rado 0.2.21 → 0.2.23

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.
@@ -1,26 +1,27 @@
1
1
  import { Column, ColumnData, OptionalColumn, PrimaryColumn } from './Column';
2
- import { Cursor } from './Cursor';
3
2
  import { EV } from './Expr';
4
3
  import { Index, IndexData } from './Index';
4
+ import { Query } from './Query';
5
5
  import { Selection } from './Selection';
6
6
  declare const DATA: unique symbol;
7
7
  declare const META: unique symbol;
8
8
  interface TableDefinition {
9
9
  }
10
- export interface TableData {
10
+ export declare class TableData {
11
11
  name: string;
12
12
  alias?: string;
13
13
  definition: TableDefinition;
14
14
  columns: Record<string, ColumnData>;
15
- meta(): {
15
+ meta: () => {
16
16
  indexes: Record<string, IndexData>;
17
17
  };
18
+ constructor(data: TableData);
18
19
  }
19
20
  export interface TableInstance<Definition> {
20
21
  (conditions: {
21
22
  [K in keyof Definition]?: Definition[K] extends Column<infer V> ? EV<V> : never;
22
- }): Cursor.TableSelect<Definition>;
23
- (...conditions: Array<EV<boolean>>): Cursor.TableSelect<Definition>;
23
+ }): Query.TableSelect<Definition>;
24
+ (...conditions: Array<EV<boolean>>): Query.TableSelect<Definition>;
24
25
  }
25
26
  export declare class TableInstance<Definition> {
26
27
  [Selection.TableType](): Table.Select<Definition>;
@@ -56,15 +57,12 @@ export declare namespace Table {
56
57
  export interface TableMeta {
57
58
  indexes?: Record<string, Index>;
58
59
  }
59
- type Blueprint<T> = {
60
- [K in keyof T as K extends string ? K : never]: Column<any> | (() => any);
61
- };
62
60
  interface Define<T> {
63
61
  new (): T;
64
62
  }
65
63
  export type table<T> = T extends Table<infer D> ? Table.Select<D> : never;
66
64
  export declare function createTable<Definition>(data: TableData): Table<Definition>;
67
- export declare function table<T extends Blueprint<T>>(define: Record<string, T | Define<T>>): Table<T>;
65
+ export declare function table<T extends {}>(define: Record<string, T | Define<T>>): Table<T>;
68
66
  export declare namespace table {
69
67
  const meta: typeof META;
70
68
  }
@@ -3,28 +3,33 @@ import {
3
3
  Column,
4
4
  ColumnType
5
5
  } from "./Column.js";
6
- import { Cursor } from "./Cursor.js";
7
6
  import { BinOpType, Expr, ExprData } from "./Expr.js";
7
+ import { Query } from "./Query.js";
8
8
  import { Target } from "./Target.js";
9
- var DATA = Symbol("Table.Data");
10
- var META = Symbol("Table.Meta");
11
9
  var {
10
+ assign,
12
11
  keys,
13
12
  entries,
14
13
  fromEntries,
15
14
  getOwnPropertyDescriptors,
16
15
  getPrototypeOf,
17
16
  setPrototypeOf,
18
- defineProperty,
19
- getOwnPropertyNames
17
+ defineProperty
20
18
  } = Object;
19
+ var DATA = Symbol("Table.Data");
20
+ var META = Symbol("Table.Meta");
21
+ var TableData = class {
22
+ constructor(data) {
23
+ assign(this, data);
24
+ }
25
+ };
21
26
  var Table;
22
27
  ((Table2) => {
23
28
  Table2.Data = DATA;
24
29
  Table2.Meta = META;
25
30
  })(Table || (Table = {}));
26
31
  function createTable(data) {
27
- const target = Target.Table(data);
32
+ const target = new Target.Table(data);
28
33
  const call = {
29
34
  [data.name]: function(...args) {
30
35
  const isConditionalRecord = args.length === 1 && !Expr.isExpr(args[0]);
@@ -33,21 +38,21 @@ function createTable(data) {
33
38
  if (!column)
34
39
  throw new Error(`Column ${key} not found`);
35
40
  return new Expr(
36
- ExprData.BinOp(
41
+ new ExprData.BinOp(
37
42
  BinOpType.Equals,
38
- ExprData.Field(ExprData.Row(target), key),
43
+ new ExprData.Field(new ExprData.Row(target), key),
39
44
  ExprData.create(value)
40
45
  )
41
46
  );
42
47
  }) : args;
43
- return new Cursor.TableSelect(data, conditions);
48
+ return new Query.TableSelect(data, conditions);
44
49
  }
45
50
  }[data.name];
46
51
  const cols = keys(data.columns);
47
- const row = ExprData.Row(target);
52
+ const row = new ExprData.Row(target);
48
53
  const expressions = fromEntries(
49
54
  cols.map((name) => {
50
- let expr = new Expr(ExprData.Field(row, name));
55
+ let expr = new Expr(new ExprData.Field(row, name));
51
56
  if (data.columns[name].type === ColumnType.Json)
52
57
  expr = expr.dynamic();
53
58
  return [name, expr];
@@ -71,39 +76,44 @@ function table(define) {
71
76
  const target = define[name];
72
77
  const definition = "prototype" in target ? new target() : target;
73
78
  const columns = definition;
74
- const res = createTable({
75
- name,
76
- definition,
77
- columns: fromEntries(
78
- entries(getOwnPropertyDescriptors(columns)).map(([name2, descriptor]) => {
79
- const column = columns[name2];
80
- const data = column[Column.Data];
81
- if (!data.type)
82
- throw new Error(`Column ${name2} has no type`);
83
- return [
84
- name2,
85
- {
86
- ...data,
87
- type: data.type,
88
- name: data.name || name2,
89
- enumerable: descriptor.enumerable
90
- }
91
- ];
92
- })
93
- ),
94
- meta() {
95
- const createMeta = res[table.meta];
96
- const meta = createMeta ? createMeta.apply(res) : {};
97
- return {
98
- indexes: fromEntries(
99
- entries(meta?.indexes || {}).map(([key, index]) => {
100
- const indexName = `${name}.${key}`;
101
- return [indexName, { name: indexName, ...index.data }];
102
- })
103
- )
104
- };
105
- }
106
- });
79
+ const res = createTable(
80
+ new TableData({
81
+ name,
82
+ definition,
83
+ columns: fromEntries(
84
+ entries(getOwnPropertyDescriptors(columns)).filter(([name2]) => {
85
+ const column = columns[name2];
86
+ return Column.isColumn(column);
87
+ }).map(([name2, descriptor]) => {
88
+ const column = columns[name2];
89
+ const data = column[Column.Data];
90
+ if (!data.type)
91
+ throw new Error(`Column ${name2} has no type`);
92
+ return [
93
+ name2,
94
+ {
95
+ ...data,
96
+ type: data.type,
97
+ name: data.name || name2,
98
+ enumerable: descriptor.enumerable
99
+ }
100
+ ];
101
+ })
102
+ ),
103
+ meta() {
104
+ const createMeta = res[table.meta];
105
+ const meta = createMeta ? createMeta.apply(res) : {};
106
+ return {
107
+ indexes: fromEntries(
108
+ entries(meta?.indexes || {}).map(([key, index]) => {
109
+ const indexName = `${name}.${key}`;
110
+ return [indexName, { name: indexName, ...index.data }];
111
+ })
112
+ )
113
+ };
114
+ }
115
+ })
116
+ );
107
117
  return res;
108
118
  }
109
119
  ((table2) => {
@@ -111,6 +121,7 @@ function table(define) {
111
121
  })(table || (table = {}));
112
122
  export {
113
123
  Table,
124
+ TableData,
114
125
  createTable,
115
126
  table
116
127
  };
@@ -1,38 +1,38 @@
1
- import { ExprData } from './Expr';
2
- import { Query as QueryData } from './Query';
3
- import { TableData } from './Table';
1
+ import type { ExprData } from './Expr';
2
+ import type { QueryData } from './Query';
3
+ import type { TableData } from './Table';
4
4
  export declare enum TargetType {
5
- Expr = "Expr",
6
- Query = "Query",
7
- Table = "Table",
8
- Join = "Join"
5
+ Expr = "Target.Expr",
6
+ Query = "Target.Query",
7
+ Table = "Target.Table",
8
+ Join = "Target.Join"
9
9
  }
10
10
  export type Target = Target.Expr | Target.Query | Target.Table | Target.Join;
11
11
  export declare namespace Target {
12
- interface Expr {
13
- type: TargetType.Expr;
12
+ class Expr {
14
13
  expr: ExprData;
15
- alias?: string;
14
+ alias?: string | undefined;
15
+ type: TargetType.Expr;
16
+ constructor(expr: ExprData, alias?: string | undefined);
16
17
  }
17
- function Expr(expr: ExprData, alias?: string): Expr;
18
- interface Query {
19
- type: TargetType.Query;
18
+ class Query {
20
19
  query: QueryData;
21
- alias?: string;
20
+ alias?: string | undefined;
21
+ type: TargetType.Query;
22
+ constructor(query: QueryData, alias?: string | undefined);
22
23
  }
23
- function Query(query: QueryData, alias?: string): Query;
24
- interface Table {
25
- type: TargetType.Table;
24
+ class Table {
26
25
  table: TableData;
26
+ type: TargetType.Table;
27
+ constructor(table: TableData);
27
28
  }
28
- function Table(table: TableData): Table;
29
- interface Join {
30
- type: TargetType.Join;
29
+ class Join {
31
30
  left: Target;
32
31
  right: Target;
33
32
  joinType: 'left' | 'inner';
34
33
  on: ExprData;
34
+ type: TargetType.Join;
35
+ constructor(left: Target, right: Target, joinType: 'left' | 'inner', on: ExprData);
35
36
  }
36
- function Join(left: Target, right: Target, joinType: 'left' | 'inner', on: ExprData): Join;
37
37
  function source(from: Target): TableData | undefined;
38
38
  }
@@ -1,34 +1,51 @@
1
1
  // src/define/Target.ts
2
2
  var TargetType = /* @__PURE__ */ ((TargetType2) => {
3
- TargetType2["Expr"] = "Expr";
4
- TargetType2["Query"] = "Query";
5
- TargetType2["Table"] = "Table";
6
- TargetType2["Join"] = "Join";
3
+ TargetType2["Expr"] = "Target.Expr";
4
+ TargetType2["Query"] = "Target.Query";
5
+ TargetType2["Table"] = "Target.Table";
6
+ TargetType2["Join"] = "Target.Join";
7
7
  return TargetType2;
8
8
  })(TargetType || {});
9
9
  var Target;
10
10
  ((Target2) => {
11
- function Expr(expr, alias) {
12
- return { type: "Expr" /* Expr */, expr, alias };
11
+ class Expr {
12
+ constructor(expr, alias) {
13
+ this.expr = expr;
14
+ this.alias = alias;
15
+ }
16
+ type = "Target.Expr" /* Expr */;
13
17
  }
14
18
  Target2.Expr = Expr;
15
- function Query(query, alias) {
16
- return { type: "Query" /* Query */, query, alias };
19
+ class Query {
20
+ constructor(query, alias) {
21
+ this.query = query;
22
+ this.alias = alias;
23
+ }
24
+ type = "Target.Query" /* Query */;
17
25
  }
18
26
  Target2.Query = Query;
19
- function Table(table) {
20
- return { type: "Table" /* Table */, table };
27
+ class Table {
28
+ constructor(table) {
29
+ this.table = table;
30
+ }
31
+ type = "Target.Table" /* Table */;
21
32
  }
22
33
  Target2.Table = Table;
23
- function Join(left, right, joinType, on) {
24
- return { type: "Join" /* Join */, left, right, joinType, on };
34
+ class Join {
35
+ constructor(left, right, joinType, on) {
36
+ this.left = left;
37
+ this.right = right;
38
+ this.joinType = joinType;
39
+ this.on = on;
40
+ }
41
+ type = "Target.Join" /* Join */;
25
42
  }
26
43
  Target2.Join = Join;
27
44
  function source(from) {
28
45
  switch (from.type) {
29
- case "Table" /* Table */:
46
+ case "Target.Table" /* Table */:
30
47
  return from.table;
31
- case "Join" /* Join */:
48
+ case "Target.Join" /* Join */:
32
49
  return source(from.left);
33
50
  default:
34
51
  return void 0;
@@ -1,6 +1,5 @@
1
1
  // src/driver/bun-sqlite.ts
2
- import { Cursor } from "../define/Cursor.js";
3
- import { Query } from "../define/Query.js";
2
+ import { Query, QueryData } from "../define/Query.js";
4
3
  import { Driver } from "../lib/Driver.js";
5
4
  import { SqlError } from "../lib/SqlError.js";
6
5
  import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
@@ -35,8 +34,8 @@ var BunSqliteDriver = class extends Driver.Sync {
35
34
  this.tableData = this.prepare(SqliteSchema.tableData);
36
35
  this.indexData = this.prepare(SqliteSchema.indexData);
37
36
  this.lastChanges = this.prepare(() => {
38
- return new Cursor.SelectSingle(
39
- Query.Raw({
37
+ return new Query.SelectSingle(
38
+ new QueryData.Raw({
40
39
  expectedReturn: "row",
41
40
  strings: ["SELECT changes() as rowsAffected"],
42
41
  params: []
@@ -1,5 +1,5 @@
1
1
  import type { Database } from 'sqlite3';
2
- import { Query } from '../define/Query';
2
+ import { QueryData } from '../define/Query';
3
3
  import { SchemaInstructions } from '../define/Schema';
4
4
  import { Driver } from '../lib/Driver';
5
5
  import { Statement } from '../lib/Statement';
@@ -10,7 +10,7 @@ export declare class Sqlite3Driver extends Driver.Async {
10
10
  tableData: (tableName: string) => Promise<Array<SqliteSchema.Column>>;
11
11
  indexData: (tableName: string) => Promise<Array<SqliteSchema.Index>>;
12
12
  constructor(db: Database);
13
- executeQuery<T>(query: Query<T>, stmt?: Driver.Async.PreparedStatement, params?: any[] | undefined): Promise<T>;
13
+ executeQuery(query: QueryData, stmt?: Driver.Async.PreparedStatement, params?: any[] | undefined): Promise<unknown>;
14
14
  prepareStatement(stmt: Statement): Driver.Async.PreparedStatement;
15
15
  schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
16
16
  isolate(): [connection: Driver.Async, release: () => Promise<void>];
package/dist/index.d.ts CHANGED
@@ -1,5 +1,4 @@
1
1
  export * from './define/Column';
2
- export * from './define/Cursor';
3
2
  export * from './define/Expr';
4
3
  export type { Fields } from './define/Fields';
5
4
  export * from './define/Functions';
@@ -11,6 +10,7 @@ export * from './define/Param';
11
10
  export * from './define/Query';
12
11
  export * from './define/Schema';
13
12
  export type { Selection } from './define/Selection';
13
+ export * from './define/Sql';
14
14
  export * from './define/Table';
15
15
  export * from './define/Target';
16
16
  export type { Driver } from './lib/Driver';
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  // src/index.ts
2
2
  export * from "./define/Column.js";
3
- export * from "./define/Cursor.js";
4
3
  export * from "./define/Expr.js";
5
4
  export * from "./define/Functions.js";
6
5
  export * from "./define/Index.js";
@@ -9,6 +8,7 @@ export * from "./define/OrderBy.js";
9
8
  export * from "./define/Param.js";
10
9
  export * from "./define/Query.js";
11
10
  export * from "./define/Schema.js";
11
+ export * from "./define/Sql.js";
12
12
  export * from "./define/Table.js";
13
13
  export * from "./define/Target.js";
14
14
  export * from "./lib/SqlError.js";
@@ -1,6 +1,5 @@
1
- import { Cursor } from '../define/Cursor';
2
1
  import { Expr } from '../define/Expr';
3
- import { Query } from '../define/Query';
2
+ import { Query, QueryData } from '../define/Query';
4
3
  import { SchemaInstructions } from '../define/Schema';
5
4
  import { Table } from '../define/Table';
6
5
  import { Callable } from '../util/Callable';
@@ -9,12 +8,11 @@ import { Statement } from './Statement';
9
8
  declare abstract class DriverBase extends Callable {
10
9
  formatter: Formatter;
11
10
  constructor(formatter: Formatter);
12
- compile<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): [Query<T>, Statement];
11
+ compile<T extends Array<Expr<any>>, R>(create: (...params: T) => Query<R>): [QueryData, Statement];
13
12
  all(...args: Array<any>): any;
14
13
  get(...args: Array<any>): any;
15
- sql(strings: TemplateStringsArray, ...params: Array<any>): Cursor<unknown>;
16
- executeTemplate(expectedReturn: Query.RawReturn, strings: TemplateStringsArray, ...params: Array<any>): any;
17
- abstract executeQuery(query: Query<any>): any;
14
+ executeTemplate(expectedReturn: QueryData.RawReturn, strings: TemplateStringsArray, ...params: Array<any>): any;
15
+ abstract executeQuery(query: QueryData): any;
18
16
  }
19
17
  type ParamTypes<Params extends [...any[]]> = {
20
18
  [K in keyof Params]: Params[K] extends Expr<infer T> ? T : never;
@@ -22,8 +20,8 @@ type ParamTypes<Params extends [...any[]]> = {
22
20
  length: Params['length'];
23
21
  };
24
22
  interface SyncDriver {
25
- <T>(query: Cursor<T>): T;
26
- <T>(...queries: Array<Cursor<any>>): T;
23
+ <T>(query: Query<T>): T;
24
+ <T>(...queries: Array<Query<any>>): T;
27
25
  (strings: TemplateStringsArray, ...values: any[]): any;
28
26
  }
29
27
  declare abstract class SyncDriver extends DriverBase {
@@ -31,16 +29,16 @@ declare abstract class SyncDriver extends DriverBase {
31
29
  constructor(formatter: Formatter);
32
30
  abstract prepareStatement(stmt: Statement, discardAfter: boolean): SyncPreparedStatement;
33
31
  abstract schemaInstructions(tableName: string): SchemaInstructions | undefined;
34
- prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): (...params: ParamTypes<T>) => R;
32
+ prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Query<R>): (...params: ParamTypes<T>) => R;
35
33
  migrateSchema(...tables: Array<Table<any>>): unknown;
36
- executeQuery<T>(query: Query<T>, stmt?: SyncPreparedStatement, params?: Array<any>): T;
37
- all<T>(cursor: Cursor.SelectSingle<T>): Array<T>;
38
- all<T>(cursor: Cursor<T>): T;
34
+ executeQuery(query: QueryData, stmt?: SyncPreparedStatement, params?: Array<any>): unknown;
35
+ all<T>(cursor: Query.SelectSingle<T>): Array<T>;
36
+ all<T>(cursor: Query<T>): T;
39
37
  all<T>(strings: TemplateStringsArray, ...params: Array<any>): Array<T>;
40
- get<T>(cursor: Cursor.SelectMultiple<T>): T | null;
41
- get<T>(cursor: Cursor<T>): T;
38
+ get<T>(cursor: Query.SelectMultiple<T>): T | null;
39
+ get<T>(cursor: Query<T>): T;
42
40
  get<T>(strings: TemplateStringsArray, ...params: Array<any>): T;
43
- iterate<T>(cursor: Cursor.SelectMultiple<T>): Iterable<T>;
41
+ iterate<T>(cursor: Query.SelectMultiple<T>): Iterable<T>;
44
42
  transaction<T>(run: (query: SyncDriver) => T): T;
45
43
  toAsync(): SyncWrapper;
46
44
  }
@@ -54,8 +52,8 @@ interface SyncPreparedStatement {
54
52
  execute(params?: Array<any>): void;
55
53
  }
56
54
  interface AsyncDriver {
57
- <T>(query: Cursor<T>): Promise<T>;
58
- <T>(...queries: Array<Cursor<any>>): Promise<T>;
55
+ <T>(query: Query<T>): Promise<T>;
56
+ <T>(...queries: Array<Query<any>>): Promise<T>;
59
57
  (strings: TemplateStringsArray, ...values: any[]): Promise<any>;
60
58
  }
61
59
  declare abstract class AsyncDriver extends DriverBase {
@@ -64,23 +62,23 @@ declare abstract class AsyncDriver extends DriverBase {
64
62
  abstract isolate(): [connection: AsyncDriver, release: () => Promise<void>];
65
63
  abstract prepareStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
66
64
  abstract schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
67
- prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Cursor<R>): (...params: ParamTypes<T>) => Promise<R>;
65
+ prepare<T extends Array<Expr<any>>, R>(create: (...params: T) => Query<R>): (...params: ParamTypes<T>) => Promise<R>;
68
66
  migrateSchema(...tables: Array<Table<any>>): Promise<unknown>;
69
- executeQuery<T>(query: Query<T>, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<T>;
70
- all<T>(cursor: Cursor.SelectSingle<T>): Promise<Array<T>>;
71
- all<T>(cursor: Cursor<T>): Promise<T>;
67
+ executeQuery(query: QueryData, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<unknown>;
68
+ all<T>(cursor: Query.SelectSingle<T>): Promise<Array<T>>;
69
+ all<T>(cursor: Query<T>): Promise<T>;
72
70
  all<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<Array<T>>;
73
- get<T>(cursor: Cursor.SelectMultiple<T>): Promise<T | null>;
74
- get<T>(cursor: Cursor<T>): Promise<T>;
71
+ get<T>(cursor: Query.SelectMultiple<T>): Promise<T | null>;
72
+ get<T>(cursor: Query<T>): Promise<T>;
75
73
  get<T>(strings: TemplateStringsArray, ...params: Array<any>): Promise<T>;
76
- iterate<T>(cursor: Cursor.SelectMultiple<T>): AsyncIterable<T>;
74
+ iterate<T>(cursor: Query.SelectMultiple<T>): AsyncIterable<T>;
77
75
  transaction<T>(run: (query: AsyncDriver) => T): Promise<T>;
78
76
  }
79
77
  declare class SyncWrapper extends AsyncDriver {
80
78
  private sync;
81
79
  lock: Promise<void> | undefined;
82
80
  constructor(sync: SyncDriver);
83
- executeQuery<T>(query: Query<T>, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<T>;
81
+ executeQuery(query: QueryData, stmt?: AsyncPreparedStatement, params?: Array<any>): Promise<unknown>;
84
82
  prepareStatement(stmt: Statement, discardAfter: boolean): AsyncPreparedStatement;
85
83
  schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
86
84
  isolate(): [connection: AsyncDriver, release: () => Promise<void>];