effect-qb 0.16.0 → 0.19.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 (128) hide show
  1. package/README.md +4 -0
  2. package/dist/index.js +8065 -0
  3. package/dist/mysql.js +4036 -2418
  4. package/dist/postgres/metadata.js +2536 -625
  5. package/dist/postgres.js +8248 -7857
  6. package/dist/sqlite.js +8854 -0
  7. package/dist/standard.js +8019 -0
  8. package/package.json +15 -3
  9. package/src/casing.ts +71 -0
  10. package/src/index.ts +2 -0
  11. package/src/internal/casing.ts +89 -0
  12. package/src/internal/column-state.ts +11 -6
  13. package/src/internal/column.ts +44 -7
  14. package/src/internal/datatypes/define.ts +2 -1
  15. package/src/internal/datatypes/enrich.ts +23 -0
  16. package/src/internal/datatypes/lookup.ts +14 -7
  17. package/src/internal/derived-table.ts +7 -13
  18. package/src/internal/dialect-renderers/mysql.ts +2046 -0
  19. package/src/{postgres/internal/sql-expression-renderer.ts → internal/dialect-renderers/postgres.ts} +867 -283
  20. package/src/{mysql/internal/sql-expression-renderer.ts → internal/dialect-renderers/sqlite.ts} +834 -358
  21. package/src/internal/dialect.ts +37 -0
  22. package/src/internal/dsl-mutation-runtime.ts +29 -10
  23. package/src/internal/dsl-plan-runtime.ts +41 -24
  24. package/src/internal/dsl-query-runtime.ts +11 -31
  25. package/src/internal/dsl-transaction-ddl-runtime.ts +61 -15
  26. package/src/internal/executor.ts +57 -15
  27. package/src/internal/expression-ast.ts +3 -2
  28. package/src/internal/grouping-key.ts +216 -9
  29. package/src/internal/implication-runtime.ts +3 -2
  30. package/src/internal/json/types.ts +155 -40
  31. package/src/internal/predicate/context.ts +14 -1
  32. package/src/internal/predicate/key.ts +19 -2
  33. package/src/internal/predicate/runtime.ts +30 -3
  34. package/src/internal/query.d.ts +38 -11
  35. package/src/internal/query.ts +315 -54
  36. package/src/internal/renderer.ts +51 -6
  37. package/src/internal/runtime/driver-value-mapping.ts +58 -0
  38. package/src/internal/runtime/normalize.ts +74 -43
  39. package/src/internal/runtime/schema.ts +5 -3
  40. package/src/internal/runtime/value.ts +153 -30
  41. package/src/internal/scalar.ts +6 -1
  42. package/src/internal/schema-derivation.d.ts +12 -61
  43. package/src/internal/schema-derivation.ts +90 -38
  44. package/src/internal/schema-expression.ts +2 -2
  45. package/src/internal/sql-expression-renderer.ts +19 -0
  46. package/src/internal/standard-dsl.ts +6885 -0
  47. package/src/internal/table-options.ts +229 -62
  48. package/src/internal/table.d.ts +33 -32
  49. package/src/internal/table.ts +469 -160
  50. package/src/mysql/column-extension.ts +3 -0
  51. package/src/mysql/column.ts +27 -12
  52. package/src/mysql/datatypes/index.ts +24 -2
  53. package/src/mysql/errors/catalog.ts +5 -5
  54. package/src/mysql/errors/normalize.ts +2 -2
  55. package/src/mysql/executor.ts +7 -5
  56. package/src/mysql/internal/dialect.ts +9 -4
  57. package/src/mysql/internal/dsl.ts +906 -324
  58. package/src/mysql/internal/renderer.ts +7 -2
  59. package/src/mysql/json.ts +37 -0
  60. package/src/mysql/query-extension.ts +16 -0
  61. package/src/mysql/query.ts +9 -2
  62. package/src/mysql/renderer.ts +31 -4
  63. package/src/mysql.ts +4 -12
  64. package/src/postgres/column-extension.ts +28 -0
  65. package/src/postgres/column.ts +9 -13
  66. package/src/postgres/datatypes/index.d.ts +2 -1
  67. package/src/postgres/datatypes/index.ts +3 -2
  68. package/src/postgres/errors/normalize.ts +2 -2
  69. package/src/postgres/executor.ts +55 -10
  70. package/src/postgres/function/core.ts +20 -4
  71. package/src/postgres/function/index.ts +1 -17
  72. package/src/postgres/internal/dialect.ts +9 -4
  73. package/src/postgres/internal/dsl.ts +850 -359
  74. package/src/postgres/internal/renderer.ts +7 -2
  75. package/src/postgres/internal/schema-ddl.ts +22 -9
  76. package/src/postgres/internal/schema-model.ts +244 -10
  77. package/src/postgres/json.ts +100 -24
  78. package/src/postgres/jsonb.ts +38 -0
  79. package/src/postgres/query-extension.ts +2 -0
  80. package/src/postgres/query.ts +9 -2
  81. package/src/postgres/renderer.ts +31 -4
  82. package/src/postgres/schema-management.ts +108 -16
  83. package/src/postgres/schema.ts +98 -15
  84. package/src/postgres/table.ts +203 -398
  85. package/src/postgres/type.ts +8 -7
  86. package/src/postgres.ts +9 -11
  87. package/src/sqlite/column-extension.ts +3 -0
  88. package/src/sqlite/column.ts +127 -0
  89. package/src/sqlite/datatypes/index.ts +80 -0
  90. package/src/sqlite/datatypes/spec.ts +98 -0
  91. package/src/sqlite/errors/catalog.ts +103 -0
  92. package/src/sqlite/errors/fields.ts +19 -0
  93. package/src/sqlite/errors/index.ts +19 -0
  94. package/src/sqlite/errors/normalize.ts +229 -0
  95. package/src/sqlite/errors/requirements.ts +71 -0
  96. package/src/sqlite/errors/types.ts +29 -0
  97. package/src/sqlite/executor.ts +229 -0
  98. package/src/sqlite/function/aggregate.ts +2 -0
  99. package/src/sqlite/function/core.ts +2 -0
  100. package/src/sqlite/function/index.ts +19 -0
  101. package/src/sqlite/function/string.ts +2 -0
  102. package/src/sqlite/function/temporal.ts +100 -0
  103. package/src/sqlite/function/window.ts +2 -0
  104. package/src/sqlite/internal/dialect.ts +42 -0
  105. package/src/sqlite/internal/dsl.ts +6979 -0
  106. package/src/sqlite/internal/renderer.ts +51 -0
  107. package/src/sqlite/json.ts +39 -0
  108. package/src/sqlite/query-extension.ts +2 -0
  109. package/src/sqlite/query.ts +196 -0
  110. package/src/sqlite/renderer.ts +51 -0
  111. package/src/sqlite.ts +14 -0
  112. package/src/standard/column.ts +163 -0
  113. package/src/standard/datatypes/index.ts +83 -0
  114. package/src/standard/datatypes/spec.ts +98 -0
  115. package/src/standard/dialect.ts +40 -0
  116. package/src/standard/function/aggregate.ts +2 -0
  117. package/src/standard/function/core.ts +2 -0
  118. package/src/standard/function/index.ts +18 -0
  119. package/src/standard/function/string.ts +2 -0
  120. package/src/standard/function/temporal.ts +78 -0
  121. package/src/standard/function/window.ts +2 -0
  122. package/src/standard/internal/renderer.ts +45 -0
  123. package/src/standard/query.ts +152 -0
  124. package/src/standard/renderer.ts +21 -0
  125. package/src/standard/table.ts +147 -0
  126. package/src/standard.ts +18 -0
  127. package/src/internal/aggregation-validation.ts +0 -57
  128. package/src/mysql/table.ts +0 -157
@@ -1,64 +1,7 @@
1
- import * as VariantSchema from "@effect/experimental/VariantSchema";
2
1
  import type * as Brand from "effect/Brand";
3
2
  import * as Schema from "effect/Schema";
4
3
  import { type AnyColumnDefinition, type HasDefault, type InsertType, type IsGenerated, type IsNullable, type SelectType, type UpdateType } from "./column-state.js";
5
- /** Variant-schema helper used to derive select / insert / update schemas. */
6
- export declare const TableSchema: {
7
- readonly Struct: <const A extends VariantSchema.Struct.Fields>(fields: A & VariantSchema.Struct.Validate<A, "insert" | "select" | "update">) => VariantSchema.Struct<A>;
8
- readonly Field: <const A extends VariantSchema.Field.ConfigWithKeys<"insert" | "select" | "update">>(config: A & { readonly [K in Exclude<keyof A, "insert" | "select" | "update">]: never; }) => VariantSchema.Field<A>;
9
- readonly FieldOnly: <const Keys extends readonly ("insert" | "select" | "update")[]>(...keys: Keys) => <S extends Schema.Schema.All | Schema.PropertySignature.All<PropertyKey>>(schema: S) => VariantSchema.Field<{ readonly [K in Keys[number]]: S; }>;
10
- readonly FieldExcept: <const Keys extends readonly ("insert" | "select" | "update")[]>(...keys: Keys) => <S extends Schema.Schema.All | Schema.PropertySignature.All<PropertyKey>>(schema: S) => VariantSchema.Field<{ readonly [K in Exclude<"insert", Keys[number]> | Exclude<"select", Keys[number]> | Exclude<"update", Keys[number]>]: S; }>;
11
- readonly fieldEvolve: {
12
- <Self extends VariantSchema.Field<any> | VariantSchema.Field.ValueAny, const Mapping extends Self extends VariantSchema.Field<infer S extends VariantSchema.Field.Config> ? { readonly [K in keyof S]?: ((variant: S[K]) => VariantSchema.Field.ValueAny) | undefined; } : {
13
- readonly insert?: ((variant: Self) => VariantSchema.Field.ValueAny) | undefined;
14
- readonly select?: ((variant: Self) => VariantSchema.Field.ValueAny) | undefined;
15
- readonly update?: ((variant: Self) => VariantSchema.Field.ValueAny) | undefined;
16
- }>(f: Mapping): (self: Self) => VariantSchema.Field<Self extends VariantSchema.Field<infer S_1 extends VariantSchema.Field.Config> ? { readonly [K in keyof S_1]: K extends keyof Mapping ? Mapping[K] extends (arg: any) => any ? ReturnType<Mapping[K]> : S_1[K] : S_1[K]; } : {
17
- readonly insert: "insert" extends infer T ? T extends "insert" ? T extends keyof Mapping ? Mapping[T] extends (arg: any) => any ? ReturnType<Mapping[T]> : Self : Self : never : never;
18
- readonly select: "select" extends infer T_1 ? T_1 extends "select" ? T_1 extends keyof Mapping ? Mapping[T_1] extends (arg: any) => any ? ReturnType<Mapping[T_1]> : Self : Self : never : never;
19
- readonly update: "update" extends infer T_2 ? T_2 extends "update" ? T_2 extends keyof Mapping ? Mapping[T_2] extends (arg: any) => any ? ReturnType<Mapping[T_2]> : Self : Self : never : never;
20
- }>;
21
- <Self extends VariantSchema.Field<any> | VariantSchema.Field.ValueAny, const Mapping_1 extends Self extends VariantSchema.Field<infer S extends VariantSchema.Field.Config> ? { readonly [K in keyof S]?: ((variant: S[K]) => VariantSchema.Field.ValueAny) | undefined; } : {
22
- readonly insert?: ((variant: Self) => VariantSchema.Field.ValueAny) | undefined;
23
- readonly select?: ((variant: Self) => VariantSchema.Field.ValueAny) | undefined;
24
- readonly update?: ((variant: Self) => VariantSchema.Field.ValueAny) | undefined;
25
- }>(self: Self, f: Mapping_1): VariantSchema.Field<Self extends VariantSchema.Field<infer S_1 extends VariantSchema.Field.Config> ? { readonly [K in keyof S_1]: K extends keyof Mapping_1 ? Mapping_1[K] extends (arg: any) => any ? ReturnType<Mapping_1[K]> : S_1[K] : S_1[K]; } : {
26
- readonly insert: "insert" extends infer T ? T extends "insert" ? T extends keyof Mapping_1 ? Mapping_1[T] extends (arg: any) => any ? ReturnType<Mapping_1[T]> : Self : Self : never : never;
27
- readonly select: "select" extends infer T_1 ? T_1 extends "select" ? T_1 extends keyof Mapping_1 ? Mapping_1[T_1] extends (arg: any) => any ? ReturnType<Mapping_1[T_1]> : Self : Self : never : never;
28
- readonly update: "update" extends infer T_2 ? T_2 extends "update" ? T_2 extends keyof Mapping_1 ? Mapping_1[T_2] extends (arg: any) => any ? ReturnType<Mapping_1[T_2]> : Self : Self : never : never;
29
- }>;
30
- };
31
- readonly fieldFromKey: {
32
- <Self extends VariantSchema.Field<any> | VariantSchema.Field.ValueAny, const Mapping_2 extends Self extends VariantSchema.Field<infer S extends VariantSchema.Field.Config> ? { readonly [K in keyof S]?: string | undefined; } : {
33
- readonly insert?: string | undefined;
34
- readonly select?: string | undefined;
35
- readonly update?: string | undefined;
36
- }>(mapping: Mapping_2): (self: Self) => VariantSchema.Field<Self extends VariantSchema.Field<infer S_1 extends VariantSchema.Field.Config> ? { readonly [K in keyof S_1]: K extends keyof Mapping_2 ? Mapping_2[K] extends string ? VariantSchema.fromKey.Rename<S_1[K], Mapping_2[K]> : S_1[K] : S_1[K]; } : {
37
- readonly insert: "insert" extends infer T ? T extends "insert" ? T extends keyof Mapping_2 ? Mapping_2[T] extends string ? VariantSchema.fromKey.Rename<Self, Mapping_2[T]> : Self : Self : never : never;
38
- readonly select: "select" extends infer T_1 ? T_1 extends "select" ? T_1 extends keyof Mapping_2 ? Mapping_2[T_1] extends string ? VariantSchema.fromKey.Rename<Self, Mapping_2[T_1]> : Self : Self : never : never;
39
- readonly update: "update" extends infer T_2 ? T_2 extends "update" ? T_2 extends keyof Mapping_2 ? Mapping_2[T_2] extends string ? VariantSchema.fromKey.Rename<Self, Mapping_2[T_2]> : Self : Self : never : never;
40
- }>;
41
- <Self extends VariantSchema.Field<any> | VariantSchema.Field.ValueAny, const Mapping_3 extends Self extends VariantSchema.Field<infer S extends VariantSchema.Field.Config> ? { readonly [K in keyof S]?: string | undefined; } : {
42
- readonly insert?: string | undefined;
43
- readonly select?: string | undefined;
44
- readonly update?: string | undefined;
45
- }>(self: Self, mapping: Mapping_3): VariantSchema.Field<Self extends VariantSchema.Field<infer S_1 extends VariantSchema.Field.Config> ? { readonly [K in keyof S_1]: K extends keyof Mapping_3 ? Mapping_3[K] extends string ? VariantSchema.fromKey.Rename<S_1[K], Mapping_3[K]> : S_1[K] : S_1[K]; } : {
46
- readonly insert: "insert" extends infer T ? T extends "insert" ? T extends keyof Mapping_3 ? Mapping_3[T] extends string ? VariantSchema.fromKey.Rename<Self, Mapping_3[T]> : Self : Self : never : never;
47
- readonly select: "select" extends infer T_1 ? T_1 extends "select" ? T_1 extends keyof Mapping_3 ? Mapping_3[T_1] extends string ? VariantSchema.fromKey.Rename<Self, Mapping_3[T_1]> : Self : Self : never : never;
48
- readonly update: "update" extends infer T_2 ? T_2 extends "update" ? T_2 extends keyof Mapping_3 ? Mapping_3[T_2] extends string ? VariantSchema.fromKey.Rename<Self, Mapping_3[T_2]> : Self : Self : never : never;
49
- }>;
50
- };
51
- readonly Class: <Self = never>(identifier: string) => <const Fields extends VariantSchema.Struct.Fields>(fields: Fields & VariantSchema.Struct.Validate<Fields, "insert" | "select" | "update">, annotations?: Schema.Annotations.Schema<Self, readonly []> | undefined) => [Self] extends [never] ? "Missing `Self` generic - use `class Self extends Class<Self>()({ ... })`" : VariantSchema.Class<Self, Fields, VariantSchema.ExtractFields<"select", Fields, true>, Schema.Struct.Type<VariantSchema.ExtractFields<"select", Fields, true>>, Schema.Struct.Encoded<VariantSchema.ExtractFields<"select", Fields, true>>, Schema.Schema.Context<VariantSchema.ExtractFields<"select", Fields, true>[keyof VariantSchema.ExtractFields<"select", Fields, true>]>, Schema.Struct.Constructor<VariantSchema.ExtractFields<"select", Fields, true>>> & {
52
- readonly insert: Schema.Struct<VariantSchema.ExtractFields<"insert", Fields, false> extends infer T ? { [K in keyof T]: T[K]; } : never>;
53
- readonly select: Schema.Struct<VariantSchema.ExtractFields<"select", Fields, false> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never>;
54
- readonly update: Schema.Struct<VariantSchema.ExtractFields<"update", Fields, false> extends infer T_2 ? { [K in keyof T_2]: T_2[K]; } : never>;
55
- };
56
- readonly Union: <const Members extends readonly VariantSchema.Struct<any>[]>(...members: Members) => VariantSchema.Union<Members> & VariantSchema.Union.Variants<Members, "insert" | "select" | "update">;
57
- readonly extract: {
58
- <V extends "insert" | "select" | "update">(variant: V): <A extends VariantSchema.Struct<any>>(self: A) => VariantSchema.Extract<V, A, V extends "select" ? true : false>;
59
- <V extends "insert" | "select" | "update", A extends VariantSchema.Struct<any>>(self: A, variant: V): VariantSchema.Extract<V, A, V extends "select" ? true : false>;
60
- };
61
- };
4
+ export type TableSchemaVariant = "select" | "insert" | "update";
62
5
  /** Normalized field map used by table definitions. */
63
6
  export type TableFieldMap = Record<string, AnyColumnDefinition>;
64
7
  type GeneratedKeys<Fields extends TableFieldMap> = {
@@ -91,15 +34,23 @@ export type InsertRow<TableName extends string, Fields extends TableFieldMap> =
91
34
  export type UpdateRow<TableName extends string, Fields extends TableFieldMap, PrimaryKey extends keyof Fields> = Simplify<Partial<{
92
35
  [K in UpdateKeys<Fields, PrimaryKey>]: BrandedUpdateType<Fields[K], TableName, Extract<K, string>>;
93
36
  }>>;
37
+ type SchemaOfVariant<Variant extends TableSchemaVariant, TableName extends string, Fields extends TableFieldMap, PrimaryKeyColumns extends keyof Fields & string> = Variant extends "select" ? Schema.Schema<SelectRow<TableName, Fields>> : Variant extends "insert" ? Schema.Schema<InsertRow<TableName, Fields>> : Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>>;
38
+ export declare const deriveSchema: <Variant extends TableSchemaVariant, TableName extends string, Fields extends TableFieldMap, PrimaryKeyColumns extends keyof Fields & string>(variant: Variant, tableName: TableName, fields: Fields, primaryKeyColumns: readonly PrimaryKeyColumns[]) => SchemaOfVariant<Variant, TableName, Fields, PrimaryKeyColumns>;
39
+ export declare const deriveSelectSchema: <TableName extends string, Fields extends TableFieldMap, PrimaryKeyColumns extends keyof Fields & string>(tableName: TableName, fields: Fields, primaryKeyColumns: readonly PrimaryKeyColumns[]) => Schema.Schema<SelectRow<TableName, Fields>>;
40
+ export declare const deriveInsertSchema: <TableName extends string, Fields extends TableFieldMap, PrimaryKeyColumns extends keyof Fields & string>(tableName: TableName, fields: Fields, primaryKeyColumns: readonly PrimaryKeyColumns[]) => Schema.Schema<InsertRow<TableName, Fields>>;
41
+ export declare const deriveUpdateSchema: <TableName extends string, Fields extends TableFieldMap, PrimaryKeyColumns extends keyof Fields & string>(tableName: TableName, fields: Fields, primaryKeyColumns: readonly PrimaryKeyColumns[]) => Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>>;
94
42
  /**
95
43
  * Derives the `select`, `insert`, and `update` schemas for a table.
96
44
  *
97
45
  * This is the central place where the column capability flags are turned into
98
46
  * real runtime schemas.
47
+ *
48
+ * @deprecated Prefer `deriveSelectSchema`, `deriveInsertSchema`, and
49
+ * `deriveUpdateSchema` so individual variants are derived lazily.
99
50
  */
100
51
  export declare const deriveSchemas: <TableName extends string, Fields extends TableFieldMap, PrimaryKeyColumns extends keyof Fields & string>(tableName: TableName, fields: Fields, primaryKeyColumns: readonly PrimaryKeyColumns[]) => {
101
- readonly select: Schema.Schema<{ [K in keyof { [K in keyof Fields]: BrandedSelectType<Fields[K], TableName, Extract<K, string>>; }]: { [K in keyof Fields]: BrandedSelectType<Fields[K], TableName, Extract<K, string>>; }[K]; }, { [K in keyof { [K in keyof Fields]: BrandedSelectType<Fields[K], TableName, Extract<K, string>>; }]: { [K in keyof Fields]: BrandedSelectType<Fields[K], TableName, Extract<K, string>>; }[K]; }, never>;
102
- readonly insert: Schema.Schema<{ [K in Exclude<keyof Fields, GeneratedKeys<Fields> | OptionalInsertKeys<Fields>>]: BrandedInsertType<Fields[K], TableName, Extract<K, string>>; } & { [K in OptionalInsertKeys<Fields>]?: BrandedInsertType<Fields[K], TableName, Extract<K, string>> | undefined; } extends infer T ? { [K in keyof T]: T[K]; } : never, { [K in Exclude<keyof Fields, GeneratedKeys<Fields> | OptionalInsertKeys<Fields>>]: BrandedInsertType<Fields[K], TableName, Extract<K, string>>; } & { [K in OptionalInsertKeys<Fields>]?: BrandedInsertType<Fields[K], TableName, Extract<K, string>> | undefined; } extends infer T ? { [K in keyof T]: T[K]; } : never, never>;
103
- readonly update: Schema.Schema<Partial<{ [K in Exclude<keyof Fields, PrimaryKeyColumns | GeneratedKeys<Fields>>]: BrandedUpdateType<Fields[K], TableName, Extract<K, string>>; }> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never, Partial<{ [K in Exclude<keyof Fields, PrimaryKeyColumns | GeneratedKeys<Fields>>]: BrandedUpdateType<Fields[K], TableName, Extract<K, string>>; }> extends infer T_1 ? { [K in keyof T_1]: T_1[K]; } : never, never>;
52
+ readonly select: Schema.Schema<SelectRow<TableName, Fields>>;
53
+ readonly insert: Schema.Schema<InsertRow<TableName, Fields>>;
54
+ readonly update: Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>>;
104
55
  };
105
56
  export {};
@@ -1,4 +1,3 @@
1
- import * as VariantSchema from "@effect/experimental/VariantSchema"
2
1
  import type * as Brand from "effect/Brand"
3
2
  import * as Schema from "effect/Schema"
4
3
 
@@ -12,13 +11,7 @@ import {
12
11
  type UpdateType
13
12
  } from "./column-state.js"
14
13
 
15
- /** Variant-schema helper used to derive select / insert / update schemas. */
16
- export const TableSchema = VariantSchema.make({
17
- variants: ["select", "insert", "update"] as const,
18
- defaultVariant: "select"
19
- })
20
-
21
- type Variants = "select" | "insert" | "update"
14
+ export type TableSchemaVariant = "select" | "insert" | "update"
22
15
 
23
16
  /** Normalized field map used by table definitions. */
24
17
  export type TableFieldMap = Record<string, AnyColumnDefinition>
@@ -153,11 +146,95 @@ const updateSchema = (
153
146
  return Schema.optional(base)
154
147
  }
155
148
 
149
+ type SchemaOfVariant<
150
+ Variant extends TableSchemaVariant,
151
+ TableName extends string,
152
+ Fields extends TableFieldMap,
153
+ PrimaryKeyColumns extends keyof Fields & string
154
+ > = Variant extends "select" ? Schema.Schema<SelectRow<TableName, Fields>>
155
+ : Variant extends "insert" ? Schema.Schema<InsertRow<TableName, Fields>>
156
+ : Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>>
157
+
158
+ const fieldSchemaForVariant = (
159
+ variant: TableSchemaVariant,
160
+ column: AnyColumnDefinition,
161
+ tableName: string,
162
+ columnName: string,
163
+ primaryKeySet: ReadonlySet<string>
164
+ ): any | undefined => {
165
+ switch (variant) {
166
+ case "select":
167
+ return selectSchema(column, tableName, columnName)
168
+ case "insert":
169
+ return insertSchema(column, tableName, columnName)
170
+ case "update":
171
+ return updateSchema(column, tableName, columnName, primaryKeySet.has(columnName))
172
+ }
173
+ }
174
+
175
+ export const deriveSchema = <
176
+ Variant extends TableSchemaVariant,
177
+ TableName extends string,
178
+ Fields extends TableFieldMap,
179
+ PrimaryKeyColumns extends keyof Fields & string
180
+ >(
181
+ variant: Variant,
182
+ tableName: TableName,
183
+ fields: Fields,
184
+ primaryKeyColumns: readonly PrimaryKeyColumns[]
185
+ ): SchemaOfVariant<Variant, TableName, Fields, PrimaryKeyColumns> => {
186
+ const primaryKeySet = new Set<string>(primaryKeyColumns)
187
+ const structFields: Record<string, any> = {}
188
+ for (const [key, column] of Object.entries(fields)) {
189
+ const schema = fieldSchemaForVariant(variant, column, tableName, key, primaryKeySet)
190
+ if (schema !== undefined) {
191
+ structFields[key] = schema
192
+ }
193
+ }
194
+ return Schema.Struct(structFields) as unknown as SchemaOfVariant<Variant, TableName, Fields, PrimaryKeyColumns>
195
+ }
196
+
197
+ export const deriveSelectSchema = <
198
+ TableName extends string,
199
+ Fields extends TableFieldMap,
200
+ PrimaryKeyColumns extends keyof Fields & string
201
+ >(
202
+ tableName: TableName,
203
+ fields: Fields,
204
+ primaryKeyColumns: readonly PrimaryKeyColumns[]
205
+ ): Schema.Schema<SelectRow<TableName, Fields>> =>
206
+ deriveSchema("select", tableName, fields, primaryKeyColumns)
207
+
208
+ export const deriveInsertSchema = <
209
+ TableName extends string,
210
+ Fields extends TableFieldMap,
211
+ PrimaryKeyColumns extends keyof Fields & string
212
+ >(
213
+ tableName: TableName,
214
+ fields: Fields,
215
+ primaryKeyColumns: readonly PrimaryKeyColumns[]
216
+ ): Schema.Schema<InsertRow<TableName, Fields>> =>
217
+ deriveSchema("insert", tableName, fields, primaryKeyColumns)
218
+
219
+ export const deriveUpdateSchema = <
220
+ TableName extends string,
221
+ Fields extends TableFieldMap,
222
+ PrimaryKeyColumns extends keyof Fields & string
223
+ >(
224
+ tableName: TableName,
225
+ fields: Fields,
226
+ primaryKeyColumns: readonly PrimaryKeyColumns[]
227
+ ): Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>> =>
228
+ deriveSchema("update", tableName, fields, primaryKeyColumns)
229
+
156
230
  /**
157
231
  * Derives the `select`, `insert`, and `update` schemas for a table.
158
232
  *
159
233
  * This is the central place where the column capability flags are turned into
160
234
  * real runtime schemas.
235
+ *
236
+ * @deprecated Prefer `deriveSelectSchema`, `deriveInsertSchema`, and
237
+ * `deriveUpdateSchema` so individual variants are derived lazily.
161
238
  */
162
239
  export const deriveSchemas = <
163
240
  TableName extends string,
@@ -171,33 +248,8 @@ export const deriveSchemas = <
171
248
  readonly select: Schema.Schema<SelectRow<TableName, Fields>>
172
249
  readonly insert: Schema.Schema<InsertRow<TableName, Fields>>
173
250
  readonly update: Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>>
174
- } => {
175
- const primaryKeySet = new Set<string>(primaryKeyColumns)
176
- const variants: Record<string, VariantSchema.Field<any>> = {}
177
- for (const [key, column] of Object.entries(fields)) {
178
- const config: Record<Variants, any> = {
179
- select: selectSchema(column, tableName, key),
180
- insert: undefined,
181
- update: undefined
182
- }
183
- const insert = insertSchema(column, tableName, key)
184
- const update = updateSchema(column, tableName, key, primaryKeySet.has(key))
185
- if (insert !== undefined) {
186
- config.insert = insert
187
- } else {
188
- delete config.insert
189
- }
190
- if (update !== undefined) {
191
- config.update = update
192
- } else {
193
- delete config.update
194
- }
195
- variants[key] = TableSchema.Field(config)
196
- }
197
- const struct = TableSchema.Struct(variants as any)
198
- return {
199
- select: TableSchema.extract(struct, "select") as unknown as Schema.Schema<SelectRow<TableName, Fields>>,
200
- insert: TableSchema.extract(struct, "insert") as unknown as Schema.Schema<InsertRow<TableName, Fields>>,
201
- update: TableSchema.extract(struct, "update") as unknown as Schema.Schema<UpdateRow<TableName, Fields, PrimaryKeyColumns>>
202
- }
203
- }
251
+ } => ({
252
+ select: deriveSelectSchema(tableName, fields, primaryKeyColumns),
253
+ insert: deriveInsertSchema(tableName, fields, primaryKeyColumns),
254
+ update: deriveUpdateSchema(tableName, fields, primaryKeyColumns)
255
+ })
@@ -6,7 +6,7 @@ export const TypeId: unique symbol = Symbol.for("effect-qb/SchemaExpression")
6
6
  export type TypeId = typeof TypeId
7
7
 
8
8
  const SchemaExpressionProto = {
9
- pipe(this: unknown) {
9
+ pipe(this: Pipeable) {
10
10
  return pipeArguments(this, arguments)
11
11
  }
12
12
  }
@@ -15,7 +15,7 @@ const attachPipe = <Value extends object>(value: Value): Value => {
15
15
  Object.defineProperty(value, "pipe", {
16
16
  configurable: true,
17
17
  writable: true,
18
- value: function(this: unknown) {
18
+ value: function(this: Value) {
19
19
  return pipeArguments(value, arguments)
20
20
  }
21
21
  })
@@ -0,0 +1,19 @@
1
+ import type { RenderedAst, RenderState, SqlDialect } from "./dialect.js"
2
+ import type * as Expression from "./scalar.js"
3
+ import type * as QueryAst from "./query-ast.js"
4
+
5
+ export const renderQueryAst = (
6
+ ast: QueryAst.Ast<Record<string, unknown>, any, QueryAst.QueryStatement>,
7
+ state: RenderState,
8
+ dialect: SqlDialect
9
+ ): RenderedAst => {
10
+ return dialect.renderQueryAst(ast, state, dialect)
11
+ }
12
+
13
+ export const renderExpression = (
14
+ expression: Expression.Any,
15
+ state: RenderState,
16
+ dialect: SqlDialect
17
+ ): string => {
18
+ return dialect.renderExpression(expression, state, dialect)
19
+ }