durcno 1.0.0-alpha.4 → 1.0.0-alpha.5
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/README.md +1 -1
- package/dist/bin.cjs +1 -1
- package/dist/src/columns/common.d.mts +1 -0
- package/dist/src/columns/postgis/geography/linestring.d.mts +1 -0
- package/dist/src/columns/postgis/geography/multilinestring.d.mts +1 -0
- package/dist/src/columns/postgis/geography/multipoint.d.mts +1 -0
- package/dist/src/columns/postgis/geography/multipolygon.d.mts +1 -0
- package/dist/src/columns/postgis/geography/point.d.mts +1 -0
- package/dist/src/columns/postgis/geography/polygon.d.mts +1 -0
- package/dist/src/constraints/check.d.mts +1 -0
- package/dist/src/constraints/primary-key.d.mts +1 -0
- package/dist/src/constraints/unique.d.mts +1 -0
- package/dist/src/db.d.mts +16 -16
- package/dist/src/db.mjs +8 -8
- package/dist/src/filters/array.mjs +10 -23
- package/dist/src/filters/index.d.mts +1 -0
- package/dist/src/index.d.mts +2 -10
- package/dist/src/indexes.d.mts +1 -0
- package/dist/src/logger.d.mts +8 -4
- package/dist/src/logger.mjs +8 -4
- package/dist/src/query-builders/aggregates.d.mts +3 -2
- package/dist/src/query-builders/aggregates.mjs +5 -2
- package/dist/src/query-builders/count.d.mts +2 -2
- package/dist/src/query-builders/count.mjs +5 -2
- package/dist/src/query-builders/delete.d.mts +1 -0
- package/dist/src/query-builders/distinct.d.mts +3 -2
- package/dist/src/query-builders/distinct.mjs +5 -2
- package/dist/src/query-builders/exists.d.mts +2 -2
- package/dist/src/query-builders/exists.mjs +5 -2
- package/dist/src/query-builders/first.d.mts +2 -2
- package/dist/src/query-builders/first.mjs +5 -2
- package/dist/src/query-builders/insert.d.mts +1 -0
- package/dist/src/query-builders/insert.mjs +17 -27
- package/dist/src/query-builders/orderby-clause.d.mts +1 -0
- package/dist/src/query-builders/select.d.mts +1 -0
- package/dist/src/query-builders/update.d.mts +1 -0
- package/dist/src/table.d.mts +1 -1
- package/dist/src/types.d.mts +8 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ npm exec durcno init
|
|
|
40
40
|
|
|
41
41
|
Get started with Durcno by following our comprehensive documentation.
|
|
42
42
|
|
|
43
|
-
**[Read the Documentation](https://durcno.dev/docs)**
|
|
43
|
+
**[Read the Documentation](https://durcno.dev/docs/latest/intro)**
|
|
44
44
|
|
|
45
45
|
> [!WARNING]
|
|
46
46
|
> Durcno is currently in the alpha stage.
|
package/dist/bin.cjs
CHANGED
|
@@ -13508,7 +13508,7 @@ async function status(options) {
|
|
|
13508
13508
|
}
|
|
13509
13509
|
|
|
13510
13510
|
// src/cli/index.ts
|
|
13511
|
-
program.version("1.0.0-alpha.
|
|
13511
|
+
program.version("1.0.0-alpha.4");
|
|
13512
13512
|
var Options = {
|
|
13513
13513
|
config: ["--config <path>", "Path to the config file"]
|
|
13514
13514
|
};
|
package/dist/src/db.d.mts
CHANGED
|
@@ -60,24 +60,24 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
|
|
|
60
60
|
* @param where Optional where clause to filter rows
|
|
61
61
|
* @returns Promise<number> - the count of matching rows
|
|
62
62
|
*/
|
|
63
|
-
$count<TTable extends TTables[keyof TTables]>(table: TTable): CountQuery<TTable>;
|
|
64
|
-
$count<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
63
|
+
$count<TTable extends TTables[keyof TTables]>(table: TTable): CountQuery<TTable, TPrepare>;
|
|
64
|
+
$count<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, where: TWhere): CountQuery<TTable, TPrepare>;
|
|
65
65
|
/**
|
|
66
66
|
* Check if any rows exist in a table, optionally filtered by a where clause.
|
|
67
67
|
* @param table The table to check
|
|
68
68
|
* @param where Optional where clause to filter rows
|
|
69
69
|
* @returns Promise<boolean> - true if at least one row exists
|
|
70
70
|
*/
|
|
71
|
-
$exists<TTable extends TTables[keyof TTables]>(table: TTable): ExistsQuery<TTable>;
|
|
72
|
-
$exists<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
71
|
+
$exists<TTable extends TTables[keyof TTables]>(table: TTable): ExistsQuery<TTable, TPrepare>;
|
|
72
|
+
$exists<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, where: TWhere): ExistsQuery<TTable, TPrepare>;
|
|
73
73
|
/**
|
|
74
74
|
* Get the first row from a table, optionally filtered by a where clause.
|
|
75
75
|
* @param table The table to query
|
|
76
76
|
* @param where Optional where clause to filter rows
|
|
77
77
|
* @returns Promise<T | null> - the first row or null if no rows match
|
|
78
78
|
*/
|
|
79
|
-
$first<TTable extends TTables[keyof TTables]>(table: TTable): FirstQuery<TTable>;
|
|
80
|
-
$first<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
79
|
+
$first<TTable extends TTables[keyof TTables]>(table: TTable): FirstQuery<TTable, TPrepare>;
|
|
80
|
+
$first<TTable extends TTables[keyof TTables], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, where: TWhere): FirstQuery<TTable, TPrepare>;
|
|
81
81
|
/**
|
|
82
82
|
* Calculate the sum of a numeric column.
|
|
83
83
|
* @param table The table to query
|
|
@@ -85,8 +85,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
|
|
|
85
85
|
* @param where Optional where clause to filter rows
|
|
86
86
|
* @returns Promise<number | null> - the sum or null if no rows match
|
|
87
87
|
*/
|
|
88
|
-
$sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
|
|
89
|
-
$sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
88
|
+
$sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
89
|
+
$sum<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
90
90
|
/**
|
|
91
91
|
* Calculate the average of a numeric column.
|
|
92
92
|
* @param table The table to query
|
|
@@ -94,8 +94,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
|
|
|
94
94
|
* @param where Optional where clause to filter rows
|
|
95
95
|
* @returns Promise<number | null> - the average or null if no rows match
|
|
96
96
|
*/
|
|
97
|
-
$avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
|
|
98
|
-
$avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
97
|
+
$avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
98
|
+
$avg<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
99
99
|
/**
|
|
100
100
|
* Find the minimum value of a column.
|
|
101
101
|
* @param table The table to query
|
|
@@ -103,8 +103,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
|
|
|
103
103
|
* @param where Optional where clause to filter rows
|
|
104
104
|
* @returns Promise<number | null> - the minimum value or null if no rows match
|
|
105
105
|
*/
|
|
106
|
-
$min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
|
|
107
|
-
$min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
106
|
+
$min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
107
|
+
$min<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
108
108
|
/**
|
|
109
109
|
* Find the maximum value of a column.
|
|
110
110
|
* @param table The table to query
|
|
@@ -112,8 +112,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
|
|
|
112
112
|
* @param where Optional where clause to filter rows
|
|
113
113
|
* @returns Promise<number | null> - the maximum value or null if no rows match
|
|
114
114
|
*/
|
|
115
|
-
$max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null>;
|
|
116
|
-
$max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
115
|
+
$max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
116
|
+
$max<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): AggregateQuery<TTable, TColumn, number | null, TPrepare>;
|
|
117
117
|
/**
|
|
118
118
|
* Get distinct values of a column.
|
|
119
119
|
* @param table The table to query
|
|
@@ -121,8 +121,8 @@ declare class Base<TTName extends string, TTables extends Record<TTName, TableWi
|
|
|
121
121
|
* @param where Optional where clause to filter rows
|
|
122
122
|
* @returns Promise<T[]> - array of distinct values
|
|
123
123
|
*/
|
|
124
|
-
$distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][]>;
|
|
125
|
-
$distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]
|
|
124
|
+
$distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]]>(table: TTable, column: TColumn): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][], TPrepare>;
|
|
125
|
+
$distinct<TTable extends TTables[keyof TTables], TColumn extends TTable["_"]["columns"][keyof TTable["_"]["columns"]], TWhere extends BuildFilterExpression<TColsToLeftRight<TTable["_"]["columns"]>, TPrepare>>(table: TTable, column: TColumn, where: TWhere): DistinctQuery<TTable, TColumn, TColumn["ValTypeSelect"][], TPrepare>;
|
|
126
126
|
/**
|
|
127
127
|
* Insert a row and return the inserted row with all columns.
|
|
128
128
|
* @param table The table to insert into
|
package/dist/src/db.mjs
CHANGED
|
@@ -67,28 +67,28 @@ var Base = class {
|
|
|
67
67
|
return new DeleteQuery(table, void 0, void 0, this.#getExecutor(), this.$.pre);
|
|
68
68
|
}
|
|
69
69
|
$count(table, where) {
|
|
70
|
-
return new CountQuery(table, where, this.#getExecutor());
|
|
70
|
+
return new CountQuery(table, where, this.#getExecutor(), this.$.pre);
|
|
71
71
|
}
|
|
72
72
|
$exists(table, where) {
|
|
73
|
-
return new ExistsQuery(table, where, this.#getExecutor());
|
|
73
|
+
return new ExistsQuery(table, where, this.#getExecutor(), this.$.pre);
|
|
74
74
|
}
|
|
75
75
|
$first(table, where) {
|
|
76
|
-
return new FirstQuery(table, where, this.#getExecutor());
|
|
76
|
+
return new FirstQuery(table, where, this.#getExecutor(), this.$.pre);
|
|
77
77
|
}
|
|
78
78
|
$sum(table, column, where) {
|
|
79
|
-
return new AggregateQuery(table, column, "SUM", where, this.#getExecutor());
|
|
79
|
+
return new AggregateQuery(table, column, "SUM", where, this.#getExecutor(), this.$.pre);
|
|
80
80
|
}
|
|
81
81
|
$avg(table, column, where) {
|
|
82
|
-
return new AggregateQuery(table, column, "AVG", where, this.#getExecutor());
|
|
82
|
+
return new AggregateQuery(table, column, "AVG", where, this.#getExecutor(), this.$.pre);
|
|
83
83
|
}
|
|
84
84
|
$min(table, column, where) {
|
|
85
|
-
return new AggregateQuery(table, column, "MIN", where, this.#getExecutor());
|
|
85
|
+
return new AggregateQuery(table, column, "MIN", where, this.#getExecutor(), this.$.pre);
|
|
86
86
|
}
|
|
87
87
|
$max(table, column, where) {
|
|
88
|
-
return new AggregateQuery(table, column, "MAX", where, this.#getExecutor());
|
|
88
|
+
return new AggregateQuery(table, column, "MAX", where, this.#getExecutor(), this.$.pre);
|
|
89
89
|
}
|
|
90
90
|
$distinct(table, column, where) {
|
|
91
|
-
return new DistinctQuery(table, column, where, this.#getExecutor());
|
|
91
|
+
return new DistinctQuery(table, column, where, this.#getExecutor(), this.$.pre);
|
|
92
92
|
}
|
|
93
93
|
/**
|
|
94
94
|
* Insert a row and return the inserted row with all columns.
|
|
@@ -1,18 +1,5 @@
|
|
|
1
1
|
import { Filter } from "./custom.mjs";
|
|
2
2
|
//#region src/filters/array.ts
|
|
3
|
-
/** Converts an array of values to a PostgreSQL array literal. */
|
|
4
|
-
function arrayToSql(values) {
|
|
5
|
-
if (values.length === 0) return "'{}'";
|
|
6
|
-
return `ARRAY[${values.map((v) => {
|
|
7
|
-
if (typeof v === "string") return `'${v.replace(/'/g, "''")}'`;
|
|
8
|
-
return String(v);
|
|
9
|
-
}).join(", ")}]`;
|
|
10
|
-
}
|
|
11
|
-
/** Converts a single value to a SQL literal. */
|
|
12
|
-
function valueToSql(value) {
|
|
13
|
-
if (typeof value === "string") return `'${value.replace(/'/g, "''")}'`;
|
|
14
|
-
return String(value);
|
|
15
|
-
}
|
|
16
3
|
/**
|
|
17
4
|
* ArrayContains filter: col @> ARRAY[values]
|
|
18
5
|
* Returns true if the array column contains all the specified values.
|
|
@@ -26,10 +13,10 @@ var ArrayContainsFilter = class extends Filter {
|
|
|
26
13
|
this.right = values;
|
|
27
14
|
}
|
|
28
15
|
toSQL() {
|
|
29
|
-
return `${this.left.fullName} @> ${
|
|
16
|
+
return `${this.left.fullName} @> ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
|
|
30
17
|
}
|
|
31
18
|
toQuery(query) {
|
|
32
|
-
query.sql += `${this.left.fullName} @> ${
|
|
19
|
+
query.sql += `${this.left.fullName} @> ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
|
|
33
20
|
}
|
|
34
21
|
};
|
|
35
22
|
/**
|
|
@@ -55,10 +42,10 @@ var ArrayContainedByFilter = class extends Filter {
|
|
|
55
42
|
this.right = values;
|
|
56
43
|
}
|
|
57
44
|
toSQL() {
|
|
58
|
-
return `${this.left.fullName} <@ ${
|
|
45
|
+
return `${this.left.fullName} <@ ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
|
|
59
46
|
}
|
|
60
47
|
toQuery(query) {
|
|
61
|
-
query.sql += `${this.left.fullName} <@ ${
|
|
48
|
+
query.sql += `${this.left.fullName} <@ ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
|
|
62
49
|
}
|
|
63
50
|
};
|
|
64
51
|
/**
|
|
@@ -81,10 +68,10 @@ var ArrayOverlapsFilter = class extends Filter {
|
|
|
81
68
|
this.right = values;
|
|
82
69
|
}
|
|
83
70
|
toSQL() {
|
|
84
|
-
return `${this.left.fullName} && ${
|
|
71
|
+
return `${this.left.fullName} && ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
|
|
85
72
|
}
|
|
86
73
|
toQuery(query) {
|
|
87
|
-
query.sql += `${this.left.fullName} && ${
|
|
74
|
+
query.sql += `${this.left.fullName} && ${this.left.toSQL(this.right)}::${this.left.sqlType}`;
|
|
88
75
|
}
|
|
89
76
|
};
|
|
90
77
|
/**
|
|
@@ -107,10 +94,10 @@ var ArrayHasFilter = class extends Filter {
|
|
|
107
94
|
this.right = value;
|
|
108
95
|
}
|
|
109
96
|
toSQL() {
|
|
110
|
-
return `${
|
|
97
|
+
return `${this.left.toSQLScalar(this.right)} = ANY(${this.left.fullName})`;
|
|
111
98
|
}
|
|
112
99
|
toQuery(query) {
|
|
113
|
-
query.sql += `${
|
|
100
|
+
query.sql += `${this.left.toSQLScalar(this.right)} = ANY(${this.left.fullName})`;
|
|
114
101
|
}
|
|
115
102
|
};
|
|
116
103
|
/**
|
|
@@ -133,10 +120,10 @@ var ArrayAllFilter = class extends Filter {
|
|
|
133
120
|
this.right = value;
|
|
134
121
|
}
|
|
135
122
|
toSQL() {
|
|
136
|
-
return `${
|
|
123
|
+
return `${this.left.toSQLScalar(this.right)} = ALL(${this.left.fullName})`;
|
|
137
124
|
}
|
|
138
125
|
toQuery(query) {
|
|
139
|
-
query.sql += `${
|
|
126
|
+
query.sql += `${this.left.toSQLScalar(this.right)} = ALL(${this.left.fullName})`;
|
|
140
127
|
}
|
|
141
128
|
};
|
|
142
129
|
/**
|
package/dist/src/index.d.mts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DurcnoLogger } from "./logger.mjs";
|
|
2
2
|
import { Query } from "./query-builders/query.mjs";
|
|
3
|
+
import { Is, Key, Prettify, SelfOrArray, SelfOrReadonly, UnionToIntersection, Valueof } from "./types.mjs";
|
|
3
4
|
import { asc, desc } from "./query-builders/orderby-clause.mjs";
|
|
4
5
|
import { Sql, sql } from "./sql.mjs";
|
|
5
6
|
import { Filter } from "./filters/custom.mjs";
|
|
@@ -91,14 +92,5 @@ type Config<T extends Connector = Connector> = {
|
|
|
91
92
|
*/
|
|
92
93
|
connector: T;
|
|
93
94
|
};
|
|
94
|
-
declare global {
|
|
95
|
-
type Key = string | number | symbol;
|
|
96
|
-
type Valueof<T> = T extends any ? T[keyof T] : never;
|
|
97
|
-
type SelfOrArray<T> = T | T[];
|
|
98
|
-
type SelfOrReadonly<T> = T | Readonly<T>;
|
|
99
|
-
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
|
|
100
|
-
type Is<T, U> = T extends U ? true : false;
|
|
101
|
-
type Prettify<T> = { [K in keyof T]: T[K] } & {};
|
|
102
|
-
}
|
|
103
95
|
//#endregion
|
|
104
|
-
export { $, type $Client, type AnyColumn, type AnyTableColumn, Arg, Column, type ColumnConfig, Config, type ConnectorOptions, type DurcnoLogger, Filter, Migrations, PrimaryKeyConstraint, Query, Sql, type TableColumn, UniqueConstraint, type UuidVersion, and, arrayAll, arrayContainedBy, arrayContains, arrayHas, arrayOverlaps, asc, bigint, bigserial, boolean, bytea, char, cidr, database, date, defineConfig, desc, enumed, enumtype, eq, fk, geography, gt, gte, index, inet, integer, isIn, isNotNull, isNull, json, jsonb, lt, lte, macaddr, many, ne, notNull, now, numeric, one, or, pk, prequery, primaryKey, primaryKeyConstraint, relations, sequence, serial, smallint, smallserial, sql, table, text, time, timestamp, unique, uniqueConstraint, uniqueIndex, uuid, uuidv4, uuidv7, varchar };
|
|
96
|
+
export { $, type $Client, type AnyColumn, type AnyTableColumn, Arg, Column, type ColumnConfig, Config, type ConnectorOptions, type DurcnoLogger, Filter, type Is, type Key, Migrations, type Prettify, PrimaryKeyConstraint, Query, type SelfOrArray, type SelfOrReadonly, Sql, type TableColumn, type UnionToIntersection, UniqueConstraint, type UuidVersion, type Valueof, and, arrayAll, arrayContainedBy, arrayContains, arrayHas, arrayOverlaps, asc, bigint, bigserial, boolean, bytea, char, cidr, database, date, defineConfig, desc, enumed, enumtype, eq, fk, geography, gt, gte, index, inet, integer, isIn, isNotNull, isNull, json, jsonb, lt, lte, macaddr, many, ne, notNull, now, numeric, one, or, pk, prequery, primaryKey, primaryKeyConstraint, relations, sequence, serial, smallint, smallserial, sql, table, text, time, timestamp, unique, uniqueConstraint, uniqueIndex, uuid, uuidv4, uuidv7, varchar };
|
package/dist/src/indexes.d.mts
CHANGED
package/dist/src/logger.d.mts
CHANGED
|
@@ -15,7 +15,7 @@ interface DurcnoLogger {
|
|
|
15
15
|
*
|
|
16
16
|
* @example
|
|
17
17
|
* ```ts
|
|
18
|
-
* import {
|
|
18
|
+
* import { createQueryLogger } from "durcno/logger";
|
|
19
19
|
* import { defineConfig } from "durcno";
|
|
20
20
|
* import { pg } from "durcno/connectors/pg";
|
|
21
21
|
*
|
|
@@ -23,10 +23,14 @@ interface DurcnoLogger {
|
|
|
23
23
|
* schema: "db/schema.ts",
|
|
24
24
|
* out: "migrations",
|
|
25
25
|
* dbCredentials: { url: process.env.DATABASE_URL! },
|
|
26
|
-
* logger:
|
|
26
|
+
* logger: createQueryLogger(),
|
|
27
27
|
* });
|
|
28
28
|
* ```
|
|
29
29
|
*/
|
|
30
|
-
declare function
|
|
30
|
+
declare function createQueryLogger(): DurcnoLogger;
|
|
31
|
+
/**
|
|
32
|
+
* @deprecated Use `createQueryLogger` instead.
|
|
33
|
+
*/
|
|
34
|
+
declare const createDurcnoLogger: typeof createQueryLogger;
|
|
31
35
|
//#endregion
|
|
32
|
-
export { DurcnoLogger, createDurcnoLogger };
|
|
36
|
+
export { DurcnoLogger, createDurcnoLogger, createQueryLogger };
|
package/dist/src/logger.mjs
CHANGED
|
@@ -35,7 +35,7 @@ const durcnoFormat = printf(({ level, message, label, timestamp, sql, arguments:
|
|
|
35
35
|
*
|
|
36
36
|
* @example
|
|
37
37
|
* ```ts
|
|
38
|
-
* import {
|
|
38
|
+
* import { createQueryLogger } from "durcno/logger";
|
|
39
39
|
* import { defineConfig } from "durcno";
|
|
40
40
|
* import { pg } from "durcno/connectors/pg";
|
|
41
41
|
*
|
|
@@ -43,15 +43,19 @@ const durcnoFormat = printf(({ level, message, label, timestamp, sql, arguments:
|
|
|
43
43
|
* schema: "db/schema.ts",
|
|
44
44
|
* out: "migrations",
|
|
45
45
|
* dbCredentials: { url: process.env.DATABASE_URL! },
|
|
46
|
-
* logger:
|
|
46
|
+
* logger: createQueryLogger(),
|
|
47
47
|
* });
|
|
48
48
|
* ```
|
|
49
49
|
*/
|
|
50
|
-
function
|
|
50
|
+
function createQueryLogger() {
|
|
51
51
|
return createLogger({
|
|
52
52
|
format: combine(label({ label: "durcno" }), timestamp(), durcnoFormat),
|
|
53
53
|
transports: [new transports.Console()]
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* @deprecated Use `createQueryLogger` instead.
|
|
58
|
+
*/
|
|
59
|
+
const createDurcnoLogger = createQueryLogger;
|
|
56
60
|
//#endregion
|
|
57
|
-
export { createDurcnoLogger };
|
|
61
|
+
export { createDurcnoLogger, createQueryLogger };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Query } from "./query.mjs";
|
|
2
|
+
import { Key } from "../types.mjs";
|
|
2
3
|
import { QueryPromise } from "./query-promise.mjs";
|
|
3
4
|
import { BuildFilterExpression } from "../filters/index.mjs";
|
|
4
5
|
import { AnyColumn, TColsToLeftRight, TableColumn, TableWithColumns } from "../table.mjs";
|
|
@@ -6,9 +7,9 @@ import { QueryExecutor } from "../connectors/common.mjs";
|
|
|
6
7
|
|
|
7
8
|
//#region src/query-builders/aggregates.d.ts
|
|
8
9
|
type AggregateFunction = "SUM" | "AVG" | "MIN" | "MAX";
|
|
9
|
-
declare class AggregateQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn extends number | null> extends QueryPromise<TReturn> {
|
|
10
|
+
declare class AggregateQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn extends number | null, TPrepare extends boolean = false> extends QueryPromise<TReturn> {
|
|
10
11
|
#private;
|
|
11
|
-
constructor(table: TTableWC, column: TColumn, fn: AggregateFunction, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]
|
|
12
|
+
constructor(table: TTableWC, column: TColumn, fn: AggregateFunction, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
|
|
12
13
|
toQuery(): Query<TReturn>;
|
|
13
14
|
execute(): Promise<TReturn>;
|
|
14
15
|
handleRows(rows: {
|
|
@@ -7,13 +7,15 @@ var AggregateQuery = class extends QueryPromise {
|
|
|
7
7
|
#$fn;
|
|
8
8
|
#$where;
|
|
9
9
|
#$executor;
|
|
10
|
-
|
|
10
|
+
#$prepare;
|
|
11
|
+
constructor(table, column, fn, where, executor, prepare = false) {
|
|
11
12
|
super();
|
|
12
13
|
this.#$table = table;
|
|
13
14
|
this.#$column = column;
|
|
14
15
|
this.#$fn = fn;
|
|
15
16
|
this.#$where = where;
|
|
16
17
|
this.#$executor = executor;
|
|
18
|
+
this.#$prepare = prepare;
|
|
17
19
|
}
|
|
18
20
|
toQuery() {
|
|
19
21
|
const columnName = this.#$column.fullName;
|
|
@@ -21,7 +23,8 @@ var AggregateQuery = class extends QueryPromise {
|
|
|
21
23
|
query.sql += this.#$table._.fullName;
|
|
22
24
|
if (this.#$where) {
|
|
23
25
|
query.sql += " WHERE ";
|
|
24
|
-
|
|
26
|
+
if (this.#$prepare) this.#$where.toQuery(query);
|
|
27
|
+
else query.sql += this.#$where.toSQL();
|
|
25
28
|
}
|
|
26
29
|
return query;
|
|
27
30
|
}
|
|
@@ -5,9 +5,9 @@ import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
|
|
|
5
5
|
import { QueryExecutor } from "../connectors/common.mjs";
|
|
6
6
|
|
|
7
7
|
//#region src/query-builders/count.d.ts
|
|
8
|
-
declare class CountQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn
|
|
8
|
+
declare class CountQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TPrepare extends boolean = false> extends QueryPromise<number> {
|
|
9
9
|
#private;
|
|
10
|
-
constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]
|
|
10
|
+
constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
|
|
11
11
|
toQuery(): Query<number>;
|
|
12
12
|
execute(): Promise<number>;
|
|
13
13
|
handleRows(rows: {
|
|
@@ -5,18 +5,21 @@ var CountQuery = class extends QueryPromise {
|
|
|
5
5
|
#$table;
|
|
6
6
|
#$where;
|
|
7
7
|
#$executor;
|
|
8
|
-
|
|
8
|
+
#$prepare;
|
|
9
|
+
constructor(table, where, executor, prepare = false) {
|
|
9
10
|
super();
|
|
10
11
|
this.#$table = table;
|
|
11
12
|
this.#$where = where;
|
|
12
13
|
this.#$executor = executor;
|
|
14
|
+
this.#$prepare = prepare;
|
|
13
15
|
}
|
|
14
16
|
toQuery() {
|
|
15
17
|
const query = new Query("SELECT count(*) FROM ", this.handleRows.bind(this));
|
|
16
18
|
query.sql += this.#$table._.fullName;
|
|
17
19
|
if (this.#$where) {
|
|
18
20
|
query.sql += " WHERE ";
|
|
19
|
-
|
|
21
|
+
if (this.#$prepare) this.#$where.toQuery(query);
|
|
22
|
+
else query.sql += this.#$where.toSQL();
|
|
20
23
|
}
|
|
21
24
|
return query;
|
|
22
25
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Query } from "./query.mjs";
|
|
2
|
+
import { Key } from "../types.mjs";
|
|
2
3
|
import { QueryPromise } from "./query-promise.mjs";
|
|
3
4
|
import { BuildFilterExpression } from "../filters/index.mjs";
|
|
4
5
|
import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Query } from "./query.mjs";
|
|
2
|
+
import { Key } from "../types.mjs";
|
|
2
3
|
import { QueryPromise } from "./query-promise.mjs";
|
|
3
4
|
import { BuildFilterExpression } from "../filters/index.mjs";
|
|
4
5
|
import { AnyColumn, TColsToLeftRight, TableColumn, TableWithColumns } from "../table.mjs";
|
|
5
6
|
import { QueryExecutor } from "../connectors/common.mjs";
|
|
6
7
|
|
|
7
8
|
//#region src/query-builders/distinct.d.ts
|
|
8
|
-
declare class DistinctQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn = TColumn["ValTypeSelect"][]> extends QueryPromise<TReturn> {
|
|
9
|
+
declare class DistinctQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TColumn extends TableColumn<string, string, Key, AnyColumn>, TReturn = TColumn["ValTypeSelect"][], TPrepare extends boolean = false> extends QueryPromise<TReturn> {
|
|
9
10
|
#private;
|
|
10
|
-
constructor(table: TTableWC, column: TColumn, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]
|
|
11
|
+
constructor(table: TTableWC, column: TColumn, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
|
|
11
12
|
toQuery(): Query<TReturn>;
|
|
12
13
|
execute(): Promise<TReturn>;
|
|
13
14
|
handleRows(rows: {
|
|
@@ -6,12 +6,14 @@ var DistinctQuery = class extends QueryPromise {
|
|
|
6
6
|
#$column;
|
|
7
7
|
#$where;
|
|
8
8
|
#$executor;
|
|
9
|
-
|
|
9
|
+
#$prepare;
|
|
10
|
+
constructor(table, column, where, executor, prepare = false) {
|
|
10
11
|
super();
|
|
11
12
|
this.#$table = table;
|
|
12
13
|
this.#$column = column;
|
|
13
14
|
this.#$where = where;
|
|
14
15
|
this.#$executor = executor;
|
|
16
|
+
this.#$prepare = prepare;
|
|
15
17
|
}
|
|
16
18
|
toQuery() {
|
|
17
19
|
const columnName = this.#$column.fullName;
|
|
@@ -19,7 +21,8 @@ var DistinctQuery = class extends QueryPromise {
|
|
|
19
21
|
query.sql += this.#$table._.fullName;
|
|
20
22
|
if (this.#$where) {
|
|
21
23
|
query.sql += " WHERE ";
|
|
22
|
-
|
|
24
|
+
if (this.#$prepare) this.#$where.toQuery(query);
|
|
25
|
+
else query.sql += this.#$where.toSQL();
|
|
23
26
|
}
|
|
24
27
|
query.sql += ` ORDER BY ${columnName}`;
|
|
25
28
|
return query;
|
|
@@ -5,9 +5,9 @@ import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
|
|
|
5
5
|
import { QueryExecutor } from "../connectors/common.mjs";
|
|
6
6
|
|
|
7
7
|
//#region src/query-builders/exists.d.ts
|
|
8
|
-
declare class ExistsQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn
|
|
8
|
+
declare class ExistsQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TPrepare extends boolean = false> extends QueryPromise<boolean> {
|
|
9
9
|
#private;
|
|
10
|
-
constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]
|
|
10
|
+
constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
|
|
11
11
|
toQuery(): Query<boolean>;
|
|
12
12
|
execute(): Promise<boolean>;
|
|
13
13
|
handleRows(rows: {
|
|
@@ -5,18 +5,21 @@ var ExistsQuery = class extends QueryPromise {
|
|
|
5
5
|
#$table;
|
|
6
6
|
#$where;
|
|
7
7
|
#$executor;
|
|
8
|
-
|
|
8
|
+
#$prepare;
|
|
9
|
+
constructor(table, where, executor, prepare = false) {
|
|
9
10
|
super();
|
|
10
11
|
this.#$table = table;
|
|
11
12
|
this.#$where = where;
|
|
12
13
|
this.#$executor = executor;
|
|
14
|
+
this.#$prepare = prepare;
|
|
13
15
|
}
|
|
14
16
|
toQuery() {
|
|
15
17
|
const query = new Query("SELECT EXISTS(SELECT 1 FROM ", this.handleRows.bind(this));
|
|
16
18
|
query.sql += this.#$table._.fullName;
|
|
17
19
|
if (this.#$where) {
|
|
18
20
|
query.sql += " WHERE ";
|
|
19
|
-
|
|
21
|
+
if (this.#$prepare) this.#$where.toQuery(query);
|
|
22
|
+
else query.sql += this.#$where.toSQL();
|
|
20
23
|
}
|
|
21
24
|
query.sql += ")";
|
|
22
25
|
return query;
|
|
@@ -5,9 +5,9 @@ import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
|
|
|
5
5
|
import { QueryExecutor } from "../connectors/common.mjs";
|
|
6
6
|
|
|
7
7
|
//#region src/query-builders/first.d.ts
|
|
8
|
-
declare class FirstQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TReturn = { [ColName in keyof TTableWC["_"]["columns"]]: TTableWC["_"]["columns"][ColName]["ValTypeSelect"] } | null> extends QueryPromise<TReturn> {
|
|
8
|
+
declare class FirstQuery<TTableWC extends TableWithColumns<string, string, Record<string, AnyColumn>>, TPrepare extends boolean = false, TReturn = { [ColName in keyof TTableWC["_"]["columns"]]: TTableWC["_"]["columns"][ColName]["ValTypeSelect"] } | null> extends QueryPromise<TReturn> {
|
|
9
9
|
#private;
|
|
10
|
-
constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]
|
|
10
|
+
constructor(table: TTableWC, where: BuildFilterExpression<TColsToLeftRight<TTableWC["_"]["columns"]>, TPrepare> | undefined, executor: QueryExecutor, prepare?: TPrepare);
|
|
11
11
|
toQuery(): Query<TReturn>;
|
|
12
12
|
execute(): Promise<TReturn>;
|
|
13
13
|
handleRows(rows: Record<string, unknown>[]): TReturn;
|
|
@@ -6,18 +6,21 @@ var FirstQuery = class extends QueryPromise {
|
|
|
6
6
|
#$table;
|
|
7
7
|
#$where;
|
|
8
8
|
#$executor;
|
|
9
|
-
|
|
9
|
+
#$prepare;
|
|
10
|
+
constructor(table, where, executor, prepare = false) {
|
|
10
11
|
super();
|
|
11
12
|
this.#$table = table;
|
|
12
13
|
this.#$where = where;
|
|
13
14
|
this.#$executor = executor;
|
|
15
|
+
this.#$prepare = prepare;
|
|
14
16
|
}
|
|
15
17
|
toQuery() {
|
|
16
18
|
const query = new Query("SELECT * FROM ", this.handleRows.bind(this));
|
|
17
19
|
query.sql += this.#$table._.fullName;
|
|
18
20
|
if (this.#$where) {
|
|
19
21
|
query.sql += " WHERE ";
|
|
20
|
-
|
|
22
|
+
if (this.#$prepare) this.#$where.toQuery(query);
|
|
23
|
+
else query.sql += this.#$where.toSQL();
|
|
21
24
|
}
|
|
22
25
|
query.sql += " LIMIT 1";
|
|
23
26
|
return query;
|
|
@@ -38,38 +38,28 @@ var InsertQuery = class InsertQuery extends QueryPromise {
|
|
|
38
38
|
const query = new Query("INSERT INTO ", this.handleRows.bind(this));
|
|
39
39
|
query.sql += this.#table._.fullName;
|
|
40
40
|
const valuesArray = Array.isArray(this.#$values) ? this.#$values : [this.#$values];
|
|
41
|
-
const
|
|
42
|
-
for (const row of valuesArray) for (const field of Object.keys(row)) allFields.add(field);
|
|
43
|
-
for (const col in this.#table._.columns) {
|
|
44
|
-
const column = this.#table._.columns[col];
|
|
45
|
-
if (!allFields.has(col) && column.hasInsertFn) allFields.add(column.name);
|
|
46
|
-
}
|
|
47
|
-
const fields = Array.from(allFields);
|
|
41
|
+
const fields = Object.keys(this.#table._.columns);
|
|
48
42
|
query.sql += " ( ";
|
|
49
43
|
query.sql += fields.map((field) => `"${this.#table._.columns[field].nameSnake}"`).join(", ");
|
|
50
44
|
query.sql += " ) VALUES";
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
if (
|
|
59
|
-
|
|
60
|
-
rowValues.push("NULL");
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
if (this.#prepare && is(value, Arg)) {
|
|
64
|
-
const cast = value.cast ?? column?.sqlCast ?? null;
|
|
45
|
+
valuesArray.forEach((row, i) => {
|
|
46
|
+
query.sql += "(";
|
|
47
|
+
fields.forEach((fieldName, j) => {
|
|
48
|
+
const value = row[fieldName];
|
|
49
|
+
const column = this.#table._.columns[fieldName];
|
|
50
|
+
if (value === void 0) if (column.hasInsertFn) query.sql += column.toSQL(column.getInsertFnVal(), { cast: true });
|
|
51
|
+
else query.sql += "DEFAULT";
|
|
52
|
+
else if (this.#prepare && is(value, Arg)) {
|
|
53
|
+
const cast = value.cast ?? column.sqlCast ?? null;
|
|
65
54
|
const castSuffix = cast ? `::${cast}` : "";
|
|
66
|
-
|
|
55
|
+
query.sql += `$${value.index}${castSuffix}`;
|
|
67
56
|
query.arguments.push(value.key);
|
|
68
|
-
} else
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
57
|
+
} else query.sql += column.toSQL(value, { cast: true });
|
|
58
|
+
if (j !== fields.length - 1) query.sql += ", ";
|
|
59
|
+
});
|
|
60
|
+
query.sql += ")";
|
|
61
|
+
if (i !== valuesArray.length - 1) query.sql += ",\n";
|
|
62
|
+
});
|
|
73
63
|
if (this.#$returning) {
|
|
74
64
|
query.sql += " RETURNING ";
|
|
75
65
|
const returningFields = Object.keys(this.#$returning).filter((k) => this.#$returning?.[k] === true);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Query } from "./query.mjs";
|
|
2
|
+
import { Key, Prettify, SelfOrArray, UnionToIntersection, Valueof } from "../types.mjs";
|
|
2
3
|
import { OrderBy } from "./orderby-clause.mjs";
|
|
3
4
|
import { QueryPromise } from "./query-promise.mjs";
|
|
4
5
|
import { BuildFilterExpression, StdCondition } from "../filters/index.mjs";
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Query } from "./query.mjs";
|
|
2
|
+
import { Key } from "../types.mjs";
|
|
2
3
|
import { QueryPromise } from "./query-promise.mjs";
|
|
3
4
|
import { BuildFilterExpression } from "../filters/index.mjs";
|
|
4
5
|
import { AnyColumn, TColsToLeftRight, TableWithColumns } from "../table.mjs";
|
package/dist/src/table.d.mts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { CamelToSnake, Key } from "./types.mjs";
|
|
1
2
|
import { entityType } from "./symbols.mjs";
|
|
2
3
|
import { PrimaryKeyConstraint, PrimaryKeyConstraintFn } from "./constraints/primary-key.mjs";
|
|
3
4
|
import { UniqueConstraint, UniqueConstraintFn } from "./constraints/unique.mjs";
|
|
4
5
|
import { Index } from "./indexes.mjs";
|
|
5
6
|
import { Column } from "./columns/common.mjs";
|
|
6
|
-
import { CamelToSnake } from "./types.mjs";
|
|
7
7
|
import { Check, CheckBuilder, CheckExpr } from "./constraints/check.mjs";
|
|
8
8
|
|
|
9
9
|
//#region src/table.d.ts
|
package/dist/src/types.d.mts
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
//#region src/types.d.ts
|
|
2
2
|
type CamelToSnake<S extends string> = S extends `${infer Head}${infer Tail}` ? Head extends Uppercase<Head> ? `_${Lowercase<Head>}${CamelToSnake<Tail>}` : `${Head}${CamelToSnake<Tail>}` : S;
|
|
3
|
+
type Key = string | number | symbol;
|
|
4
|
+
type Valueof<T> = T extends any ? T[keyof T] : never;
|
|
5
|
+
type SelfOrArray<T> = T | T[];
|
|
6
|
+
type SelfOrReadonly<T> = T | Readonly<T>;
|
|
7
|
+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
|
|
8
|
+
type Is<T, U> = T extends U ? true : false;
|
|
9
|
+
type Prettify<T> = { [K in keyof T]: T[K] } & {};
|
|
3
10
|
//#endregion
|
|
4
|
-
export { CamelToSnake };
|
|
11
|
+
export { CamelToSnake, Is, Key, Prettify, SelfOrArray, SelfOrReadonly, UnionToIntersection, Valueof };
|
package/package.json
CHANGED