rado 0.4.9 → 1.0.0-preview.1
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/dist/core/Builder.d.ts +36 -0
- package/dist/core/Builder.js +99 -0
- package/dist/core/Column.d.ts +38 -0
- package/dist/core/Column.js +59 -0
- package/dist/core/Constraint.d.ts +39 -0
- package/dist/core/Constraint.js +87 -0
- package/dist/core/Database.d.ts +43 -0
- package/dist/core/Database.js +58 -0
- package/dist/core/Dialect.d.ts +6 -0
- package/dist/core/Dialect.js +16 -0
- package/dist/core/Driver.d.ts +28 -0
- package/dist/core/Emitter.d.ts +35 -0
- package/dist/core/Emitter.js +153 -0
- package/dist/core/Index.d.ts +28 -0
- package/dist/core/Index.js +50 -0
- package/dist/core/Internal.d.ts +67 -0
- package/dist/core/Internal.js +62 -0
- package/dist/core/MetaData.d.ts +27 -0
- package/dist/core/Param.d.ts +9 -0
- package/dist/core/Param.js +14 -0
- package/dist/core/Query.d.ts +40 -0
- package/dist/core/Query.js +70 -0
- package/dist/core/Resolver.d.ts +23 -0
- package/dist/core/Resolver.js +54 -0
- package/dist/core/Schema.d.ts +4 -0
- package/dist/core/Schema.js +13 -0
- package/dist/core/Selection.d.ts +27 -0
- package/dist/core/Selection.js +88 -0
- package/dist/core/Sql.d.ts +49 -0
- package/dist/core/Sql.js +153 -0
- package/dist/core/Table.d.ts +56 -0
- package/dist/core/Table.js +103 -0
- package/dist/core/Types.d.ts +3 -0
- package/dist/core/Virtual.d.ts +2 -0
- package/dist/core/Virtual.js +28 -0
- package/dist/core/expr/Aggregate.d.ts +10 -0
- package/dist/core/expr/Aggregate.js +38 -0
- package/dist/core/expr/Conditions.d.ts +40 -0
- package/dist/core/expr/Conditions.js +137 -0
- package/dist/core/expr/Field.d.ts +14 -0
- package/dist/core/expr/Field.js +15 -0
- package/dist/core/expr/Functions.d.ts +6 -0
- package/dist/core/expr/Functions.js +11 -0
- package/dist/core/expr/Input.d.ts +3 -0
- package/dist/core/expr/Input.js +14 -0
- package/dist/core/query/CreateTable.d.ts +13 -0
- package/dist/core/query/CreateTable.js +23 -0
- package/dist/core/query/Delete.d.ts +19 -0
- package/dist/core/query/Delete.js +44 -0
- package/dist/core/query/DropTable.d.ts +13 -0
- package/dist/core/query/DropTable.js +23 -0
- package/dist/core/query/Insert.d.ts +43 -0
- package/dist/core/query/Insert.js +111 -0
- package/dist/core/query/Select.d.ts +93 -0
- package/dist/core/query/Select.js +196 -0
- package/dist/core/query/Union.d.ts +27 -0
- package/dist/core/query/Union.js +86 -0
- package/dist/core/query/Update.d.ts +23 -0
- package/dist/core/query/Update.js +55 -0
- package/dist/driver/better-sqlite3.d.ts +3 -16
- package/dist/driver/better-sqlite3.js +27 -33
- package/dist/driver/bun-sqlite.d.ts +3 -18
- package/dist/driver/bun-sqlite.js +26 -42
- package/dist/driver/pg.d.ts +25 -0
- package/dist/driver/pg.js +81 -0
- package/dist/driver/pglite.d.ts +24 -0
- package/dist/driver/pglite.js +59 -0
- package/dist/driver/sql.js.d.ts +3 -16
- package/dist/driver/sql.js.js +41 -47
- package/dist/index.d.ts +16 -21
- package/dist/index.js +16 -14
- package/dist/migrate/Scan.d.ts +1 -0
- package/dist/migrate/Scan.js +0 -0
- package/dist/postgres/PostgresColumns.d.ts +10 -0
- package/dist/postgres/PostgresColumns.js +58 -0
- package/dist/postgres/PostgresDialect.d.ts +2 -0
- package/dist/postgres/PostgresDialect.js +58 -0
- package/dist/postgres/PostgresSchema.d.ts +1 -0
- package/dist/postgres/PostgresSchema.js +4 -0
- package/dist/postgres/PostgresTable.d.ts +1 -0
- package/dist/postgres/PostgresTable.js +4 -0
- package/dist/postgres.d.ts +2 -0
- package/dist/postgres.js +2 -0
- package/dist/sqlite/SqliteColumns.d.ts +9 -0
- package/dist/sqlite/SqliteColumns.js +63 -0
- package/dist/sqlite/SqliteDialect.d.ts +2 -0
- package/dist/sqlite/SqliteDialect.js +51 -0
- package/dist/sqlite/SqliteFunctions.d.ts +8 -167
- package/dist/sqlite/SqliteFunctions.js +6 -3
- package/dist/sqlite/SqliteTable.d.ts +1 -0
- package/dist/sqlite/SqliteTable.js +4 -0
- package/dist/sqlite.d.ts +3 -2
- package/dist/sqlite.js +3 -2
- package/dist/universal/UniversalColumns.d.ts +6 -0
- package/dist/universal/UniversalColumns.js +56 -0
- package/dist/universal/UniversalTransaction.d.ts +3 -0
- package/dist/universal/UniversalTransaction.js +14 -0
- package/dist/universal.d.ts +2 -0
- package/dist/universal.js +2 -0
- package/package.json +25 -43
- package/dist/define/Column.d.ts +0 -122
- package/dist/define/Column.js +0 -183
- package/dist/define/Expr.d.ts +0 -185
- package/dist/define/Expr.js +0 -463
- package/dist/define/Fields.d.ts +0 -18
- package/dist/define/Functions.d.ts +0 -5
- package/dist/define/Functions.js +0 -12
- package/dist/define/Id.d.ts +0 -3
- package/dist/define/Index.d.ts +0 -17
- package/dist/define/Index.js +0 -19
- package/dist/define/Ops.d.ts +0 -36
- package/dist/define/Ops.js +0 -114
- package/dist/define/OrderBy.d.ts +0 -9
- package/dist/define/OrderBy.js +0 -8
- package/dist/define/Param.d.ts +0 -18
- package/dist/define/Param.js +0 -27
- package/dist/define/Query.d.ts +0 -268
- package/dist/define/Query.js +0 -596
- package/dist/define/Schema.d.ts +0 -12
- package/dist/define/Schema.js +0 -140
- package/dist/define/Selection.d.ts +0 -21
- package/dist/define/Selection.js +0 -6
- package/dist/define/Sql.d.ts +0 -6
- package/dist/define/Sql.js +0 -21
- package/dist/define/Table.d.ts +0 -75
- package/dist/define/Table.js +0 -138
- package/dist/define/Target.d.ts +0 -47
- package/dist/define/Target.js +0 -68
- package/dist/define/VirtualTable.d.ts +0 -31
- package/dist/define/VirtualTable.js +0 -39
- package/dist/driver/@sqlite.org/sqlite-wasm.d.ts +0 -17
- package/dist/driver/@sqlite.org/sqlite-wasm.js +0 -80
- package/dist/driver/d1.d.ts +0 -22
- package/dist/driver/d1.js +0 -71
- package/dist/driver/sqlite3.d.ts +0 -22
- package/dist/driver/sqlite3.js +0 -132
- package/dist/lib/Driver.d.ts +0 -111
- package/dist/lib/Driver.js +0 -398
- package/dist/lib/Formatter.d.ts +0 -106
- package/dist/lib/Formatter.js +0 -898
- package/dist/lib/Sanitizer.d.ts +0 -5
- package/dist/lib/SqlError.d.ts +0 -3
- package/dist/lib/SqlError.js +0 -10
- package/dist/lib/Statement.d.ts +0 -108
- package/dist/lib/Statement.js +0 -190
- package/dist/sqlite/SqliteFormatter.d.ts +0 -11
- package/dist/sqlite/SqliteFormatter.js +0 -66
- package/dist/sqlite/SqliteSchema.d.ts +0 -25
- package/dist/sqlite/SqliteSchema.js +0 -46
- package/dist/util/Alias.d.ts +0 -1
- package/dist/util/Alias.js +0 -6
- package/dist/util/Callable.d.ts +0 -16
- package/dist/util/Callable.js +0 -9
- /package/dist/{define/Fields.js → core/Driver.js} +0 -0
- /package/dist/{define/Id.js → core/MetaData.js} +0 -0
- /package/dist/{lib/Sanitizer.js → core/Types.js} +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getData,
|
|
3
|
+
getQuery,
|
|
4
|
+
getSelection,
|
|
5
|
+
getTable,
|
|
6
|
+
getTarget
|
|
7
|
+
} from "./Internal.ts";
|
|
8
|
+
import { ValueParam } from "./Param.ts";
|
|
9
|
+
import { sql } from "./Sql.ts";
|
|
10
|
+
class Emitter {
|
|
11
|
+
sql = "";
|
|
12
|
+
params = [];
|
|
13
|
+
bind(inputs) {
|
|
14
|
+
return this.params.map((param) => {
|
|
15
|
+
if (param instanceof ValueParam)
|
|
16
|
+
return param.value;
|
|
17
|
+
if (inputs && param.name in inputs)
|
|
18
|
+
return inputs[param.name];
|
|
19
|
+
throw new Error(`Missing input for named parameter: ${param.name}`);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
emitUnsafe(value) {
|
|
23
|
+
this.sql += value;
|
|
24
|
+
}
|
|
25
|
+
emitField(field) {
|
|
26
|
+
this.emitIdentifier(field.targetName);
|
|
27
|
+
this.emitUnsafe(".");
|
|
28
|
+
this.emitIdentifier(field.fieldName);
|
|
29
|
+
}
|
|
30
|
+
emitCreateTable(create) {
|
|
31
|
+
const { table, ifNotExists } = getData(create);
|
|
32
|
+
const tableApi = getTable(table);
|
|
33
|
+
sql.join([
|
|
34
|
+
sql`create table`,
|
|
35
|
+
ifNotExists ? sql`if not exists` : void 0,
|
|
36
|
+
tableApi.target(),
|
|
37
|
+
sql`(${tableApi.createDefinition()})`
|
|
38
|
+
]).emit(this);
|
|
39
|
+
}
|
|
40
|
+
emitDrop(drop) {
|
|
41
|
+
const { table, ifExists } = getData(drop);
|
|
42
|
+
const tableApi = getTable(table);
|
|
43
|
+
sql.join([
|
|
44
|
+
sql`drop table`,
|
|
45
|
+
ifExists ? sql`if exists` : void 0,
|
|
46
|
+
sql.identifier(tableApi.name)
|
|
47
|
+
]).emit(this);
|
|
48
|
+
}
|
|
49
|
+
emitColumn(column) {
|
|
50
|
+
sql.join([
|
|
51
|
+
column.type,
|
|
52
|
+
column.primary && sql`primary key`,
|
|
53
|
+
column.notNull && sql`not null`,
|
|
54
|
+
column.isUnique && sql`unique`,
|
|
55
|
+
column.autoIncrement && sql`autoincrement`,
|
|
56
|
+
column.defaultValue && sql`default ${column.defaultValue()}`,
|
|
57
|
+
column.references && sql`references ${sql.chunk("emitReferences", [column.references()])}`,
|
|
58
|
+
column.onUpdate && sql`on update ${column.onUpdate}`
|
|
59
|
+
]).emit(this);
|
|
60
|
+
}
|
|
61
|
+
emitReferences(fields) {
|
|
62
|
+
sql.join([
|
|
63
|
+
sql.identifier(fields[0].targetName),
|
|
64
|
+
sql`(${sql.join(
|
|
65
|
+
fields.map((field) => sql.identifier(field.fieldName)),
|
|
66
|
+
sql`, `
|
|
67
|
+
)})`
|
|
68
|
+
]).emit(this);
|
|
69
|
+
}
|
|
70
|
+
emitDelete(deleteOp) {
|
|
71
|
+
const { cte, from, where, returning } = getData(deleteOp);
|
|
72
|
+
if (cte)
|
|
73
|
+
this.emitWith(cte);
|
|
74
|
+
const table = getTable(from);
|
|
75
|
+
sql.query({
|
|
76
|
+
deleteFrom: sql.identifier(table.name),
|
|
77
|
+
where,
|
|
78
|
+
returning
|
|
79
|
+
}).emit(this);
|
|
80
|
+
}
|
|
81
|
+
emitInsert(insert) {
|
|
82
|
+
const { cte, into, values, onConflict, returning } = getData(insert);
|
|
83
|
+
if (cte)
|
|
84
|
+
this.emitWith(cte);
|
|
85
|
+
const table = getTable(into);
|
|
86
|
+
const tableName = sql.identifier(table.name);
|
|
87
|
+
sql.query({
|
|
88
|
+
insertInto: sql`${tableName}(${table.listColumns()})`,
|
|
89
|
+
values,
|
|
90
|
+
onConflict,
|
|
91
|
+
returning
|
|
92
|
+
}).inlineFields(false).emit(this);
|
|
93
|
+
}
|
|
94
|
+
emitSelect(select) {
|
|
95
|
+
const {
|
|
96
|
+
cte,
|
|
97
|
+
from,
|
|
98
|
+
distinct,
|
|
99
|
+
distinctOn,
|
|
100
|
+
where,
|
|
101
|
+
groupBy,
|
|
102
|
+
orderBy,
|
|
103
|
+
having,
|
|
104
|
+
limit,
|
|
105
|
+
offset
|
|
106
|
+
} = getData(select);
|
|
107
|
+
if (cte)
|
|
108
|
+
this.emitWith(cte);
|
|
109
|
+
const selected = getSelection(select);
|
|
110
|
+
const prefix = distinctOn ? sql`distinct on (${sql.join(distinctOn, sql`, `)})` : distinct && sql`distinct`;
|
|
111
|
+
sql.query({
|
|
112
|
+
select: sql.join([prefix, selected]),
|
|
113
|
+
from,
|
|
114
|
+
where,
|
|
115
|
+
groupBy,
|
|
116
|
+
orderBy,
|
|
117
|
+
having,
|
|
118
|
+
limit,
|
|
119
|
+
offset
|
|
120
|
+
}).emit(this);
|
|
121
|
+
}
|
|
122
|
+
emitUnion(union) {
|
|
123
|
+
const { left, operator, right } = getData(union);
|
|
124
|
+
sql.join([getQuery(left), operator, getQuery(right)]).emit(this);
|
|
125
|
+
}
|
|
126
|
+
emitUpdate(update) {
|
|
127
|
+
const { cte, table, set, where, returning } = getData(update);
|
|
128
|
+
const tableApi = getTable(table);
|
|
129
|
+
if (cte)
|
|
130
|
+
this.emitWith(cte);
|
|
131
|
+
sql.query({
|
|
132
|
+
update: sql.identifier(tableApi.name),
|
|
133
|
+
set,
|
|
134
|
+
where,
|
|
135
|
+
returning
|
|
136
|
+
}).inlineFields(false).emit(this);
|
|
137
|
+
}
|
|
138
|
+
emitWith(cte) {
|
|
139
|
+
sql.query({
|
|
140
|
+
with: sql.join(
|
|
141
|
+
cte.map((cte2) => {
|
|
142
|
+
const query = getQuery(cte2);
|
|
143
|
+
const target = getTarget(cte2);
|
|
144
|
+
return sql`${target} as (${query})`;
|
|
145
|
+
}),
|
|
146
|
+
sql`, `
|
|
147
|
+
)
|
|
148
|
+
}).add(sql` `).emit(this);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
export {
|
|
152
|
+
Emitter
|
|
153
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { internalData, type HasData, type HasSql } from './Internal.ts';
|
|
2
|
+
import type { Field, FieldData } from './expr/Field.ts';
|
|
3
|
+
export interface IndexData {
|
|
4
|
+
fields: Array<FieldData>;
|
|
5
|
+
unique?: boolean;
|
|
6
|
+
concurrently?: boolean;
|
|
7
|
+
only?: boolean;
|
|
8
|
+
using?: HasSql;
|
|
9
|
+
order?: 'asc' | 'desc';
|
|
10
|
+
nulls?: 'first' | 'last';
|
|
11
|
+
where?: HasSql;
|
|
12
|
+
}
|
|
13
|
+
export declare class Index<TableName extends string = string> implements HasData<IndexData> {
|
|
14
|
+
private brand;
|
|
15
|
+
[internalData]: IndexData;
|
|
16
|
+
constructor(data: IndexData);
|
|
17
|
+
on<TableName extends string>(...columns: Array<Field<unknown, TableName>>): Index<TableName>;
|
|
18
|
+
concurrently(): Index<string>;
|
|
19
|
+
only(): Index<string>;
|
|
20
|
+
using<Sql>(using: HasSql<Sql>): Index<string>;
|
|
21
|
+
asc(): Index<string>;
|
|
22
|
+
desc(): Index<string>;
|
|
23
|
+
nullsFirst(): Index<string>;
|
|
24
|
+
nullsLast(): Index<string>;
|
|
25
|
+
where(where: HasSql<boolean>): Index<string>;
|
|
26
|
+
}
|
|
27
|
+
export declare function index(): Index<string>;
|
|
28
|
+
export declare function uniqueIndex(): Index<string>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getData,
|
|
3
|
+
getField,
|
|
4
|
+
internalData
|
|
5
|
+
} from "./Internal.ts";
|
|
6
|
+
class Index {
|
|
7
|
+
[internalData];
|
|
8
|
+
constructor(data) {
|
|
9
|
+
this[internalData] = data;
|
|
10
|
+
}
|
|
11
|
+
on(...columns) {
|
|
12
|
+
const fields = columns.map(getField);
|
|
13
|
+
return new Index({ ...getData(this), fields });
|
|
14
|
+
}
|
|
15
|
+
concurrently() {
|
|
16
|
+
return new Index({ ...getData(this), concurrently: true });
|
|
17
|
+
}
|
|
18
|
+
only() {
|
|
19
|
+
return new Index({ ...getData(this), only: true });
|
|
20
|
+
}
|
|
21
|
+
using(using) {
|
|
22
|
+
return new Index({ ...getData(this), using });
|
|
23
|
+
}
|
|
24
|
+
asc() {
|
|
25
|
+
return new Index({ ...getData(this), order: "asc" });
|
|
26
|
+
}
|
|
27
|
+
desc() {
|
|
28
|
+
return new Index({ ...getData(this), order: "desc" });
|
|
29
|
+
}
|
|
30
|
+
nullsFirst() {
|
|
31
|
+
return new Index({ ...getData(this), nulls: "first" });
|
|
32
|
+
}
|
|
33
|
+
nullsLast() {
|
|
34
|
+
return new Index({ ...getData(this), nulls: "last" });
|
|
35
|
+
}
|
|
36
|
+
where(where) {
|
|
37
|
+
return new Index({ ...getData(this), where });
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
function index() {
|
|
41
|
+
return new Index({ fields: [] });
|
|
42
|
+
}
|
|
43
|
+
function uniqueIndex() {
|
|
44
|
+
return new Index({ fields: [], unique: true });
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
Index,
|
|
48
|
+
index,
|
|
49
|
+
uniqueIndex
|
|
50
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { ColumnData } from './Column.ts';
|
|
2
|
+
import type { QueryMeta } from './MetaData.ts';
|
|
3
|
+
import type { Resolver } from './Resolver.ts';
|
|
4
|
+
import type { Selection } from './Selection.ts';
|
|
5
|
+
import type { Sql } from './Sql.ts';
|
|
6
|
+
import type { TableApi, TableDefinition } from './Table.ts';
|
|
7
|
+
import type { FieldData } from './expr/Field.ts';
|
|
8
|
+
export declare const internalData: unique symbol;
|
|
9
|
+
export declare const internalSql: unique symbol;
|
|
10
|
+
export declare const internalSelection: unique symbol;
|
|
11
|
+
export declare const internalTarget: unique symbol;
|
|
12
|
+
export declare const internalQuery: unique symbol;
|
|
13
|
+
export declare const internalTable: unique symbol;
|
|
14
|
+
export declare const internalColumn: unique symbol;
|
|
15
|
+
export declare const internalField: unique symbol;
|
|
16
|
+
export declare const internalResolver: unique symbol;
|
|
17
|
+
export declare const internalConstraint: unique symbol;
|
|
18
|
+
export declare class HasData<Data> {
|
|
19
|
+
get [internalData](): Data;
|
|
20
|
+
}
|
|
21
|
+
export declare class HasSql<Value = unknown> {
|
|
22
|
+
get [internalSql](): Sql<Value>;
|
|
23
|
+
}
|
|
24
|
+
export declare class HasSelection {
|
|
25
|
+
get [internalSelection](): Selection;
|
|
26
|
+
}
|
|
27
|
+
export declare class HasTarget {
|
|
28
|
+
get [internalTarget](): Sql;
|
|
29
|
+
}
|
|
30
|
+
export declare class HasQuery {
|
|
31
|
+
get [internalQuery](): Sql;
|
|
32
|
+
}
|
|
33
|
+
export declare class HasTable<Definition extends TableDefinition = TableDefinition, Name extends string = string> {
|
|
34
|
+
get [internalTable](): TableApi<Definition, Name>;
|
|
35
|
+
}
|
|
36
|
+
export declare class HasColumn {
|
|
37
|
+
get [internalColumn](): ColumnData;
|
|
38
|
+
}
|
|
39
|
+
export declare class HasField {
|
|
40
|
+
get [internalField](): FieldData;
|
|
41
|
+
}
|
|
42
|
+
export declare class HasResolver<Meta extends QueryMeta = QueryMeta> {
|
|
43
|
+
get [internalResolver](): Resolver<Meta>;
|
|
44
|
+
}
|
|
45
|
+
export declare class HasConstraint {
|
|
46
|
+
get [internalConstraint](): Sql;
|
|
47
|
+
}
|
|
48
|
+
export declare const hasData: <Data>(obj: object) => obj is HasData<Data>;
|
|
49
|
+
export declare const getData: <Data>(obj: HasData<Data>) => Data;
|
|
50
|
+
export declare const hasSql: <Value>(obj: object) => obj is HasSql<Value>;
|
|
51
|
+
export declare const getSql: <Value>(obj: HasSql<Value>) => Sql<Value>;
|
|
52
|
+
export declare const hasSelection: (obj: object) => obj is HasSelection;
|
|
53
|
+
export declare const getSelection: (obj: HasSelection) => Selection;
|
|
54
|
+
export declare const hasTarget: (obj: object) => obj is HasTarget;
|
|
55
|
+
export declare const getTarget: (obj: HasTarget) => Sql<unknown>;
|
|
56
|
+
export declare const hasQuery: (obj: object) => obj is HasQuery;
|
|
57
|
+
export declare const getQuery: (obj: HasQuery) => Sql<unknown>;
|
|
58
|
+
export declare const hasTable: (obj: object) => obj is HasTable<TableDefinition, string>;
|
|
59
|
+
export declare const getTable: (obj: HasTable) => TableApi<TableDefinition, string>;
|
|
60
|
+
export declare const hasColumn: (obj: object) => obj is HasColumn;
|
|
61
|
+
export declare const getColumn: (obj: HasColumn) => ColumnData;
|
|
62
|
+
export declare const hasField: (obj: object) => obj is HasField;
|
|
63
|
+
export declare const getField: (obj: HasField) => FieldData;
|
|
64
|
+
export declare const hasResolver: <Meta extends QueryMeta>(obj: object) => obj is HasResolver<Meta>;
|
|
65
|
+
export declare const getResolver: <Meta extends QueryMeta>(obj: HasResolver<Meta>) => Resolver<Meta>;
|
|
66
|
+
export declare const hasConstraint: (obj: object) => obj is HasConstraint;
|
|
67
|
+
export declare const getConstraint: (obj: HasConstraint) => Sql<unknown>;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
const internalData = Symbol();
|
|
2
|
+
const internalSql = Symbol();
|
|
3
|
+
const internalSelection = Symbol();
|
|
4
|
+
const internalTarget = Symbol();
|
|
5
|
+
const internalQuery = Symbol();
|
|
6
|
+
const internalTable = Symbol();
|
|
7
|
+
const internalColumn = Symbol();
|
|
8
|
+
const internalField = Symbol();
|
|
9
|
+
const internalResolver = Symbol();
|
|
10
|
+
const internalConstraint = Symbol();
|
|
11
|
+
const hasData = (obj) => internalData in obj;
|
|
12
|
+
const getData = (obj) => obj[internalData];
|
|
13
|
+
const hasSql = (obj) => internalSql in obj;
|
|
14
|
+
const getSql = (obj) => obj[internalSql];
|
|
15
|
+
const hasSelection = (obj) => internalSelection in obj;
|
|
16
|
+
const getSelection = (obj) => obj[internalSelection];
|
|
17
|
+
const hasTarget = (obj) => internalTarget in obj;
|
|
18
|
+
const getTarget = (obj) => obj[internalTarget];
|
|
19
|
+
const hasQuery = (obj) => internalQuery in obj;
|
|
20
|
+
const getQuery = (obj) => obj[internalQuery];
|
|
21
|
+
const hasTable = (obj) => internalTable in obj;
|
|
22
|
+
const getTable = (obj) => obj[internalTable];
|
|
23
|
+
const hasColumn = (obj) => internalColumn in obj;
|
|
24
|
+
const getColumn = (obj) => obj[internalColumn];
|
|
25
|
+
const hasField = (obj) => internalField in obj;
|
|
26
|
+
const getField = (obj) => obj[internalField];
|
|
27
|
+
const hasResolver = (obj) => internalResolver in obj;
|
|
28
|
+
const getResolver = (obj) => obj[internalResolver];
|
|
29
|
+
const hasConstraint = (obj) => internalConstraint in obj;
|
|
30
|
+
const getConstraint = (obj) => obj[internalConstraint];
|
|
31
|
+
export {
|
|
32
|
+
getColumn,
|
|
33
|
+
getConstraint,
|
|
34
|
+
getData,
|
|
35
|
+
getField,
|
|
36
|
+
getQuery,
|
|
37
|
+
getResolver,
|
|
38
|
+
getSelection,
|
|
39
|
+
getSql,
|
|
40
|
+
getTable,
|
|
41
|
+
getTarget,
|
|
42
|
+
hasColumn,
|
|
43
|
+
hasConstraint,
|
|
44
|
+
hasData,
|
|
45
|
+
hasField,
|
|
46
|
+
hasQuery,
|
|
47
|
+
hasResolver,
|
|
48
|
+
hasSelection,
|
|
49
|
+
hasSql,
|
|
50
|
+
hasTable,
|
|
51
|
+
hasTarget,
|
|
52
|
+
internalColumn,
|
|
53
|
+
internalConstraint,
|
|
54
|
+
internalData,
|
|
55
|
+
internalField,
|
|
56
|
+
internalQuery,
|
|
57
|
+
internalResolver,
|
|
58
|
+
internalSelection,
|
|
59
|
+
internalSql,
|
|
60
|
+
internalTable,
|
|
61
|
+
internalTarget
|
|
62
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export type QueryMode = 'sync' | 'async' | undefined;
|
|
2
|
+
export type QueryDialect = 'universal' | 'sqlite' | 'mysql' | 'postgres';
|
|
3
|
+
export interface QueryMeta {
|
|
4
|
+
mode: QueryMode;
|
|
5
|
+
dialect: QueryDialect;
|
|
6
|
+
}
|
|
7
|
+
export interface Sync<Dialect extends QueryDialect = QueryDialect> extends QueryMeta {
|
|
8
|
+
mode: 'sync';
|
|
9
|
+
dialect: Dialect;
|
|
10
|
+
}
|
|
11
|
+
export interface Async<Dialect extends QueryDialect = QueryDialect> extends QueryMeta {
|
|
12
|
+
mode: 'async';
|
|
13
|
+
dialect: Dialect;
|
|
14
|
+
}
|
|
15
|
+
export interface IsPostgres extends QueryMeta {
|
|
16
|
+
dialect: 'postgres';
|
|
17
|
+
}
|
|
18
|
+
export interface IsMysql extends QueryMeta {
|
|
19
|
+
dialect: 'mysql';
|
|
20
|
+
}
|
|
21
|
+
export interface IsSqlite extends QueryMeta {
|
|
22
|
+
dialect: 'sqlite';
|
|
23
|
+
}
|
|
24
|
+
export interface Either extends QueryMeta {
|
|
25
|
+
mode: 'sync' | 'async';
|
|
26
|
+
dialect: QueryDialect;
|
|
27
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { internalData, internalQuery, type HasQuery, type HasResolver, type HasTarget } from './Internal.ts';
|
|
2
|
+
import type { Async, QueryMeta, Sync } from './MetaData.ts';
|
|
3
|
+
import type { PreparedStatement, Resolver } from './Resolver.ts';
|
|
4
|
+
import type { Sql } from './Sql.ts';
|
|
5
|
+
export declare class QueryData<Meta extends QueryMeta> {
|
|
6
|
+
resolver?: Resolver<Meta>;
|
|
7
|
+
cte?: Array<HasQuery & HasTarget>;
|
|
8
|
+
}
|
|
9
|
+
export declare abstract class Query<Result, Meta extends QueryMeta> implements PromiseLike<Array<Result>> {
|
|
10
|
+
#private;
|
|
11
|
+
readonly [internalData]: QueryData<Meta>;
|
|
12
|
+
abstract [internalQuery]: Sql;
|
|
13
|
+
constructor(data: QueryData<Meta>);
|
|
14
|
+
[Symbol.iterator](): Generator<Promise<unknown>, Array<Result>, unknown>;
|
|
15
|
+
prepare<Inputs extends Record<string, unknown>>(name: string): PreparedQuery<Result, Inputs, Meta>;
|
|
16
|
+
all(this: Query<Result, Sync>): Array<Result>;
|
|
17
|
+
all(this: Query<Result, Async>): Promise<Array<Result>>;
|
|
18
|
+
all(db: HasResolver<Sync> | Resolver<Sync>): Array<Result>;
|
|
19
|
+
all(db: HasResolver<Async> | Resolver<Async>): Promise<Array<Result>>;
|
|
20
|
+
get(this: Query<Result, Sync>): Result;
|
|
21
|
+
get(this: Query<Result, Async>): Promise<Result>;
|
|
22
|
+
get(db: HasResolver<Sync> | Resolver<Sync>): Result;
|
|
23
|
+
get(db: HasResolver<Async> | Resolver<Async>): Promise<Result>;
|
|
24
|
+
run(this: Query<Result, Sync>): void;
|
|
25
|
+
run(this: Query<Result, Async>): Promise<void>;
|
|
26
|
+
run(db: HasResolver<Sync> | Resolver<Sync>): void;
|
|
27
|
+
run(db: HasResolver<Async> | Resolver<Async>): Promise<void>;
|
|
28
|
+
then<TResult1 = Array<Result>, TResult2 = never>(this: Query<Result, Sync | Async>, onfulfilled?: ((value: Array<Result>) => TResult1 | PromiseLike<TResult1>) | undefined | null, onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | undefined | null): Promise<TResult1 | TResult2>;
|
|
29
|
+
catch<TResult = never>(this: Query<Result, Async>, onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | undefined | null): Promise<Array<Result> | TResult>;
|
|
30
|
+
finally(this: Query<Result, Async>, onfinally?: (() => void) | undefined | null): Promise<Array<Result>>;
|
|
31
|
+
}
|
|
32
|
+
export interface PreparedQuery<Result, Inputs extends Record<string, unknown>, Meta extends QueryMeta> extends PreparedStatement<Meta> {
|
|
33
|
+
all(this: PreparedQuery<Result, Inputs, Sync>, inputs?: Inputs): Array<Result>;
|
|
34
|
+
all(this: PreparedQuery<Result, Inputs, Async>, inputs?: Inputs): Promise<Array<Result>>;
|
|
35
|
+
get(this: PreparedQuery<Result, Inputs, Sync>, inputs?: Inputs): Result;
|
|
36
|
+
get(this: PreparedQuery<Result, Inputs, Async>, inputs?: Inputs): Promise<Result>;
|
|
37
|
+
run(this: PreparedQuery<Result, Inputs, Sync>, inputs?: Inputs): void;
|
|
38
|
+
run(this: PreparedQuery<Result, Inputs, Async>, inputs?: Inputs): Promise<void>;
|
|
39
|
+
execute(inputs?: Inputs): Promise<Array<Result>>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getData,
|
|
3
|
+
getResolver,
|
|
4
|
+
hasResolver,
|
|
5
|
+
hasSelection,
|
|
6
|
+
internalData
|
|
7
|
+
} from "./Internal.ts";
|
|
8
|
+
class QueryData {
|
|
9
|
+
resolver;
|
|
10
|
+
cte;
|
|
11
|
+
}
|
|
12
|
+
class Query {
|
|
13
|
+
[internalData];
|
|
14
|
+
constructor(data) {
|
|
15
|
+
this[internalData] = data;
|
|
16
|
+
}
|
|
17
|
+
#exec(method, db) {
|
|
18
|
+
const resolver = db ? hasResolver(db) ? getResolver(db) : db : getData(this).resolver;
|
|
19
|
+
const isSelection = hasSelection(this);
|
|
20
|
+
const prepared = resolver.prepare(this, "");
|
|
21
|
+
const resultType = method ?? (isSelection ? "all" : "run");
|
|
22
|
+
try {
|
|
23
|
+
const result = prepared[resultType]();
|
|
24
|
+
if (result instanceof Promise)
|
|
25
|
+
return result.finally(prepared.free.bind(prepared));
|
|
26
|
+
prepared.free();
|
|
27
|
+
return result;
|
|
28
|
+
} catch (error) {
|
|
29
|
+
prepared.free();
|
|
30
|
+
throw error;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
*[Symbol.iterator]() {
|
|
34
|
+
const interim = this.#exec(void 0);
|
|
35
|
+
const isAsync = interim instanceof Promise;
|
|
36
|
+
if (!isAsync)
|
|
37
|
+
return interim;
|
|
38
|
+
let result;
|
|
39
|
+
yield interim.then((v) => result = v);
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
prepare(name) {
|
|
43
|
+
return getData(this).resolver.prepare(this, name);
|
|
44
|
+
}
|
|
45
|
+
all(db) {
|
|
46
|
+
return this.#exec("all", db);
|
|
47
|
+
}
|
|
48
|
+
get(db) {
|
|
49
|
+
return this.#exec("get", db);
|
|
50
|
+
}
|
|
51
|
+
run(db) {
|
|
52
|
+
return this.#exec("run", db);
|
|
53
|
+
}
|
|
54
|
+
// biome-ignore lint/suspicious/noThenProperty:
|
|
55
|
+
then(onfulfilled, onrejected) {
|
|
56
|
+
const resolver = getData(this).resolver;
|
|
57
|
+
const result = this.#exec(void 0, resolver);
|
|
58
|
+
return Promise.resolve(result).then(onfulfilled, onrejected);
|
|
59
|
+
}
|
|
60
|
+
catch(onrejected) {
|
|
61
|
+
return this.#exec(void 0).catch(onrejected);
|
|
62
|
+
}
|
|
63
|
+
finally(onfinally) {
|
|
64
|
+
return this.#exec(void 0).finally(onfinally);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export {
|
|
68
|
+
Query,
|
|
69
|
+
QueryData
|
|
70
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Dialect } from './Dialect.ts';
|
|
2
|
+
import type { Driver, Statement } from './Driver.ts';
|
|
3
|
+
import type { Emitter } from './Emitter.ts';
|
|
4
|
+
import { type HasQuery } from './Internal.ts';
|
|
5
|
+
import type { QueryMeta } from './MetaData.ts';
|
|
6
|
+
export declare class Resolver<Meta extends QueryMeta = QueryMeta> {
|
|
7
|
+
#private;
|
|
8
|
+
private brand;
|
|
9
|
+
constructor(driver: Driver, dialect: Dialect);
|
|
10
|
+
prepare(query: HasQuery, name: string): PreparedStatement<Meta>;
|
|
11
|
+
}
|
|
12
|
+
type RowMapper = ((values: Array<unknown>) => unknown) | undefined;
|
|
13
|
+
export declare class PreparedStatement<Meta extends QueryMeta> {
|
|
14
|
+
#private;
|
|
15
|
+
private brand;
|
|
16
|
+
constructor(emitter: Emitter, stmt: Statement, mapRow: RowMapper);
|
|
17
|
+
all(inputs?: Record<string, unknown>): Array<unknown> | Promise<Array<unknown>>;
|
|
18
|
+
get(inputs?: Record<string, unknown>): unknown | Promise<unknown>;
|
|
19
|
+
run(inputs?: Record<string, unknown>): unknown;
|
|
20
|
+
execute(inputs?: Record<string, unknown>): Promise<unknown>;
|
|
21
|
+
free(): void;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { getSelection, hasSelection } from "./Internal.ts";
|
|
2
|
+
class Resolver {
|
|
3
|
+
#driver;
|
|
4
|
+
#dialect;
|
|
5
|
+
constructor(driver, dialect) {
|
|
6
|
+
this.#driver = driver;
|
|
7
|
+
this.#dialect = dialect;
|
|
8
|
+
}
|
|
9
|
+
prepare(query, name) {
|
|
10
|
+
const isSelection = hasSelection(query);
|
|
11
|
+
const mapRow = isSelection ? getSelection(query).mapRow : void 0;
|
|
12
|
+
const emitter = this.#dialect(query);
|
|
13
|
+
const stmt = this.#driver.prepare(emitter.sql, name);
|
|
14
|
+
return new PreparedStatement(emitter, stmt, mapRow);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
class PreparedStatement {
|
|
18
|
+
#emitter;
|
|
19
|
+
#stmt;
|
|
20
|
+
#mapRow;
|
|
21
|
+
constructor(emitter, stmt, mapRow) {
|
|
22
|
+
this.#emitter = emitter;
|
|
23
|
+
this.#stmt = stmt;
|
|
24
|
+
this.#mapRow = mapRow;
|
|
25
|
+
}
|
|
26
|
+
#transform = (rows) => {
|
|
27
|
+
return this.#mapRow ? rows.map(this.#mapRow) : rows;
|
|
28
|
+
};
|
|
29
|
+
all(inputs) {
|
|
30
|
+
const rows = this.#stmt.values(this.#emitter.bind(inputs));
|
|
31
|
+
if (rows instanceof Promise)
|
|
32
|
+
return rows.then(this.#transform);
|
|
33
|
+
return this.#transform(rows);
|
|
34
|
+
}
|
|
35
|
+
get(inputs) {
|
|
36
|
+
const rows = this.all(inputs);
|
|
37
|
+
if (rows instanceof Promise)
|
|
38
|
+
return rows.then((rows2) => rows2[0]);
|
|
39
|
+
return rows[0];
|
|
40
|
+
}
|
|
41
|
+
run(inputs) {
|
|
42
|
+
return this.#stmt.run(this.#emitter.bind(inputs));
|
|
43
|
+
}
|
|
44
|
+
async execute(inputs) {
|
|
45
|
+
return this.all(inputs);
|
|
46
|
+
}
|
|
47
|
+
free() {
|
|
48
|
+
this.#stmt.free();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export {
|
|
52
|
+
PreparedStatement,
|
|
53
|
+
Resolver
|
|
54
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type Table, type TableConfig, type TableDefinition } from './Table.ts';
|
|
2
|
+
export declare function schema<SchemaName extends string>(schemaName: SchemaName): {
|
|
3
|
+
table<Definition extends TableDefinition, TableName extends string>(tableName: TableName, columns: Definition, config?: ((self: Table<Definition>) => TableConfig<`${SchemaName}.${TableName}`>) | undefined): Table<Definition, `${SchemaName}.${TableName}`>;
|
|
4
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { internalSql, type HasSql, type HasTable } from './Internal.ts';
|
|
2
|
+
import { type Sql } from './Sql.ts';
|
|
3
|
+
import type { Table, TableRow } from './Table.ts';
|
|
4
|
+
import type { Expand } from './Types.ts';
|
|
5
|
+
declare const nullable: unique symbol;
|
|
6
|
+
export interface SelectionRecord extends Record<string, SelectionInput> {
|
|
7
|
+
}
|
|
8
|
+
export type IsNullable = {
|
|
9
|
+
[nullable]: true;
|
|
10
|
+
};
|
|
11
|
+
export type MakeNullable<T> = Expand<{
|
|
12
|
+
[K in keyof T]: T[K] & IsNullable;
|
|
13
|
+
}>;
|
|
14
|
+
export type SelectionInput = HasSql | HasTable | SelectionRecord;
|
|
15
|
+
export type RowOfRecord<Input> = Expand<{
|
|
16
|
+
[Key in keyof Input as Key extends string ? Key : never]: SelectionRow<Input[Key]>;
|
|
17
|
+
}>;
|
|
18
|
+
export type SelectionRow<Input> = Input extends HasSql<infer Value> ? Value : Input extends IsNullable ? RowOfRecord<Input> | null : Input extends SelectionRecord ? RowOfRecord<Input> : Input extends Table<infer Definition> ? TableRow<Definition> : never;
|
|
19
|
+
export declare class Selection implements HasSql {
|
|
20
|
+
#private;
|
|
21
|
+
constructor(input: SelectionInput, nullable: Set<string>);
|
|
22
|
+
makeVirtual(name: string): SelectionRecord | HasSql<unknown> | HasTable<import("./Table.ts").TableDefinition, string>;
|
|
23
|
+
mapRow: (values: Array<unknown>) => unknown;
|
|
24
|
+
get [internalSql](): Sql<unknown>;
|
|
25
|
+
}
|
|
26
|
+
export declare function selection(input: SelectionInput, nullable?: Set<string>): Selection;
|
|
27
|
+
export {};
|