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.
- package/README.md +4 -0
- package/dist/index.js +8065 -0
- package/dist/mysql.js +4036 -2418
- package/dist/postgres/metadata.js +2536 -625
- package/dist/postgres.js +8248 -7857
- package/dist/sqlite.js +8854 -0
- package/dist/standard.js +8019 -0
- package/package.json +15 -3
- package/src/casing.ts +71 -0
- package/src/index.ts +2 -0
- package/src/internal/casing.ts +89 -0
- package/src/internal/column-state.ts +11 -6
- package/src/internal/column.ts +44 -7
- package/src/internal/datatypes/define.ts +2 -1
- package/src/internal/datatypes/enrich.ts +23 -0
- package/src/internal/datatypes/lookup.ts +14 -7
- package/src/internal/derived-table.ts +7 -13
- package/src/internal/dialect-renderers/mysql.ts +2046 -0
- package/src/{postgres/internal/sql-expression-renderer.ts → internal/dialect-renderers/postgres.ts} +867 -283
- package/src/{mysql/internal/sql-expression-renderer.ts → internal/dialect-renderers/sqlite.ts} +834 -358
- package/src/internal/dialect.ts +37 -0
- package/src/internal/dsl-mutation-runtime.ts +29 -10
- package/src/internal/dsl-plan-runtime.ts +41 -24
- package/src/internal/dsl-query-runtime.ts +11 -31
- package/src/internal/dsl-transaction-ddl-runtime.ts +61 -15
- package/src/internal/executor.ts +57 -15
- package/src/internal/expression-ast.ts +3 -2
- package/src/internal/grouping-key.ts +216 -9
- package/src/internal/implication-runtime.ts +3 -2
- package/src/internal/json/types.ts +155 -40
- package/src/internal/predicate/context.ts +14 -1
- package/src/internal/predicate/key.ts +19 -2
- package/src/internal/predicate/runtime.ts +30 -3
- package/src/internal/query.d.ts +38 -11
- package/src/internal/query.ts +315 -54
- package/src/internal/renderer.ts +51 -6
- package/src/internal/runtime/driver-value-mapping.ts +58 -0
- package/src/internal/runtime/normalize.ts +74 -43
- package/src/internal/runtime/schema.ts +5 -3
- package/src/internal/runtime/value.ts +153 -30
- package/src/internal/scalar.ts +6 -1
- package/src/internal/schema-derivation.d.ts +12 -61
- package/src/internal/schema-derivation.ts +90 -38
- package/src/internal/schema-expression.ts +2 -2
- package/src/internal/sql-expression-renderer.ts +19 -0
- package/src/internal/standard-dsl.ts +6885 -0
- package/src/internal/table-options.ts +229 -62
- package/src/internal/table.d.ts +33 -32
- package/src/internal/table.ts +469 -160
- package/src/mysql/column-extension.ts +3 -0
- package/src/mysql/column.ts +27 -12
- package/src/mysql/datatypes/index.ts +24 -2
- package/src/mysql/errors/catalog.ts +5 -5
- package/src/mysql/errors/normalize.ts +2 -2
- package/src/mysql/executor.ts +7 -5
- package/src/mysql/internal/dialect.ts +9 -4
- package/src/mysql/internal/dsl.ts +906 -324
- package/src/mysql/internal/renderer.ts +7 -2
- package/src/mysql/json.ts +37 -0
- package/src/mysql/query-extension.ts +16 -0
- package/src/mysql/query.ts +9 -2
- package/src/mysql/renderer.ts +31 -4
- package/src/mysql.ts +4 -12
- package/src/postgres/column-extension.ts +28 -0
- package/src/postgres/column.ts +9 -13
- package/src/postgres/datatypes/index.d.ts +2 -1
- package/src/postgres/datatypes/index.ts +3 -2
- package/src/postgres/errors/normalize.ts +2 -2
- package/src/postgres/executor.ts +55 -10
- package/src/postgres/function/core.ts +20 -4
- package/src/postgres/function/index.ts +1 -17
- package/src/postgres/internal/dialect.ts +9 -4
- package/src/postgres/internal/dsl.ts +850 -359
- package/src/postgres/internal/renderer.ts +7 -2
- package/src/postgres/internal/schema-ddl.ts +22 -9
- package/src/postgres/internal/schema-model.ts +244 -10
- package/src/postgres/json.ts +100 -24
- package/src/postgres/jsonb.ts +38 -0
- package/src/postgres/query-extension.ts +2 -0
- package/src/postgres/query.ts +9 -2
- package/src/postgres/renderer.ts +31 -4
- package/src/postgres/schema-management.ts +108 -16
- package/src/postgres/schema.ts +98 -15
- package/src/postgres/table.ts +203 -398
- package/src/postgres/type.ts +8 -7
- package/src/postgres.ts +9 -11
- package/src/sqlite/column-extension.ts +3 -0
- package/src/sqlite/column.ts +127 -0
- package/src/sqlite/datatypes/index.ts +80 -0
- package/src/sqlite/datatypes/spec.ts +98 -0
- package/src/sqlite/errors/catalog.ts +103 -0
- package/src/sqlite/errors/fields.ts +19 -0
- package/src/sqlite/errors/index.ts +19 -0
- package/src/sqlite/errors/normalize.ts +229 -0
- package/src/sqlite/errors/requirements.ts +71 -0
- package/src/sqlite/errors/types.ts +29 -0
- package/src/sqlite/executor.ts +229 -0
- package/src/sqlite/function/aggregate.ts +2 -0
- package/src/sqlite/function/core.ts +2 -0
- package/src/sqlite/function/index.ts +19 -0
- package/src/sqlite/function/string.ts +2 -0
- package/src/sqlite/function/temporal.ts +100 -0
- package/src/sqlite/function/window.ts +2 -0
- package/src/sqlite/internal/dialect.ts +42 -0
- package/src/sqlite/internal/dsl.ts +6979 -0
- package/src/sqlite/internal/renderer.ts +51 -0
- package/src/sqlite/json.ts +39 -0
- package/src/sqlite/query-extension.ts +2 -0
- package/src/sqlite/query.ts +196 -0
- package/src/sqlite/renderer.ts +51 -0
- package/src/sqlite.ts +14 -0
- package/src/standard/column.ts +163 -0
- package/src/standard/datatypes/index.ts +83 -0
- package/src/standard/datatypes/spec.ts +98 -0
- package/src/standard/dialect.ts +40 -0
- package/src/standard/function/aggregate.ts +2 -0
- package/src/standard/function/core.ts +2 -0
- package/src/standard/function/index.ts +18 -0
- package/src/standard/function/string.ts +2 -0
- package/src/standard/function/temporal.ts +78 -0
- package/src/standard/function/window.ts +2 -0
- package/src/standard/internal/renderer.ts +45 -0
- package/src/standard/query.ts +152 -0
- package/src/standard/renderer.ts +21 -0
- package/src/standard/table.ts +147 -0
- package/src/standard.ts +18 -0
- package/src/internal/aggregation-validation.ts +0 -57
- 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
|
-
|
|
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<
|
|
102
|
-
readonly insert: Schema.Schema<
|
|
103
|
-
readonly update: Schema.Schema<
|
|
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
|
-
|
|
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
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
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:
|
|
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:
|
|
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
|
+
}
|