effect-qb 0.19.0 → 4.0.0-beta.92

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 (89) hide show
  1. package/README.md +7 -1
  2. package/dist/index.js +1987 -679
  3. package/dist/mysql.js +1486 -616
  4. package/dist/postgres/metadata.js +1334 -263
  5. package/dist/postgres.js +3374 -2308
  6. package/dist/sqlite.js +1569 -627
  7. package/dist/standard.js +1982 -674
  8. package/package.json +2 -4
  9. package/src/internal/coercion/rules.ts +13 -1
  10. package/src/internal/column-state.d.ts +3 -3
  11. package/src/internal/column-state.ts +13 -12
  12. package/src/internal/column.ts +8 -8
  13. package/src/internal/datatypes/define.ts +5 -0
  14. package/src/internal/datatypes/lookup.ts +67 -18
  15. package/src/internal/datatypes/matrix.ts +903 -0
  16. package/src/internal/datatypes/shape.ts +2 -0
  17. package/src/internal/dialect-renderers/mysql.ts +6 -4
  18. package/src/internal/dialect-renderers/postgres.ts +6 -4
  19. package/src/internal/dialect-renderers/sqlite.ts +6 -4
  20. package/src/internal/dialect.ts +1 -1
  21. package/src/internal/executor.ts +56 -43
  22. package/src/internal/json/path-access.ts +351 -0
  23. package/src/internal/query.d.ts +1 -1
  24. package/src/internal/query.ts +1 -1
  25. package/src/internal/runtime/driver-value-mapping.ts +3 -3
  26. package/src/internal/runtime/schema.ts +28 -38
  27. package/src/internal/runtime/value.ts +20 -23
  28. package/src/internal/scalar.d.ts +1 -1
  29. package/src/internal/scalar.ts +2 -1
  30. package/src/internal/schema-derivation.d.ts +7 -7
  31. package/src/internal/schema-derivation.ts +11 -11
  32. package/src/internal/standard-dsl.ts +118 -28
  33. package/src/internal/table.ts +451 -120
  34. package/src/mysql/column.ts +6 -6
  35. package/src/mysql/datatypes/index.ts +1 -0
  36. package/src/mysql/datatypes/spec.ts +6 -176
  37. package/src/mysql/executor.ts +4 -6
  38. package/src/mysql/function/temporal.ts +1 -1
  39. package/src/mysql/internal/dsl.ts +113 -16
  40. package/src/mysql/json.ts +1 -33
  41. package/src/mysql/renderer.ts +13 -6
  42. package/src/mysql/type.ts +60 -0
  43. package/src/mysql.ts +3 -1
  44. package/src/postgres/check.ts +1 -0
  45. package/src/postgres/column.ts +11 -11
  46. package/src/postgres/datatypes/index.ts +1 -0
  47. package/src/postgres/datatypes/spec.ts +6 -260
  48. package/src/postgres/executor.ts +4 -6
  49. package/src/postgres/foreign-key.ts +24 -0
  50. package/src/postgres/function/temporal.ts +1 -1
  51. package/src/postgres/index.ts +1 -0
  52. package/src/postgres/internal/dsl.ts +119 -21
  53. package/src/postgres/json-extension.ts +7 -0
  54. package/src/postgres/json.ts +726 -173
  55. package/src/postgres/jsonb.ts +0 -1
  56. package/src/postgres/primary-key.ts +24 -0
  57. package/src/postgres/renderer.ts +13 -6
  58. package/src/postgres/schema-management.ts +1 -6
  59. package/src/postgres/schema.ts +16 -8
  60. package/src/postgres/table.ts +111 -113
  61. package/src/postgres/type.ts +86 -4
  62. package/src/postgres/unique.ts +32 -0
  63. package/src/postgres.ts +12 -6
  64. package/src/sqlite/column.ts +6 -6
  65. package/src/sqlite/datatypes/index.ts +1 -0
  66. package/src/sqlite/datatypes/spec.ts +6 -94
  67. package/src/sqlite/executor.ts +4 -6
  68. package/src/sqlite/function/temporal.ts +1 -1
  69. package/src/sqlite/internal/dsl.ts +97 -5
  70. package/src/sqlite/json.ts +1 -32
  71. package/src/sqlite/renderer.ts +13 -6
  72. package/src/sqlite/type.ts +40 -0
  73. package/src/sqlite.ts +3 -1
  74. package/src/standard/cast.ts +113 -0
  75. package/src/standard/check.ts +17 -0
  76. package/src/standard/column.ts +10 -10
  77. package/src/standard/datatypes/index.ts +2 -2
  78. package/src/standard/datatypes/spec.ts +10 -96
  79. package/src/standard/foreign-key.ts +37 -0
  80. package/src/standard/function/temporal.ts +1 -1
  81. package/src/standard/index.ts +17 -0
  82. package/src/standard/json.ts +883 -0
  83. package/src/standard/primary-key.ts +17 -0
  84. package/src/standard/renderer.ts +31 -3
  85. package/src/standard/table.ts +25 -21
  86. package/src/standard/unique.ts +17 -0
  87. package/src/standard.ts +14 -0
  88. package/src/internal/table.d.ts +0 -174
  89. package/src/postgres/cast.ts +0 -45
@@ -114,6 +114,7 @@ import * as ExpressionAst from "../../internal/expression-ast.js"
114
114
  import { presenceWitnessesOfSourceLike } from "../../internal/implication-runtime.js"
115
115
  import type { JsonNode } from "../../internal/json/ast.js"
116
116
  import type { JsonPathUsageError } from "../../internal/json/errors.js"
117
+ import { withJsonPathAccess } from "../../internal/json/path-access.js"
117
118
  import * as JsonPath from "../../internal/json/path.js"
118
119
  import type {
119
120
  JsonConcatResult,
@@ -1553,11 +1554,11 @@ const profile: QueryDialectProfile<Dialect, TextDb, NumericDb, BoolDb, Timestamp
1553
1554
 
1554
1555
  const literalSchemaOf = <Value extends LiteralValue>(
1555
1556
  value: Value
1556
- ): Schema.Schema.Any | undefined => {
1557
+ ): Schema.Top | undefined => {
1557
1558
  if (value === null || value instanceof Date) {
1558
1559
  return undefined
1559
1560
  }
1560
- return Schema.Literal(value) as Schema.Schema.Any
1561
+ return Schema.Literal(value) as unknown as Schema.Top
1561
1562
  }
1562
1563
 
1563
1564
  const literal = <const Value extends LiteralValue>(
@@ -2402,7 +2403,7 @@ type BinaryPredicateExpression<
2402
2403
  MergeAggregationTuple<typeof expressions>,
2403
2404
  TupleDependencies<typeof expressions>,
2404
2405
  Ast
2405
- > => makeExpression({
2406
+ > => withJsonPathAccess(makeExpression({
2406
2407
  runtime: state.runtime,
2407
2408
  dbType: state.dbType,
2408
2409
  nullability: state.nullability,
@@ -2410,7 +2411,7 @@ type BinaryPredicateExpression<
2410
2411
  kind: mergeAggregationManyRuntime(expressions) as MergeAggregationTuple<typeof expressions>,
2411
2412
 
2412
2413
  dependencies: mergeManyDependencies(expressions)
2413
- }, ast) as AstBackedExpression<
2414
+ }, ast)) as AstBackedExpression<
2414
2415
  Runtime,
2415
2416
  Db,
2416
2417
  Nullability,
@@ -2431,7 +2432,7 @@ type BinaryPredicateExpression<
2431
2432
  const makeJsonLiteralExpression = <Value extends JsonLiteralInput>(
2432
2433
  value: Value,
2433
2434
  dbType: Expression.DbType.Json<any, any> = jsonDb
2434
- ) => makeExpression({
2435
+ ) => withJsonPathAccess(makeExpression({
2435
2436
  runtime: value as JsonRuntime<Value>,
2436
2437
  dbType,
2437
2438
  nullability: (value === null ? "always" : "never") as JsonNullabilityOf<Value>,
@@ -2442,7 +2443,7 @@ type BinaryPredicateExpression<
2442
2443
  }, {
2443
2444
  kind: "literal",
2444
2445
  value
2445
- })
2446
+ }))
2446
2447
 
2447
2448
  const wrapJsonExpression = (
2448
2449
  value: Expression.Any,
@@ -4523,6 +4524,83 @@ type ValidateTargetColumnInput<
4523
4524
  Columns extends DdlColumnInput
4524
4525
  > = ValidateTargetColumns<Target, NormalizeDdlColumns<Columns>> extends never ? never : Columns
4525
4526
 
4527
+ type SameColumnSet<
4528
+ Left extends readonly string[],
4529
+ Right extends readonly string[]
4530
+ > = string extends Left[number] | Right[number]
4531
+ ? false
4532
+ : Exclude<Left[number], Right[number]> extends never
4533
+ ? Exclude<Right[number], Left[number]> extends never
4534
+ ? true
4535
+ : false
4536
+ : false
4537
+
4538
+ type ConflictArbitersOf<Target extends MutationTargetLike> =
4539
+ Target[typeof Table.TypeId]["conflictArbiters"][number]
4540
+
4541
+ type MatchingConflictArbiter<
4542
+ Target extends MutationTargetLike,
4543
+ Columns extends readonly string[],
4544
+ AllowPartial extends boolean
4545
+ > = ConflictArbitersOf<Target> extends infer Arbiter extends Table.ConflictArbiter
4546
+ ? Arbiter extends Table.ConflictArbiter
4547
+ ? SameColumnSet<Arbiter["columns"], Columns> extends true
4548
+ ? Arbiter["scope"] extends "unconditional"
4549
+ ? true
4550
+ : AllowPartial extends true ? true : never
4551
+ : never
4552
+ : never
4553
+ : never
4554
+
4555
+ type HasInlineConflictArbiter<
4556
+ Target extends MutationTargetLike,
4557
+ Columns extends readonly string[]
4558
+ > = Columns extends readonly [infer Column extends Extract<keyof Target[typeof Table.TypeId]["fields"], string>]
4559
+ ? Target[typeof Table.TypeId]["fields"][Column] extends { readonly metadata: { readonly primaryKey: true } | { readonly unique: true } }
4560
+ ? true
4561
+ : false
4562
+ : false
4563
+
4564
+ type HasConflictArbiter<
4565
+ Target extends MutationTargetLike,
4566
+ Columns extends readonly string[],
4567
+ AllowPartial extends boolean
4568
+ > = string extends Extract<keyof Target[typeof Table.TypeId]["fields"], string>
4569
+ ? true
4570
+ : HasInlineConflictArbiter<Target, Columns> extends true
4571
+ ? true
4572
+ : true extends MatchingConflictArbiter<Target, Columns, AllowPartial> ? true : false
4573
+
4574
+ type ConflictTargetArbiterError<
4575
+ Columns,
4576
+ AllowPartial extends boolean
4577
+ > = {
4578
+ readonly __effect_qb_error__: "effect-qb: conflict target columns must match a primary key, unique constraint, or unique index"
4579
+ readonly __effect_qb_conflict_columns__: Columns
4580
+ readonly __effect_qb_partial_target__: AllowPartial
4581
+ readonly __effect_qb_hint__: "Declare the target columns as primaryKey/unique, add a table-level Unique.make(...), or use a simple Pg.Index.uniqueIndex(...)"
4582
+ }
4583
+
4584
+ type ValidateConflictColumnInput<
4585
+ Target extends MutationTargetLike,
4586
+ Columns extends DdlColumnInput,
4587
+ AllowPartial extends boolean
4588
+ > = ValidateTargetColumnInput<Target, Columns> extends never
4589
+ ? never
4590
+ : HasConflictArbiter<Target, NormalizeDdlColumns<Columns>, AllowPartial> extends true
4591
+ ? Columns
4592
+ : ConflictTargetArbiterError<NormalizeDdlColumns<Columns>, AllowPartial>
4593
+
4594
+ type ConflictColumnPlanConstraint<
4595
+ Target extends MutationTargetLike,
4596
+ Columns extends DdlColumnInput,
4597
+ AllowPartial extends boolean
4598
+ > = ValidateTargetColumnInput<Target, Columns> extends never
4599
+ ? never
4600
+ : HasConflictArbiter<Target, NormalizeDdlColumns<Columns>, AllowPartial> extends true
4601
+ ? unknown
4602
+ : ConflictTargetArbiterError<NormalizeDdlColumns<Columns>, AllowPartial>
4603
+
4526
4604
  type CreateIndexOptions<Name extends string = string> = {
4527
4605
  readonly name?: NonEmptyStringInput<Name>
4528
4606
  readonly unique?: boolean
@@ -4961,6 +5039,21 @@ type ConflictConstraintNameConstraint<Target> =
4961
5039
  ? { readonly constraint: NonEmptyStringInput<Constraint> }
4962
5040
  : unknown
4963
5041
 
5042
+ type ConflictTargetHasPredicate<Target> =
5043
+ Target extends { readonly where: PredicateInput } ? true : false
5044
+
5045
+ type ConflictTargetPlanConstraint<
5046
+ Target extends MutationTargetLike,
5047
+ ConflictTarget
5048
+ > =
5049
+ ConflictTarget extends { readonly constraint: string }
5050
+ ? unknown
5051
+ : ConflictTarget extends { readonly columns: infer Columns extends DdlColumnInput }
5052
+ ? ConflictColumnPlanConstraint<Target, Columns, ConflictTargetHasPredicate<ConflictTarget>>
5053
+ : ConflictTarget extends DdlColumnInput
5054
+ ? ConflictColumnPlanConstraint<Target, ConflictTarget, false>
5055
+ : unknown
5056
+
4964
5057
  type ConflictActionInput<
4965
5058
  Target extends MutationTargetLike,
4966
5059
  Dialect extends string,
@@ -5114,6 +5207,11 @@ type MutationTargetTupleDialectConstraint<
5114
5207
  Dialect extends string
5115
5208
  > = Exclude<TableDialectOf<Targets[number]>, Dialect | "standard"> extends never ? unknown : never
5116
5209
 
5210
+ type TableDialectConstraint<
5211
+ Target extends TableLike,
5212
+ Dialect extends string
5213
+ > = Exclude<TableDialectOf<Target>, Dialect> extends never ? unknown : never
5214
+
5117
5215
  type MutationRequiredFromValues<Values extends Record<string, unknown>> = {
5118
5216
  [K in keyof Values]: Values[K] extends Expression.Any ? RequiredFromDependencies<DependenciesOf<Values[K]>> : never
5119
5217
  }[keyof Values]
@@ -6268,7 +6366,7 @@ type AsCurriedResult<
6268
6366
 
6269
6367
  export interface InsertApi {
6270
6368
  <Target extends MutationTargetLike>(
6271
- target: Target
6369
+ target: Target & TableDialectConstraint<Target, Dialect>
6272
6370
  ): QueryPlan<
6273
6371
  {},
6274
6372
  never,
@@ -6285,7 +6383,7 @@ type AsCurriedResult<
6285
6383
  EmptyFacts
6286
6384
  >
6287
6385
  <Target extends MutationTargetLike, Values extends Record<string, unknown>>(
6288
- target: Target,
6386
+ target: Target & TableDialectConstraint<Target, Dialect>,
6289
6387
  values: MutationValuesInput<"insert", Target, Values> & MutationValuesDialectConstraint<Values, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>
6290
6388
  ): QueryPlan<
6291
6389
  {},
@@ -6318,9 +6416,9 @@ type AsCurriedResult<
6318
6416
  >(
6319
6417
  target: ConflictTarget & ConflictConstraintNameConstraint<ConflictTarget>,
6320
6418
  options?: Options & ConflictActionUpdateNonEmptyConstraint<Options>
6321
- ) =>
6419
+ ) =>
6322
6420
  <PlanValue extends QueryPlan<any, any, any, any, any, any, any, any, any, any>>(
6323
- plan: PlanValue & RequireInsertStatement<PlanValue>
6421
+ plan: PlanValue & RequireInsertStatement<PlanValue> & ConflictTargetPlanConstraint<MutationTargetOfPlan<PlanValue>, ConflictTarget>
6324
6422
  ) => QueryPlan<
6325
6423
  SelectionOfPlan<PlanValue>,
6326
6424
  Exclude<RequiredOfPlan<PlanValue> | ConflictRequired<UpdateValues, Options, ConflictTarget>, AvailableNames<AvailableOfPlan<PlanValue>>>,
@@ -6357,7 +6455,7 @@ type AsCurriedResult<
6357
6455
  EmptyFacts
6358
6456
  >
6359
6457
  <Target extends MutationTargetLike, Values extends Record<string, unknown>>(
6360
- target: Target,
6458
+ target: Target & TableDialectConstraint<Target, Dialect>,
6361
6459
  values: MutationValuesInput<"update", Target, Values> & UpdateValuesNonEmptyConstraint<Values> & MutationValuesDialectConstraint<Values, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>
6362
6460
  ): QueryPlan<
6363
6461
  {},
@@ -6382,9 +6480,9 @@ type AsCurriedResult<
6382
6480
  const Columns extends DdlColumnInput,
6383
6481
  UpdateValues extends MutationInputOf<Table.UpdateOf<Target>> | undefined = undefined
6384
6482
  >(
6385
- target: Target,
6483
+ target: Target & TableDialectConstraint<Target, Dialect>,
6386
6484
  values: Values & MutationValuesDialectConstraint<Values, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>,
6387
- conflictColumns: ValidateTargetColumnInput<Target, Columns>,
6485
+ conflictColumns: ValidateConflictColumnInput<Target, Columns, false>,
6388
6486
  updateValues?: UpdateValues & UpdateValuesNonEmptyConstraint<Exclude<UpdateValues, undefined>> & MutationValuesDialectConstraint<Exclude<UpdateValues, undefined>, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>
6389
6487
  ) => QueryPlan<
6390
6488
  {},
@@ -6406,7 +6504,7 @@ type AsCurriedResult<
6406
6504
 
6407
6505
  interface DeleteApi {
6408
6506
  <Target extends MutationTargetLike>(
6409
- target: Target
6507
+ target: Target & TableDialectConstraint<Target, Dialect>
6410
6508
  ): QueryPlan<
6411
6509
  {},
6412
6510
  never,
@@ -6442,7 +6540,7 @@ type AsCurriedResult<
6442
6540
  }
6443
6541
 
6444
6542
  type TruncateApi = <Target extends MutationTargetLike>(
6445
- target: Target,
6543
+ target: Target & TableDialectConstraint<Target, Dialect>,
6446
6544
  options?: TruncateOptions
6447
6545
  ) => QueryPlan<
6448
6546
  {},
@@ -6469,10 +6567,10 @@ type AsCurriedResult<
6469
6567
  MatchedPredicate extends PredicateInput | undefined = undefined,
6470
6568
  NotMatchedPredicate extends PredicateInput | undefined = undefined
6471
6569
  >(
6472
- target: Target,
6570
+ target: Target & TableDialectConstraint<Target, Dialect>,
6473
6571
  source: Source & (
6474
6572
  SourceRequiredOf<Source> extends never ? unknown : SourceRequirementError<Source>
6475
- ) & SourceDialectConstraint<Source, Dialect> & MergeSourceNameConstraint<Target, Source>,
6573
+ ) & MergeSourceNameConstraint<Target, Source> & SourceDialectConstraint<Source, Dialect>,
6476
6574
  on: On,
6477
6575
  options: MergeOptions<Target, MatchedValues, InsertValues, MatchedPredicate, NotMatchedPredicate>
6478
6576
  ) => QueryPlan<
@@ -6674,7 +6772,7 @@ type AsCurriedResult<
6674
6772
  >
6675
6773
 
6676
6774
  type CreateTableApi = <Target extends SchemaTableLike>(
6677
- target: Target,
6775
+ target: Target & TableDialectConstraint<Target, Dialect>,
6678
6776
  options?: CreateTableOptions
6679
6777
  ) => QueryPlan<
6680
6778
  {},
@@ -6690,7 +6788,7 @@ type AsCurriedResult<
6690
6788
  >
6691
6789
 
6692
6790
  type DropTableApi = <Target extends SchemaTableLike>(
6693
- target: Target,
6791
+ target: Target & TableDialectConstraint<Target, Dialect>,
6694
6792
  options?: DropTableOptions
6695
6793
  ) => QueryPlan<
6696
6794
  {},
@@ -6706,7 +6804,7 @@ type AsCurriedResult<
6706
6804
  >
6707
6805
 
6708
6806
  type CreateIndexApi = <Target extends SchemaTableLike, const Columns extends DdlColumnInput, Name extends string = string>(
6709
- target: Target,
6807
+ target: Target & TableDialectConstraint<Target, Dialect>,
6710
6808
  columns: Columns & ValidateDdlColumnInput<Target, Columns>,
6711
6809
  options?: CreateIndexOptions<Name>
6712
6810
  ) => QueryPlan<
@@ -6723,7 +6821,7 @@ type AsCurriedResult<
6723
6821
  >
6724
6822
 
6725
6823
  type DropIndexApi = <Target extends SchemaTableLike, const Columns extends DdlColumnInput, Name extends string = string>(
6726
- target: Target,
6824
+ target: Target & TableDialectConstraint<Target, Dialect>,
6727
6825
  columns: Columns & ValidateDdlColumnInput<Target, Columns>,
6728
6826
  options?: DropIndexOptions<Name>
6729
6827
  ) => QueryPlan<
@@ -0,0 +1,7 @@
1
+ import { json } from "./json.js"
2
+
3
+ /** Removes null object fields using Postgres json/jsonb strip-null functions. */
4
+ export const stripNulls = json.stripNulls
5
+
6
+ /** Evaluates a Postgres SQL/JSON path predicate with the @@ operator. */
7
+ export const pathMatch = json.pathMatch