rado 1.2.0 → 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 +38 -25
  6. package/dist/core/Column.js +56 -27
  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 +43 -26
  84. package/dist/universal/functions.d.ts +1 -1
  85. package/dist/universal/functions.js +1 -1
  86. package/package.json +54 -37
@@ -1,58 +1,71 @@
1
1
  import type { DriverSpecs } from './Driver.js';
2
- import { internalData } 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';
6
- export interface ColumnData {
7
- type: Sql;
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
+ }
11
+ export interface BaseColumnData {
12
+ type: HasSql;
8
13
  name?: string;
9
14
  json?: boolean;
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
  }
29
+ export interface ColumnData extends BaseColumnData {
30
+ type: ColumnType;
31
+ }
32
+ export declare class ColumnType implements HasSql {
33
+ kind: string;
34
+ args: Array<Input<unknown>>;
35
+ [internalSql]: Sql;
36
+ constructor(kind: string, args: Array<Input<unknown>>, sql?: Sql);
37
+ }
38
+ export type Nullability = [allowsNull: boolean, isRequired: boolean];
21
39
  type WithoutNull<Value> = Exclude<Value, null>;
22
- export declare class Column<Value = unknown> {
40
+ export declare class Column<Value = unknown, Nulls extends Nullability = Nullability> {
23
41
  readonly [internalData]: ColumnData;
24
42
  constructor(data: ColumnData);
25
- notNull(): RequiredColumn<Value>;
26
- $defaultFn(value: () => Input<WithoutNull<Value>>): Column<WithoutNull<Value>>;
27
- $default(value: Input<WithoutNull<Value>> | (() => Input<WithoutNull<Value>>)): Column<WithoutNull<Value>>;
28
- $onUpdateFn(fn: () => Input<Value>): Column<Value>;
29
- $onUpdate(fn: () => Input<Value>): Column<Value>;
30
- default(value: Input<WithoutNull<Value>>): Column<WithoutNull<Value>>;
31
- 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]>;
32
50
  primaryKey(options?: {
33
51
  autoIncrement: boolean;
34
- }): Column<WithoutNull<Value>>;
35
- unique(name?: string): Column<Value>;
36
- references(foreignField: Field | (() => Field)): Column<Value>;
37
- $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>;
38
56
  }
39
- export declare class JsonColumn<Value = unknown> extends Column<Value> {
57
+ export declare class JsonColumn<Value, Meta extends Nullability = Nullability> extends Column<Value, Meta> {
40
58
  private brand;
41
59
  constructor(data: ColumnData);
42
60
  }
43
- declare const required: unique symbol;
44
- export interface RequiredColumn<Value = unknown> extends Column<WithoutNull<Value>> {
45
- [required]: true;
46
- }
47
61
  export interface Columns {
48
- <T>(data: ColumnData): Column<T>;
49
- [key: string]: (...args: Array<Input<any>>) => Sql<any>;
62
+ [key: string]: (...args: Array<Input<any>>) => ColumnType;
50
63
  }
51
64
  export declare const column: Columns;
52
- 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];
53
66
  export declare function columnConfig<Options>(args: ColumnArguments<Options>): {
54
67
  name: string | undefined;
55
68
  options: Options | undefined;
56
69
  };
57
- export declare function formatColumn(column: ColumnData): Sql;
70
+ export declare function formatColumn(column: BaseColumnData): Sql;
58
71
  export {};
@@ -1,8 +1,26 @@
1
1
  // src/core/Column.ts
2
- import { getData, getField, internalData } from "./Internal.js";
3
- import { sql } from "./Sql.js";
4
2
  import { callFunction } from "./expr/Functions.js";
5
3
  import { input, mapToColumn } from "./expr/Input.js";
4
+ import {
5
+ getData,
6
+ getField,
7
+ internalData,
8
+ internalSql
9
+ } from "./Internal.js";
10
+ import { sql } from "./Sql.js";
11
+ function formatType(kind, args) {
12
+ return args.length === 0 ? sql.unsafe(kind) : sql`${sql.unsafe(kind)}(${sql.join(args.map(sql.inline), sql`, `)})`;
13
+ }
14
+ var ColumnType = class {
15
+ constructor(kind, args, sql2 = formatType(kind, args)) {
16
+ this.kind = kind;
17
+ this.args = args;
18
+ this[internalSql] = sql2;
19
+ }
20
+ kind;
21
+ args;
22
+ [internalSql];
23
+ };
6
24
  var Column = class _Column {
7
25
  [internalData];
8
26
  constructor(data) {
@@ -20,7 +38,10 @@ var Column = class _Column {
20
38
  $default(value) {
21
39
  return new _Column({
22
40
  ...getData(this),
23
- $default: () => mapToColumn(getData(this), value instanceof Function ? value() : value)
41
+ $default: () => mapToColumn(
42
+ getData(this),
43
+ typeof value === "function" ? value() : value
44
+ )
24
45
  });
25
46
  }
26
47
  $onUpdateFn(fn) {
@@ -50,14 +71,15 @@ var Column = class _Column {
50
71
  unique(name) {
51
72
  return new _Column({ ...getData(this), isUnique: true });
52
73
  }
53
- references(foreignField) {
74
+ references(foreignField, options) {
54
75
  return new _Column({
55
76
  ...getData(this),
56
77
  references() {
57
78
  return getField(
58
79
  typeof foreignField === "function" ? foreignField() : foreignField
59
80
  );
60
- }
81
+ },
82
+ referenceOptions: options
61
83
  });
62
84
  }
63
85
  $type() {
@@ -69,50 +91,57 @@ var JsonColumn = class extends Column {
69
91
  super({ ...data, json: true });
70
92
  }
71
93
  };
72
- function createColumn(data) {
73
- return new Column(data);
74
- }
75
- var column = new Proxy(createColumn, {
76
- get(target, method) {
77
- return target[method] ??= (...args) => {
78
- while (args.length > 0)
79
- if (args.at(-1) === void 0) args.pop();
80
- else break;
81
- if (args.length === 0) return sql.unsafe(method);
82
- return sql`${sql.unsafe(method)}(${sql.join(
83
- args.map(sql.inline),
84
- sql`, `
85
- )})`;
86
- };
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
+ }
87
105
  }
88
- });
106
+ );
89
107
  function columnConfig(args) {
108
+ if (args.length > 1)
109
+ return { name: args[0], options: args[1] };
90
110
  if (typeof args[0] === "string")
91
111
  return { name: args[0], options: args[1] };
92
112
  return { name: void 0, options: args[0] };
93
113
  }
94
- function formatReferences(fields) {
95
- return callFunction(
96
- sql.identifier(fields[0].targetName),
97
- 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
+ }
98
124
  );
99
125
  }
100
126
  function formatColumn(column2) {
101
- const references = column2.references && sql`references ${formatReferences([column2.references()])}`;
102
127
  return sql.query(
103
128
  column2.type,
104
129
  {
105
130
  primaryKey: column2.primary,
106
131
  notNull: column2.notNull,
107
132
  unique: column2.isUnique,
133
+ nullsNotDistinct: column2.nullsNotDistinct,
108
134
  autoincrement: column2.autoIncrement
109
135
  },
110
136
  column2.defaultValue !== void 0 ? sql`default (${column2.defaultValue})`.inlineValues() : void 0,
111
- references
137
+ {
138
+ references: column2.references && formatReferences([column2.references()], column2.referenceOptions)
139
+ }
112
140
  );
113
141
  }
114
142
  export {
115
143
  Column,
144
+ ColumnType,
116
145
  JsonColumn,
117
146
  column,
118
147
  columnConfig,
@@ -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 {};