rado 0.3.1 → 0.3.3

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 CHANGED
@@ -1,3 +1,5 @@
1
+ [![npm](https://img.shields.io/npm/v/rado.svg)](https://npmjs.org/package/rado)
2
+
1
3
  # rado
2
4
 
3
5
  Fully typed, lightweight TypeScript query builder.
@@ -17,6 +17,8 @@ export interface PartialColumnData {
17
17
  primaryKey?: boolean;
18
18
  unique?: boolean;
19
19
  references?: () => ExprData;
20
+ onUpdate?: Action;
21
+ onDelete?: Action;
20
22
  enumerable?: boolean;
21
23
  }
22
24
  export interface ColumnData extends PartialColumnData {
@@ -46,9 +48,20 @@ export declare class ValueColumn<T> extends Callable implements Column<T> {
46
48
  get unique(): ValueColumn<T>;
47
49
  get autoIncrement(): OptionalColumn<T>;
48
50
  primaryKey<K = string>(create?: () => EV<T>): PrimaryColumn<T, K>;
49
- references<X extends T>(column: Expr<X> | (() => Expr<X>)): ValueColumn<X>;
51
+ references<X extends T>(column: Expr<X> | (() => Expr<X>)): ForeignKey<X>;
50
52
  default(value: DefaultValue<T>): OptionalColumn<T>;
51
53
  }
54
+ export declare enum Action {
55
+ NoAction = "no action",
56
+ Restrict = "restrict",
57
+ SetNull = "set null",
58
+ SetDefault = "set default",
59
+ Cascade = "cascade"
60
+ }
61
+ export declare class ForeignKey<T> extends ValueColumn<T> {
62
+ onUpdate(value: `${Action}`): ForeignKey<unknown>;
63
+ onDelete(value: `${Action}`): ForeignKey<unknown>;
64
+ }
52
65
  export declare class OptionalColumn<T> extends ValueColumn<T> {
53
66
  [Column.IsOptional]: true;
54
67
  }
@@ -40,7 +40,7 @@ class ValueColumn extends Callable {
40
40
  });
41
41
  }
42
42
  references(column2) {
43
- return new ValueColumn({
43
+ return new ForeignKey({
44
44
  ...this[Column.Data],
45
45
  references() {
46
46
  return ExprData.create(Expr.isExpr(column2) ? column2 : column2());
@@ -57,6 +57,28 @@ class ValueColumn extends Callable {
57
57
  function createDefaultValue(value) {
58
58
  return typeof value === "function" && !Expr.isExpr(value) ? () => ExprData.create(value()) : ExprData.create(value);
59
59
  }
60
+ var Action = /* @__PURE__ */ ((Action2) => {
61
+ Action2["NoAction"] = "no action";
62
+ Action2["Restrict"] = "restrict";
63
+ Action2["SetNull"] = "set null";
64
+ Action2["SetDefault"] = "set default";
65
+ Action2["Cascade"] = "cascade";
66
+ return Action2;
67
+ })(Action || {});
68
+ class ForeignKey extends ValueColumn {
69
+ onUpdate(value) {
70
+ return new ForeignKey({
71
+ ...this[Column.Data],
72
+ onUpdate: value
73
+ });
74
+ }
75
+ onDelete(value) {
76
+ return new ForeignKey({
77
+ ...this[Column.Data],
78
+ onDelete: value
79
+ });
80
+ }
81
+ }
60
82
  class OptionalColumn extends ValueColumn {
61
83
  [Column.IsOptional];
62
84
  }
@@ -147,8 +169,10 @@ class UnTyped extends Callable {
147
169
  }
148
170
  const column = new UnTyped();
149
171
  export {
172
+ Action,
150
173
  Column,
151
174
  ColumnType,
175
+ ForeignKey,
152
176
  ObjectColumn,
153
177
  OptionalColumn,
154
178
  OptionalObjectColumn,
@@ -1,10 +1,9 @@
1
1
  import { Fields } from './Fields.js';
2
2
  import { OrderBy } from './OrderBy.js';
3
3
  import { ParamData } from './Param.js';
4
- import { QueryData } from './Query.js';
4
+ import { QueryData, Select, SelectFirst } from './Query.js';
5
5
  import { Selection } from './Selection.js';
6
6
  import { Target } from './Target.js';
7
- import { Select, SelectFirst } from './query/Select.js';
8
7
  export declare enum UnOpType {
9
8
  Not = "Not",
10
9
  IsNull = "IsNull"
@@ -161,6 +160,7 @@ export declare class Expr<T> {
161
160
  map<T, X extends Selection>(this: Expr<Array<T>>, fn: (cursor: Fields<T>) => X): Expr<Array<Selection.Infer<X>>>;
162
161
  sure(): Expr<NonNullable<T>>;
163
162
  get<T>(name: string): Expr<T>;
163
+ static [Symbol.hasInstance](instance: any): any;
164
164
  }
165
165
  export interface ObjectExpr {
166
166
  [Expr.Data]: ExprData;
@@ -386,6 +386,9 @@ class Expr {
386
386
  get(name) {
387
387
  return new Expr(new ExprData.Field(this[Expr.Data], name));
388
388
  }
389
+ static [Symbol.hasInstance](instance) {
390
+ return instance?.[Expr.IsExpr];
391
+ }
389
392
  }
390
393
  ((Expr2) => {
391
394
  Expr2.Data = Symbol("Expr.Data");
@@ -419,7 +422,7 @@ class Expr {
419
422
  }
420
423
  Expr2.hasExpr = hasExpr;
421
424
  function isExpr(input) {
422
- return input !== null && (typeof input === "object" || typeof input === "function") && input[Expr2.IsExpr];
425
+ return input instanceof Expr2;
423
426
  }
424
427
  Expr2.isExpr = isExpr;
425
428
  })(Expr || (Expr = {}));
@@ -1,11 +1,6 @@
1
+ import { Batch, Delete, InsertInto, RecursiveUnion, Select, Update } from './Query.js';
1
2
  import { Selection } from './Selection.js';
2
3
  import { Table } from './Table.js';
3
- import { Batch } from './query/Batch.js';
4
- import { Delete } from './query/Delete.js';
5
- import { InsertInto } from './query/Insert.js';
6
- import { Select } from './query/Select.js';
7
- import { RecursiveUnion } from './query/Union.js';
8
- import { Update } from './query/Update.js';
9
4
  export declare function withRecursive<Row>(initialSelect: Select<Row>): RecursiveUnion<Row>;
10
5
  export declare function alias<T extends Table<{}>>(table: T): Record<string, T>;
11
6
  export declare function select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;
@@ -1,14 +1,17 @@
1
1
  import { ExprData } from "./Expr.js";
2
- import { Query, QueryData } from "./Query.js";
2
+ import {
3
+ Batch,
4
+ Delete,
5
+ InsertInto,
6
+ Query,
7
+ QueryData,
8
+ RecursiveUnion,
9
+ Select,
10
+ Update
11
+ } from "./Query.js";
3
12
  import { Schema } from "./Schema.js";
4
13
  import { Table, createTable } from "./Table.js";
5
14
  import { Target } from "./Target.js";
6
- import { Batch } from "./query/Batch.js";
7
- import { Delete } from "./query/Delete.js";
8
- import { InsertInto } from "./query/Insert.js";
9
- import { Select } from "./query/Select.js";
10
- import { RecursiveUnion } from "./query/Union.js";
11
- import { Update } from "./query/Update.js";
12
15
  function withRecursive(initialSelect) {
13
16
  return new RecursiveUnion(initialSelect[Query.Data]);
14
17
  }
@@ -1,12 +1,13 @@
1
1
  import { Driver } from '../lib/Driver.js';
2
2
  import { CompileOptions } from '../lib/Formatter.js';
3
3
  import { ColumnData } from './Column.js';
4
- import { EV, ExprData } from './Expr.js';
4
+ import { EV, Expr, ExprData } from './Expr.js';
5
5
  import { IndexData } from './Index.js';
6
6
  import { OrderBy } from './OrderBy.js';
7
7
  import { Selection } from './Selection.js';
8
- import { TableData } from './Table.js';
8
+ import { Table, TableData } from './Table.js';
9
9
  import { Target } from './Target.js';
10
+ import { VirtualTable } from './VirtualTable.js';
10
11
  export declare enum QueryType {
11
12
  Insert = "QueryData.Insert",
12
13
  Select = "QueryData.Select",
@@ -151,3 +152,117 @@ export declare namespace Query {
151
152
  const Data: unique symbol;
152
153
  function isQuery<T>(input: any): input is Query<T>;
153
154
  }
155
+ export declare class Batch<T = void> extends Query<T> {
156
+ protected queries: Array<QueryData>;
157
+ [Query.Data]: QueryData.Batch;
158
+ constructor(queries: Array<QueryData>);
159
+ next<T>(cursor: Query<T>): Query<T>;
160
+ }
161
+ export declare class CreateTable extends Query<void> {
162
+ protected table: TableData;
163
+ constructor(table: TableData);
164
+ }
165
+ export declare class Delete extends Query<{
166
+ rowsAffected: number;
167
+ }> {
168
+ [Query.Data]: QueryData.Delete;
169
+ constructor(query: QueryData.Delete);
170
+ where(...where: Array<EV<boolean>>): Delete;
171
+ orderBy(...orderBy: Array<OrderBy>): Delete;
172
+ take(limit: number | undefined): Delete;
173
+ skip(offset: number | undefined): Delete;
174
+ }
175
+ export declare class Insert<T = {
176
+ rowsAffected: number;
177
+ }> extends Query<T> {
178
+ [Query.Data]: QueryData.Insert;
179
+ constructor(query: QueryData.Insert);
180
+ returning<X extends Selection>(selection: X): Insert<Array<Selection.Infer<X>>>;
181
+ }
182
+ export declare class InsertOne<T> extends Query<T> {
183
+ [Query.Data]: QueryData.Insert;
184
+ constructor(query: QueryData.Insert);
185
+ returning<X extends Selection>(selection: X): Insert<Selection.Infer<X>>;
186
+ }
187
+ export declare class InsertInto<Definition> {
188
+ protected into: TableData;
189
+ constructor(into: TableData);
190
+ selection(query: Select<Table.Select<Definition>>): Insert;
191
+ values(...data: Array<Table.Insert<Definition>>): Insert;
192
+ }
193
+ export declare class RecursiveUnion<Row> {
194
+ initialSelect: QueryData.Select;
195
+ constructor(initialSelect: QueryData.Select);
196
+ union(create: () => Select<Row> | Union<Row>): VirtualTable.Of<Row>;
197
+ unionAll(create: () => Select<Row> | Union<Row>): VirtualTable.Of<Row>;
198
+ }
199
+ export declare class Union<Row> extends Query<Array<Row>> {
200
+ [Query.Data]: QueryData.Union | QueryData.Select;
201
+ constructor(query: QueryData.Union | QueryData.Select);
202
+ union(query: Select<Row> | Union<Row>): Union<Row>;
203
+ unionAll(query: Select<Row> | Union<Row>): Union<Row>;
204
+ except(query: Select<Row> | Union<Row>): Union<Row>;
205
+ intersect(query: Select<Row> | Union<Row>): Union<Row>;
206
+ }
207
+ export declare class Select<Row> extends Union<Row> {
208
+ [Query.Data]: QueryData.Select;
209
+ constructor(query: QueryData.Select);
210
+ from(table: Table<any> | VirtualTable<any>): Select<Row>;
211
+ indexedBy(index: IndexData): Select<unknown>;
212
+ leftJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): Select<Row>;
213
+ innerJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): Select<Row>;
214
+ select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;
215
+ count(): SelectFirst<number>;
216
+ orderBy(...orderBy: Array<Expr<any> | OrderBy>): Select<Row>;
217
+ groupBy(...groupBy: Array<Expr<any>>): Select<Row>;
218
+ maybeFirst(): SelectFirst<Row | null>;
219
+ first(): SelectFirst<Row>;
220
+ where(...where: Array<EV<boolean>>): Select<Row>;
221
+ take(limit: number | undefined): Select<Row>;
222
+ skip(offset: number | undefined): Select<Row>;
223
+ [Expr.ToExpr](): Expr<Row>;
224
+ }
225
+ export declare class SelectFirst<Row> extends Query<Row> {
226
+ [Query.Data]: QueryData.Select;
227
+ constructor(query: QueryData.Select);
228
+ from(table: Table<any>): Select<Row>;
229
+ leftJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): SelectFirst<Row>;
230
+ innerJoin<C>(that: Table<C> | Select<C>, ...on: Array<EV<boolean>>): SelectFirst<Row>;
231
+ select<X extends Selection>(selection: X): SelectFirst<Selection.Infer<X>>;
232
+ orderBy(...orderBy: Array<OrderBy>): SelectFirst<Row>;
233
+ groupBy(...groupBy: Array<Expr<any>>): SelectFirst<Row>;
234
+ where(...where: Array<EV<boolean>>): SelectFirst<Row>;
235
+ take(limit: number | undefined): SelectFirst<Row>;
236
+ skip(offset: number | undefined): SelectFirst<Row>;
237
+ all(): Select<Row>;
238
+ [Expr.ToExpr](): Expr<Row>;
239
+ }
240
+ export declare class TableSelect<Definition> extends Select<Table.Select<Definition>> {
241
+ protected table: TableData;
242
+ [Query.Data]: QueryData.Select;
243
+ constructor(table: TableData, conditions?: Array<EV<boolean>>);
244
+ as(alias: string): Table<Definition>;
245
+ create(): CreateTable;
246
+ insert(query: Select<Table.Insert<Definition>>): Insert;
247
+ insert(rows: Array<Table.Insert<Definition>>): Insert;
248
+ insert(row: Table.Insert<Definition>): InsertOne<Table.Select<Definition>>;
249
+ insertSelect(query: Select<Table.Insert<Definition>>): Insert<{
250
+ rowsAffected: number;
251
+ }>;
252
+ insertOne(record: Table.Insert<Definition>): InsertOne<{ [K in keyof Definition as Definition[K] extends import("./Column.js").Column<any> ? K : never]: Definition[K] extends import("./Column.js").Column<infer T> ? T : never; }>;
253
+ insertAll(data: Array<Table.Insert<Definition>>): Insert<{
254
+ rowsAffected: number;
255
+ }>;
256
+ set(data: Table.Update<Definition>): Update<Definition>;
257
+ delete(): Delete;
258
+ get(name: string): Expr<any>;
259
+ }
260
+ export declare class Update<Definition> extends Query<{
261
+ rowsAffected: number;
262
+ }> {
263
+ [Query.Data]: QueryData.Update;
264
+ set(set: Table.Update<Definition>): Update<Definition>;
265
+ where(...where: Array<EV<boolean>>): Update<Definition>;
266
+ take(limit: number | undefined): Update<Definition>;
267
+ skip(offset: number | undefined): Update<Definition>;
268
+ }