rado 0.3.9 → 0.4.0

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.
@@ -138,7 +138,7 @@ export declare class Expr<T> {
138
138
  isLess(that: EV<any>): Expr<boolean>;
139
139
  isLessOrEqual(that: EV<any>): Expr<boolean>;
140
140
  add(this: Expr<number>, that: EV<number>): Expr<number>;
141
- substract(this: Expr<number>, that: EV<number>): Expr<number>;
141
+ subtract(this: Expr<number>, that: EV<number>): Expr<number>;
142
142
  multiply(this: Expr<number>, that: EV<number>): Expr<number>;
143
143
  remainder(this: Expr<number>, that: EV<number>): Expr<number>;
144
144
  divide(this: Expr<number>, that: EV<number>): Expr<number>;
@@ -278,7 +278,7 @@ class Expr {
278
278
  new ExprData.BinOp("Add" /* Add */, this[Expr.Data], ExprData.create(that))
279
279
  );
280
280
  }
281
- substract(that) {
281
+ subtract(that) {
282
282
  return new Expr(
283
283
  new ExprData.BinOp("Subt" /* Subt */, this[Expr.Data], ExprData.create(that))
284
284
  );
@@ -402,6 +402,8 @@ class Expr {
402
402
  Expr2.ToExpr = Symbol("Expr.ToExpr");
403
403
  Expr2.NULL = create(null);
404
404
  function value(value2, inline = false) {
405
+ if (isExpr(value2))
406
+ return value2;
405
407
  return new Expr2(new ExprData.Param(new ParamData.Value(value2, inline)));
406
408
  }
407
409
  Expr2.value = value;
@@ -1,6 +1,31 @@
1
+ import { EV, Expr } from './Expr.js';
1
2
  import { Batch, Delete, InsertInto, RecursiveUnion, Select, Update } from './Query.js';
2
3
  import { Selection } from './Selection.js';
3
4
  import { Table } from './Table.js';
5
+ export declare const value: typeof Expr.value;
6
+ export declare const and: typeof Expr.and;
7
+ export declare const or: typeof Expr.or;
8
+ export declare const not: <T>(a: EV<T>) => Expr<boolean>;
9
+ export declare const is: <T>(a: EV<T>, b: EV<T>) => Expr<boolean>;
10
+ export declare const isNot: <T>(a: EV<T>, b: EV<T>) => Expr<boolean>;
11
+ export declare const isNull: <T>(a: EV<T>) => Expr<boolean>;
12
+ export declare const isNotNull: <T>(a: EV<T>) => Expr<boolean>;
13
+ export declare const isIn: <T>(a: EV<T>, b: EV<T[]> | Select<T>) => Expr<boolean>;
14
+ export declare const isNotIn: <T>(a: EV<T>, b: EV<T[]> | Select<T>) => Expr<boolean>;
15
+ export declare const isGreater: <T>(a: EV<T>, b: EV<T>) => Expr<boolean>;
16
+ export declare const isGreaterOrEqual: <T>(a: EV<T>, b: EV<T>) => Expr<boolean>;
17
+ export declare const isLess: <T>(a: EV<T>, b: EV<T>) => Expr<boolean>;
18
+ export declare const isLessOrEqual: <T>(a: EV<T>, b: EV<T>) => Expr<boolean>;
19
+ export declare const add: <T extends number>(a: EV<T>, b: EV<T>) => Expr<number>;
20
+ export declare const subtract: <T extends number>(a: EV<T>, b: EV<T>) => Expr<number>;
21
+ export declare const multiply: <T extends number>(a: EV<T>, b: EV<T>) => Expr<number>;
22
+ export declare const divide: <T extends number>(a: EV<T>, b: EV<T>) => Expr<number>;
23
+ export declare const remainder: <T extends number>(a: EV<T>, b: EV<T>) => Expr<number>;
24
+ export declare const concat: <T extends string>(a: EV<T>, b: EV<T>) => Expr<string>;
25
+ export declare const like: <T extends string>(a: EV<T>, b: EV<T>) => Expr<boolean>;
26
+ export declare const glob: <T extends string>(a: EV<T>, b: EV<T>) => Expr<boolean>;
27
+ export declare const at: <T extends string>(a: EV<T[]>, index: number) => Expr<T | null>;
28
+ export declare const includes: <T extends string>(a: EV<T[]>, value: EV<T>) => Expr<boolean>;
4
29
  export declare function withRecursive<Row>(initialSelect: Select<Row>): RecursiveUnion<Row>;
5
30
  export declare function alias<T extends Table<{}>>(table: T): Record<string, T>;
6
31
  export declare function select<X extends Selection>(selection: X): Select<Selection.Infer<X>>;
@@ -1,4 +1,4 @@
1
- import { ExprData } from "./Expr.js";
1
+ import { Expr, ExprData } from "./Expr.js";
2
2
  import {
3
3
  Batch,
4
4
  Delete,
@@ -12,6 +12,30 @@ import {
12
12
  import { Schema } from "./Schema.js";
13
13
  import { Table, createTable } from "./Table.js";
14
14
  import { Target } from "./Target.js";
15
+ const value = Expr.value;
16
+ const and = Expr.and;
17
+ const or = Expr.or;
18
+ const not = (a) => Expr.create(a).not();
19
+ const is = (a, b) => Expr.create(a).is(b);
20
+ const isNot = (a, b) => Expr.create(a).isNot(b);
21
+ const isNull = (a) => Expr.create(a).isNull();
22
+ const isNotNull = (a) => Expr.create(a).isNotNull();
23
+ const isIn = (a, b) => Expr.create(a).isIn(b);
24
+ const isNotIn = (a, b) => Expr.create(a).isNotIn(b);
25
+ const isGreater = (a, b) => Expr.create(a).isGreater(b);
26
+ const isGreaterOrEqual = (a, b) => Expr.create(a).isGreaterOrEqual(b);
27
+ const isLess = (a, b) => Expr.create(a).isLess(b);
28
+ const isLessOrEqual = (a, b) => Expr.create(a).isLessOrEqual(b);
29
+ const add = (a, b) => Expr.create(a).add(b);
30
+ const subtract = (a, b) => Expr.create(a).subtract(b);
31
+ const multiply = (a, b) => Expr.create(a).multiply(b);
32
+ const divide = (a, b) => Expr.create(a).divide(b);
33
+ const remainder = (a, b) => Expr.create(a).remainder(b);
34
+ const concat = (a, b) => Expr.create(a).concat(b);
35
+ const like = (a, b) => Expr.create(a).like(b);
36
+ const glob = (a, b) => Expr.create(a).glob(b);
37
+ const at = (a, index) => Expr.create(a).at(index);
38
+ const includes = (a, value2) => Expr.create(a).includes(value2);
15
39
  function withRecursive(initialSelect) {
16
40
  return new RecursiveUnion(initialSelect[Query.Data]);
17
41
  }
@@ -55,12 +79,36 @@ function create(...tables) {
55
79
  );
56
80
  }
57
81
  export {
82
+ add,
58
83
  alias,
84
+ and,
85
+ at,
86
+ concat,
59
87
  create,
60
88
  deleteFrom,
89
+ divide,
61
90
  from,
91
+ glob,
92
+ includes,
62
93
  insertInto,
94
+ is,
95
+ isGreater,
96
+ isGreaterOrEqual,
97
+ isIn,
98
+ isLess,
99
+ isLessOrEqual,
100
+ isNot,
101
+ isNotIn,
102
+ isNotNull,
103
+ isNull,
104
+ like,
105
+ multiply,
106
+ not,
107
+ or,
108
+ remainder,
63
109
  select,
110
+ subtract,
64
111
  update,
112
+ value,
65
113
  withRecursive
66
114
  };
@@ -5,19 +5,19 @@ class PreparedStatement {
5
5
  constructor(stmt) {
6
6
  this.stmt = stmt;
7
7
  }
8
- iterate(params = []) {
8
+ iterate(params) {
9
9
  return this.stmt.iterate(...params);
10
10
  }
11
- all(params = []) {
11
+ all(params) {
12
12
  return this.stmt.all(...params);
13
13
  }
14
- run(params = []) {
14
+ run(params) {
15
15
  return { rowsAffected: this.stmt.run(...params).changes };
16
16
  }
17
- get(params = []) {
17
+ get(params) {
18
18
  return this.stmt.get(...params);
19
19
  }
20
- execute(params = []) {
20
+ execute(params) {
21
21
  this.stmt.run(...params);
22
22
  }
23
23
  }
@@ -7,21 +7,21 @@ class PreparedStatement {
7
7
  this.lastChanges = lastChanges;
8
8
  this.stmt = stmt;
9
9
  }
10
- *iterate(params = []) {
10
+ *iterate(params) {
11
11
  for (const row of this.stmt.all(...params))
12
12
  yield row;
13
13
  }
14
- all(params = []) {
14
+ all(params) {
15
15
  return this.stmt.all(...params);
16
16
  }
17
- run(params = []) {
17
+ run(params) {
18
18
  this.stmt.run(...params);
19
19
  return this.lastChanges();
20
20
  }
21
- get(params = []) {
21
+ get(params) {
22
22
  return this.stmt.get(...params);
23
23
  }
24
- execute(params = []) {
24
+ execute(params) {
25
25
  this.stmt.run(...params);
26
26
  }
27
27
  }
@@ -0,0 +1,19 @@
1
+ /// <reference types="@cloudflare/workers-types" />
2
+ import { QueryData } from '../define/Query.js';
3
+ import { SchemaInstructions } from '../define/Schema.js';
4
+ import { Driver, DriverOptions } from '../lib/Driver.js';
5
+ import { Statement } from '../lib/Statement.js';
6
+ import { SqliteSchema } from '../sqlite/SqliteSchema.js';
7
+ export declare class D1Driver extends Driver.Async {
8
+ private db;
9
+ lock: Promise<void> | undefined;
10
+ tableData: (tableName: string) => Promise<Array<SqliteSchema.Column>>;
11
+ indexData: (tableName: string) => Promise<Array<SqliteSchema.Index>>;
12
+ constructor(db: D1Database, options?: DriverOptions);
13
+ executeQuery(query: QueryData, stmt?: Driver.Async.PreparedStatement, params?: any[] | undefined): Promise<unknown>;
14
+ prepareStatement(stmt: Statement): Driver.Async.PreparedStatement;
15
+ schemaInstructions(tableName: string): Promise<SchemaInstructions | undefined>;
16
+ isolate(): [connection: Driver.Async, release: () => Promise<void>];
17
+ close(): Promise<void>;
18
+ }
19
+ export declare function connect(db: D1Database, options?: DriverOptions): D1Driver;
@@ -0,0 +1,69 @@
1
+ import { Driver } from "../lib/Driver.js";
2
+ import { SqliteFormatter } from "../sqlite/SqliteFormatter.js";
3
+ import { SqliteSchema } from "../sqlite/SqliteSchema.js";
4
+ class PreparedStatement {
5
+ constructor(stmt) {
6
+ this.stmt = stmt;
7
+ }
8
+ async *iterate(params) {
9
+ yield* await this.all(params);
10
+ }
11
+ async all(params) {
12
+ return this.stmt.bind(...params).raw();
13
+ }
14
+ async run(params) {
15
+ const results = await this.stmt.bind(...params).raw();
16
+ return {
17
+ get rowsAffected() {
18
+ throw new Error(`Affected rows cannot be queried on D1`);
19
+ }
20
+ };
21
+ }
22
+ async get(params) {
23
+ return (await this.all(params))[0];
24
+ }
25
+ async execute(params) {
26
+ this.stmt.bind(...params).raw();
27
+ }
28
+ }
29
+ class D1Driver extends Driver.Async {
30
+ constructor(db, options) {
31
+ super(new SqliteFormatter(), options);
32
+ this.db = db;
33
+ this.tableData = this.prepare(SqliteSchema.tableData);
34
+ this.indexData = this.prepare(SqliteSchema.indexData);
35
+ }
36
+ lock;
37
+ tableData;
38
+ indexData;
39
+ async executeQuery(query, stmt, params) {
40
+ await this.lock;
41
+ return super.executeQuery(query, stmt, params);
42
+ }
43
+ prepareStatement(stmt) {
44
+ return new PreparedStatement(this.db.prepare(stmt.sql));
45
+ }
46
+ async schemaInstructions(tableName) {
47
+ const columnData = await this.tableData(tableName);
48
+ const indexData = await this.indexData(tableName);
49
+ return SqliteSchema.createInstructions(columnData, indexData);
50
+ }
51
+ isolate() {
52
+ const connection = new D1Driver(this.db);
53
+ let release, trigger = new Promise((resolve) => {
54
+ release = async () => resolve();
55
+ });
56
+ this.lock = Promise.resolve(this.lock).then(() => trigger);
57
+ return [connection, release];
58
+ }
59
+ async close() {
60
+ await this.lock;
61
+ }
62
+ }
63
+ function connect(db, options) {
64
+ return new D1Driver(db, options);
65
+ }
66
+ export {
67
+ D1Driver,
68
+ connect
69
+ };
@@ -81,13 +81,13 @@ declare class SyncWrapper extends AsyncDriver {
81
81
  isolate(): [connection: AsyncDriver, release: () => Promise<void>];
82
82
  }
83
83
  interface AsyncPreparedStatement {
84
- run(params?: Array<any>): Promise<{
84
+ run(params: Array<any>): Promise<{
85
85
  rowsAffected: number;
86
86
  }>;
87
- iterate<T>(params?: Array<any>): AsyncIterable<T>;
88
- all<T>(params?: Array<any>): Promise<Array<T>>;
89
- get<T>(params?: Array<any>): Promise<T>;
90
- execute(params?: Array<any>): Promise<void>;
87
+ iterate<T>(params: Array<any>): AsyncIterable<T>;
88
+ all<T>(params: Array<any>): Promise<Array<T>>;
89
+ get<T>(params: Array<any>): Promise<T>;
90
+ execute(params: Array<any>): Promise<void>;
91
91
  }
92
92
  export type Driver = SyncDriver | AsyncDriver;
93
93
  export declare namespace Driver {
@@ -302,7 +302,7 @@ class AsyncDriver extends DriverBase {
302
302
  this.formatter.compile(cursor[Query.Data]),
303
303
  true
304
304
  );
305
- for await (const row of stmt.iterate()) {
305
+ for await (const row of stmt.iterate([])) {
306
306
  yield JSON.parse(row.result).result;
307
307
  }
308
308
  }
@@ -134,7 +134,7 @@ export type SqliteFunctions = {
134
134
  /** Return the remainder after dividing X by Y. This is similar to the '%' operator, except that it works for non-numbereger arguments. */
135
135
  mod(x: EV<number>, y: EV<number>): Expr<number>;
136
136
  /** Return an approximation for π. */
137
- pi(x: EV<number>): Expr<number>;
137
+ pi(): Expr<number>;
138
138
  /** Compute X raised to the power Y. */
139
139
  pow(x: EV<number>, y: EV<number>): Expr<number>;
140
140
  /** Convert X from degrees numbero radians. */
@@ -162,4 +162,4 @@ export declare const count: (x?: Expr<any>) => Expr<number>, iif: <T>(x: EV<bool
162
162
  (x: EV<any>, type: 'real'): Expr<number>;
163
163
  (x: EV<any>, type: 'integer'): Expr<number>;
164
164
  (x: EV<any>, type: 'numeric'): Expr<number>;
165
- }, abs: (x: EV<number>) => Expr<number>, changes: () => Expr<number>, char: (...arg: Array<EV<number>>) => Expr<string>, coalesce: (x: EV<any>, y: EV<any>, ...rest: EV<any>) => Expr<any>, ifnull: <T>(x: EV<T>, y: EV<T>) => Expr<T>, instr: (x: EV<string>, y: EV<string>) => Expr<number>, last_insert_rowid: () => Expr<number>, length: (x: EV<string>) => Expr<number>, likelihood: (x: EV<boolean>, y: number) => Expr<boolean>, likely: (x: EV<boolean>) => Expr<boolean>, lower: (x: EV<string>) => Expr<string>, ltrim: (x: EV<string>, y?: EV<string>) => Expr<string>, max: <T>(x: EV<T>, ...rest: EV<T>[]) => Expr<T>, min: <T>(x: EV<T>, ...rest: EV<T>[]) => Expr<T>, nullif: <T>(x: EV<T>, y: EV<T>) => Expr<T | null>, prnumberf: (format: string, ...rest: Array<Expr<any>>) => Expr<string>, quote: (x: EV<string>) => Expr<string>, random: () => Expr<number>, replace: (x: EV<string>, y: EV<string>, z: EV<string>) => Expr<string>, round: (x: EV<number>, y?: EV<number>) => Expr<number>, rtrim: (x: EV<string>, y?: EV<string>) => Expr<string>, sign: (x: EV<number>) => Expr<number>, soundex: (x: EV<string>) => Expr<string>, sqlite_version: () => Expr<string>, substr: (x: EV<string>, y: EV<number>, z?: EV<number>) => Expr<string>, total_changes: () => Expr<number>, trim: (x: EV<string>, Y: EV<string>) => Expr<string>, unicode: (x: EV<string>) => Expr<number>, unlikely: (x: EV<boolean>) => Expr<boolean>, upper: (x: EV<string>) => Expr<string>, avg: (x: Expr<number>) => Expr<number>, group_concat: (x: EV<string>, y?: EV<string>) => Expr<string>, sum: (x: EV<number>) => Expr<number>, acos: (x: EV<number>) => Expr<number>, acosh: (x: EV<number>) => Expr<number>, asin: (x: EV<number>) => Expr<number>, asinh: (x: EV<number>) => Expr<number>, atan: (x: EV<number>) => Expr<number>, atan2: (x: EV<number>, y: EV<number>) => Expr<number>, atanh: (x: EV<number>) => Expr<number>, ceil: (x: EV<number>) => Expr<number>, cos: (x: EV<number>) => Expr<number>, cosh: (x: EV<number>) => Expr<number>, degrees: (x: EV<number>) => Expr<number>, exp: (x: EV<number>) => Expr<number>, floor: (x: EV<number>) => Expr<number>, ln: (x: EV<number>) => Expr<number>, log: (x: EV<number>, y?: EV<number>) => Expr<number>, log2: (x: EV<number>) => Expr<number>, mod: (x: EV<number>, y: EV<number>) => Expr<number>, pi: (x: EV<number>) => Expr<number>, pow: (x: EV<number>, y: EV<number>) => Expr<number>, radians: (x: EV<number>) => Expr<number>, sin: (x: EV<number>) => Expr<number>, sinh: (x: EV<number>) => Expr<number>, sqrt: (x: EV<number>) => Expr<number>, tan: (x: EV<number>) => Expr<number>, tanh: (x: EV<number>) => Expr<number>, trunc: (x: EV<number>) => Expr<number>, date: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, time: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, datetime: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, julianday: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, strftime: (format: EV<string>, timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>;
165
+ }, abs: (x: EV<number>) => Expr<number>, changes: () => Expr<number>, char: (...arg: Array<EV<number>>) => Expr<string>, coalesce: (x: EV<any>, y: EV<any>, ...rest: EV<any>) => Expr<any>, ifnull: <T>(x: EV<T>, y: EV<T>) => Expr<T>, instr: (x: EV<string>, y: EV<string>) => Expr<number>, last_insert_rowid: () => Expr<number>, length: (x: EV<string>) => Expr<number>, likelihood: (x: EV<boolean>, y: number) => Expr<boolean>, likely: (x: EV<boolean>) => Expr<boolean>, lower: (x: EV<string>) => Expr<string>, ltrim: (x: EV<string>, y?: EV<string>) => Expr<string>, max: <T>(x: EV<T>, ...rest: EV<T>[]) => Expr<T>, min: <T>(x: EV<T>, ...rest: EV<T>[]) => Expr<T>, nullif: <T>(x: EV<T>, y: EV<T>) => Expr<T | null>, prnumberf: (format: string, ...rest: Array<Expr<any>>) => Expr<string>, quote: (x: EV<string>) => Expr<string>, random: () => Expr<number>, replace: (x: EV<string>, y: EV<string>, z: EV<string>) => Expr<string>, round: (x: EV<number>, y?: EV<number>) => Expr<number>, rtrim: (x: EV<string>, y?: EV<string>) => Expr<string>, sign: (x: EV<number>) => Expr<number>, soundex: (x: EV<string>) => Expr<string>, sqlite_version: () => Expr<string>, substr: (x: EV<string>, y: EV<number>, z?: EV<number>) => Expr<string>, total_changes: () => Expr<number>, trim: (x: EV<string>, Y: EV<string>) => Expr<string>, unicode: (x: EV<string>) => Expr<number>, unlikely: (x: EV<boolean>) => Expr<boolean>, upper: (x: EV<string>) => Expr<string>, avg: (x: Expr<number>) => Expr<number>, group_concat: (x: EV<string>, y?: EV<string>) => Expr<string>, sum: (x: EV<number>) => Expr<number>, acos: (x: EV<number>) => Expr<number>, acosh: (x: EV<number>) => Expr<number>, asin: (x: EV<number>) => Expr<number>, asinh: (x: EV<number>) => Expr<number>, atan: (x: EV<number>) => Expr<number>, atan2: (x: EV<number>, y: EV<number>) => Expr<number>, atanh: (x: EV<number>) => Expr<number>, ceil: (x: EV<number>) => Expr<number>, cos: (x: EV<number>) => Expr<number>, cosh: (x: EV<number>) => Expr<number>, degrees: (x: EV<number>) => Expr<number>, exp: (x: EV<number>) => Expr<number>, floor: (x: EV<number>) => Expr<number>, ln: (x: EV<number>) => Expr<number>, log: (x: EV<number>, y?: EV<number>) => Expr<number>, log2: (x: EV<number>) => Expr<number>, mod: (x: EV<number>, y: EV<number>) => Expr<number>, pi: () => Expr<number>, pow: (x: EV<number>, y: EV<number>) => Expr<number>, radians: (x: EV<number>) => Expr<number>, sin: (x: EV<number>) => Expr<number>, sinh: (x: EV<number>) => Expr<number>, sqrt: (x: EV<number>) => Expr<number>, tan: (x: EV<number>) => Expr<number>, tanh: (x: EV<number>) => Expr<number>, trunc: (x: EV<number>) => Expr<number>, date: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, time: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, datetime: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, julianday: (timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>, strftime: (format: EV<string>, timeValue: EV<any>, ...rest: Array<EV<string>>) => Expr<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rado",
3
- "version": "0.3.9",
3
+ "version": "0.4.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -47,13 +47,14 @@
47
47
  "prepublishOnly": "tsc -p tsconfig.build.json && tsx build.ts"
48
48
  },
49
49
  "devDependencies": {
50
+ "@cloudflare/workers-types": "^4.20230628.0",
50
51
  "@types/better-sqlite3": "^5.4.1",
51
52
  "@types/glob": "^8.0.0",
52
53
  "@types/sql.js": "^1.4.2",
53
54
  "better-sqlite3": "^7.5.1",
54
55
  "bun-types": "^0.5.0",
55
56
  "cross-env": "^7.0.3",
56
- "esbuild": "^0.17.10",
57
+ "esbuild": "^0.18.11",
57
58
  "glob": "^8.0.3",
58
59
  "rimraf": "^4.1.2",
59
60
  "sade": "^1.8.1",
@@ -67,8 +68,5 @@
67
68
  "volta": {
68
69
  "node": "18.12.1"
69
70
  },
70
- "packageManager": "yarn@3.3.1",
71
- "resolutions": {
72
- "esbuild": "0.17.10"
73
- }
71
+ "packageManager": "yarn@3.3.1"
74
72
  }