rado 1.2.1 → 1.3.0-preview.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.
Files changed (86) hide show
  1. package/README.md +163 -257
  2. package/dist/compat.d.ts +3 -0
  3. package/dist/core/Builder.d.ts +16 -9
  4. package/dist/core/Builder.js +52 -4
  5. package/dist/core/Column.d.ts +25 -21
  6. package/dist/core/Column.js +39 -23
  7. package/dist/core/Constraint.d.ts +2 -1
  8. package/dist/core/Constraint.js +2 -1
  9. package/dist/core/Database.d.ts +5 -4
  10. package/dist/core/Database.js +14 -13
  11. package/dist/core/Emitter.d.ts +2 -2
  12. package/dist/core/Index.d.ts +1 -1
  13. package/dist/core/Internal.d.ts +19 -2
  14. package/dist/core/Internal.js +29 -11
  15. package/dist/core/Param.js +2 -0
  16. package/dist/core/Queries.d.ts +1 -0
  17. package/dist/core/Queries.js +11 -1
  18. package/dist/core/Resolver.js +2 -2
  19. package/dist/core/Schema.d.ts +1 -3
  20. package/dist/core/Selection.d.ts +9 -4
  21. package/dist/core/Selection.js +94 -5
  22. package/dist/core/Sql.d.ts +4 -3
  23. package/dist/core/Sql.js +8 -2
  24. package/dist/core/Table.d.ts +18 -11
  25. package/dist/core/Table.js +45 -25
  26. package/dist/core/View.d.ts +34 -0
  27. package/dist/core/View.js +153 -0
  28. package/dist/core/Virtual.d.ts +7 -2
  29. package/dist/core/Virtual.js +14 -10
  30. package/dist/core/expr/Conditions.d.ts +7 -7
  31. package/dist/core/expr/Include.d.ts +2 -2
  32. package/dist/core/expr/Include.js +1 -1
  33. package/dist/core/expr/Input.d.ts +1 -1
  34. package/dist/core/expr/Input.js +5 -1
  35. package/dist/core/query/CTE.d.ts +3 -5
  36. package/dist/core/query/CTE.js +1 -13
  37. package/dist/core/query/Delete.d.ts +10 -10
  38. package/dist/core/query/Delete.js +2 -2
  39. package/dist/core/query/Insert.d.ts +6 -5
  40. package/dist/core/query/Insert.js +22 -9
  41. package/dist/core/query/Query.d.ts +26 -11
  42. package/dist/core/query/Select.d.ts +41 -8
  43. package/dist/core/query/Select.js +235 -25
  44. package/dist/core/query/Shared.d.ts +2 -1
  45. package/dist/core/query/Shared.js +8 -5
  46. package/dist/core/query/Update.d.ts +9 -9
  47. package/dist/core/query/Update.js +24 -12
  48. package/dist/driver/better-sqlite3.js +4 -0
  49. package/dist/driver/bun-sqlite.js +3 -0
  50. package/dist/driver/d1.js +3 -0
  51. package/dist/driver/libsql.js +4 -0
  52. package/dist/driver/mysql2.js +5 -0
  53. package/dist/driver/pg.d.ts +17 -1
  54. package/dist/driver/pg.js +10 -1
  55. package/dist/driver/pglite.js +21 -6
  56. package/dist/driver/sql.js.js +4 -0
  57. package/dist/index.d.ts +1 -0
  58. package/dist/index.js +1 -0
  59. package/dist/mysql/columns.d.ts +30 -30
  60. package/dist/mysql/columns.js +25 -24
  61. package/dist/mysql/dialect.js +6 -2
  62. package/dist/mysql/diff.js +1 -1
  63. package/dist/mysql.d.ts +1 -0
  64. package/dist/mysql.js +2 -0
  65. package/dist/postgres/columns.d.ts +103 -33
  66. package/dist/postgres/columns.js +317 -35
  67. package/dist/postgres/diff.js +3 -3
  68. package/dist/postgres/enum.d.ts +17 -0
  69. package/dist/postgres/enum.js +64 -0
  70. package/dist/postgres/schema.d.ts +19 -0
  71. package/dist/postgres/schema.js +47 -0
  72. package/dist/postgres.d.ts +3 -1
  73. package/dist/postgres.js +9 -2
  74. package/dist/sqlite/columns.d.ts +29 -14
  75. package/dist/sqlite/columns.js +41 -9
  76. package/dist/sqlite/dialect.js +3 -1
  77. package/dist/sqlite/diff.js +1 -1
  78. package/dist/sqlite/functions.d.ts +1 -1
  79. package/dist/sqlite/functions.js +1 -1
  80. package/dist/sqlite.d.ts +1 -0
  81. package/dist/sqlite.js +3 -6
  82. package/dist/universal/columns.d.ts +8 -8
  83. package/dist/universal/columns.js +10 -9
  84. package/dist/universal/functions.d.ts +1 -1
  85. package/dist/universal/functions.js +1 -1
  86. package/package.json +54 -37
@@ -1,8 +1,13 @@
1
1
  import type { DriverSpecs } from './Driver.js';
2
- import { type HasSql, internalData, internalSql } from './Internal.js';
3
- import { type Sql } from './Sql.js';
4
2
  import type { Field, FieldData } from './expr/Field.js';
5
3
  import { type Input } from './expr/Input.js';
4
+ import { type HasSql, internalData, internalEnum, internalSql } from './Internal.js';
5
+ import { type Sql } from './Sql.js';
6
+ export type ReferenceAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';
7
+ export interface ReferenceOptions {
8
+ onDelete?: ReferenceAction;
9
+ onUpdate?: ReferenceAction;
10
+ }
6
11
  export interface BaseColumnData {
7
12
  type: HasSql;
8
13
  name?: string;
@@ -10,13 +15,16 @@ export interface BaseColumnData {
10
15
  primary?: boolean;
11
16
  notNull?: boolean;
12
17
  isUnique?: boolean;
18
+ nullsNotDistinct?: boolean;
13
19
  autoIncrement?: boolean;
14
20
  defaultValue?: Sql;
15
21
  references?(): FieldData;
22
+ referenceOptions?: ReferenceOptions;
16
23
  mapFromDriverValue?(value: unknown, specs: DriverSpecs): unknown;
17
24
  mapToDriverValue?(value: unknown): unknown;
18
25
  $default?(): Sql;
19
26
  $onUpdate?(): Sql;
27
+ readonly [internalEnum]?: unknown;
20
28
  }
21
29
  export interface ColumnData extends BaseColumnData {
22
30
  type: ColumnType;
@@ -27,38 +35,34 @@ export declare class ColumnType implements HasSql {
27
35
  [internalSql]: Sql;
28
36
  constructor(kind: string, args: Array<Input<unknown>>, sql?: Sql);
29
37
  }
38
+ export type Nullability = [allowsNull: boolean, isRequired: boolean];
30
39
  type WithoutNull<Value> = Exclude<Value, null>;
31
- export declare class Column<Value = unknown> {
40
+ export declare class Column<Value = unknown, Nulls extends Nullability = Nullability> {
32
41
  readonly [internalData]: ColumnData;
33
42
  constructor(data: ColumnData);
34
- notNull(): RequiredColumn<Value>;
35
- $defaultFn(value: () => Input<WithoutNull<Value>>): Column<WithoutNull<Value>>;
36
- $default(value: Input<WithoutNull<Value>> | (() => Input<WithoutNull<Value>>)): Column<WithoutNull<Value>>;
37
- $onUpdateFn(fn: () => Input<Value>): Column<Value>;
38
- $onUpdate(fn: () => Input<Value>): Column<Value>;
39
- default(value: Input<WithoutNull<Value>>): Column<WithoutNull<Value>>;
40
- defaultNow(): Column<WithoutNull<Value>>;
43
+ notNull(): Column<Value, [false, Nulls[1]]>;
44
+ $defaultFn(value: () => Input<Value>): Column<Value, [Nulls[0], false]>;
45
+ $default(value: Input<Value> | (() => Input<Value>)): Column<Value, [Nulls[0], false]>;
46
+ $onUpdateFn(fn: () => Input<Value>): Column<Value, Nulls>;
47
+ $onUpdate(fn: () => Input<Value>): Column<Value, Nulls>;
48
+ default(value: Input<Value>): Column<Value, [Nulls[0], false]>;
49
+ defaultNow(): Column<WithoutNull<Value>, [Nulls[0], false]>;
41
50
  primaryKey(options?: {
42
51
  autoIncrement: boolean;
43
- }): Column<WithoutNull<Value>>;
44
- unique(name?: string): Column<Value>;
45
- references(foreignField: Field | (() => Field)): Column<Value>;
46
- $type<T>(): Column<null extends Value ? T | null : T>;
52
+ }): Column<Value, [false, false]>;
53
+ unique(name?: string): Column<Value, Nulls>;
54
+ references(foreignField: Field | (() => Field), options?: ReferenceOptions): Column<Value, Nulls>;
55
+ $type<T>(): Column<T, Nulls>;
47
56
  }
48
- export declare class JsonColumn<Value = unknown> extends Column<Value> {
57
+ export declare class JsonColumn<Value, Meta extends Nullability = Nullability> extends Column<Value, Meta> {
49
58
  private brand;
50
59
  constructor(data: ColumnData);
51
60
  }
52
- declare const required: unique symbol;
53
- export interface RequiredColumn<Value = unknown> extends Column<WithoutNull<Value>> {
54
- [required]: true;
55
- }
56
61
  export interface Columns {
57
- <T>(data: ColumnData): Column<T>;
58
62
  [key: string]: (...args: Array<Input<any>>) => ColumnType;
59
63
  }
60
64
  export declare const column: Columns;
61
- export type ColumnArguments<Options> = [name?: string] | [options: Options] | [name: string, options: Options];
65
+ export type ColumnArguments<Options> = [name?: string] | [options: Options] | [name: string | undefined, options: Options];
62
66
  export declare function columnConfig<Options>(args: ColumnArguments<Options>): {
63
67
  name: string | undefined;
64
68
  options: Options | undefined;
@@ -1,4 +1,6 @@
1
1
  // src/core/Column.ts
2
+ import { callFunction } from "./expr/Functions.js";
3
+ import { input, mapToColumn } from "./expr/Input.js";
2
4
  import {
3
5
  getData,
4
6
  getField,
@@ -6,8 +8,6 @@ import {
6
8
  internalSql
7
9
  } from "./Internal.js";
8
10
  import { sql } from "./Sql.js";
9
- import { callFunction } from "./expr/Functions.js";
10
- import { input, mapToColumn } from "./expr/Input.js";
11
11
  function formatType(kind, args) {
12
12
  return args.length === 0 ? sql.unsafe(kind) : sql`${sql.unsafe(kind)}(${sql.join(args.map(sql.inline), sql`, `)})`;
13
13
  }
@@ -17,6 +17,8 @@ var ColumnType = class {
17
17
  this.args = args;
18
18
  this[internalSql] = sql2;
19
19
  }
20
+ kind;
21
+ args;
20
22
  [internalSql];
21
23
  };
22
24
  var Column = class _Column {
@@ -36,7 +38,10 @@ var Column = class _Column {
36
38
  $default(value) {
37
39
  return new _Column({
38
40
  ...getData(this),
39
- $default: () => mapToColumn(getData(this), value instanceof Function ? value() : value)
41
+ $default: () => mapToColumn(
42
+ getData(this),
43
+ typeof value === "function" ? value() : value
44
+ )
40
45
  });
41
46
  }
42
47
  $onUpdateFn(fn) {
@@ -66,14 +71,15 @@ var Column = class _Column {
66
71
  unique(name) {
67
72
  return new _Column({ ...getData(this), isUnique: true });
68
73
  }
69
- references(foreignField) {
74
+ references(foreignField, options) {
70
75
  return new _Column({
71
76
  ...getData(this),
72
77
  references() {
73
78
  return getField(
74
79
  typeof foreignField === "function" ? foreignField() : foreignField
75
80
  );
76
- }
81
+ },
82
+ referenceOptions: options
77
83
  });
78
84
  }
79
85
  $type() {
@@ -85,42 +91,52 @@ var JsonColumn = class extends Column {
85
91
  super({ ...data, json: true });
86
92
  }
87
93
  };
88
- function createColumn(data) {
89
- return new Column(data);
90
- }
91
- var column = new Proxy(createColumn, {
92
- get(target, method) {
93
- return target[method] ??= (...args) => {
94
- while (args.length > 0)
95
- if (args.at(-1) === void 0) args.pop();
96
- else break;
97
- return new ColumnType(method, args);
98
- };
94
+ var column = new Proxy(
95
+ {},
96
+ {
97
+ get(target, method) {
98
+ return target[method] ??= (...args) => {
99
+ while (args.length > 0)
100
+ if (args.at(-1) === void 0) args.pop();
101
+ else break;
102
+ return new ColumnType(method, args);
103
+ };
104
+ }
99
105
  }
100
- });
106
+ );
101
107
  function columnConfig(args) {
108
+ if (args.length > 1)
109
+ return { name: args[0], options: args[1] };
102
110
  if (typeof args[0] === "string")
103
111
  return { name: args[0], options: args[1] };
104
112
  return { name: void 0, options: args[0] };
105
113
  }
106
- function formatReferences(fields) {
107
- return callFunction(
108
- sql.identifier(fields[0].targetName),
109
- fields.map((field) => sql.identifier(field.fieldName))
114
+ function formatReferences(fields, options = {}) {
115
+ return sql.query(
116
+ callFunction(
117
+ sql.identifier(fields[0].targetName),
118
+ fields.map((field) => sql.identifier(field.fieldName))
119
+ ),
120
+ {
121
+ onDelete: options.onDelete && sql.unsafe(options.onDelete),
122
+ onUpdate: options.onUpdate && sql.unsafe(options.onUpdate)
123
+ }
110
124
  );
111
125
  }
112
126
  function formatColumn(column2) {
113
- const references = column2.references && sql`references ${formatReferences([column2.references()])}`;
114
127
  return sql.query(
115
128
  column2.type,
116
129
  {
117
130
  primaryKey: column2.primary,
118
131
  notNull: column2.notNull,
119
132
  unique: column2.isUnique,
133
+ nullsNotDistinct: column2.nullsNotDistinct,
120
134
  autoincrement: column2.autoIncrement
121
135
  },
122
136
  column2.defaultValue !== void 0 ? sql`default (${column2.defaultValue})`.inlineValues() : void 0,
123
- references
137
+ {
138
+ references: column2.references && formatReferences([column2.references()], column2.referenceOptions)
139
+ }
124
140
  );
125
141
  }
126
142
  export {
@@ -1,6 +1,6 @@
1
+ import type { Field, FieldData } from './expr/Field.js';
1
2
  import { type HasConstraint, type HasData, internalConstraint, internalData } from './Internal.js';
2
3
  import { type Sql } from './Sql.js';
3
- import type { Field, FieldData } from './expr/Field.js';
4
4
  export interface ConstraintData {
5
5
  name?: string;
6
6
  }
@@ -46,6 +46,7 @@ export declare class ForeignKeyConstraint<TableName extends string = string> imp
46
46
  export declare function foreignKey<TableName extends string = string>(options: {
47
47
  name?: string;
48
48
  columns: Array<Field<unknown, TableName>>;
49
+ foreignColumns?: Array<Field<unknown, string>>;
49
50
  }): ForeignKeyConstraint<TableName>;
50
51
  export declare function foreignKey<TableName extends string = string>(...fields: Array<Field<unknown, TableName>>): ForeignKeyConstraint<TableName>;
51
52
  export type Constraint = UniqueConstraint | PrimaryKeyConstraint | ForeignKeyConstraint;
@@ -38,6 +38,7 @@ var PrimaryKeyConstraint = class {
38
38
  this.data = data;
39
39
  this[internalData] = data;
40
40
  }
41
+ data;
41
42
  [internalData];
42
43
  get [internalConstraint]() {
43
44
  const { fields } = getData(this);
@@ -82,7 +83,7 @@ function foreignKey(...args) {
82
83
  return new ForeignKeyConstraint({
83
84
  name: args[0].name,
84
85
  fields: args[0].columns.map(getField),
85
- references: []
86
+ references: args[0].foreignColumns?.map(getField) ?? []
86
87
  });
87
88
  return new ForeignKeyConstraint({
88
89
  fields: args.map(getField),
@@ -2,13 +2,13 @@ import { Builder } from './Builder.js';
2
2
  import type { Dialect } from './Dialect.js';
3
3
  import type { Diff } from './Diff.js';
4
4
  import type { Driver } from './Driver.js';
5
- import { type HasQuery, type HasResolver, type HasSql, type HasTable, internalResolver } from './Internal.js';
5
+ import { type HasCreate, type HasDrop, type HasQuery, type HasResolver, type HasSql, type HasTarget, internalResolver } from './Internal.js';
6
6
  import type { Async, Deliver, Either, QueryDialect, QueryMeta, Sync } from './MetaData.js';
7
7
  import { BatchQuery } from './Queries.js';
8
+ import type { SelectFirst } from './query/Select.js';
8
9
  import { Resolver } from './Resolver.js';
9
10
  import { type Sql } from './Sql.js';
10
11
  import type { Table } from './Table.js';
11
- import type { SelectFirst } from './query/Select.js';
12
12
  export declare class Database<Meta extends QueryMeta = Either> extends Builder<Meta> implements HasResolver<Meta> {
13
13
  driver: Driver;
14
14
  dialect: Dialect;
@@ -19,8 +19,8 @@ export declare class Database<Meta extends QueryMeta = Either> extends Builder<M
19
19
  close(this: Database<Sync>): void;
20
20
  [Symbol.dispose](this: Database<Sync>): void;
21
21
  [Symbol.asyncDispose](this: Database<Async>): Promise<void>;
22
- create(...tables: Array<HasTable>): BatchQuery<unknown, Meta>;
23
- drop(...tables: Array<HasTable>): BatchQuery<unknown, Meta>;
22
+ create(...createables: Array<HasCreate>): BatchQuery<unknown, Meta>;
23
+ drop(...droppables: Array<HasDrop>): BatchQuery<unknown, Meta>;
24
24
  run(input: HasSql): Deliver<Meta, void>;
25
25
  get<Result extends Array<unknown>>(input: HasQuery<Result>): Deliver<Meta, Result[number]>;
26
26
  get<Result>(input: HasSql<Result>): Deliver<Meta, Result>;
@@ -28,6 +28,7 @@ export declare class Database<Meta extends QueryMeta = Either> extends Builder<M
28
28
  migrate(...tables: Array<Table>): Deliver<Meta, void>;
29
29
  batch<Queries extends Array<HasSql | HasQuery>>(queries: Queries): BatchQuery<unknown, Meta>;
30
30
  execute(input: HasSql): Deliver<Meta, void>;
31
+ refreshMaterializedView(view: HasTarget): Deliver<Meta, void>;
31
32
  transaction<T>(this: Database<Sync>, run: (tx: Transaction<Meta>) => T, options?: TransactionOptions[Meta['dialect']]): T;
32
33
  transaction<T>(this: Database<Async>, run: (tx: Transaction<Meta>) => Promise<T>, options?: TransactionOptions[Meta['dialect']]): Promise<T>;
33
34
  transaction<T>(run: (tx: Transaction<Meta>) => T | Promise<T>, options?: TransactionOptions[Meta['dialect']]): Deliver<Meta, T>;
@@ -1,15 +1,17 @@
1
1
  // src/core/Database.ts
2
2
  import { txGenerator } from "../universal.js";
3
3
  import { Builder } from "./Builder.js";
4
+ import { count } from "./expr/Aggregate.js";
4
5
  import {
6
+ getCreate,
7
+ getDrop,
5
8
  getResolver,
6
- getTable,
9
+ getSql,
7
10
  internalResolver
8
11
  } from "./Internal.js";
9
12
  import { BatchQuery } from "./Queries.js";
10
13
  import { Resolver } from "./Resolver.js";
11
14
  import { sql } from "./Sql.js";
12
- import { count } from "./expr/Aggregate.js";
13
15
  var Database = class extends Builder {
14
16
  driver;
15
17
  dialect;
@@ -32,17 +34,11 @@ var Database = class extends Builder {
32
34
  async [Symbol.asyncDispose]() {
33
35
  return this.close();
34
36
  }
35
- create(...tables) {
36
- return new BatchQuery(
37
- getResolver(this),
38
- tables.flatMap((table) => getTable(table).create())
39
- );
37
+ create(...createables) {
38
+ return new BatchQuery(getResolver(this), createables.flatMap(getCreate));
40
39
  }
41
- drop(...tables) {
42
- return new BatchQuery(
43
- getResolver(this),
44
- tables.map((table) => getTable(table).drop())
45
- );
40
+ drop(...droppables) {
41
+ return new BatchQuery(getResolver(this), droppables.flatMap(getDrop));
46
42
  }
47
43
  run(input) {
48
44
  const sql2 = this.dialect.inline(input);
@@ -71,10 +67,14 @@ var Database = class extends Builder {
71
67
  return new BatchQuery(getResolver(this), queries);
72
68
  }
73
69
  execute(input) {
74
- const emitter = this.dialect.emit(input);
70
+ const inner = getSql(input);
71
+ const emitter = this.dialect.emit(inner.inlineValues());
75
72
  if (emitter.hasParams) throw new Error("Query has parameters");
76
73
  return this.driver.exec(emitter.sql);
77
74
  }
75
+ refreshMaterializedView(view) {
76
+ return this.execute(sql`refresh materialized view ${view}`);
77
+ }
78
78
  transaction(run, options = {}) {
79
79
  return this.driver.transaction(
80
80
  (inner) => {
@@ -93,6 +93,7 @@ var Rollback = class extends Error {
93
93
  super("Rollback");
94
94
  this.data = data;
95
95
  }
96
+ data;
96
97
  };
97
98
  var Transaction = class extends Database {
98
99
  rollback(data) {
@@ -1,9 +1,9 @@
1
+ import type { FieldData } from './expr/Field.js';
2
+ import type { JsonPath } from './expr/Json.js';
1
3
  import { type HasSql } from './Internal.js';
2
4
  import type { Runtime } from './MetaData.js';
3
5
  import { type Param } from './Param.js';
4
6
  import { Sql } from './Sql.js';
5
- import type { FieldData } from './expr/Field.js';
6
- import type { JsonPath } from './expr/Json.js';
7
7
  export declare abstract class Emitter {
8
8
  #private;
9
9
  sql: string;
@@ -1,6 +1,6 @@
1
+ import type { Field } from './expr/Field.js';
1
2
  import { type HasData, type HasSql, internalData } from './Internal.js';
2
3
  import { type Sql } from './Sql.js';
3
- import type { Field } from './expr/Field.js';
4
4
  declare class IndexData {
5
5
  fields: Array<HasSql>;
6
6
  concurrently?: boolean;
@@ -1,9 +1,9 @@
1
+ import type { FieldData } from './expr/Field.js';
1
2
  import type { QueryMeta } from './MetaData.js';
2
3
  import type { Resolver } from './Resolver.js';
3
4
  import type { Selection } from './Selection.js';
4
5
  import type { Sql } from './Sql.js';
5
6
  import type { TableApi, TableDefinition } from './Table.js';
6
- import type { FieldData } from './expr/Field.js';
7
7
  export declare const internalData: unique symbol;
8
8
  export declare const internalSql: unique symbol;
9
9
  export declare const internalSelection: unique symbol;
@@ -15,6 +15,9 @@ export declare const internalField: unique symbol;
15
15
  export declare const internalResolver: unique symbol;
16
16
  export declare const internalConstraint: unique symbol;
17
17
  export declare const internalInclude: unique symbol;
18
+ export declare const internalEnum: unique symbol;
19
+ export declare const internalCreate: unique symbol;
20
+ export declare const internalDrop: unique symbol;
18
21
  export declare class HasData<Data> {
19
22
  get [internalData](): Data;
20
23
  }
@@ -26,7 +29,6 @@ export declare class HasSelection {
26
29
  }
27
30
  export declare class HasTarget<Name extends string = string> {
28
31
  get [internalTarget](): Sql;
29
- private brand?;
30
32
  }
31
33
  export declare class HasQuery<Result = unknown> {
32
34
  get [internalQuery](): Sql<Result>;
@@ -46,6 +48,15 @@ export declare class HasResolver<Meta extends QueryMeta = QueryMeta> {
46
48
  export declare class HasConstraint {
47
49
  get [internalConstraint](): Sql;
48
50
  }
51
+ export declare class HasEnum<EnumData> {
52
+ get [internalEnum](): EnumData;
53
+ }
54
+ export interface HasCreate {
55
+ readonly [internalCreate]: Array<Sql>;
56
+ }
57
+ export interface HasDrop {
58
+ readonly [internalDrop]: Array<Sql>;
59
+ }
49
60
  export declare const hasData: <Data>(obj: object) => obj is HasData<Data>;
50
61
  export declare const getData: <Data>(obj: HasData<Data>) => Data;
51
62
  export declare const hasSql: <Value>(obj: object) => obj is HasSql<Value>;
@@ -66,3 +77,9 @@ export declare const hasResolver: <Meta extends QueryMeta>(obj: object) => obj i
66
77
  export declare const getResolver: <Meta extends QueryMeta>(obj: HasResolver<Meta>) => Resolver<Meta>;
67
78
  export declare const hasConstraint: (obj: object) => obj is HasConstraint;
68
79
  export declare const getConstraint: (obj: HasConstraint) => Sql<unknown>;
80
+ export declare const hasEnum: <EnumData>(obj: object) => obj is HasEnum<EnumData>;
81
+ export declare const getEnum: <EnumData>(obj: HasEnum<EnumData>) => EnumData;
82
+ export declare const hasCreate: (obj: object) => obj is HasCreate;
83
+ export declare const getCreate: (obj: HasCreate) => Sql<unknown>[];
84
+ export declare const hasDrop: (obj: object) => obj is HasDrop;
85
+ export declare const getDrop: (obj: HasDrop) => Sql<unknown>[];
@@ -1,15 +1,18 @@
1
1
  // src/core/Internal.ts
2
- var internalData = Symbol();
3
- var internalSql = Symbol();
4
- var internalSelection = Symbol();
5
- var internalTarget = Symbol();
6
- var internalQuery = Symbol();
7
- var internalBatch = Symbol();
8
- var internalTable = Symbol();
9
- var internalField = Symbol();
10
- var internalResolver = Symbol();
11
- var internalConstraint = Symbol();
12
- var internalInclude = Symbol();
2
+ var internalData = /* @__PURE__ */ Symbol();
3
+ var internalSql = /* @__PURE__ */ Symbol();
4
+ var internalSelection = /* @__PURE__ */ Symbol();
5
+ var internalTarget = /* @__PURE__ */ Symbol();
6
+ var internalQuery = /* @__PURE__ */ Symbol();
7
+ var internalBatch = /* @__PURE__ */ Symbol();
8
+ var internalTable = /* @__PURE__ */ Symbol();
9
+ var internalField = /* @__PURE__ */ Symbol();
10
+ var internalResolver = /* @__PURE__ */ Symbol();
11
+ var internalConstraint = /* @__PURE__ */ Symbol();
12
+ var internalInclude = /* @__PURE__ */ Symbol();
13
+ var internalEnum = /* @__PURE__ */ Symbol();
14
+ var internalCreate = /* @__PURE__ */ Symbol();
15
+ var internalDrop = /* @__PURE__ */ Symbol();
13
16
  var hasData = (obj) => internalData in obj;
14
17
  var getData = (obj) => obj[internalData];
15
18
  var hasSql = (obj) => internalSql in obj;
@@ -30,10 +33,19 @@ var hasResolver = (obj) => internalResolver in obj;
30
33
  var getResolver = (obj) => obj[internalResolver];
31
34
  var hasConstraint = (obj) => internalConstraint in obj;
32
35
  var getConstraint = (obj) => obj[internalConstraint];
36
+ var hasEnum = (obj) => internalEnum in obj;
37
+ var getEnum = (obj) => obj[internalEnum];
38
+ var hasCreate = (obj) => internalCreate in obj;
39
+ var getCreate = (obj) => obj[internalCreate];
40
+ var hasDrop = (obj) => internalDrop in obj;
41
+ var getDrop = (obj) => obj[internalDrop];
33
42
  export {
34
43
  getBatch,
35
44
  getConstraint,
45
+ getCreate,
36
46
  getData,
47
+ getDrop,
48
+ getEnum,
37
49
  getField,
38
50
  getQuery,
39
51
  getResolver,
@@ -43,7 +55,10 @@ export {
43
55
  getTarget,
44
56
  hasBatch,
45
57
  hasConstraint,
58
+ hasCreate,
46
59
  hasData,
60
+ hasDrop,
61
+ hasEnum,
47
62
  hasField,
48
63
  hasQuery,
49
64
  hasResolver,
@@ -53,7 +68,10 @@ export {
53
68
  hasTarget,
54
69
  internalBatch,
55
70
  internalConstraint,
71
+ internalCreate,
56
72
  internalData,
73
+ internalDrop,
74
+ internalEnum,
57
75
  internalField,
58
76
  internalInclude,
59
77
  internalQuery,
@@ -3,11 +3,13 @@ var NamedParam = class {
3
3
  constructor(name) {
4
4
  this.name = name;
5
5
  }
6
+ name;
6
7
  };
7
8
  var ValueParam = class {
8
9
  constructor(value) {
9
10
  this.value = value;
10
11
  }
12
+ value;
11
13
  };
12
14
  export {
13
15
  NamedParam,
@@ -29,6 +29,7 @@ export declare abstract class SingleQuery<Result, Meta extends QueryMeta> extend
29
29
  get<Result extends Array<unknown>>(this: SingleQuery<Result, Meta>, db?: HasResolver): Deliver<Meta, Result[number] | null>;
30
30
  get(db?: HasResolver): Deliver<Meta, Result | null>;
31
31
  run(db?: HasResolver): Deliver<Meta, void>;
32
+ execute(inputs?: Record<string, unknown>, db?: HasResolver): Promise<Result>;
32
33
  prepare<Inputs extends Record<string, unknown>>(name?: string): PreparedQuery<Result, Inputs, Meta>;
33
34
  toSQL(db?: HasResolver): {
34
35
  sql: string;
@@ -25,7 +25,6 @@ var Executable = class {
25
25
  run() {
26
26
  return this.#execute();
27
27
  }
28
- // biome-ignore lint/suspicious/noThenProperty:
29
28
  async then(onfulfilled, onrejected) {
30
29
  try {
31
30
  const result = await this.#execute();
@@ -82,6 +81,17 @@ var SingleQuery = class extends Executable {
82
81
  run(db) {
83
82
  return this.#exec("run", db);
84
83
  }
84
+ async execute(inputs, db) {
85
+ const data = getData(this);
86
+ const resolver = db ? getResolver(db) : data.resolver;
87
+ if (!resolver) throw new Error("Query has no resolver");
88
+ const prepared = resolver.prepare(this, "");
89
+ try {
90
+ return await prepared.execute(inputs);
91
+ } finally {
92
+ prepared.free();
93
+ }
94
+ }
85
95
  prepare(name) {
86
96
  return getData(this).resolver.prepare(this, name);
87
97
  }
@@ -54,9 +54,9 @@ var Batch = class {
54
54
  if (!mapRow) continue;
55
55
  const rows = results[i];
56
56
  for (let j = 0; j < results[i].length; j++) {
57
- ctx.values = rows[i];
57
+ ctx.values = rows[j];
58
58
  ctx.index = 0;
59
- rows[i] = mapRow(ctx);
59
+ rows[j] = mapRow(ctx);
60
60
  }
61
61
  }
62
62
  return results;
@@ -1,7 +1,5 @@
1
1
  import { type Table, type TableConfig, type TableDefinition } from './Table.js';
2
- type Prefix<SchemaName extends string, TableName extends string> = `${SchemaName}.${TableName}`;
3
2
  export interface Schema<SchemaName extends string> {
4
- table<Definition extends TableDefinition, TableName extends string>(tableName: TableName, columns: Definition, config?: (self: Table<Definition>) => TableConfig<Prefix<SchemaName, TableName>>): Table<Definition, Prefix<SchemaName, TableName>>;
3
+ table<Definition extends TableDefinition, TableName extends string>(tableName: TableName, columns: Definition, config?: (self: Table<Definition>) => TableConfig<TableName>): Table<Definition, TableName>;
5
4
  }
6
5
  export declare function schema<SchemaName extends string>(schemaName: SchemaName): Schema<SchemaName>;
7
- export {};
@@ -1,10 +1,11 @@
1
1
  import type { DriverSpecs } from './Driver.js';
2
+ import type { Include } from './expr/Include.js';
2
3
  import { type HasSql, type HasTable, type HasTarget, internalSql } from './Internal.js';
4
+ import type { JoinOp } from './query/Query.js';
3
5
  import { type Sql } from './Sql.js';
4
6
  import type { Table, TableRow } from './Table.js';
5
7
  import type { Expand } from './Types.js';
6
- import type { Include } from './expr/Include.js';
7
- import type { JoinOp } from './query/Query.js';
8
+ import { type VirtualTarget } from './Virtual.js';
8
9
  declare const nullable: unique symbol;
9
10
  export interface SelectionRecord extends Record<string, SelectionInput> {
10
11
  }
@@ -18,7 +19,7 @@ export type SelectionInput = HasSql | HasTable | HasTarget | SelectionRecord | I
18
19
  export type RowOfRecord<Input> = Expand<{
19
20
  [Key in keyof Input as Key extends string ? Key : never]: SelectionRow<Input[Key]>;
20
21
  }>;
21
- 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;
22
+ export type SelectionRow<Input> = Input extends HasSql<infer Value> ? Value : Input extends IsNullable ? RowOfRecord<Input> | null : Input extends Table<infer Definition> ? TableRow<Definition> : Input extends object ? RowOfRecord<Input> : never;
22
23
  export interface MapRowContext {
23
24
  values: Array<unknown>;
24
25
  index: number;
@@ -30,8 +31,9 @@ export declare class Selection implements HasSql {
30
31
  nullable: Set<string>;
31
32
  mapRow: (ctx: MapRowContext) => unknown;
32
33
  constructor(input: SelectionInput, nullable?: Set<string>);
33
- makeVirtual<Input>(name: string): Input & HasTarget;
34
+ makeVirtual<Input>(name: string): VirtualTarget<Input>;
34
35
  fieldNames(): Array<string>;
36
+ aliasOf(input: HasSql): string | undefined;
35
37
  get [internalSql](): Sql;
36
38
  join(right: HasTarget | Sql, operator: JoinOp): Selection;
37
39
  }
@@ -45,5 +47,8 @@ export declare class JoinSelection extends Selection {
45
47
  constructor(tables: Array<HasTable>, nullable: Set<string>);
46
48
  join(right: HasTarget | Sql, operator: JoinOp): Selection;
47
49
  }
50
+ export declare class StarSelection extends Selection {
51
+ get [internalSql](): Sql;
52
+ }
48
53
  export declare function selection(input: SelectionInput): Selection;
49
54
  export {};