durcno 1.0.0-alpha.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 +201 -0
- package/README.md +56 -0
- package/dist/bin.cjs +13522 -0
- package/dist/src/_virtual/_rolldown/runtime.mjs +28 -0
- package/dist/src/cli/helpers.mjs +16 -0
- package/dist/src/columns/bigint.d.mts +19 -0
- package/dist/src/columns/bigint.mjs +32 -0
- package/dist/src/columns/bigserial.d.mts +24 -0
- package/dist/src/columns/bigserial.mjs +35 -0
- package/dist/src/columns/boolean.d.mts +19 -0
- package/dist/src/columns/boolean.mjs +31 -0
- package/dist/src/columns/bytea.d.mts +19 -0
- package/dist/src/columns/bytea.mjs +33 -0
- package/dist/src/columns/char.d.mts +32 -0
- package/dist/src/columns/char.mjs +44 -0
- package/dist/src/columns/cidr.d.mts +19 -0
- package/dist/src/columns/cidr.mjs +31 -0
- package/dist/src/columns/common.d.mts +233 -0
- package/dist/src/columns/common.mjs +276 -0
- package/dist/src/columns/date.d.mts +19 -0
- package/dist/src/columns/date.mjs +32 -0
- package/dist/src/columns/enum.d.mts +21 -0
- package/dist/src/columns/enum.mjs +35 -0
- package/dist/src/columns/inet.d.mts +19 -0
- package/dist/src/columns/inet.mjs +36 -0
- package/dist/src/columns/integer.d.mts +19 -0
- package/dist/src/columns/integer.mjs +32 -0
- package/dist/src/columns/json.d.mts +52 -0
- package/dist/src/columns/json.mjs +67 -0
- package/dist/src/columns/jsonb.d.mts +53 -0
- package/dist/src/columns/jsonb.mjs +68 -0
- package/dist/src/columns/macaddr.d.mts +19 -0
- package/dist/src/columns/macaddr.mjs +31 -0
- package/dist/src/columns/numeric.d.mts +42 -0
- package/dist/src/columns/numeric.mjs +57 -0
- package/dist/src/columns/postgis/geography/index.d.mts +18 -0
- package/dist/src/columns/postgis/geography/index.mjs +17 -0
- package/dist/src/columns/postgis/geography/linestring.d.mts +38 -0
- package/dist/src/columns/postgis/geography/linestring.mjs +70 -0
- package/dist/src/columns/postgis/geography/multilinestring.d.mts +39 -0
- package/dist/src/columns/postgis/geography/multilinestring.mjs +70 -0
- package/dist/src/columns/postgis/geography/multipoint.d.mts +38 -0
- package/dist/src/columns/postgis/geography/multipoint.mjs +70 -0
- package/dist/src/columns/postgis/geography/multipolygon.d.mts +40 -0
- package/dist/src/columns/postgis/geography/multipolygon.mjs +70 -0
- package/dist/src/columns/postgis/geography/point.d.mts +36 -0
- package/dist/src/columns/postgis/geography/point.mjs +69 -0
- package/dist/src/columns/postgis/geography/polygon.d.mts +39 -0
- package/dist/src/columns/postgis/geography/polygon.mjs +70 -0
- package/dist/src/columns/serial.d.mts +24 -0
- package/dist/src/columns/serial.mjs +35 -0
- package/dist/src/columns/smallint.d.mts +19 -0
- package/dist/src/columns/smallint.mjs +32 -0
- package/dist/src/columns/smallserial.d.mts +24 -0
- package/dist/src/columns/smallserial.mjs +35 -0
- package/dist/src/columns/text.d.mts +19 -0
- package/dist/src/columns/text.mjs +30 -0
- package/dist/src/columns/time.d.mts +44 -0
- package/dist/src/columns/time.mjs +47 -0
- package/dist/src/columns/timestamp.d.mts +44 -0
- package/dist/src/columns/timestamp.mjs +47 -0
- package/dist/src/columns/uuid.d.mts +33 -0
- package/dist/src/columns/uuid.mjs +44 -0
- package/dist/src/columns/varchar.d.mts +32 -0
- package/dist/src/columns/varchar.mjs +44 -0
- package/dist/src/connectors/bun.d.mts +18 -0
- package/dist/src/connectors/bun.mjs +97 -0
- package/dist/src/connectors/common.d.mts +148 -0
- package/dist/src/connectors/common.mjs +65 -0
- package/dist/src/connectors/pg.d.mts +18 -0
- package/dist/src/connectors/pg.mjs +103 -0
- package/dist/src/connectors/pglite.d.mts +19 -0
- package/dist/src/connectors/pglite.mjs +94 -0
- package/dist/src/connectors/postgres.d.mts +18 -0
- package/dist/src/connectors/postgres.mjs +93 -0
- package/dist/src/constraints/check.d.mts +88 -0
- package/dist/src/constraints/check.mjs +307 -0
- package/dist/src/constraints/primary-key.d.mts +28 -0
- package/dist/src/constraints/primary-key.mjs +36 -0
- package/dist/src/constraints/unique.d.mts +28 -0
- package/dist/src/constraints/unique.mjs +36 -0
- package/dist/src/db.d.mts +180 -0
- package/dist/src/db.mjs +191 -0
- package/dist/src/entity.mjs +23 -0
- package/dist/src/enumtype.d.mts +27 -0
- package/dist/src/enumtype.mjs +42 -0
- package/dist/src/filters/array.d.mts +97 -0
- package/dist/src/filters/array.mjs +150 -0
- package/dist/src/filters/custom.d.mts +12 -0
- package/dist/src/filters/custom.mjs +7 -0
- package/dist/src/filters/index.d.mts +155 -0
- package/dist/src/filters/index.mjs +318 -0
- package/dist/src/functions/index.d.mts +24 -0
- package/dist/src/functions/index.mjs +29 -0
- package/dist/src/index.d.mts +129 -0
- package/dist/src/index.mjs +78 -0
- package/dist/src/indexes.d.mts +31 -0
- package/dist/src/indexes.mjs +43 -0
- package/dist/src/migration/consts.d.mts +8 -0
- package/dist/src/migration/consts.mjs +8 -0
- package/dist/src/migration/ddl.d.mts +747 -0
- package/dist/src/migration/ddl.mjs +1084 -0
- package/dist/src/migration/index.d.mts +15 -0
- package/dist/src/migration/index.mjs +5 -0
- package/dist/src/migration/snapshot.d.mts +169 -0
- package/dist/src/migration/snapshot.mjs +123 -0
- package/dist/src/migration/statement.d.mts +89 -0
- package/dist/src/migration/statement.mjs +61 -0
- package/dist/src/models.d.mts +34 -0
- package/dist/src/models.mjs +27 -0
- package/dist/src/node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/index.mjs +126 -0
- package/dist/src/node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/utilities.mjs +29 -0
- package/dist/src/node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/ansi-styles/index.mjs +165 -0
- package/dist/src/node_modules/.pnpm/chalk@5.6.2/node_modules/chalk/source/vendor/supports-color/index.mjs +92 -0
- package/dist/src/query-builders/aggregates.d.mts +20 -0
- package/dist/src/query-builders/aggregates.mjs +43 -0
- package/dist/src/query-builders/count.d.mts +19 -0
- package/dist/src/query-builders/count.mjs +36 -0
- package/dist/src/query-builders/delete.d.mts +19 -0
- package/dist/src/query-builders/delete.mjs +57 -0
- package/dist/src/query-builders/distinct.d.mts +19 -0
- package/dist/src/query-builders/distinct.mjs +42 -0
- package/dist/src/query-builders/exists.d.mts +19 -0
- package/dist/src/query-builders/exists.mjs +37 -0
- package/dist/src/query-builders/first.d.mts +17 -0
- package/dist/src/query-builders/first.mjs +46 -0
- package/dist/src/query-builders/insert-returning.d.mts +16 -0
- package/dist/src/query-builders/insert-returning.mjs +63 -0
- package/dist/src/query-builders/insert.d.mts +22 -0
- package/dist/src/query-builders/insert.mjs +93 -0
- package/dist/src/query-builders/orderby-clause.d.mts +14 -0
- package/dist/src/query-builders/orderby-clause.mjs +20 -0
- package/dist/src/query-builders/pre.d.mts +36 -0
- package/dist/src/query-builders/pre.mjs +60 -0
- package/dist/src/query-builders/query-promise.d.mts +14 -0
- package/dist/src/query-builders/query-promise.mjs +21 -0
- package/dist/src/query-builders/query.d.mts +14 -0
- package/dist/src/query-builders/query.mjs +17 -0
- package/dist/src/query-builders/raw.d.mts +14 -0
- package/dist/src/query-builders/raw.mjs +26 -0
- package/dist/src/query-builders/rq.d.mts +36 -0
- package/dist/src/query-builders/rq.mjs +231 -0
- package/dist/src/query-builders/select.d.mts +48 -0
- package/dist/src/query-builders/select.mjs +118 -0
- package/dist/src/query-builders/update.d.mts +24 -0
- package/dist/src/query-builders/update.mjs +99 -0
- package/dist/src/sequence.d.mts +48 -0
- package/dist/src/sequence.mjs +53 -0
- package/dist/src/sql.d.mts +15 -0
- package/dist/src/sql.mjs +36 -0
- package/dist/src/symbols.d.mts +4 -0
- package/dist/src/symbols.mjs +4 -0
- package/dist/src/table.d.mts +144 -0
- package/dist/src/table.mjs +134 -0
- package/dist/src/types.d.mts +4 -0
- package/dist/src/utils.mjs +10 -0
- package/dist/src/validators/zod.d.mts +23 -0
- package/dist/src/validators/zod.mjs +27 -0
- package/dist/src/wkx/binaryreader.mjs +56 -0
- package/dist/src/wkx/binarywriter.mjs +110 -0
- package/dist/src/wkx/geometry.mjs +101 -0
- package/dist/src/wkx/geometrycollection.mjs +113 -0
- package/dist/src/wkx/index.mjs +18 -0
- package/dist/src/wkx/linestring.mjs +124 -0
- package/dist/src/wkx/multilinestring.mjs +133 -0
- package/dist/src/wkx/multipoint.mjs +120 -0
- package/dist/src/wkx/multipolygon.mjs +155 -0
- package/dist/src/wkx/parser.mjs +183 -0
- package/dist/src/wkx/point.mjs +159 -0
- package/dist/src/wkx/polygon.mjs +189 -0
- package/dist/src/wkx/types.mjs +37 -0
- package/dist/src/wkx/wktparser.mjs +109 -0
- package/dist/src/wkx/zigzag.mjs +18 -0
- package/package.json +100 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
2
|
+
import { snakeToCamel } from "../utils.mjs";
|
|
3
|
+
import { Query } from "./query.mjs";
|
|
4
|
+
//#region src/query-builders/insert-returning.ts
|
|
5
|
+
var InsertReturningQuery = class extends QueryPromise {
|
|
6
|
+
#$table;
|
|
7
|
+
#$values;
|
|
8
|
+
#$config;
|
|
9
|
+
#$executor;
|
|
10
|
+
constructor(table, values, config, executor) {
|
|
11
|
+
super();
|
|
12
|
+
this.#$table = table;
|
|
13
|
+
this.#$values = values;
|
|
14
|
+
this.#$config = config;
|
|
15
|
+
this.#$executor = executor;
|
|
16
|
+
}
|
|
17
|
+
toQuery() {
|
|
18
|
+
const query = new Query("INSERT INTO ", this.handleRows.bind(this));
|
|
19
|
+
query.sql += this.#$table._.fullName;
|
|
20
|
+
const allFields = /* @__PURE__ */ new Set();
|
|
21
|
+
for (const field of Object.keys(this.#$values)) allFields.add(field);
|
|
22
|
+
for (const col in this.#$table._.columns) {
|
|
23
|
+
const column = this.#$table._.columns[col];
|
|
24
|
+
if (!allFields.has(col) && column.hasInsertFn) allFields.add(column.name);
|
|
25
|
+
}
|
|
26
|
+
const fields = Array.from(allFields);
|
|
27
|
+
query.sql += " ( ";
|
|
28
|
+
query.sql += fields.map((field) => `"${this.#$table._.columns[field].nameSnake}"`).join(", ");
|
|
29
|
+
query.sql += " ) VALUES ( ";
|
|
30
|
+
const rowValues = [];
|
|
31
|
+
for (const field of fields) {
|
|
32
|
+
let value = this.#$values[field];
|
|
33
|
+
if (value === void 0) {
|
|
34
|
+
const column = this.#$table._.columns[field];
|
|
35
|
+
if (column?.hasInsertFn) value = column.getInsertFnVal();
|
|
36
|
+
}
|
|
37
|
+
const driverValue = this.#$table._.columns[field]?.toDriver(value);
|
|
38
|
+
query.arguments.push(driverValue);
|
|
39
|
+
rowValues.push(`$${query.arguments.length}`);
|
|
40
|
+
}
|
|
41
|
+
query.sql += rowValues.join(", ");
|
|
42
|
+
query.sql += " ) RETURNING *;";
|
|
43
|
+
return query;
|
|
44
|
+
}
|
|
45
|
+
async execute() {
|
|
46
|
+
const query = this.toQuery();
|
|
47
|
+
const res = await this.#$executor.query(query.sql, query.arguments);
|
|
48
|
+
const rows = this.#$executor.getRows(res);
|
|
49
|
+
return this.handleRows(rows);
|
|
50
|
+
}
|
|
51
|
+
handleRows(rows) {
|
|
52
|
+
const row = rows[0];
|
|
53
|
+
const { columns } = this.#$table._;
|
|
54
|
+
for (const [key, value] of Object.entries(row)) {
|
|
55
|
+
const keyCamel = snakeToCamel(key);
|
|
56
|
+
row[keyCamel] = columns[keyCamel].fromDriver(value);
|
|
57
|
+
if (keyCamel !== key) delete row[key];
|
|
58
|
+
}
|
|
59
|
+
return row;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { InsertReturningQuery };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Query } from "./query.mjs";
|
|
2
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
3
|
+
import { AnyColumn, TableWithColumns } from "../table.mjs";
|
|
4
|
+
import { Config } from "../index.mjs";
|
|
5
|
+
import { QueryExecutor } from "../connectors/common.mjs";
|
|
6
|
+
|
|
7
|
+
//#region src/query-builders/insert.d.ts
|
|
8
|
+
declare class InsertBuilder<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>> {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(table: TTableWC, config: Config, executor: QueryExecutor);
|
|
11
|
+
values(values: { [colName in keyof TTableWC["_"]["columns"] as TTableWC["_"]["columns"][colName]["ValTypeInsert"] extends never ? never : undefined extends TTableWC["_"]["columns"][colName]["ValTypeInsert"] ? never : colName]: TTableWC["_"]["columns"][colName]["ValTypeInsert"] } & { [colName in keyof TTableWC["_"]["columns"] as TTableWC["_"]["columns"][colName]["ValTypeInsert"] extends never ? never : undefined extends TTableWC["_"]["columns"][colName]["ValTypeInsert"] ? colName : never]?: Exclude<TTableWC["_"]["columns"][colName]["ValTypeInsert"], undefined> } extends infer TValues ? { [colName in keyof TValues as TValues[colName] extends never ? never : colName]: TValues[colName] } | { [colName in keyof TValues as TValues[colName] extends never ? never : colName]: TValues[colName] }[] : never): InsertQuery<TTableWC, undefined, null>;
|
|
12
|
+
}
|
|
13
|
+
declare class InsertQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TReturning extends { [ColName in keyof TTableWC["_"]["columns"]]?: true } | { [ColName in keyof TTableWC["_"]["columns"]]?: false } | undefined, TReturn = (TReturning extends Record<Key, boolean> ? TReturning extends { [ColName in keyof TTableWC["_"]["columns"]]?: false } ? { [ColName in keyof TTableWC["_"]["columns"] as TReturning[ColName] extends false ? never : ColName]: TTableWC["_"]["columns"][ColName]["ValTypeSelect"] }[] : { [ColName in keyof TTableWC["_"]["columns"] as TReturning[ColName] extends true ? ColName : never]: TTableWC["_"]["columns"][ColName]["ValTypeSelect"] }[] : null)> extends QueryPromise<TReturn> {
|
|
14
|
+
#private;
|
|
15
|
+
constructor(table: TTableWC, values: Record<string, unknown> | Record<string, unknown>[], returnings: TReturning, config: Config, executor: QueryExecutor);
|
|
16
|
+
returning<TReturnings extends { [ColName in keyof TTableWC["_"]["columns"]]?: true } | { [ColName in keyof TTableWC["_"]["columns"]]?: false }>(returnings: TReturnings): InsertQuery<TTableWC, TReturnings, TReturnings extends Record<Key, boolean> ? TReturnings extends { [ColName in keyof TTableWC["_"]["columns"]]?: false | undefined } ? { [ColName_1 in keyof TTableWC["_"]["columns"] as TReturnings[ColName_1] extends false ? never : ColName_1]: TTableWC["_"]["columns"][ColName_1]["ValTypeSelect"] }[] : { [ColName_2 in keyof TTableWC["_"]["columns"] as TReturnings[ColName_2] extends true ? ColName_2 : never]: TTableWC["_"]["columns"][ColName_2]["ValTypeSelect"] }[] : null>;
|
|
17
|
+
toQuery(): Query<TReturn>;
|
|
18
|
+
execute(): Promise<TReturn>;
|
|
19
|
+
handleRows(rows: Record<string, unknown>[]): TReturn;
|
|
20
|
+
}
|
|
21
|
+
//#endregion
|
|
22
|
+
export { InsertBuilder };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
2
|
+
import { snakeToCamel } from "../utils.mjs";
|
|
3
|
+
import { Query } from "./query.mjs";
|
|
4
|
+
//#region src/query-builders/insert.ts
|
|
5
|
+
var InsertBuilder = class {
|
|
6
|
+
#table;
|
|
7
|
+
#config;
|
|
8
|
+
#executor;
|
|
9
|
+
constructor(table, config, executor) {
|
|
10
|
+
this.#table = table;
|
|
11
|
+
this.#config = config;
|
|
12
|
+
this.#executor = executor;
|
|
13
|
+
}
|
|
14
|
+
values(values) {
|
|
15
|
+
return new InsertQuery(this.#table, values, void 0, this.#config, this.#executor);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
var InsertQuery = class InsertQuery extends QueryPromise {
|
|
19
|
+
#table;
|
|
20
|
+
#$values;
|
|
21
|
+
#$returning;
|
|
22
|
+
#config;
|
|
23
|
+
#executor;
|
|
24
|
+
constructor(table, values, returnings, config, executor) {
|
|
25
|
+
super();
|
|
26
|
+
this.#table = table;
|
|
27
|
+
this.#$values = values;
|
|
28
|
+
this.#$returning = returnings;
|
|
29
|
+
this.#config = config;
|
|
30
|
+
this.#executor = executor;
|
|
31
|
+
}
|
|
32
|
+
returning(returnings) {
|
|
33
|
+
return new InsertQuery(this.#table, this.#$values, returnings, this.#config, this.#executor);
|
|
34
|
+
}
|
|
35
|
+
toQuery() {
|
|
36
|
+
const query = new Query("INSERT INTO ", this.handleRows.bind(this));
|
|
37
|
+
query.sql += this.#table._.fullName;
|
|
38
|
+
const valuesArray = Array.isArray(this.#$values) ? this.#$values : [this.#$values];
|
|
39
|
+
const allFields = /* @__PURE__ */ new Set();
|
|
40
|
+
for (const row of valuesArray) for (const field of Object.keys(row)) allFields.add(field);
|
|
41
|
+
for (const col in this.#table._.columns) {
|
|
42
|
+
const column = this.#table._.columns[col];
|
|
43
|
+
if (!allFields.has(col) && column.hasInsertFn) allFields.add(column.name);
|
|
44
|
+
}
|
|
45
|
+
const fields = Array.from(allFields);
|
|
46
|
+
query.sql += " ( ";
|
|
47
|
+
query.sql += fields.map((field) => `"${this.#table._.columns[field].nameSnake}"`).join(", ");
|
|
48
|
+
query.sql += " ) VALUES";
|
|
49
|
+
const rowPlaceholders = [];
|
|
50
|
+
for (let rowIndex = 0; rowIndex < valuesArray.length; rowIndex++) {
|
|
51
|
+
const row = valuesArray[rowIndex];
|
|
52
|
+
const rowValues = [];
|
|
53
|
+
for (const field of fields) {
|
|
54
|
+
let value = row[field];
|
|
55
|
+
if (value === void 0) {
|
|
56
|
+
const column = this.#table._.columns[field];
|
|
57
|
+
if (column?.hasInsertFn) value = column.getInsertFnVal();
|
|
58
|
+
}
|
|
59
|
+
const driverValue = this.#table._.columns[field]?.toDriver(value);
|
|
60
|
+
query.arguments.push(driverValue);
|
|
61
|
+
rowValues.push(`$${query.arguments.length}`);
|
|
62
|
+
}
|
|
63
|
+
rowPlaceholders.push(`(${rowValues.join(", ")})`);
|
|
64
|
+
}
|
|
65
|
+
query.sql += rowPlaceholders.join(",\n ");
|
|
66
|
+
if (this.#$returning) {
|
|
67
|
+
query.sql += " RETURNING ";
|
|
68
|
+
const returningFields = Object.keys(this.#$returning).filter((k) => this.#$returning?.[k] === true);
|
|
69
|
+
query.sql += returningFields.map((field) => `"${this.#table._.columns[field].nameSnake}"`).join(", ");
|
|
70
|
+
}
|
|
71
|
+
query.sql += ";";
|
|
72
|
+
return query;
|
|
73
|
+
}
|
|
74
|
+
async execute() {
|
|
75
|
+
const query = this.toQuery();
|
|
76
|
+
const res = await this.#executor.query(query.sql, query.arguments);
|
|
77
|
+
const rows = this.#executor.getRows(res);
|
|
78
|
+
return this.handleRows(rows);
|
|
79
|
+
}
|
|
80
|
+
handleRows(rows) {
|
|
81
|
+
const { columns } = this.#table._;
|
|
82
|
+
rows.forEach((row) => {
|
|
83
|
+
for (const [key, value] of Object.entries(row)) {
|
|
84
|
+
const keyCamel = snakeToCamel(key);
|
|
85
|
+
row[keyCamel] = columns[keyCamel].fromDriver(value);
|
|
86
|
+
if (keyCamel !== key) delete row[key];
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
return rows;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
//#endregion
|
|
93
|
+
export { InsertBuilder };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { AnyColumn, AnyTableWithColumns, TableColumn } from "../table.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/query-builders/orderby-clause.d.ts
|
|
4
|
+
declare class Order<TTSchema extends string, TTName extends string, TCName extends Key, TCol extends AnyColumn, TOrder extends "ASC" | "DESC"> {
|
|
5
|
+
readonly field: TableColumn<TTSchema, TTName, TCName, TCol>;
|
|
6
|
+
readonly order: TOrder;
|
|
7
|
+
constructor(field: TableColumn<TTSchema, TTName, TCName, TCol>, order: TOrder);
|
|
8
|
+
toSQL(): string;
|
|
9
|
+
}
|
|
10
|
+
type OrderBy<TTableWC extends AnyTableWithColumns> = TTableWC extends any ? { [ColName in keyof TTableWC["_"]["columns"]]: TTableWC["_"]["columns"][ColName] extends TableColumn<infer TTSchema, infer TTName, infer TCName, infer TColumn> ? Order<TTSchema, TTName, TCName, TColumn, "ASC" | "DESC"> : never }[keyof TTableWC["_"]["columns"]] : never;
|
|
11
|
+
declare function asc<CTSchema extends string, CTName extends string, CName extends Key, Col extends AnyColumn>(field: TableColumn<CTSchema, CTName, CName, Col>): Order<CTSchema, CTName, CName, Col, "ASC">;
|
|
12
|
+
declare function desc<CTSchema extends string, CTName extends string, CName extends Key, Col extends AnyColumn>(field: TableColumn<CTSchema, CTName, CName, Col>): Order<CTSchema, CTName, CName, Col, "DESC">;
|
|
13
|
+
//#endregion
|
|
14
|
+
export { OrderBy, asc, desc };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
//#region src/query-builders/orderby-clause.ts
|
|
2
|
+
var Order = class {
|
|
3
|
+
field;
|
|
4
|
+
order;
|
|
5
|
+
constructor(field, order) {
|
|
6
|
+
this.field = field;
|
|
7
|
+
this.order = order;
|
|
8
|
+
}
|
|
9
|
+
toSQL() {
|
|
10
|
+
return `${this.field.fullName} ${this.order}`;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
function asc(field) {
|
|
14
|
+
return new Order(field, "ASC");
|
|
15
|
+
}
|
|
16
|
+
function desc(field) {
|
|
17
|
+
return new Order(field, "DESC");
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { asc, desc };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Query } from "./query.mjs";
|
|
2
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
3
|
+
import { AnyDBorTX } from "../db.mjs";
|
|
4
|
+
import { entityType } from "../symbols.mjs";
|
|
5
|
+
import { Config } from "../index.mjs";
|
|
6
|
+
import { QueryExecutor } from "../connectors/common.mjs";
|
|
7
|
+
|
|
8
|
+
//#region src/query-builders/pre.d.ts
|
|
9
|
+
declare class Arg<TType> {
|
|
10
|
+
static readonly [entityType] = "Arg";
|
|
11
|
+
readonly type: TType;
|
|
12
|
+
index: number;
|
|
13
|
+
key: string;
|
|
14
|
+
readonly handler: (val: TType) => string | number | null;
|
|
15
|
+
constructor(handler: (val: TType) => string | number | null);
|
|
16
|
+
}
|
|
17
|
+
type AnyArg = Arg<any>;
|
|
18
|
+
declare class PreparedStatement<TArgs extends Record<string, AnyArg>, TReturn> {
|
|
19
|
+
#private;
|
|
20
|
+
constructor(query: Query, args: TArgs);
|
|
21
|
+
run(db: AnyDBorTX, values: { [K in keyof TArgs]: TArgs[K]["type"] }): PreparedQuery<TReturn>;
|
|
22
|
+
}
|
|
23
|
+
declare class PreparedQuery<TReturn> extends QueryPromise<TReturn> {
|
|
24
|
+
readonly query: Query;
|
|
25
|
+
readonly config: Config;
|
|
26
|
+
readonly executor: QueryExecutor;
|
|
27
|
+
constructor(query: Query, config: Config, executor: QueryExecutor);
|
|
28
|
+
toQuery(): Query<TReturn>;
|
|
29
|
+
execute(): Promise<TReturn>;
|
|
30
|
+
handleRows(rows: any[]): TReturn;
|
|
31
|
+
}
|
|
32
|
+
declare function prequery<TArgs extends Record<string, AnyArg>, TReturn>(args: TArgs, statement: (...args: [{ [K in keyof TArgs]: TArgs[K] }]) => Promise<TReturn> & {
|
|
33
|
+
toQuery: () => Query;
|
|
34
|
+
}): PreparedStatement<TArgs, TReturn>;
|
|
35
|
+
//#endregion
|
|
36
|
+
export { Arg, prequery };
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { entityType } from "../symbols.mjs";
|
|
2
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
3
|
+
//#region src/query-builders/pre.ts
|
|
4
|
+
var Arg = class {
|
|
5
|
+
static [entityType] = "Arg";
|
|
6
|
+
type;
|
|
7
|
+
index = 0;
|
|
8
|
+
key = "";
|
|
9
|
+
handler;
|
|
10
|
+
constructor(handler) {
|
|
11
|
+
this.handler = handler;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var PreparedStatement = class {
|
|
15
|
+
#query;
|
|
16
|
+
#args;
|
|
17
|
+
constructor(query, args) {
|
|
18
|
+
this.#query = query;
|
|
19
|
+
this.#args = args;
|
|
20
|
+
}
|
|
21
|
+
run(db, values) {
|
|
22
|
+
const args = [];
|
|
23
|
+
for (const k of this.#query.arguments) args.push(this.#args[k].handler(values[k]));
|
|
24
|
+
this.#query.arguments = args;
|
|
25
|
+
return new PreparedQuery(this.#query, db.$.config, db._.getExecutor());
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
var PreparedQuery = class extends QueryPromise {
|
|
29
|
+
query;
|
|
30
|
+
config;
|
|
31
|
+
executor;
|
|
32
|
+
constructor(query, config, executor) {
|
|
33
|
+
super();
|
|
34
|
+
this.query = query;
|
|
35
|
+
this.config = config;
|
|
36
|
+
this.executor = executor;
|
|
37
|
+
}
|
|
38
|
+
toQuery() {
|
|
39
|
+
return this.query;
|
|
40
|
+
}
|
|
41
|
+
async execute() {
|
|
42
|
+
const res = await this.executor.query(this.query.sql, this.query.arguments);
|
|
43
|
+
const rows = this.executor.getRows(res);
|
|
44
|
+
return this.handleRows(rows);
|
|
45
|
+
}
|
|
46
|
+
handleRows(rows) {
|
|
47
|
+
return this.query.rowsHandler(rows);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
function prequery(args, statement) {
|
|
51
|
+
const keys = Object.keys(args).sort();
|
|
52
|
+
for (let i = 0; i < keys.length; i++) {
|
|
53
|
+
const key = keys[i];
|
|
54
|
+
args[key].index = i + 1;
|
|
55
|
+
args[key].key = key;
|
|
56
|
+
}
|
|
57
|
+
return new PreparedStatement(statement(args).toQuery(), args);
|
|
58
|
+
}
|
|
59
|
+
//#endregion
|
|
60
|
+
export { Arg, prequery };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Query } from "./query.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/query-builders/query-promise.d.ts
|
|
4
|
+
declare abstract class QueryPromise<T> implements Promise<T> {
|
|
5
|
+
[Symbol.toStringTag]: string;
|
|
6
|
+
catch<TResult = never>(onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined): Promise<T | TResult>;
|
|
7
|
+
finally(onFinally?: (() => void) | null | undefined): Promise<T>;
|
|
8
|
+
then<TResult1 = T, TResult2 = never>(onFulfilled: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null, onRejected: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
|
|
9
|
+
abstract toQuery(): Query<T>;
|
|
10
|
+
abstract execute(): Promise<T>;
|
|
11
|
+
abstract handleRows(rows: any[]): T;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { QueryPromise };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
//#region src/query-builders/query-promise.ts
|
|
2
|
+
var QueryPromise = class {
|
|
3
|
+
[Symbol.toStringTag] = "QueryPromise";
|
|
4
|
+
catch(onRejected) {
|
|
5
|
+
return this.then(void 0, onRejected);
|
|
6
|
+
}
|
|
7
|
+
finally(onFinally) {
|
|
8
|
+
return this.then((value) => {
|
|
9
|
+
onFinally?.();
|
|
10
|
+
return value;
|
|
11
|
+
}, (reason) => {
|
|
12
|
+
onFinally?.();
|
|
13
|
+
throw reason;
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
then(onFulfilled, onRejected) {
|
|
17
|
+
return this.execute().then(onFulfilled).catch(onRejected);
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
//#endregion
|
|
21
|
+
export { QueryPromise };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Arg } from "./pre.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/query-builders/query.d.ts
|
|
4
|
+
type SqlArgType = string | number | null;
|
|
5
|
+
declare class Query<T = unknown> {
|
|
6
|
+
readonly returnType: T;
|
|
7
|
+
sql: string;
|
|
8
|
+
arguments: SqlArgType[];
|
|
9
|
+
rowsHandler: (rows: any[]) => T;
|
|
10
|
+
constructor(sql: string, rowsHandler: (rows: any[]) => T);
|
|
11
|
+
addArg(arg: Arg<any>): void;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { Query };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
//#region src/query-builders/query.ts
|
|
2
|
+
var Query = class {
|
|
3
|
+
returnType;
|
|
4
|
+
sql;
|
|
5
|
+
arguments = [];
|
|
6
|
+
rowsHandler;
|
|
7
|
+
constructor(sql, rowsHandler) {
|
|
8
|
+
this.sql = sql;
|
|
9
|
+
this.rowsHandler = rowsHandler;
|
|
10
|
+
}
|
|
11
|
+
addArg(arg) {
|
|
12
|
+
this.sql += `$${arg.index}`;
|
|
13
|
+
this.arguments.push(arg.key);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
17
|
+
export { Query };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Query } from "./query.mjs";
|
|
2
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
3
|
+
import { QueryExecutor } from "../connectors/common.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/query-builders/raw.d.ts
|
|
6
|
+
declare class RawQuery<TReturn> extends QueryPromise<TReturn> {
|
|
7
|
+
#private;
|
|
8
|
+
readonly handleRows: (rows: unknown[]) => TReturn;
|
|
9
|
+
constructor(query: string, args: (string | number | null)[] | undefined, rowsHandler: ((rows: unknown[]) => TReturn) | undefined, executor: QueryExecutor);
|
|
10
|
+
toQuery(): Query<TReturn>;
|
|
11
|
+
execute(): Promise<TReturn>;
|
|
12
|
+
}
|
|
13
|
+
//#endregion
|
|
14
|
+
export { RawQuery };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
2
|
+
import { Query } from "./query.mjs";
|
|
3
|
+
//#region src/query-builders/raw.ts
|
|
4
|
+
var RawQuery = class extends QueryPromise {
|
|
5
|
+
#queryStr;
|
|
6
|
+
#args;
|
|
7
|
+
#executor;
|
|
8
|
+
handleRows;
|
|
9
|
+
constructor(query, args = [], rowsHandler, executor) {
|
|
10
|
+
super();
|
|
11
|
+
this.#queryStr = query;
|
|
12
|
+
this.#args = args;
|
|
13
|
+
this.handleRows = rowsHandler ?? ((rows) => rows);
|
|
14
|
+
this.#executor = executor;
|
|
15
|
+
}
|
|
16
|
+
toQuery() {
|
|
17
|
+
return new Query(this.#queryStr, this.handleRows.bind(this));
|
|
18
|
+
}
|
|
19
|
+
async execute() {
|
|
20
|
+
const res = await this.#executor.query(this.#queryStr, this.#args);
|
|
21
|
+
const rows = this.#executor.getRows(res);
|
|
22
|
+
return this.handleRows(rows);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { RawQuery };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Query } from "./query.mjs";
|
|
2
|
+
import { OrderBy } from "./orderby-clause.mjs";
|
|
3
|
+
import { QueryPromise } from "./query-promise.mjs";
|
|
4
|
+
import { BuildFilterExpression } from "../filters/index.mjs";
|
|
5
|
+
import { AnyColumn, AnyRelation, Fk, Many, Relations, StdRelations, TColsToLeftRight, TableWithColumns } from "../table.mjs";
|
|
6
|
+
import { Config } from "../index.mjs";
|
|
7
|
+
import { QueryExecutor } from "../connectors/common.mjs";
|
|
8
|
+
|
|
9
|
+
//#region src/query-builders/rq.d.ts
|
|
10
|
+
type RelationReturnType<O, TRelation extends AnyRelation> = TRelation extends Many<any, any, any, any> ? O[] : TRelation extends Fk<any, any, any, infer TCol> ? TCol["isNotNull"] extends true ? O : O | null : O | null;
|
|
11
|
+
type OptionsBase<TTSchema extends string, TTName extends string, TTColumns extends Record<string, AnyColumn>, TAllRelations extends Record<string, StdRelations>> = {
|
|
12
|
+
columns?: Partial<Record<keyof TableWithColumns<TTSchema, TTName, TTColumns>["_"]["columns"], true>> | Partial<Record<keyof TableWithColumns<TTSchema, TTName, TTColumns>["_"]["columns"], false>>;
|
|
13
|
+
where?: BuildFilterExpression<TColsToLeftRight<TableWithColumns<TTSchema, TTName, TTColumns>["_"]["columns"]>>;
|
|
14
|
+
orderBy?: OrderBy<TableWithColumns<TTSchema, TTName, TTColumns>> | OrderBy<TableWithColumns<TTSchema, TTName, TTColumns>>[];
|
|
15
|
+
limit?: number;
|
|
16
|
+
with?: keyof TAllRelations[`"${TTSchema}"."${TTName}"`]["map"] extends never ? never : { [TRelationName in keyof TAllRelations[`"${TTSchema}"."${TTName}"`]["map"]]?: OptionsBase<TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TRelationName]["table"]["_"]["schema"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TRelationName]["table"]["_"]["name"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TRelationName]["table"]["_"]["cols"], TAllRelations> };
|
|
17
|
+
};
|
|
18
|
+
type Options<TTSchema extends string, TTName extends string, TTColumns extends Record<string, AnyColumn>, TAllRelations extends Record<string, StdRelations>, TOffset extends boolean = false> = OptionsBase<TTSchema, TTName, TTColumns, TAllRelations> & {
|
|
19
|
+
offset?: TOffset extends true ? number : never;
|
|
20
|
+
};
|
|
21
|
+
type Object$1<TTSchema extends string, TTName extends string, TTColumns extends Record<string, AnyColumn>, TAllRelations extends Record<string, Relations<any, any, Record<any, any>, Record<any, AnyRelation>>>, TOptions extends OptionsBase<TTSchema, TTName, TTColumns, TAllRelations>> = (keyof TOptions["columns"] extends never ? TableWithColumns<TTSchema, TTName, TTColumns>["$"]["inferSelect"] : TOptions["columns"] extends Record<string, true> ? { [ColName in keyof TTColumns as TOptions["columns"][ColName] extends true ? ColName : never]: TTColumns[ColName]["ValTypeSelect"] } : TOptions["columns"] extends Record<string, false> ? { [ColName in keyof TTColumns as TOptions["columns"][ColName] extends false ? never : ColName]: TTColumns[ColName]["ValTypeSelect"] } : TableWithColumns<TTSchema, TTName, TTColumns>["$"]["inferSelect"]) & (keyof TOptions["with"] extends never ? Record<never, never> : { [TWith in keyof TOptions["with"]]: TOptions["with"][TWith] extends infer TNestedOptions ? TNestedOptions extends OptionsBase<TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["schema"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["name"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["cols"], TAllRelations> ? RelationReturnType<{ [K in keyof Object$1<TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["schema"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["name"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["cols"], TAllRelations, TNestedOptions>]: Object$1<TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["schema"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["name"], TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]["table"]["_"]["cols"], TAllRelations, TNestedOptions>[K] }, TAllRelations[`"${TTSchema}"."${TTName}"`]["map"][TWith]> : never : never });
|
|
22
|
+
declare class RelationQueryBuilder<TTSchema extends string, TTName extends string, TTColumns extends Record<string, AnyColumn>, TTRelations extends Relations<TTSchema, TTName, TTColumns, Record<any, AnyRelation>>, TAllRelations extends Record<string, StdRelations>> {
|
|
23
|
+
#private;
|
|
24
|
+
constructor(table: TableWithColumns<TTSchema, TTName, TTColumns>, relations: TTRelations, allRelations: TAllRelations, config: Config, executor: QueryExecutor);
|
|
25
|
+
findMany<TOptions extends Options<TTSchema, TTName, TTColumns, TAllRelations, true>>(options: TOptions): RelationQuery<TTSchema, TTName, TTColumns, TTRelations, TAllRelations, TOptions, { [K in keyof Object$1<TTSchema, TTName, TTColumns, TAllRelations, TOptions>]: Object$1<TTSchema, TTName, TTColumns, TAllRelations, TOptions>[K] }[]>;
|
|
26
|
+
findFirst<TOptions extends Options<TTSchema, TTName, TTColumns, TAllRelations>>(options: TOptions): Promise<{ [K in keyof Object$1<TTSchema, TTName, TTColumns, TAllRelations, TOptions>]: Object$1<TTSchema, TTName, TTColumns, TAllRelations, TOptions>[K] } | null>;
|
|
27
|
+
}
|
|
28
|
+
declare class RelationQuery<TTSchema extends string, TTName extends string, TTColumns extends Record<string, AnyColumn>, TTRelations extends Relations<TTSchema, TTName, TTColumns, Record<any, AnyRelation>>, TAllRelations extends Record<string, StdRelations>, TOptions extends Options<TTSchema, TTName, TTColumns, TAllRelations, true>, TReturn = { [K in keyof Object$1<TTSchema, TTName, TTColumns, TAllRelations, TOptions>]: Object$1<TTSchema, TTName, TTColumns, TAllRelations, TOptions>[K] }[]> extends QueryPromise<TReturn> {
|
|
29
|
+
#private;
|
|
30
|
+
constructor(table: TableWithColumns<TTSchema, TTName, TTColumns>, relations: TTRelations, allRelations: TAllRelations, options: TOptions, config: Config, executor: QueryExecutor);
|
|
31
|
+
toQuery(): Query<TReturn>;
|
|
32
|
+
execute(): Promise<TReturn>;
|
|
33
|
+
handleRows(rows: Record<string, unknown>[]): TReturn;
|
|
34
|
+
}
|
|
35
|
+
//#endregion
|
|
36
|
+
export { RelationQueryBuilder };
|