rado 1.0.3 → 1.0.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/dist/core/Column.d.ts +5 -2
- package/dist/core/Column.js +12 -5
- package/dist/core/Emitter.js +1 -1
- package/dist/core/expr/Conditions.d.ts +5 -4
- package/dist/core/expr/Conditions.js +24 -17
- package/dist/core/query/Insert.js +3 -3
- package/dist/core/query/Select.d.ts +8 -4
- package/dist/core/query/Select.js +2 -3
- package/dist/postgres/diff.js +3 -3
- package/dist/sqlite/diff.js +2 -2
- package/package.json +2 -2
package/dist/core/Column.d.ts
CHANGED
|
@@ -11,7 +11,8 @@ export interface ColumnData {
|
|
|
11
11
|
notNull?: boolean;
|
|
12
12
|
isUnique?: boolean;
|
|
13
13
|
autoIncrement?: boolean;
|
|
14
|
-
|
|
14
|
+
$default?(): Sql;
|
|
15
|
+
defaultValue?: Sql;
|
|
15
16
|
references?(): FieldData;
|
|
16
17
|
onUpdate?: Sql;
|
|
17
18
|
onDelete?: Sql;
|
|
@@ -23,7 +24,9 @@ export declare class Column<Value = unknown> {
|
|
|
23
24
|
readonly [internalData]: ColumnData;
|
|
24
25
|
constructor(data: ColumnData);
|
|
25
26
|
notNull(): RequiredColumn<Value>;
|
|
26
|
-
|
|
27
|
+
$defaultFn(value: () => Input<WithoutNull<Value>>): Column<WithoutNull<Value>>;
|
|
28
|
+
$default(value: Input<WithoutNull<Value>> | (() => Input<WithoutNull<Value>>)): Column<WithoutNull<Value>>;
|
|
29
|
+
default(value: Input<WithoutNull<Value>>): Column<WithoutNull<Value>>;
|
|
27
30
|
defaultNow(): Column<WithoutNull<Value>>;
|
|
28
31
|
primaryKey(): Column<WithoutNull<Value>>;
|
|
29
32
|
unique(name?: string): Column<Value>;
|
package/dist/core/Column.js
CHANGED
|
@@ -13,20 +13,27 @@ var Column = class _Column {
|
|
|
13
13
|
notNull: true
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
|
-
|
|
16
|
+
$defaultFn(value) {
|
|
17
|
+
return this.$default(value);
|
|
18
|
+
}
|
|
19
|
+
$default(value) {
|
|
17
20
|
return new _Column({
|
|
18
21
|
...getData(this),
|
|
19
|
-
|
|
22
|
+
$default() {
|
|
20
23
|
return input(value instanceof Function ? value() : value);
|
|
21
24
|
}
|
|
22
25
|
});
|
|
23
26
|
}
|
|
27
|
+
default(value) {
|
|
28
|
+
return new _Column({
|
|
29
|
+
...getData(this),
|
|
30
|
+
defaultValue: input(value)
|
|
31
|
+
});
|
|
32
|
+
}
|
|
24
33
|
defaultNow() {
|
|
25
34
|
return new _Column({
|
|
26
35
|
...getData(this),
|
|
27
|
-
defaultValue()
|
|
28
|
-
return sql.unsafe("now()");
|
|
29
|
-
}
|
|
36
|
+
defaultValue: sql.unsafe("now()")
|
|
30
37
|
});
|
|
31
38
|
}
|
|
32
39
|
primaryKey() {
|
package/dist/core/Emitter.js
CHANGED
|
@@ -65,7 +65,7 @@ var Emitter = class {
|
|
|
65
65
|
column.notNull && sql`not null`,
|
|
66
66
|
column.isUnique && sql`unique`,
|
|
67
67
|
column.autoIncrement && sql`autoincrement`,
|
|
68
|
-
column.defaultValue && sql`default ${column.defaultValue
|
|
68
|
+
column.defaultValue && sql`default ${column.defaultValue}`,
|
|
69
69
|
column.references && sql`references ${sql.chunk("emitReferences", [column.references()])}`,
|
|
70
70
|
column.onUpdate && sql`on update ${column.onUpdate}`
|
|
71
71
|
]).emitTo(this);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { type HasSql } from '../Internal.js';
|
|
2
|
+
import type { Either } from '../MetaData.js';
|
|
3
|
+
import type { Query } from '../Query.js';
|
|
2
4
|
import { type Sql } from '../Sql.js';
|
|
3
|
-
import type { Select } from '../query/Select.js';
|
|
4
5
|
import { type Input } from './Input.js';
|
|
5
6
|
export declare const eq: <T>(left: Input<T>, right: Input<T>) => Sql<boolean>;
|
|
6
7
|
export declare const ne: <T>(left: Input<T>, right: Input<T>) => Sql<boolean>;
|
|
@@ -18,8 +19,8 @@ export declare const arrayOverlaps: <T>(left: Input<Array<T>>, right: Input<Arra
|
|
|
18
19
|
export declare function and(...conditions: Array<undefined | Input<boolean>>): Sql<boolean>;
|
|
19
20
|
export declare function or(...conditions: Array<undefined | Input<boolean>>): Sql<boolean>;
|
|
20
21
|
export declare function not(condition: Input<boolean>): Sql<boolean>;
|
|
21
|
-
export declare function inArray<T>(left: Input<T>, right: Input<Array<T>>): Sql<boolean>;
|
|
22
|
-
export declare function notInArray<T>(left: Input<T>, right: Input<Array<T>>): Sql<boolean>;
|
|
22
|
+
export declare function inArray<T>(left: Input<T>, right: Query<T, any> | Input<Array<T>>): Sql<boolean>;
|
|
23
|
+
export declare function notInArray<T>(left: Input<T>, right: Query<T, any> | Input<Array<T>>): Sql<boolean>;
|
|
23
24
|
export declare function isNull(value: Input): Sql<boolean>;
|
|
24
25
|
export declare function isNotNull(value: Input): Sql<boolean>;
|
|
25
26
|
export declare function between<T>(value: Input<T>, left: Input<T>, right: Input<T>): Sql<boolean>;
|
|
@@ -29,4 +30,4 @@ export declare function desc<T>(input: HasSql<T>): Sql;
|
|
|
29
30
|
export declare function distinct<T>(input: HasSql<T>): Sql;
|
|
30
31
|
export declare function when<In, Out>(compare: Input<In>, ...cases: Array<[condition: Input<In>, result: Input<Out>] | Input<Out>>): Sql<Out>;
|
|
31
32
|
export declare function when<Out>(...cases: Array<[condition: Input<boolean>, result: Input<Out>] | Input<Out>>): Sql<Out>;
|
|
32
|
-
export declare function exists
|
|
33
|
+
export declare function exists(query: Query<any, Either>): Sql<boolean>;
|
|
@@ -2,8 +2,11 @@
|
|
|
2
2
|
import { getQuery } from "../Internal.js";
|
|
3
3
|
import { sql } from "../Sql.js";
|
|
4
4
|
import { input } from "./Input.js";
|
|
5
|
+
function bool(impl) {
|
|
6
|
+
return impl.mapWith(Boolean);
|
|
7
|
+
}
|
|
5
8
|
function binop(operator) {
|
|
6
|
-
return (left, right) => sql`${input(left)} ${sql.unsafe(operator)} ${input(right)}
|
|
9
|
+
return (left, right) => bool(sql`${input(left)} ${sql.unsafe(operator)} ${input(right)}`);
|
|
7
10
|
}
|
|
8
11
|
var eq = binop("=");
|
|
9
12
|
var ne = binop("<>");
|
|
@@ -21,49 +24,53 @@ var arrayOverlaps = binop("&&");
|
|
|
21
24
|
function and(...conditions) {
|
|
22
25
|
const inputs = conditions.filter((v) => v !== void 0).map(input);
|
|
23
26
|
if (inputs.length === 0)
|
|
24
|
-
return sql`true
|
|
27
|
+
return bool(sql`true`);
|
|
25
28
|
if (inputs.length === 1)
|
|
26
|
-
return inputs[0];
|
|
27
|
-
return sql`(${sql.join(inputs, sql` and `)})
|
|
29
|
+
return bool(inputs[0]);
|
|
30
|
+
return bool(sql`(${sql.join(inputs, sql` and `)})`);
|
|
28
31
|
}
|
|
29
32
|
function or(...conditions) {
|
|
30
33
|
const inputs = conditions.filter((v) => v !== void 0).map(input);
|
|
31
34
|
if (inputs.length === 0)
|
|
32
|
-
return sql`true
|
|
35
|
+
return bool(sql`true`);
|
|
33
36
|
if (inputs.length === 1)
|
|
34
|
-
return inputs[0];
|
|
35
|
-
return sql`(${sql.join(inputs, sql` or `)})
|
|
37
|
+
return bool(inputs[0]);
|
|
38
|
+
return bool(sql`(${sql.join(inputs, sql` or `)})`);
|
|
36
39
|
}
|
|
37
40
|
function not(condition) {
|
|
38
|
-
return sql`not ${input(condition)}
|
|
41
|
+
return bool(sql`not ${input(condition)}`);
|
|
39
42
|
}
|
|
40
43
|
function inArray(left, right) {
|
|
41
44
|
if (Array.isArray(right)) {
|
|
42
45
|
if (right.length === 0)
|
|
43
46
|
return sql`false`;
|
|
44
|
-
return sql`${input(left)} in (${sql.join(right.map(input), sql`, `)})
|
|
47
|
+
return bool(sql`${input(left)} in (${sql.join(right.map(input), sql`, `)})`);
|
|
45
48
|
}
|
|
46
|
-
return sql`${input(left)} in ${input(right)}
|
|
49
|
+
return bool(sql`${input(left)} in ${input(right)}`);
|
|
47
50
|
}
|
|
48
51
|
function notInArray(left, right) {
|
|
49
52
|
if (Array.isArray(right)) {
|
|
50
53
|
if (right.length === 0)
|
|
51
54
|
return sql`true`;
|
|
52
|
-
return
|
|
55
|
+
return bool(
|
|
56
|
+
sql`${input(left)} not in (${sql.join(right.map(input), sql`, `)})`
|
|
57
|
+
);
|
|
53
58
|
}
|
|
54
|
-
return sql`${input(left)} not in ${input(right)}
|
|
59
|
+
return bool(sql`${input(left)} not in ${input(right)}`);
|
|
55
60
|
}
|
|
56
61
|
function isNull(value) {
|
|
57
|
-
return sql`${input(value)} is null
|
|
62
|
+
return bool(sql`${input(value)} is null`);
|
|
58
63
|
}
|
|
59
64
|
function isNotNull(value) {
|
|
60
|
-
return sql`${input(value)} is not null
|
|
65
|
+
return bool(sql`${input(value)} is not null`);
|
|
61
66
|
}
|
|
62
67
|
function between(value, left, right) {
|
|
63
|
-
return sql`${input(value)} between ${input(left)} and ${input(right)}
|
|
68
|
+
return bool(sql`${input(value)} between ${input(left)} and ${input(right)}`);
|
|
64
69
|
}
|
|
65
70
|
function notBetween(value, left, right) {
|
|
66
|
-
return
|
|
71
|
+
return bool(
|
|
72
|
+
sql`${input(value)} not between ${input(left)} and ${input(right)}`
|
|
73
|
+
);
|
|
67
74
|
}
|
|
68
75
|
function asc(input2) {
|
|
69
76
|
return sql`${input2} asc`;
|
|
@@ -94,7 +101,7 @@ function when(...cases) {
|
|
|
94
101
|
]);
|
|
95
102
|
}
|
|
96
103
|
function exists(query) {
|
|
97
|
-
return sql`exists (${getQuery(query)})
|
|
104
|
+
return bool(sql`exists (${getQuery(query)})`);
|
|
98
105
|
}
|
|
99
106
|
export {
|
|
100
107
|
and,
|
|
@@ -84,11 +84,11 @@ var InsertInto = class {
|
|
|
84
84
|
return sql`(${sql.join(
|
|
85
85
|
Object.entries(table.columns).map(([key, column]) => {
|
|
86
86
|
const value = row[key];
|
|
87
|
-
const {
|
|
87
|
+
const { $default, mapToDriverValue } = getData(column);
|
|
88
88
|
if (value !== void 0)
|
|
89
89
|
return input(mapToDriverValue?.(value) ?? value);
|
|
90
|
-
if (
|
|
91
|
-
return
|
|
90
|
+
if ($default)
|
|
91
|
+
return $default();
|
|
92
92
|
return defaultKeyword;
|
|
93
93
|
}),
|
|
94
94
|
sql`, `
|
|
@@ -25,10 +25,10 @@ export declare class Select<Input, Meta extends QueryMeta = QueryMeta> extends U
|
|
|
25
25
|
constructor(data: SelectData<Meta>);
|
|
26
26
|
as(alias: string): SubQuery<Input>;
|
|
27
27
|
from(target: HasTarget | HasSql): Select<Input, Meta>;
|
|
28
|
-
leftJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
29
|
-
rightJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
30
|
-
innerJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
31
|
-
fullJoin(right: HasTable, on: HasSql<boolean>): Select<Input, Meta>;
|
|
28
|
+
leftJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
29
|
+
rightJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
30
|
+
innerJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
31
|
+
fullJoin(right: HasTable | HasTarget, on: HasSql<boolean>): Select<Input, Meta>;
|
|
32
32
|
where(...where: Array<HasSql<boolean> | undefined>): Select<Input, Meta>;
|
|
33
33
|
groupBy(...exprs: Array<HasSql>): Select<Input, Meta>;
|
|
34
34
|
having(having: HasSql<boolean> | ((self: Input) => HasSql<boolean>)): Select<Input, Meta>;
|
|
@@ -69,8 +69,12 @@ type MarkFieldsAsNullable<Input, TableName extends string> = Expand<{
|
|
|
69
69
|
}>;
|
|
70
70
|
export interface SelectionFrom<Input, Meta extends QueryMeta> extends SelectBase<Input, Meta> {
|
|
71
71
|
leftJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<MarkFieldsAsNullable<Input, Name>, Meta>;
|
|
72
|
+
leftJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
72
73
|
rightJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
74
|
+
rightJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
73
75
|
innerJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
76
|
+
innerJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
74
77
|
fullJoin<Definition extends TableDefinition, Name extends string>(right: Table<Definition, Name>, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
78
|
+
fullJoin(right: HasTarget, on: HasSql<boolean>): SelectionFrom<Input, Meta>;
|
|
75
79
|
}
|
|
76
80
|
export {};
|
|
@@ -4,7 +4,6 @@ import {
|
|
|
4
4
|
getQuery,
|
|
5
5
|
getSelection,
|
|
6
6
|
getSql,
|
|
7
|
-
getTable,
|
|
8
7
|
getTarget,
|
|
9
8
|
hasTable,
|
|
10
9
|
hasTarget,
|
|
@@ -50,11 +49,11 @@ var Select = class _Select extends UnionBase {
|
|
|
50
49
|
const { from, select: current } = getData(this);
|
|
51
50
|
return new _Select({
|
|
52
51
|
...getData(this),
|
|
53
|
-
select: current?.join(right, operator),
|
|
52
|
+
select: hasTable(right) ? current?.join(right, operator) : current,
|
|
54
53
|
from: sql.join([
|
|
55
54
|
from,
|
|
56
55
|
sql.unsafe(`${operator} join`),
|
|
57
|
-
|
|
56
|
+
getTarget(right),
|
|
58
57
|
sql`on ${on}`
|
|
59
58
|
])
|
|
60
59
|
});
|
package/dist/postgres/diff.js
CHANGED
|
@@ -113,7 +113,7 @@ var postgresDiff = (hasTable) => {
|
|
|
113
113
|
{
|
|
114
114
|
type: sql.unsafe(column2.type.toLowerCase()),
|
|
115
115
|
notNull: column2.notNull,
|
|
116
|
-
defaultValue: column2.defaultValue ?
|
|
116
|
+
defaultValue: column2.defaultValue ? sql.unsafe(column2.defaultValue) : void 0
|
|
117
117
|
}
|
|
118
118
|
];
|
|
119
119
|
})
|
|
@@ -168,8 +168,8 @@ var postgresDiff = (hasTable) => {
|
|
|
168
168
|
})
|
|
169
169
|
);
|
|
170
170
|
}
|
|
171
|
-
const localDefault = localInstruction.defaultValue
|
|
172
|
-
const schemaDefault = schemaInstruction.defaultValue
|
|
171
|
+
const localDefault = localInstruction.defaultValue;
|
|
172
|
+
const schemaDefault = schemaInstruction.defaultValue;
|
|
173
173
|
const localDefaultStr = localDefault && inline(localDefault);
|
|
174
174
|
const schemaDefaultStr = schemaDefault && inline(schemaDefault);
|
|
175
175
|
if (localDefaultStr !== schemaDefaultStr) {
|
package/dist/sqlite/diff.js
CHANGED
|
@@ -41,7 +41,7 @@ var sqliteDiff = (hasTable) => {
|
|
|
41
41
|
type: sql.unsafe(column2.type.toLowerCase()),
|
|
42
42
|
notNull: column2.notnull,
|
|
43
43
|
primary: hasSinglePrimaryKey && column2.pk === 1,
|
|
44
|
-
defaultValue: column2.dflt_value !== null ?
|
|
44
|
+
defaultValue: column2.dflt_value !== null ? sql.unsafe(column2.dflt_value) : void 0
|
|
45
45
|
})
|
|
46
46
|
)
|
|
47
47
|
];
|
|
@@ -142,7 +142,7 @@ var sqliteDiff = (hasTable) => {
|
|
|
142
142
|
);
|
|
143
143
|
const selection = { ...hasTable };
|
|
144
144
|
for (const name of missingColumns) {
|
|
145
|
-
selection[name] = getData(tableApi.columns[name]).defaultValue
|
|
145
|
+
selection[name] = getData(tableApi.columns[name]).defaultValue ?? sql`null`;
|
|
146
146
|
}
|
|
147
147
|
return [
|
|
148
148
|
// Create a new temporary table with the new definition
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rado",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
"size": "esbuild src/index.ts --bundle --minify --format=esm --outdir=dist",
|
|
9
9
|
"profile": "PROFILE=true bun build.ts && cd bin && (rimraf CPU*.cpuprofile || true) && node --cpu-prof --cpu-prof-interval=100 test && speedscope CPU*.cpuprofile",
|
|
10
10
|
"prepublishOnly": "rm -rf dist && bun run build",
|
|
11
|
-
"cycles": "madge --
|
|
11
|
+
"cycles": "madge --circular src/index.ts src/sqlite.ts src/mysql.ts src/postgres.ts",
|
|
12
12
|
"test:bun": "bun test",
|
|
13
13
|
"test:node": "node --test-force-exit --test-concurrency=1 --import tsx --test \"**/*.test.ts\"",
|
|
14
14
|
"test:deno": "deno test --no-check --allow-read"
|