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,829 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.json = exports.xml = exports.uuid = exports.tsquery = exports.tsvector = exports.varbit = exports.bitVarying = exports.bit = exports.macaddr8 = exports.macaddr = exports.inet = exports.cidr = exports.circle = exports.polygon = exports.path = exports.box = exports.lseg = exports.line = exports.point = exports.bool = exports.boolean = exports.timeWithTimeZone = exports.date = exports.timestampWithTimeZone = exports.bytea = exports.text = exports.character = exports.characterVarying = exports.money = exports.float8 = exports.doublePrecision = exports.float4 = exports.real = exports.numeric = exports.decimal = exports.serial8 = exports.bigserial = exports.serial2 = exports.smallserial = exports.serial4 = exports.serial = exports.int8 = exports.bigint = exports.int2 = exports.smallint = exports.int4 = exports.int = exports.integer = exports.EMPTY_ARRAY = exports.EMPTY_OBJECT = void 0;
|
|
4
|
+
exports.index = exports.raw = exports.emptyArray = exports.emptyObject = exports.currentDate = exports.currentTimestamp = exports.now = exports.uuidV4 = exports.genRandomUuid = exports.compositeType = exports.enumType = exports.customType = exports.box3d = exports.box2d = exports.geoPoint = exports.geography = exports.geometry = exports.semver = exports.cube = exports.hstore = exports.ltxtquery = exports.lquery = exports.ltree = exports.citext = exports.pgSnapshot = exports.pgLsn = exports.regtype = exports.regproc = exports.regclass = exports.oid = exports.datemultirange = exports.tstzmultirange = exports.tsmultirange = exports.nummultirange = exports.int8multirange = exports.int4multirange = exports.daterange = exports.tstzrange = exports.tsrange = exports.numrange = exports.int8range = exports.int4range = exports.jsonb = void 0;
|
|
5
|
+
exports.varchar = varchar;
|
|
6
|
+
exports.char = char;
|
|
7
|
+
exports.timestamp = timestamp;
|
|
8
|
+
exports.timestamptz = timestamptz;
|
|
9
|
+
exports.time = time;
|
|
10
|
+
exports.timetz = timetz;
|
|
11
|
+
exports.interval = interval;
|
|
12
|
+
exports.pgDomain = pgDomain;
|
|
13
|
+
exports.generateDomainSQL = generateDomainSQL;
|
|
14
|
+
exports.pgComposite = pgComposite;
|
|
15
|
+
exports.generateCompositeTypeSQL = generateCompositeTypeSQL;
|
|
16
|
+
exports.sql = sql;
|
|
17
|
+
exports.EMPTY_OBJECT = Symbol.for('relq:emptyObject');
|
|
18
|
+
exports.EMPTY_ARRAY = Symbol.for('relq:emptyArray');
|
|
19
|
+
function formatGenValue(val) {
|
|
20
|
+
if (val === null)
|
|
21
|
+
return 'NULL';
|
|
22
|
+
if (typeof val === 'number')
|
|
23
|
+
return String(val);
|
|
24
|
+
if (typeof val === 'string')
|
|
25
|
+
return `'${val.replace(/'/g, "''")}'`;
|
|
26
|
+
return val.$sql;
|
|
27
|
+
}
|
|
28
|
+
function chainableExpr(sql) {
|
|
29
|
+
const expr = {
|
|
30
|
+
$sql: sql,
|
|
31
|
+
$expr: true,
|
|
32
|
+
add(value) { return chainableExpr(`(${this.$sql} + ${formatGenValue(value)})`); },
|
|
33
|
+
plus(value) { return this.add(value); },
|
|
34
|
+
subtract(value) { return chainableExpr(`(${this.$sql} - ${formatGenValue(value)})`); },
|
|
35
|
+
minus(value) { return this.subtract(value); },
|
|
36
|
+
multiply(value) { return chainableExpr(`(${this.$sql} * ${formatGenValue(value)})`); },
|
|
37
|
+
times(value) { return this.multiply(value); },
|
|
38
|
+
divide(value) { return chainableExpr(`(${this.$sql} / ${formatGenValue(value)})`); },
|
|
39
|
+
dividedBy(value) { return this.divide(value); },
|
|
40
|
+
mod(value) { return chainableExpr(`(${this.$sql} % ${formatGenValue(value)})`); },
|
|
41
|
+
concat(...args) {
|
|
42
|
+
const allParts = [this.$sql, ...args.map(formatGenValue)];
|
|
43
|
+
return chainableExpr(`CONCAT(${allParts.join(', ')})`);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
return expr;
|
|
47
|
+
}
|
|
48
|
+
function createCaseBuilder() {
|
|
49
|
+
const whens = [];
|
|
50
|
+
let elseResult = null;
|
|
51
|
+
const builder = {
|
|
52
|
+
when(condition, result) {
|
|
53
|
+
const condSql = typeof condition === 'string' ? condition : condition.$sql;
|
|
54
|
+
whens.push({ condition: condSql, result: formatGenValue(result) });
|
|
55
|
+
return builder;
|
|
56
|
+
},
|
|
57
|
+
else(result) {
|
|
58
|
+
elseResult = formatGenValue(result);
|
|
59
|
+
return this.end();
|
|
60
|
+
},
|
|
61
|
+
end() {
|
|
62
|
+
let sql = 'CASE';
|
|
63
|
+
for (const w of whens) {
|
|
64
|
+
sql += ` WHEN ${w.condition} THEN ${w.result}`;
|
|
65
|
+
}
|
|
66
|
+
if (elseResult !== null) {
|
|
67
|
+
sql += ` ELSE ${elseResult}`;
|
|
68
|
+
}
|
|
69
|
+
sql += ' END';
|
|
70
|
+
return chainableExpr(sql);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
return builder;
|
|
74
|
+
}
|
|
75
|
+
const generatedFnMethods = {
|
|
76
|
+
lower: (col) => chainableExpr(`LOWER(${col.$sql})`),
|
|
77
|
+
upper: (col) => chainableExpr(`UPPER(${col.$sql})`),
|
|
78
|
+
trim: (col) => chainableExpr(`TRIM(${col.$sql})`),
|
|
79
|
+
ltrim: (col) => chainableExpr(`LTRIM(${col.$sql})`),
|
|
80
|
+
rtrim: (col) => chainableExpr(`RTRIM(${col.$sql})`),
|
|
81
|
+
length: (col) => chainableExpr(`LENGTH(${col.$sql})`),
|
|
82
|
+
substring: (col, start, length) => length !== undefined
|
|
83
|
+
? chainableExpr(`SUBSTRING(${col.$sql} FROM ${start} FOR ${length})`)
|
|
84
|
+
: chainableExpr(`SUBSTRING(${col.$sql} FROM ${start})`),
|
|
85
|
+
concat: (...args) => chainableExpr(`CONCAT(${args.map(formatGenValue).join(', ')})`),
|
|
86
|
+
replace: (col, from, to) => chainableExpr(`REPLACE(${col.$sql}, '${from}', '${to}')`),
|
|
87
|
+
left: (col, n) => chainableExpr(`LEFT(${col.$sql}, ${n})`),
|
|
88
|
+
right: (col, n) => chainableExpr(`RIGHT(${col.$sql}, ${n})`),
|
|
89
|
+
abs: (col) => chainableExpr(`ABS(${col.$sql})`),
|
|
90
|
+
ceil: (col) => chainableExpr(`CEIL(${col.$sql})`),
|
|
91
|
+
floor: (col) => chainableExpr(`FLOOR(${col.$sql})`),
|
|
92
|
+
round: (col, decimals) => decimals !== undefined
|
|
93
|
+
? chainableExpr(`ROUND(${col.$sql}, ${decimals})`)
|
|
94
|
+
: chainableExpr(`ROUND(${col.$sql})`),
|
|
95
|
+
trunc: (col, decimals) => decimals !== undefined
|
|
96
|
+
? chainableExpr(`TRUNC(${col.$sql}, ${decimals})`)
|
|
97
|
+
: chainableExpr(`TRUNC(${col.$sql})`),
|
|
98
|
+
sign: (col) => chainableExpr(`SIGN(${col.$sql})`),
|
|
99
|
+
power: (col, exponent) => chainableExpr(`POWER(${col.$sql}, ${exponent})`),
|
|
100
|
+
sqrt: (col) => chainableExpr(`SQRT(${col.$sql})`),
|
|
101
|
+
exp: (col) => chainableExpr(`EXP(${col.$sql})`),
|
|
102
|
+
ln: (col) => chainableExpr(`LN(${col.$sql})`),
|
|
103
|
+
log: (col, base) => base !== undefined
|
|
104
|
+
? chainableExpr(`LOG(${base}, ${col.$sql})`)
|
|
105
|
+
: chainableExpr(`LOG(${col.$sql})`),
|
|
106
|
+
greatest: (...args) => chainableExpr(`GREATEST(${args.map(formatGenValue).join(', ')})`),
|
|
107
|
+
least: (...args) => chainableExpr(`LEAST(${args.map(formatGenValue).join(', ')})`),
|
|
108
|
+
add: (a, b) => chainableExpr(`(${formatGenValue(a)} + ${formatGenValue(b)})`),
|
|
109
|
+
subtract: (a, b) => chainableExpr(`(${formatGenValue(a)} - ${formatGenValue(b)})`),
|
|
110
|
+
multiply: (a, b) => chainableExpr(`(${formatGenValue(a)} * ${formatGenValue(b)})`),
|
|
111
|
+
divide: (a, b) => chainableExpr(`(${formatGenValue(a)} / ${formatGenValue(b)})`),
|
|
112
|
+
mod: (a, b) => chainableExpr(`(${formatGenValue(a)} % ${formatGenValue(b)})`),
|
|
113
|
+
asText: (col) => chainableExpr(`(${col.$sql})::TEXT`),
|
|
114
|
+
asInteger: (col) => chainableExpr(`(${col.$sql})::INTEGER`),
|
|
115
|
+
asNumeric: (col) => chainableExpr(`(${col.$sql})::NUMERIC`),
|
|
116
|
+
asBoolean: (col) => chainableExpr(`(${col.$sql})::BOOLEAN`),
|
|
117
|
+
asDate: (col) => chainableExpr(`(${col.$sql})::DATE`),
|
|
118
|
+
asTimestamp: (col) => chainableExpr(`(${col.$sql})::TIMESTAMP`),
|
|
119
|
+
coalesce: (...args) => chainableExpr(`COALESCE(${args.map(formatGenValue).join(', ')})`),
|
|
120
|
+
nullif: (col, value) => chainableExpr(`NULLIF(${col.$sql}, ${formatGenValue(value)})`),
|
|
121
|
+
ifNull: (col, defaultValue) => chainableExpr(`COALESCE(${col.$sql}, ${formatGenValue(defaultValue)})`),
|
|
122
|
+
case: () => createCaseBuilder(),
|
|
123
|
+
jsonExtract: (col, path) => chainableExpr(`${col.$sql}->'${path}'`),
|
|
124
|
+
jsonExtractText: (col, path) => chainableExpr(`${col.$sql}->>'${path}'`),
|
|
125
|
+
jsonbExtract: (col, path) => chainableExpr(`${col.$sql}->'${path}'`),
|
|
126
|
+
jsonbExtractText: (col, path) => chainableExpr(`${col.$sql}->>'${path}'`),
|
|
127
|
+
jsonArrayLength: (col) => chainableExpr(`JSONB_ARRAY_LENGTH(${col.$sql})`),
|
|
128
|
+
extract: (field, col) => chainableExpr(`EXTRACT(${field.toUpperCase()} FROM ${col.$sql})`),
|
|
129
|
+
datePart: (field, col) => chainableExpr(`DATE_PART('${field}', ${col.$sql})`),
|
|
130
|
+
age: (col1, col2) => chainableExpr(`AGE(${col1.$sql}, ${col2.$sql})`),
|
|
131
|
+
toTsvector: (config, col) => chainableExpr(`TO_TSVECTOR('${config}', ${col.$sql})`),
|
|
132
|
+
similarity: (col1, col2) => chainableExpr(`SIMILARITY(${col1.$sql}, ${formatGenValue(col2)})`),
|
|
133
|
+
point: (x, y) => chainableExpr(`POINT(${formatGenValue(x)}, ${formatGenValue(y)})`),
|
|
134
|
+
arrayLength: (col, dim = 1) => chainableExpr(`ARRAY_LENGTH(${col.$sql}, ${dim})`),
|
|
135
|
+
arrayPosition: (arr, elem) => chainableExpr(`ARRAY_POSITION(${arr.$sql}, ${formatGenValue(elem)})`),
|
|
136
|
+
md5: (col) => chainableExpr(`MD5(${col.$sql})`),
|
|
137
|
+
sha256: (col) => chainableExpr(`ENCODE(SHA256(${col.$sql}::BYTEA), 'hex')`),
|
|
138
|
+
};
|
|
139
|
+
const generatedFn = new Proxy(function (col) {
|
|
140
|
+
return chainableExpr(col.$sql);
|
|
141
|
+
}, {
|
|
142
|
+
get(target, prop) {
|
|
143
|
+
if (prop in generatedFnMethods) {
|
|
144
|
+
return generatedFnMethods[prop];
|
|
145
|
+
}
|
|
146
|
+
return Reflect.get(target, prop);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
function createColumn(type) {
|
|
150
|
+
const config = { $type: type };
|
|
151
|
+
const builder = {
|
|
152
|
+
...config,
|
|
153
|
+
$sqlType: type,
|
|
154
|
+
notNull() {
|
|
155
|
+
config.$nullable = false;
|
|
156
|
+
return Object.assign(this, { $nullable: false });
|
|
157
|
+
},
|
|
158
|
+
nullable() {
|
|
159
|
+
config.$nullable = true;
|
|
160
|
+
return Object.assign(this, { $nullable: true });
|
|
161
|
+
},
|
|
162
|
+
default(value) {
|
|
163
|
+
config.$default = value;
|
|
164
|
+
return Object.assign(this, { $default: value });
|
|
165
|
+
},
|
|
166
|
+
primaryKey() {
|
|
167
|
+
config.$primaryKey = true;
|
|
168
|
+
return Object.assign(this, { $primaryKey: true });
|
|
169
|
+
},
|
|
170
|
+
unique() {
|
|
171
|
+
config.$unique = true;
|
|
172
|
+
return Object.assign(this, { $unique: true });
|
|
173
|
+
},
|
|
174
|
+
references(table, column, options) {
|
|
175
|
+
config.$references = { table, column, ...options };
|
|
176
|
+
return Object.assign(this, { $references: config.$references });
|
|
177
|
+
},
|
|
178
|
+
check(...values) {
|
|
179
|
+
if (values.length === 1 && /[<>=!()&|+\-*/ ]/.test(values[0])) {
|
|
180
|
+
config.$check = values[0];
|
|
181
|
+
return Object.assign(this, { $check: values[0] });
|
|
182
|
+
}
|
|
183
|
+
const expression = `IN ('${values.join("', '")}')`;
|
|
184
|
+
config.$checkValues = values;
|
|
185
|
+
config.$check = expression;
|
|
186
|
+
return Object.assign(this, { $check: expression, $checkValues: values });
|
|
187
|
+
},
|
|
188
|
+
checkNot(...values) {
|
|
189
|
+
const expression = `NOT IN ('${values.join("', '")}')`;
|
|
190
|
+
config.$checkNotValues = values;
|
|
191
|
+
config.$checkNot = expression;
|
|
192
|
+
return Object.assign(this, { $checkNot: expression, $checkNotValues: values });
|
|
193
|
+
},
|
|
194
|
+
generatedAs(expression, stored = true) {
|
|
195
|
+
config.$generated = { expression, stored };
|
|
196
|
+
return Object.assign(this, { $generated: config.$generated });
|
|
197
|
+
},
|
|
198
|
+
generatedAlwaysAs(callback, options) {
|
|
199
|
+
const tableProxy = new Proxy({}, {
|
|
200
|
+
get(_target, prop) {
|
|
201
|
+
return chainableExpr(`"${prop}"`);
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
const result = callback(tableProxy, generatedFn);
|
|
205
|
+
const stored = options?.stored !== false;
|
|
206
|
+
config.$generated = { expression: result.$sql, stored };
|
|
207
|
+
return Object.assign(this, { $generated: config.$generated });
|
|
208
|
+
},
|
|
209
|
+
array(dimensions = 1) {
|
|
210
|
+
config.$array = true;
|
|
211
|
+
config.$dimensions = dimensions;
|
|
212
|
+
return Object.assign(this, { $array: true, $dimensions: dimensions });
|
|
213
|
+
},
|
|
214
|
+
$type() {
|
|
215
|
+
return this;
|
|
216
|
+
},
|
|
217
|
+
length(len) {
|
|
218
|
+
config.$length = len;
|
|
219
|
+
const baseType = config.$type.replace(/\(\d+\)/, '');
|
|
220
|
+
config.$type = `${baseType}(${len})`;
|
|
221
|
+
return Object.assign(this, { $length: len, $type: config.$type });
|
|
222
|
+
},
|
|
223
|
+
precision(p) {
|
|
224
|
+
config.$precision = p;
|
|
225
|
+
const base = config.$type.replace(/\([\d,\s]+\)/, '');
|
|
226
|
+
config.$type = config.$scale !== undefined
|
|
227
|
+
? `${base}(${p}, ${config.$scale})`
|
|
228
|
+
: `${base}(${p})`;
|
|
229
|
+
return Object.assign(this, { $precision: p, $type: config.$type });
|
|
230
|
+
},
|
|
231
|
+
scale(s) {
|
|
232
|
+
config.$scale = s;
|
|
233
|
+
const base = config.$type.replace(/\([\d,\s]+\)/, '');
|
|
234
|
+
config.$type = config.$precision !== undefined
|
|
235
|
+
? `${base}(${config.$precision}, ${s})`
|
|
236
|
+
: `${base}(38, ${s})`;
|
|
237
|
+
return Object.assign(this, { $scale: s, $type: config.$type });
|
|
238
|
+
},
|
|
239
|
+
withTimezone() {
|
|
240
|
+
config.$withTimezone = true;
|
|
241
|
+
if (config.$type === 'TIMESTAMP') {
|
|
242
|
+
config.$type = 'TIMESTAMPTZ';
|
|
243
|
+
}
|
|
244
|
+
else if (config.$type === 'TIME') {
|
|
245
|
+
config.$type = 'TIMETZ';
|
|
246
|
+
}
|
|
247
|
+
return Object.assign(this, { $withTimezone: true, $type: config.$type });
|
|
248
|
+
},
|
|
249
|
+
dimensions(d) {
|
|
250
|
+
config.$dimensions = d;
|
|
251
|
+
config.$type = `VECTOR(${d})`;
|
|
252
|
+
return Object.assign(this, { $dimensions: d, $type: config.$type });
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
return builder;
|
|
256
|
+
}
|
|
257
|
+
function createColumnWithName(type, columnName) {
|
|
258
|
+
const col = createColumn(type);
|
|
259
|
+
if (columnName) {
|
|
260
|
+
col.$columnName = columnName;
|
|
261
|
+
}
|
|
262
|
+
return col;
|
|
263
|
+
}
|
|
264
|
+
const integer = (columnName) => createColumnWithName('INTEGER', columnName);
|
|
265
|
+
exports.integer = integer;
|
|
266
|
+
exports.int = exports.integer;
|
|
267
|
+
exports.int4 = exports.integer;
|
|
268
|
+
const smallint = (columnName) => createColumnWithName('SMALLINT', columnName);
|
|
269
|
+
exports.smallint = smallint;
|
|
270
|
+
exports.int2 = exports.smallint;
|
|
271
|
+
const bigint = (columnName) => createColumnWithName('BIGINT', columnName);
|
|
272
|
+
exports.bigint = bigint;
|
|
273
|
+
exports.int8 = exports.bigint;
|
|
274
|
+
const serial = (columnName) => createColumnWithName('SERIAL', columnName);
|
|
275
|
+
exports.serial = serial;
|
|
276
|
+
exports.serial4 = exports.serial;
|
|
277
|
+
const smallserial = (columnName) => createColumnWithName('SMALLSERIAL', columnName);
|
|
278
|
+
exports.smallserial = smallserial;
|
|
279
|
+
exports.serial2 = exports.smallserial;
|
|
280
|
+
const bigserial = (columnName) => createColumnWithName('BIGSERIAL', columnName);
|
|
281
|
+
exports.bigserial = bigserial;
|
|
282
|
+
exports.serial8 = exports.bigserial;
|
|
283
|
+
const decimal = (columnNameOrOpts, scale) => {
|
|
284
|
+
if (typeof columnNameOrOpts === 'string' && !columnNameOrOpts.includes('.')) {
|
|
285
|
+
return createColumnWithName('DECIMAL', columnNameOrOpts);
|
|
286
|
+
}
|
|
287
|
+
if (typeof columnNameOrOpts === 'number') {
|
|
288
|
+
const type = scale !== undefined
|
|
289
|
+
? `DECIMAL(${columnNameOrOpts}, ${scale})`
|
|
290
|
+
: `DECIMAL(${columnNameOrOpts})`;
|
|
291
|
+
return createColumn(type);
|
|
292
|
+
}
|
|
293
|
+
if (columnNameOrOpts && typeof columnNameOrOpts === 'object') {
|
|
294
|
+
const type = columnNameOrOpts.precision !== undefined
|
|
295
|
+
? columnNameOrOpts.scale !== undefined
|
|
296
|
+
? `DECIMAL(${columnNameOrOpts.precision}, ${columnNameOrOpts.scale})`
|
|
297
|
+
: `DECIMAL(${columnNameOrOpts.precision})`
|
|
298
|
+
: 'DECIMAL';
|
|
299
|
+
return createColumn(type);
|
|
300
|
+
}
|
|
301
|
+
return createColumn('DECIMAL');
|
|
302
|
+
};
|
|
303
|
+
exports.decimal = decimal;
|
|
304
|
+
exports.numeric = exports.decimal;
|
|
305
|
+
const real = (columnName) => createColumnWithName('REAL', columnName);
|
|
306
|
+
exports.real = real;
|
|
307
|
+
exports.float4 = exports.real;
|
|
308
|
+
const doublePrecision = (columnName) => createColumnWithName('DOUBLE PRECISION', columnName);
|
|
309
|
+
exports.doublePrecision = doublePrecision;
|
|
310
|
+
exports.float8 = exports.doublePrecision;
|
|
311
|
+
const money = (columnName) => createColumnWithName('MONEY', columnName);
|
|
312
|
+
exports.money = money;
|
|
313
|
+
function varchar(arg1, arg2) {
|
|
314
|
+
if (arg1 === undefined) {
|
|
315
|
+
return createColumn('VARCHAR');
|
|
316
|
+
}
|
|
317
|
+
if (typeof arg1 === 'number') {
|
|
318
|
+
return createColumn(`VARCHAR(${arg1})`);
|
|
319
|
+
}
|
|
320
|
+
if (typeof arg1 === 'object') {
|
|
321
|
+
const length = arg1.length;
|
|
322
|
+
return createColumn(length ? `VARCHAR(${length})` : 'VARCHAR');
|
|
323
|
+
}
|
|
324
|
+
const length = arg2?.length;
|
|
325
|
+
const col = createColumn(length ? `VARCHAR(${length})` : 'VARCHAR');
|
|
326
|
+
col.$columnName = arg1;
|
|
327
|
+
return col;
|
|
328
|
+
}
|
|
329
|
+
exports.characterVarying = varchar;
|
|
330
|
+
function char(arg1, arg2) {
|
|
331
|
+
if (arg1 === undefined) {
|
|
332
|
+
return createColumn('CHAR(1)');
|
|
333
|
+
}
|
|
334
|
+
if (typeof arg1 === 'number') {
|
|
335
|
+
return createColumn(`CHAR(${arg1})`);
|
|
336
|
+
}
|
|
337
|
+
if (typeof arg1 === 'object') {
|
|
338
|
+
const length = arg1.length ?? 1;
|
|
339
|
+
return createColumn(`CHAR(${length})`);
|
|
340
|
+
}
|
|
341
|
+
const length = arg2?.length ?? 1;
|
|
342
|
+
const col = createColumn(`CHAR(${length})`);
|
|
343
|
+
col.$columnName = arg1;
|
|
344
|
+
return col;
|
|
345
|
+
}
|
|
346
|
+
exports.character = char;
|
|
347
|
+
const text = (columnName) => createColumnWithName('TEXT', columnName);
|
|
348
|
+
exports.text = text;
|
|
349
|
+
const bytea = (columnName) => createColumnWithName('BYTEA', columnName);
|
|
350
|
+
exports.bytea = bytea;
|
|
351
|
+
function timestamp(arg1, arg2) {
|
|
352
|
+
if (typeof arg1 === 'string') {
|
|
353
|
+
const opts = arg2;
|
|
354
|
+
const base = opts?.withTimezone ? 'TIMESTAMPTZ' : 'TIMESTAMP';
|
|
355
|
+
const type = opts?.precision !== undefined ? `${base}(${opts.precision})` : base;
|
|
356
|
+
const col = createColumn(type);
|
|
357
|
+
col.$columnName = arg1;
|
|
358
|
+
return col;
|
|
359
|
+
}
|
|
360
|
+
if (typeof arg1 === 'number') {
|
|
361
|
+
return createColumn(`TIMESTAMP(${arg1})`);
|
|
362
|
+
}
|
|
363
|
+
if (arg1 && typeof arg1 === 'object') {
|
|
364
|
+
const base = arg1.withTimezone ? 'TIMESTAMPTZ' : 'TIMESTAMP';
|
|
365
|
+
if (arg1.precision !== undefined) {
|
|
366
|
+
return createColumn(`${base}(${arg1.precision})`);
|
|
367
|
+
}
|
|
368
|
+
return createColumn(base);
|
|
369
|
+
}
|
|
370
|
+
return createColumn('TIMESTAMP');
|
|
371
|
+
}
|
|
372
|
+
function timestamptz(arg1, arg2) {
|
|
373
|
+
if (typeof arg1 === 'string') {
|
|
374
|
+
const opts = arg2;
|
|
375
|
+
const type = opts?.precision !== undefined ? `TIMESTAMPTZ(${opts.precision})` : 'TIMESTAMPTZ';
|
|
376
|
+
const col = createColumn(type);
|
|
377
|
+
col.$columnName = arg1;
|
|
378
|
+
return col;
|
|
379
|
+
}
|
|
380
|
+
if (typeof arg1 === 'number') {
|
|
381
|
+
return createColumn(`TIMESTAMPTZ(${arg1})`);
|
|
382
|
+
}
|
|
383
|
+
if (arg1 && typeof arg1 === 'object' && arg1.precision !== undefined) {
|
|
384
|
+
return createColumn(`TIMESTAMPTZ(${arg1.precision})`);
|
|
385
|
+
}
|
|
386
|
+
return createColumn('TIMESTAMPTZ');
|
|
387
|
+
}
|
|
388
|
+
exports.timestampWithTimeZone = timestamptz;
|
|
389
|
+
const date = (columnName) => createColumnWithName('DATE', columnName);
|
|
390
|
+
exports.date = date;
|
|
391
|
+
function time(arg1, arg2) {
|
|
392
|
+
if (typeof arg1 === 'string') {
|
|
393
|
+
const opts = arg2;
|
|
394
|
+
const base = opts?.withTimezone ? 'TIMETZ' : 'TIME';
|
|
395
|
+
const type = opts?.precision !== undefined ? `${base}(${opts.precision})` : base;
|
|
396
|
+
return createColumnWithName(type, arg1);
|
|
397
|
+
}
|
|
398
|
+
if (arg1 && typeof arg1 === 'object') {
|
|
399
|
+
const base = arg1.withTimezone ? 'TIMETZ' : 'TIME';
|
|
400
|
+
if (arg1.precision !== undefined) {
|
|
401
|
+
return createColumn(`${base}(${arg1.precision})`);
|
|
402
|
+
}
|
|
403
|
+
return createColumn(base);
|
|
404
|
+
}
|
|
405
|
+
return createColumn('TIME');
|
|
406
|
+
}
|
|
407
|
+
function timetz(arg1, arg2) {
|
|
408
|
+
if (typeof arg1 === 'string') {
|
|
409
|
+
const opts = arg2;
|
|
410
|
+
const type = opts?.precision !== undefined ? `TIMETZ(${opts.precision})` : 'TIMETZ';
|
|
411
|
+
return createColumnWithName(type, arg1);
|
|
412
|
+
}
|
|
413
|
+
if (arg1 && typeof arg1 === 'object' && arg1.precision !== undefined) {
|
|
414
|
+
return createColumn(`TIMETZ(${arg1.precision})`);
|
|
415
|
+
}
|
|
416
|
+
return createColumn('TIMETZ');
|
|
417
|
+
}
|
|
418
|
+
exports.timeWithTimeZone = timetz;
|
|
419
|
+
function interval(arg1, arg2) {
|
|
420
|
+
if (arg1 && !arg1.includes(' ') && arg2 !== undefined) {
|
|
421
|
+
const type = arg2 ? `INTERVAL ${arg2}` : 'INTERVAL';
|
|
422
|
+
return createColumnWithName(type, arg1);
|
|
423
|
+
}
|
|
424
|
+
if (arg1 && !arg1.includes(' ') && arg2 === undefined) {
|
|
425
|
+
const validFields = ['YEAR', 'MONTH', 'DAY', 'HOUR', 'MINUTE', 'SECOND'];
|
|
426
|
+
const isField = validFields.some(f => arg1.toUpperCase().startsWith(f));
|
|
427
|
+
if (isField) {
|
|
428
|
+
return createColumn(`INTERVAL ${arg1}`);
|
|
429
|
+
}
|
|
430
|
+
return createColumnWithName('INTERVAL', arg1);
|
|
431
|
+
}
|
|
432
|
+
if (arg1) {
|
|
433
|
+
return createColumn(`INTERVAL ${arg1}`);
|
|
434
|
+
}
|
|
435
|
+
return createColumn('INTERVAL');
|
|
436
|
+
}
|
|
437
|
+
const boolean = (columnName) => createColumnWithName('BOOLEAN', columnName);
|
|
438
|
+
exports.boolean = boolean;
|
|
439
|
+
exports.bool = exports.boolean;
|
|
440
|
+
const point = (columnName) => createColumnWithName('POINT', columnName);
|
|
441
|
+
exports.point = point;
|
|
442
|
+
const line = (columnName) => createColumnWithName('LINE', columnName);
|
|
443
|
+
exports.line = line;
|
|
444
|
+
const lseg = (columnName) => createColumnWithName('LSEG', columnName);
|
|
445
|
+
exports.lseg = lseg;
|
|
446
|
+
const box = (columnName) => createColumnWithName('BOX', columnName);
|
|
447
|
+
exports.box = box;
|
|
448
|
+
const path = (columnName) => createColumnWithName('PATH', columnName);
|
|
449
|
+
exports.path = path;
|
|
450
|
+
const polygon = (columnName) => createColumnWithName('POLYGON', columnName);
|
|
451
|
+
exports.polygon = polygon;
|
|
452
|
+
const circle = (columnName) => createColumnWithName('CIRCLE', columnName);
|
|
453
|
+
exports.circle = circle;
|
|
454
|
+
const cidr = (columnName) => createColumnWithName('CIDR', columnName);
|
|
455
|
+
exports.cidr = cidr;
|
|
456
|
+
const inet = (columnName) => createColumnWithName('INET', columnName);
|
|
457
|
+
exports.inet = inet;
|
|
458
|
+
const macaddr = (columnName) => createColumnWithName('MACADDR', columnName);
|
|
459
|
+
exports.macaddr = macaddr;
|
|
460
|
+
const macaddr8 = (columnName) => createColumnWithName('MACADDR8', columnName);
|
|
461
|
+
exports.macaddr8 = macaddr8;
|
|
462
|
+
const bit = (length) => createColumn(length ? `BIT(${length})` : 'BIT(1)');
|
|
463
|
+
exports.bit = bit;
|
|
464
|
+
const bitVarying = (length) => createColumn(length ? `BIT VARYING(${length})` : 'BIT VARYING');
|
|
465
|
+
exports.bitVarying = bitVarying;
|
|
466
|
+
exports.varbit = exports.bitVarying;
|
|
467
|
+
const tsvector = (columnName) => createColumnWithName('TSVECTOR', columnName);
|
|
468
|
+
exports.tsvector = tsvector;
|
|
469
|
+
const tsquery = (columnName) => createColumnWithName('TSQUERY', columnName);
|
|
470
|
+
exports.tsquery = tsquery;
|
|
471
|
+
const uuid = (columnName) => createColumnWithName('UUID', columnName);
|
|
472
|
+
exports.uuid = uuid;
|
|
473
|
+
const xml = (columnName) => createColumnWithName('XML', columnName);
|
|
474
|
+
exports.xml = xml;
|
|
475
|
+
const json = (columnName) => createColumnWithName('JSON', columnName);
|
|
476
|
+
exports.json = json;
|
|
477
|
+
const jsonb = (columnName) => createColumnWithName('JSONB', columnName);
|
|
478
|
+
exports.jsonb = jsonb;
|
|
479
|
+
const int4range = () => createColumn('INT4RANGE');
|
|
480
|
+
exports.int4range = int4range;
|
|
481
|
+
const int8range = () => createColumn('INT8RANGE');
|
|
482
|
+
exports.int8range = int8range;
|
|
483
|
+
const numrange = () => createColumn('NUMRANGE');
|
|
484
|
+
exports.numrange = numrange;
|
|
485
|
+
const tsrange = () => createColumn('TSRANGE');
|
|
486
|
+
exports.tsrange = tsrange;
|
|
487
|
+
const tstzrange = () => createColumn('TSTZRANGE');
|
|
488
|
+
exports.tstzrange = tstzrange;
|
|
489
|
+
const daterange = () => createColumn('DATERANGE');
|
|
490
|
+
exports.daterange = daterange;
|
|
491
|
+
const int4multirange = () => createColumn('INT4MULTIRANGE');
|
|
492
|
+
exports.int4multirange = int4multirange;
|
|
493
|
+
const int8multirange = () => createColumn('INT8MULTIRANGE');
|
|
494
|
+
exports.int8multirange = int8multirange;
|
|
495
|
+
const nummultirange = () => createColumn('NUMMULTIRANGE');
|
|
496
|
+
exports.nummultirange = nummultirange;
|
|
497
|
+
const tsmultirange = () => createColumn('TSMULTIRANGE');
|
|
498
|
+
exports.tsmultirange = tsmultirange;
|
|
499
|
+
const tstzmultirange = () => createColumn('TSTZMULTIRANGE');
|
|
500
|
+
exports.tstzmultirange = tstzmultirange;
|
|
501
|
+
const datemultirange = () => createColumn('DATEMULTIRANGE');
|
|
502
|
+
exports.datemultirange = datemultirange;
|
|
503
|
+
const oid = () => createColumn('OID');
|
|
504
|
+
exports.oid = oid;
|
|
505
|
+
const regclass = () => createColumn('REGCLASS');
|
|
506
|
+
exports.regclass = regclass;
|
|
507
|
+
const regproc = () => createColumn('REGPROC');
|
|
508
|
+
exports.regproc = regproc;
|
|
509
|
+
const regtype = () => createColumn('REGTYPE');
|
|
510
|
+
exports.regtype = regtype;
|
|
511
|
+
const pgLsn = () => createColumn('PG_LSN');
|
|
512
|
+
exports.pgLsn = pgLsn;
|
|
513
|
+
const pgSnapshot = () => createColumn('PG_SNAPSHOT');
|
|
514
|
+
exports.pgSnapshot = pgSnapshot;
|
|
515
|
+
const citext = (columnName) => createColumnWithName('CITEXT', columnName);
|
|
516
|
+
exports.citext = citext;
|
|
517
|
+
const ltree = (columnName) => createColumnWithName('LTREE', columnName);
|
|
518
|
+
exports.ltree = ltree;
|
|
519
|
+
const lquery = (columnName) => createColumnWithName('LQUERY', columnName);
|
|
520
|
+
exports.lquery = lquery;
|
|
521
|
+
const ltxtquery = (columnName) => createColumnWithName('LTXTQUERY', columnName);
|
|
522
|
+
exports.ltxtquery = ltxtquery;
|
|
523
|
+
const hstore = (columnName) => createColumnWithName('HSTORE', columnName);
|
|
524
|
+
exports.hstore = hstore;
|
|
525
|
+
const cube = (columnName) => createColumnWithName('CUBE', columnName);
|
|
526
|
+
exports.cube = cube;
|
|
527
|
+
const semver = (columnName) => createColumnWithName('SEMVER', columnName);
|
|
528
|
+
exports.semver = semver;
|
|
529
|
+
const geometry = (columnName, srid, geometryType) => {
|
|
530
|
+
let typeName = 'GEOMETRY';
|
|
531
|
+
if (geometryType && srid) {
|
|
532
|
+
typeName = `GEOMETRY(${geometryType}, ${srid})`;
|
|
533
|
+
}
|
|
534
|
+
else if (geometryType) {
|
|
535
|
+
typeName = `GEOMETRY(${geometryType})`;
|
|
536
|
+
}
|
|
537
|
+
else if (srid) {
|
|
538
|
+
typeName = `GEOMETRY(GEOMETRY, ${srid})`;
|
|
539
|
+
}
|
|
540
|
+
return createColumnWithName(typeName, columnName);
|
|
541
|
+
};
|
|
542
|
+
exports.geometry = geometry;
|
|
543
|
+
const geography = (columnName, srid = 4326, geometryType) => {
|
|
544
|
+
let typeName = 'GEOGRAPHY';
|
|
545
|
+
if (geometryType) {
|
|
546
|
+
typeName = `GEOGRAPHY(${geometryType}, ${srid})`;
|
|
547
|
+
}
|
|
548
|
+
else {
|
|
549
|
+
typeName = `GEOGRAPHY(GEOMETRY, ${srid})`;
|
|
550
|
+
}
|
|
551
|
+
return createColumnWithName(typeName, columnName);
|
|
552
|
+
};
|
|
553
|
+
exports.geography = geography;
|
|
554
|
+
const geoPoint = (columnName, srid = 4326) => {
|
|
555
|
+
return createColumnWithName(`GEOMETRY(POINT, ${srid})`, columnName);
|
|
556
|
+
};
|
|
557
|
+
exports.geoPoint = geoPoint;
|
|
558
|
+
const box2d = (columnName) => createColumnWithName('BOX2D', columnName);
|
|
559
|
+
exports.box2d = box2d;
|
|
560
|
+
const box3d = (columnName) => createColumnWithName('BOX3D', columnName);
|
|
561
|
+
exports.box3d = box3d;
|
|
562
|
+
function createDomainCheckCondition(sql, validate, name) {
|
|
563
|
+
return {
|
|
564
|
+
$sql: sql,
|
|
565
|
+
$name: name,
|
|
566
|
+
$validate: validate,
|
|
567
|
+
and(other) {
|
|
568
|
+
return createDomainCheckCondition(`(${this.$sql}) AND (${other.$sql})`, (val) => this.$validate(val) && other.$validate(val), this.$name || other.$name);
|
|
569
|
+
},
|
|
570
|
+
or(other) {
|
|
571
|
+
return createDomainCheckCondition(`(${this.$sql}) OR (${other.$sql})`, (val) => this.$validate(val) || other.$validate(val), this.$name || other.$name);
|
|
572
|
+
},
|
|
573
|
+
as(constraintName) {
|
|
574
|
+
return createDomainCheckCondition(this.$sql, this.$validate, constraintName);
|
|
575
|
+
},
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
function formatDomainValue(val) {
|
|
579
|
+
if (val === null)
|
|
580
|
+
return 'NULL';
|
|
581
|
+
if (typeof val === 'number')
|
|
582
|
+
return String(val);
|
|
583
|
+
if (typeof val === 'boolean')
|
|
584
|
+
return val ? 'TRUE' : 'FALSE';
|
|
585
|
+
if (typeof val === 'string')
|
|
586
|
+
return `'${val.replace(/'/g, "''")}'`;
|
|
587
|
+
return String(val);
|
|
588
|
+
}
|
|
589
|
+
function createDomainValueExpr() {
|
|
590
|
+
return {
|
|
591
|
+
eq(value) {
|
|
592
|
+
return createDomainCheckCondition(`VALUE = ${formatDomainValue(value)}`, (val) => val === value);
|
|
593
|
+
},
|
|
594
|
+
neq(value) {
|
|
595
|
+
return createDomainCheckCondition(`VALUE <> ${formatDomainValue(value)}`, (val) => val !== value);
|
|
596
|
+
},
|
|
597
|
+
gt(value) {
|
|
598
|
+
return createDomainCheckCondition(`VALUE > ${formatDomainValue(value)}`, (val) => val > value);
|
|
599
|
+
},
|
|
600
|
+
gte(value) {
|
|
601
|
+
return createDomainCheckCondition(`VALUE >= ${formatDomainValue(value)}`, (val) => val >= value);
|
|
602
|
+
},
|
|
603
|
+
lt(value) {
|
|
604
|
+
return createDomainCheckCondition(`VALUE < ${formatDomainValue(value)}`, (val) => val < value);
|
|
605
|
+
},
|
|
606
|
+
lte(value) {
|
|
607
|
+
return createDomainCheckCondition(`VALUE <= ${formatDomainValue(value)}`, (val) => val <= value);
|
|
608
|
+
},
|
|
609
|
+
between(min, max) {
|
|
610
|
+
return createDomainCheckCondition(`${formatDomainValue(min)} AND ${formatDomainValue(max)}`, (val) => val >= min && val <= max);
|
|
611
|
+
},
|
|
612
|
+
in(values) {
|
|
613
|
+
const formatted = values.map(formatDomainValue).join(', ');
|
|
614
|
+
return createDomainCheckCondition(`VALUE IN (${formatted})`, (val) => values.includes(val));
|
|
615
|
+
},
|
|
616
|
+
notIn(values) {
|
|
617
|
+
const formatted = values.map(formatDomainValue).join(', ');
|
|
618
|
+
return createDomainCheckCondition(`VALUE NOT IN (${formatted})`, (val) => !values.includes(val));
|
|
619
|
+
},
|
|
620
|
+
isNull() {
|
|
621
|
+
return createDomainCheckCondition(`VALUE IS NULL`, (val) => val === null);
|
|
622
|
+
},
|
|
623
|
+
isNotNull() {
|
|
624
|
+
return createDomainCheckCondition(`VALUE IS NOT NULL`, (val) => val !== null);
|
|
625
|
+
},
|
|
626
|
+
like(pattern) {
|
|
627
|
+
try {
|
|
628
|
+
const regex = new RegExp('^' + pattern.replace(/%/g, '.*').replace(/_/g, '.') + '$');
|
|
629
|
+
return createDomainCheckCondition(`VALUE LIKE ${formatDomainValue(pattern)}`, (val) => typeof val === 'string' && regex.test(val));
|
|
630
|
+
}
|
|
631
|
+
catch (e) {
|
|
632
|
+
throw new Error(`[Relq] Invalid LIKE pattern in domain: "${pattern}". ${e instanceof Error ? e.message : String(e)}`);
|
|
633
|
+
}
|
|
634
|
+
},
|
|
635
|
+
notLike(pattern) {
|
|
636
|
+
try {
|
|
637
|
+
const regex = new RegExp('^' + pattern.replace(/%/g, '.*').replace(/_/g, '.') + '$');
|
|
638
|
+
return createDomainCheckCondition(`VALUE NOT LIKE ${formatDomainValue(pattern)}`, (val) => typeof val === 'string' && !regex.test(val));
|
|
639
|
+
}
|
|
640
|
+
catch (e) {
|
|
641
|
+
throw new Error(`[Relq] Invalid NOT LIKE pattern in domain: "${pattern}". ${e instanceof Error ? e.message : String(e)}`);
|
|
642
|
+
}
|
|
643
|
+
},
|
|
644
|
+
ilike(pattern) {
|
|
645
|
+
try {
|
|
646
|
+
const regex = new RegExp('^' + pattern.replace(/%/g, '.*').replace(/_/g, '.') + '$', 'i');
|
|
647
|
+
return createDomainCheckCondition(`VALUE ILIKE ${formatDomainValue(pattern)}`, (val) => typeof val === 'string' && regex.test(val));
|
|
648
|
+
}
|
|
649
|
+
catch (e) {
|
|
650
|
+
throw new Error(`[Relq] Invalid ILIKE pattern in domain: "${pattern}". ${e instanceof Error ? e.message : String(e)}`);
|
|
651
|
+
}
|
|
652
|
+
},
|
|
653
|
+
notIlike(pattern) {
|
|
654
|
+
try {
|
|
655
|
+
const regex = new RegExp('^' + pattern.replace(/%/g, '.*').replace(/_/g, '.') + '$', 'i');
|
|
656
|
+
return createDomainCheckCondition(`VALUE NOT ILIKE ${formatDomainValue(pattern)}`, (val) => typeof val === 'string' && !regex.test(val));
|
|
657
|
+
}
|
|
658
|
+
catch (e) {
|
|
659
|
+
throw new Error(`[Relq] Invalid NOT ILIKE pattern in domain: "${pattern}". ${e instanceof Error ? e.message : String(e)}`);
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
matches(regex) {
|
|
663
|
+
try {
|
|
664
|
+
const re = new RegExp(regex, 'i');
|
|
665
|
+
return createDomainCheckCondition(`VALUE ~* ${formatDomainValue(regex)}`, (val) => typeof val === 'string' && re.test(val));
|
|
666
|
+
}
|
|
667
|
+
catch (e) {
|
|
668
|
+
throw new Error(`[Relq] Invalid regex pattern in domain matches(): "${regex}". Tip: Use double backslashes (\\\\d instead of \\d) in string literals. ${e instanceof Error ? e.message : String(e)}`);
|
|
669
|
+
}
|
|
670
|
+
},
|
|
671
|
+
matchesCaseSensitive(regex) {
|
|
672
|
+
try {
|
|
673
|
+
const re = new RegExp(regex);
|
|
674
|
+
return createDomainCheckCondition(`VALUE ~ ${formatDomainValue(regex)}`, (val) => typeof val === 'string' && re.test(val));
|
|
675
|
+
}
|
|
676
|
+
catch (e) {
|
|
677
|
+
throw new Error(`[Relq] Invalid regex pattern in domain matchesCaseSensitive(): "${regex}". Tip: Use double backslashes (\\\\d instead of \\d) in string literals. ${e instanceof Error ? e.message : String(e)}`);
|
|
678
|
+
}
|
|
679
|
+
},
|
|
680
|
+
lengthGt(n) {
|
|
681
|
+
return createDomainCheckCondition(`LENGTH(VALUE) > ${n}`, (val) => typeof val === 'string' && val.length > n);
|
|
682
|
+
},
|
|
683
|
+
lengthGte(n) {
|
|
684
|
+
return createDomainCheckCondition(`LENGTH(VALUE) >= ${n}`, (val) => typeof val === 'string' && val.length >= n);
|
|
685
|
+
},
|
|
686
|
+
lengthLt(n) {
|
|
687
|
+
return createDomainCheckCondition(`LENGTH(VALUE) < ${n}`, (val) => typeof val === 'string' && val.length < n);
|
|
688
|
+
},
|
|
689
|
+
lengthLte(n) {
|
|
690
|
+
return createDomainCheckCondition(`LENGTH(VALUE) <= ${n}`, (val) => typeof val === 'string' && val.length <= n);
|
|
691
|
+
},
|
|
692
|
+
lengthEq(n) {
|
|
693
|
+
return createDomainCheckCondition(`LENGTH(VALUE) = ${n}`, (val) => typeof val === 'string' && val.length === n);
|
|
694
|
+
},
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
function pgDomain(name, baseType, checks) {
|
|
698
|
+
const config = baseType.$config;
|
|
699
|
+
const baseTypeStr = config?.$type || 'TEXT';
|
|
700
|
+
const constraints = [];
|
|
701
|
+
let validateFn;
|
|
702
|
+
if (checks) {
|
|
703
|
+
const valueExpr = createDomainValueExpr();
|
|
704
|
+
const conditions = checks(valueExpr);
|
|
705
|
+
for (const cond of conditions) {
|
|
706
|
+
if (cond.$name) {
|
|
707
|
+
constraints.push(`CONSTRAINT ${cond.$name} CHECK (${cond.$sql})`);
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
constraints.push(`CHECK (${cond.$sql})`);
|
|
711
|
+
}
|
|
712
|
+
const currentValidate = cond.$validate;
|
|
713
|
+
if (!validateFn) {
|
|
714
|
+
validateFn = currentValidate;
|
|
715
|
+
}
|
|
716
|
+
else {
|
|
717
|
+
const prev = validateFn;
|
|
718
|
+
validateFn = (val) => prev(val) && currentValidate(val);
|
|
719
|
+
}
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
const notNull = config?.$nullable === false;
|
|
723
|
+
const defaultValue = config?.$default;
|
|
724
|
+
const domainFn = (columnName) => {
|
|
725
|
+
const col = createColumnWithName(name, columnName);
|
|
726
|
+
if (validateFn) {
|
|
727
|
+
col.$validate = validateFn;
|
|
728
|
+
}
|
|
729
|
+
return col;
|
|
730
|
+
};
|
|
731
|
+
Object.assign(domainFn, {
|
|
732
|
+
$domainName: name,
|
|
733
|
+
$baseType: baseTypeStr,
|
|
734
|
+
$constraints: constraints.length > 0 ? constraints : undefined,
|
|
735
|
+
$domainDefault: defaultValue,
|
|
736
|
+
$notNull: notNull,
|
|
737
|
+
$columnBuilder: baseType,
|
|
738
|
+
$validate: validateFn,
|
|
739
|
+
});
|
|
740
|
+
return domainFn;
|
|
741
|
+
}
|
|
742
|
+
function generateDomainSQL(domain) {
|
|
743
|
+
let sql = `CREATE DOMAIN "${domain.$domainName}" AS ${domain.$baseType}`;
|
|
744
|
+
if (domain.$collation) {
|
|
745
|
+
sql += ` COLLATE "${domain.$collation}"`;
|
|
746
|
+
}
|
|
747
|
+
if (domain.$domainDefault !== undefined) {
|
|
748
|
+
sql += ` DEFAULT ${typeof domain.$domainDefault === 'string' ? `'${domain.$domainDefault}'` : domain.$domainDefault}`;
|
|
749
|
+
}
|
|
750
|
+
if (domain.$constraints) {
|
|
751
|
+
sql += ' ' + domain.$constraints.join(' ');
|
|
752
|
+
}
|
|
753
|
+
return sql + ';';
|
|
754
|
+
}
|
|
755
|
+
function pgComposite(name, fields) {
|
|
756
|
+
const compositeFn = (columnName) => {
|
|
757
|
+
const col = createColumnWithName(name, columnName);
|
|
758
|
+
col.$fields = fields;
|
|
759
|
+
return col;
|
|
760
|
+
};
|
|
761
|
+
Object.assign(compositeFn, {
|
|
762
|
+
$typeName: name,
|
|
763
|
+
$fields: fields,
|
|
764
|
+
$inferType: {},
|
|
765
|
+
});
|
|
766
|
+
return compositeFn;
|
|
767
|
+
}
|
|
768
|
+
function generateCompositeTypeSQL(composite) {
|
|
769
|
+
const fieldDefs = [];
|
|
770
|
+
for (const [fieldName, fieldConfig] of Object.entries(composite.$fields)) {
|
|
771
|
+
const config = fieldConfig;
|
|
772
|
+
let fieldDef = `"${fieldName}" ${config.$type}`;
|
|
773
|
+
if (config.$nullable === false) {
|
|
774
|
+
fieldDef += ' NOT NULL';
|
|
775
|
+
}
|
|
776
|
+
fieldDefs.push(fieldDef);
|
|
777
|
+
}
|
|
778
|
+
return `CREATE TYPE "${composite.$typeName}" AS (\n ${fieldDefs.join(',\n ')}\n);`;
|
|
779
|
+
}
|
|
780
|
+
const customType = (typeName, columnName) => createColumnWithName(typeName, columnName);
|
|
781
|
+
exports.customType = customType;
|
|
782
|
+
const enumType = (name, values, columnName) => {
|
|
783
|
+
const col = createColumnWithName(name, columnName);
|
|
784
|
+
col.$enumValues = values;
|
|
785
|
+
return col;
|
|
786
|
+
};
|
|
787
|
+
exports.enumType = enumType;
|
|
788
|
+
const compositeType = (typeName, columnName) => createColumnWithName(typeName, columnName);
|
|
789
|
+
exports.compositeType = compositeType;
|
|
790
|
+
function sqlExpr(sql) {
|
|
791
|
+
const branded = Object.create(null);
|
|
792
|
+
Object.defineProperty(branded, '$sql', { value: sql, enumerable: false });
|
|
793
|
+
return branded;
|
|
794
|
+
}
|
|
795
|
+
const genRandomUuid = () => sqlExpr('gen_random_uuid()');
|
|
796
|
+
exports.genRandomUuid = genRandomUuid;
|
|
797
|
+
const uuidV4 = () => sqlExpr('uuid_generate_v4()');
|
|
798
|
+
exports.uuidV4 = uuidV4;
|
|
799
|
+
const now = () => sqlExpr('NOW()');
|
|
800
|
+
exports.now = now;
|
|
801
|
+
const currentTimestamp = () => sqlExpr('CURRENT_TIMESTAMP');
|
|
802
|
+
exports.currentTimestamp = currentTimestamp;
|
|
803
|
+
const currentDate = () => sqlExpr('CURRENT_DATE');
|
|
804
|
+
exports.currentDate = currentDate;
|
|
805
|
+
const emptyObject = () => sqlExpr("'{}'");
|
|
806
|
+
exports.emptyObject = emptyObject;
|
|
807
|
+
const emptyArray = () => sqlExpr("'[]'");
|
|
808
|
+
exports.emptyArray = emptyArray;
|
|
809
|
+
function sql(strings, ...values) {
|
|
810
|
+
let result = strings[0];
|
|
811
|
+
for (let i = 0; i < values.length; i++) {
|
|
812
|
+
result += String(values[i]) + strings[i + 1];
|
|
813
|
+
}
|
|
814
|
+
return sqlExpr(result);
|
|
815
|
+
}
|
|
816
|
+
const raw = (expression) => sqlExpr(expression);
|
|
817
|
+
exports.raw = raw;
|
|
818
|
+
const index = (name) => ({
|
|
819
|
+
name,
|
|
820
|
+
on: (...columns) => ({
|
|
821
|
+
name,
|
|
822
|
+
columns,
|
|
823
|
+
unique() { return { name, columns, unique: true, isUnique: true }; },
|
|
824
|
+
using(method) {
|
|
825
|
+
return { name, columns, using: method, method };
|
|
826
|
+
},
|
|
827
|
+
}),
|
|
828
|
+
});
|
|
829
|
+
exports.index = index;
|