effect-qb 0.16.0 → 0.17.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 (75) hide show
  1. package/dist/mysql.js +1661 -591
  2. package/dist/postgres/metadata.js +1930 -135
  3. package/dist/postgres.js +7808 -6718
  4. package/dist/sqlite.js +8360 -0
  5. package/package.json +6 -1
  6. package/src/internal/derived-table.ts +29 -3
  7. package/src/internal/dialect.ts +2 -0
  8. package/src/internal/dsl-mutation-runtime.ts +173 -4
  9. package/src/internal/dsl-plan-runtime.ts +165 -20
  10. package/src/internal/dsl-query-runtime.ts +60 -6
  11. package/src/internal/dsl-transaction-ddl-runtime.ts +72 -2
  12. package/src/internal/executor.ts +47 -9
  13. package/src/internal/expression-ast.ts +3 -2
  14. package/src/internal/grouping-key.ts +141 -1
  15. package/src/internal/implication-runtime.ts +2 -1
  16. package/src/internal/json/types.ts +155 -40
  17. package/src/internal/predicate/context.ts +14 -1
  18. package/src/internal/predicate/key.ts +19 -2
  19. package/src/internal/predicate/runtime.ts +27 -3
  20. package/src/internal/query.ts +252 -30
  21. package/src/internal/renderer.ts +35 -2
  22. package/src/internal/runtime/driver-value-mapping.ts +58 -0
  23. package/src/internal/runtime/normalize.ts +62 -38
  24. package/src/internal/runtime/schema.ts +5 -3
  25. package/src/internal/runtime/value.ts +153 -30
  26. package/src/internal/table-options.ts +108 -1
  27. package/src/internal/table.ts +87 -29
  28. package/src/mysql/column.ts +18 -2
  29. package/src/mysql/datatypes/index.ts +21 -0
  30. package/src/mysql/errors/catalog.ts +5 -5
  31. package/src/mysql/errors/normalize.ts +2 -2
  32. package/src/mysql/internal/dsl.ts +736 -218
  33. package/src/mysql/internal/renderer.ts +2 -1
  34. package/src/mysql/internal/sql-expression-renderer.ts +486 -130
  35. package/src/mysql/query.ts +9 -2
  36. package/src/mysql/table.ts +38 -12
  37. package/src/postgres/column.ts +4 -2
  38. package/src/postgres/errors/normalize.ts +2 -2
  39. package/src/postgres/executor.ts +48 -5
  40. package/src/postgres/function/core.ts +19 -1
  41. package/src/postgres/internal/dsl.ts +683 -240
  42. package/src/postgres/internal/renderer.ts +2 -1
  43. package/src/postgres/internal/schema-ddl.ts +2 -1
  44. package/src/postgres/internal/schema-model.ts +6 -3
  45. package/src/postgres/internal/sql-expression-renderer.ts +420 -91
  46. package/src/postgres/json.ts +57 -17
  47. package/src/postgres/query.ts +9 -2
  48. package/src/postgres/schema-management.ts +91 -4
  49. package/src/postgres/schema.ts +1 -1
  50. package/src/postgres/table.ts +189 -53
  51. package/src/sqlite/column.ts +128 -0
  52. package/src/sqlite/datatypes/index.ts +79 -0
  53. package/src/sqlite/datatypes/spec.ts +98 -0
  54. package/src/sqlite/errors/catalog.ts +103 -0
  55. package/src/sqlite/errors/fields.ts +19 -0
  56. package/src/sqlite/errors/index.ts +19 -0
  57. package/src/sqlite/errors/normalize.ts +229 -0
  58. package/src/sqlite/errors/requirements.ts +71 -0
  59. package/src/sqlite/errors/types.ts +29 -0
  60. package/src/sqlite/executor.ts +227 -0
  61. package/src/sqlite/function/aggregate.ts +2 -0
  62. package/src/sqlite/function/core.ts +2 -0
  63. package/src/sqlite/function/index.ts +19 -0
  64. package/src/sqlite/function/string.ts +2 -0
  65. package/src/sqlite/function/temporal.ts +100 -0
  66. package/src/sqlite/function/window.ts +2 -0
  67. package/src/sqlite/internal/dialect.ts +37 -0
  68. package/src/sqlite/internal/dsl.ts +6926 -0
  69. package/src/sqlite/internal/renderer.ts +47 -0
  70. package/src/sqlite/internal/sql-expression-renderer.ts +1821 -0
  71. package/src/sqlite/json.ts +2 -0
  72. package/src/sqlite/query.ts +196 -0
  73. package/src/sqlite/renderer.ts +24 -0
  74. package/src/sqlite/table.ts +183 -0
  75. package/src/sqlite.ts +22 -0
@@ -16,7 +16,6 @@ import {
16
16
  type HavingPredicateInput,
17
17
  type OrderDirection,
18
18
  type OutputOfSelection,
19
- type MutationInputOf,
20
19
  type MutationTargetLike,
21
20
  type NumericExpressionInput,
22
21
  type PredicateInput,
@@ -136,8 +135,17 @@ export {
136
135
  orderBy,
137
136
  groupBy
138
137
  } from "./internal/dsl.js"
138
+ import type * as Expression from "../internal/scalar.js"
139
139
  export { mysqlType as type }
140
140
 
141
+ type MysqlMutationValueInput<Value> =
142
+ | Value
143
+ | Expression.Scalar<Value, Expression.DbType.Any, Expression.Nullability, "mysql", Expression.ScalarKind, Expression.BindingId>
144
+
145
+ export type MutationInputOf<Shape> = {
146
+ readonly [K in keyof Shape]: MysqlMutationValueInput<Shape[K]>
147
+ }
148
+
141
149
  type StructuredSource = AnyValuesSource | AnyUnnestSource | AnyTableFunctionSource
142
150
 
143
151
  type StructuredFromApi = <CurrentSource extends StructuredSource>(
@@ -163,7 +171,6 @@ export type {
163
171
  HavingPredicateInput,
164
172
  OrderDirection,
165
173
  OutputOfSelection,
166
- MutationInputOf,
167
174
  MutationTargetLike,
168
175
  NumericExpressionInput,
169
176
  PredicateInput,
@@ -53,17 +53,31 @@ type SchemaNameOfTable<Table> = Table extends BaseTable.TableDefinition<any, any
53
53
  ? SchemaName
54
54
  : never
55
55
 
56
+ type ApplySchemaTableOptions<
57
+ Name extends string,
58
+ Fields extends DialectFieldMap,
59
+ PrimaryKeyColumns extends keyof Fields & string,
60
+ SchemaName extends string,
61
+ Options extends BaseTable.DeclaredTableOptions
62
+ > = BaseTable.ApplyDeclaredOptions<
63
+ BaseTable.TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>,
64
+ Options
65
+ > extends BaseTable.TableDefinition<any, any, infer AppliedPrimaryKeyColumns extends keyof Fields & string, "schema", any>
66
+ ? TableDefinition<Name, Fields, AppliedPrimaryKeyColumns, "schema", SchemaName>
67
+ : TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>
68
+
56
69
  export type TableSchemaNamespace<SchemaName extends string> = {
57
70
  readonly schemaName: SchemaName
58
71
  readonly table: <
59
72
  Name extends string,
60
73
  Fields extends DialectFieldMap,
74
+ const Options extends BaseTable.DeclaredTableOptions,
61
75
  PrimaryKeyColumns extends keyof Fields & string = InlinePrimaryKeyKeys<Fields>
62
76
  >(
63
77
  name: Name,
64
78
  fields: Fields,
65
- ...options: BaseTable.DeclaredTableOptions
66
- ) => TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>
79
+ ...options: Options & BaseTable.ValidateDeclaredOptions<BaseTable.TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>, Options>
80
+ ) => ApplySchemaTableOptions<Name, Fields, PrimaryKeyColumns, SchemaName, Options>
67
81
  }
68
82
 
69
83
  export type TableOption = BaseTable.TableOption
@@ -85,23 +99,31 @@ export const make = <
85
99
 
86
100
  export const schema = <SchemaName extends string>(
87
101
  schemaName: SchemaName
88
- ): TableSchemaNamespace<SchemaName> => ({
89
- schemaName,
90
- table: <
102
+ ): TableSchemaNamespace<SchemaName> => {
103
+ const table = <
91
104
  Name extends string,
92
105
  Fields extends DialectFieldMap,
106
+ const Options extends BaseTable.DeclaredTableOptions,
93
107
  PrimaryKeyColumns extends keyof Fields & string = InlinePrimaryKeyKeys<Fields>
94
108
  >(
95
109
  name: Name,
96
110
  fields: Fields,
97
- ...declaredOptions: BaseTable.DeclaredTableOptions
111
+ ...declaredOptions: Options & BaseTable.ValidateDeclaredOptions<BaseTable.TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>, Options>
98
112
  ) =>
99
- BaseTable.schema(schemaName).table(
113
+ (BaseTable.schema(schemaName).table as (
114
+ name: Name,
115
+ fields: Fields,
116
+ ...options: BaseTable.DeclaredTableOptions
117
+ ) => BaseTable.TableDefinition<any, any, any, "schema", any>)(
100
118
  name,
101
119
  fields,
102
120
  ...declaredOptions
103
- ) as TableDefinition<Name, Fields, PrimaryKeyColumns, "schema", SchemaName>
104
- })
121
+ ) as ApplySchemaTableOptions<Name, Fields, PrimaryKeyColumns, SchemaName, Options>
122
+ return {
123
+ schemaName,
124
+ table
125
+ } as unknown as TableSchemaNamespace<SchemaName>
126
+ }
105
127
 
106
128
  export const alias = <
107
129
  Table extends AnyTable,
@@ -144,11 +166,15 @@ export const foreignKey = <
144
166
  TargetTable extends AnyTable,
145
167
  TargetColumns extends string | readonly string[]
146
168
  >(
147
- columns: LocalColumns,
169
+ columns: LocalColumns & BaseTable.NonEmptyColumnInput<LocalColumns>,
148
170
  target: () => TargetTable,
149
- referencedColumns: TargetColumns
171
+ referencedColumns: TargetColumns & BaseTable.NonEmptyColumnInput<TargetColumns> & BaseTable.MatchingColumnArityInput<LocalColumns, TargetColumns>
150
172
  ): BaseTable.TableOption =>
151
- BaseTable.foreignKey(columns, target as () => BaseTable.AnyTable, referencedColumns)
173
+ BaseTable.foreignKey<LocalColumns, BaseTable.AnyTable, TargetColumns>(
174
+ columns as LocalColumns & BaseTable.NonEmptyColumnInput<LocalColumns>,
175
+ target as () => BaseTable.AnyTable,
176
+ referencedColumns as TargetColumns & BaseTable.NonEmptyColumnInput<TargetColumns> & BaseTable.MatchingColumnArityInput<LocalColumns, TargetColumns>
177
+ )
152
178
 
153
179
  export const check = BaseTable.check
154
180
 
@@ -59,6 +59,8 @@ const boundedString = (length?: number): Schema.Schema<string> =>
59
59
  ? Schema.String
60
60
  : Schema.String.pipe(Schema.maxLength(length))
61
61
 
62
+ const finiteNumber = Schema.Number.pipe(Schema.finite())
63
+
62
64
  export const custom = <SchemaType extends Schema.Schema.Any, Db extends Expression.DbType.Any>(
63
65
  schema: SchemaType,
64
66
  dbType: Db
@@ -92,8 +94,8 @@ export const number = (options?: BaseColumn.NumericOptions) =>
92
94
  ddlType: renderNumericDdlType("numeric", options),
93
95
  identity: undefined
94
96
  })
95
- export const float4 = () => primitive(Schema.Number, postgresDatatypes.float4())
96
- export const float8 = () => primitive(Schema.Number, postgresDatatypes.float8())
97
+ export const float4 = () => primitive(finiteNumber, postgresDatatypes.float4())
98
+ export const float8 = () => primitive(finiteNumber, postgresDatatypes.float8())
97
99
  export const boolean = () => primitive(Schema.Boolean, postgresDatatypes.boolean())
98
100
  export const date = () => primitive(LocalDateStringSchema, postgresDatatypes.date())
99
101
  export const timestamp = () => primitive(LocalDateTimeStringSchema, postgresDatatypes.timestamp())
@@ -44,8 +44,8 @@ const asNumber = (value: unknown): number | undefined => {
44
44
  if (typeof value === "number" && Number.isFinite(value)) {
45
45
  return value
46
46
  }
47
- if (typeof value === "string" && value.trim() !== "") {
48
- const parsed = Number(value)
47
+ if (typeof value === "string" && /^[+-]?\d+$/.test(value.trim())) {
48
+ const parsed = Number(value.trim())
49
49
  return Number.isFinite(parsed) ? parsed : undefined
50
50
  }
51
51
  return undefined
@@ -55,12 +55,55 @@ export interface QueryExecutor<Context = never> {
55
55
  ): Stream.Stream<CoreQuery.ResultRow<PlanValue>, PostgresQueryError<PlanValue>, Context>
56
56
  }
57
57
 
58
+ type DriverExecute<Error, Context> = <Row>(
59
+ query: CoreRenderer.RenderedQuery<Row, "postgres">
60
+ ) => Effect.Effect<ReadonlyArray<FlatRow>, Error, Context>
61
+
62
+ type DriverHandlers<Error, Context> = {
63
+ readonly execute: DriverExecute<Error, Context>
64
+ readonly stream: <Row>(
65
+ query: CoreRenderer.RenderedQuery<Row, "postgres">
66
+ ) => Stream.Stream<FlatRow, Error, Context>
67
+ }
68
+
58
69
  /** Constructs a Postgres-specialized SQL driver. */
59
- export function driver(execute: any): Driver<any, any>
60
- export function driver(dialect: "postgres", execute: any): Driver<any, any>
61
- export function driver(dialectOrExecute: "postgres" | any, maybeExecute?: any): Driver<any, any> {
62
- const execute = typeof dialectOrExecute === "string" ? maybeExecute : dialectOrExecute
63
- return CoreExecutor.driver("postgres", execute as any)
70
+ export function driver<
71
+ Error = never,
72
+ Context = never
73
+ >(
74
+ execute: DriverExecute<Error, Context>
75
+ ): Driver<Error, Context>
76
+ export function driver<
77
+ Error = never,
78
+ Context = never
79
+ >(
80
+ handlers: DriverHandlers<Error, Context>
81
+ ): Driver<Error, Context>
82
+ export function driver<
83
+ Error = never,
84
+ Context = never
85
+ >(
86
+ dialect: "postgres",
87
+ execute: DriverExecute<Error, Context>
88
+ ): Driver<Error, Context>
89
+ export function driver<
90
+ Error = never,
91
+ Context = never
92
+ >(
93
+ dialect: "postgres",
94
+ handlers: DriverHandlers<Error, Context>
95
+ ): Driver<Error, Context>
96
+ export function driver<
97
+ Error = never,
98
+ Context = never
99
+ >(
100
+ dialectOrExecute: "postgres" | DriverExecute<Error, Context> | DriverHandlers<Error, Context>,
101
+ maybeExecute?: DriverExecute<Error, Context> | DriverHandlers<Error, Context>
102
+ ): Driver<Error, Context> {
103
+ const executeOrHandlers = typeof dialectOrExecute === "string" ? maybeExecute : dialectOrExecute
104
+ return typeof executeOrHandlers === "function"
105
+ ? CoreExecutor.driver("postgres", executeOrHandlers)
106
+ : CoreExecutor.driver("postgres", executeOrHandlers as DriverHandlers<Error, Context>)
64
107
  }
65
108
 
66
109
  const fromDriver = <
@@ -12,11 +12,29 @@ import { isSequenceDefinition, type SequenceDefinition } from "../schema-managem
12
12
 
13
13
  /** Postgres scalar core functions. */
14
14
  export { coalesce, call, uuidGenerateV4 }
15
+
16
+ const safeUnquotedIdentifier = /^[a-z_][a-z0-9_$]*$/
17
+
18
+ const quoteIdentifier = (value: string): string =>
19
+ `"${value.replaceAll("\"", "\"\"")}"`
20
+
21
+ const renderIdentifier = (value: string): string =>
22
+ safeUnquotedIdentifier.test(value)
23
+ ? value
24
+ : quoteIdentifier(value)
25
+
26
+ const renderQualifiedSequenceName = (
27
+ value: SequenceDefinition<string, string | undefined>
28
+ ): string =>
29
+ value.schemaName === undefined || value.schemaName === "public"
30
+ ? renderIdentifier(value.name)
31
+ : `${renderIdentifier(value.schemaName)}.${renderIdentifier(value.name)}`
32
+
15
33
  export const nextVal = (
16
34
  value: ExpressionInput | SequenceDefinition<string, string | undefined>
17
35
  ) =>
18
36
  nextValInternal(
19
37
  isSequenceDefinition(value)
20
- ? cast(literal(value.qualifiedName()), postgresType.regclass())
38
+ ? cast(literal(renderQualifiedSequenceName(value)), postgresType.regclass())
21
39
  : value
22
40
  )