effect-qb 0.19.0 → 0.21.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 (92) hide show
  1. package/README.md +7 -1
  2. package/dist/index.js +1990 -679
  3. package/dist/mysql.js +1490 -617
  4. package/dist/postgres/metadata.js +1334 -263
  5. package/dist/postgres.js +3376 -2307
  6. package/dist/sqlite.js +1573 -628
  7. package/dist/standard.js +1984 -673
  8. package/package.json +3 -6
  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 +121 -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/errors/normalize.ts +0 -1
  38. package/src/mysql/executor.ts +4 -6
  39. package/src/mysql/function/temporal.ts +1 -1
  40. package/src/mysql/internal/dsl.ts +116 -16
  41. package/src/mysql/json.ts +1 -33
  42. package/src/mysql/renderer.ts +13 -6
  43. package/src/mysql/type.ts +60 -0
  44. package/src/mysql.ts +3 -1
  45. package/src/postgres/check.ts +1 -0
  46. package/src/postgres/column.ts +11 -11
  47. package/src/postgres/datatypes/index.ts +1 -0
  48. package/src/postgres/datatypes/spec.ts +6 -260
  49. package/src/postgres/errors/normalize.ts +0 -1
  50. package/src/postgres/executor.ts +4 -6
  51. package/src/postgres/foreign-key.ts +24 -0
  52. package/src/postgres/function/temporal.ts +1 -1
  53. package/src/postgres/index.ts +1 -0
  54. package/src/postgres/internal/dsl.ts +122 -21
  55. package/src/postgres/json-extension.ts +7 -0
  56. package/src/postgres/json.ts +726 -173
  57. package/src/postgres/jsonb.ts +0 -1
  58. package/src/postgres/primary-key.ts +24 -0
  59. package/src/postgres/renderer.ts +13 -6
  60. package/src/postgres/schema-management.ts +1 -6
  61. package/src/postgres/schema.ts +16 -8
  62. package/src/postgres/table.ts +111 -113
  63. package/src/postgres/type.ts +86 -4
  64. package/src/postgres/unique.ts +32 -0
  65. package/src/postgres.ts +12 -6
  66. package/src/sqlite/column.ts +6 -6
  67. package/src/sqlite/datatypes/index.ts +1 -0
  68. package/src/sqlite/datatypes/spec.ts +6 -94
  69. package/src/sqlite/errors/normalize.ts +0 -1
  70. package/src/sqlite/executor.ts +4 -6
  71. package/src/sqlite/function/temporal.ts +1 -1
  72. package/src/sqlite/internal/dsl.ts +100 -5
  73. package/src/sqlite/json.ts +1 -32
  74. package/src/sqlite/renderer.ts +13 -6
  75. package/src/sqlite/type.ts +40 -0
  76. package/src/sqlite.ts +3 -1
  77. package/src/standard/cast.ts +113 -0
  78. package/src/standard/check.ts +17 -0
  79. package/src/standard/column.ts +10 -10
  80. package/src/standard/datatypes/index.ts +2 -2
  81. package/src/standard/datatypes/spec.ts +10 -96
  82. package/src/standard/foreign-key.ts +37 -0
  83. package/src/standard/function/temporal.ts +1 -1
  84. package/src/standard/index.ts +17 -0
  85. package/src/standard/json.ts +883 -0
  86. package/src/standard/primary-key.ts +17 -0
  87. package/src/standard/renderer.ts +31 -3
  88. package/src/standard/table.ts +25 -21
  89. package/src/standard/unique.ts +17 -0
  90. package/src/standard.ts +14 -0
  91. package/src/internal/table.d.ts +0 -174
  92. 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,14 @@ 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
+ if (typeof value === "number" && !Number.isFinite(value)) {
1562
+ return undefined
1563
+ }
1564
+ return Schema.Literal(value) as unknown as Schema.Top
1561
1565
  }
1562
1566
 
1563
1567
  const literal = <const Value extends LiteralValue>(
@@ -2402,7 +2406,7 @@ type BinaryPredicateExpression<
2402
2406
  MergeAggregationTuple<typeof expressions>,
2403
2407
  TupleDependencies<typeof expressions>,
2404
2408
  Ast
2405
- > => makeExpression({
2409
+ > => withJsonPathAccess(makeExpression({
2406
2410
  runtime: state.runtime,
2407
2411
  dbType: state.dbType,
2408
2412
  nullability: state.nullability,
@@ -2410,7 +2414,7 @@ type BinaryPredicateExpression<
2410
2414
  kind: mergeAggregationManyRuntime(expressions) as MergeAggregationTuple<typeof expressions>,
2411
2415
 
2412
2416
  dependencies: mergeManyDependencies(expressions)
2413
- }, ast) as AstBackedExpression<
2417
+ }, ast)) as AstBackedExpression<
2414
2418
  Runtime,
2415
2419
  Db,
2416
2420
  Nullability,
@@ -2431,7 +2435,7 @@ type BinaryPredicateExpression<
2431
2435
  const makeJsonLiteralExpression = <Value extends JsonLiteralInput>(
2432
2436
  value: Value,
2433
2437
  dbType: Expression.DbType.Json<any, any> = jsonDb
2434
- ) => makeExpression({
2438
+ ) => withJsonPathAccess(makeExpression({
2435
2439
  runtime: value as JsonRuntime<Value>,
2436
2440
  dbType,
2437
2441
  nullability: (value === null ? "always" : "never") as JsonNullabilityOf<Value>,
@@ -2442,7 +2446,7 @@ type BinaryPredicateExpression<
2442
2446
  }, {
2443
2447
  kind: "literal",
2444
2448
  value
2445
- })
2449
+ }))
2446
2450
 
2447
2451
  const wrapJsonExpression = (
2448
2452
  value: Expression.Any,
@@ -4523,6 +4527,83 @@ type ValidateTargetColumnInput<
4523
4527
  Columns extends DdlColumnInput
4524
4528
  > = ValidateTargetColumns<Target, NormalizeDdlColumns<Columns>> extends never ? never : Columns
4525
4529
 
4530
+ type SameColumnSet<
4531
+ Left extends readonly string[],
4532
+ Right extends readonly string[]
4533
+ > = string extends Left[number] | Right[number]
4534
+ ? false
4535
+ : Exclude<Left[number], Right[number]> extends never
4536
+ ? Exclude<Right[number], Left[number]> extends never
4537
+ ? true
4538
+ : false
4539
+ : false
4540
+
4541
+ type ConflictArbitersOf<Target extends MutationTargetLike> =
4542
+ Target[typeof Table.TypeId]["conflictArbiters"][number]
4543
+
4544
+ type MatchingConflictArbiter<
4545
+ Target extends MutationTargetLike,
4546
+ Columns extends readonly string[],
4547
+ AllowPartial extends boolean
4548
+ > = ConflictArbitersOf<Target> extends infer Arbiter extends Table.ConflictArbiter
4549
+ ? Arbiter extends Table.ConflictArbiter
4550
+ ? SameColumnSet<Arbiter["columns"], Columns> extends true
4551
+ ? Arbiter["scope"] extends "unconditional"
4552
+ ? true
4553
+ : AllowPartial extends true ? true : never
4554
+ : never
4555
+ : never
4556
+ : never
4557
+
4558
+ type HasInlineConflictArbiter<
4559
+ Target extends MutationTargetLike,
4560
+ Columns extends readonly string[]
4561
+ > = Columns extends readonly [infer Column extends Extract<keyof Target[typeof Table.TypeId]["fields"], string>]
4562
+ ? Target[typeof Table.TypeId]["fields"][Column] extends { readonly metadata: { readonly primaryKey: true } | { readonly unique: true } }
4563
+ ? true
4564
+ : false
4565
+ : false
4566
+
4567
+ type HasConflictArbiter<
4568
+ Target extends MutationTargetLike,
4569
+ Columns extends readonly string[],
4570
+ AllowPartial extends boolean
4571
+ > = string extends Extract<keyof Target[typeof Table.TypeId]["fields"], string>
4572
+ ? true
4573
+ : HasInlineConflictArbiter<Target, Columns> extends true
4574
+ ? true
4575
+ : true extends MatchingConflictArbiter<Target, Columns, AllowPartial> ? true : false
4576
+
4577
+ type ConflictTargetArbiterError<
4578
+ Columns,
4579
+ AllowPartial extends boolean
4580
+ > = {
4581
+ readonly __effect_qb_error__: "effect-qb: conflict target columns must match a primary key, unique constraint, or unique index"
4582
+ readonly __effect_qb_conflict_columns__: Columns
4583
+ readonly __effect_qb_partial_target__: AllowPartial
4584
+ readonly __effect_qb_hint__: "Declare the target columns as primaryKey/unique, add a table-level Unique.make(...), or use a simple Pg.Index.uniqueIndex(...)"
4585
+ }
4586
+
4587
+ type ValidateConflictColumnInput<
4588
+ Target extends MutationTargetLike,
4589
+ Columns extends DdlColumnInput,
4590
+ AllowPartial extends boolean
4591
+ > = ValidateTargetColumnInput<Target, Columns> extends never
4592
+ ? never
4593
+ : HasConflictArbiter<Target, NormalizeDdlColumns<Columns>, AllowPartial> extends true
4594
+ ? Columns
4595
+ : ConflictTargetArbiterError<NormalizeDdlColumns<Columns>, AllowPartial>
4596
+
4597
+ type ConflictColumnPlanConstraint<
4598
+ Target extends MutationTargetLike,
4599
+ Columns extends DdlColumnInput,
4600
+ AllowPartial extends boolean
4601
+ > = ValidateTargetColumnInput<Target, Columns> extends never
4602
+ ? never
4603
+ : HasConflictArbiter<Target, NormalizeDdlColumns<Columns>, AllowPartial> extends true
4604
+ ? unknown
4605
+ : ConflictTargetArbiterError<NormalizeDdlColumns<Columns>, AllowPartial>
4606
+
4526
4607
  type CreateIndexOptions<Name extends string = string> = {
4527
4608
  readonly name?: NonEmptyStringInput<Name>
4528
4609
  readonly unique?: boolean
@@ -4961,6 +5042,21 @@ type ConflictConstraintNameConstraint<Target> =
4961
5042
  ? { readonly constraint: NonEmptyStringInput<Constraint> }
4962
5043
  : unknown
4963
5044
 
5045
+ type ConflictTargetHasPredicate<Target> =
5046
+ Target extends { readonly where: PredicateInput } ? true : false
5047
+
5048
+ type ConflictTargetPlanConstraint<
5049
+ Target extends MutationTargetLike,
5050
+ ConflictTarget
5051
+ > =
5052
+ ConflictTarget extends { readonly constraint: string }
5053
+ ? unknown
5054
+ : ConflictTarget extends { readonly columns: infer Columns extends DdlColumnInput }
5055
+ ? ConflictColumnPlanConstraint<Target, Columns, ConflictTargetHasPredicate<ConflictTarget>>
5056
+ : ConflictTarget extends DdlColumnInput
5057
+ ? ConflictColumnPlanConstraint<Target, ConflictTarget, false>
5058
+ : unknown
5059
+
4964
5060
  type ConflictActionInput<
4965
5061
  Target extends MutationTargetLike,
4966
5062
  Dialect extends string,
@@ -5114,6 +5210,11 @@ type MutationTargetTupleDialectConstraint<
5114
5210
  Dialect extends string
5115
5211
  > = Exclude<TableDialectOf<Targets[number]>, Dialect | "standard"> extends never ? unknown : never
5116
5212
 
5213
+ type TableDialectConstraint<
5214
+ Target extends TableLike,
5215
+ Dialect extends string
5216
+ > = Exclude<TableDialectOf<Target>, Dialect> extends never ? unknown : never
5217
+
5117
5218
  type MutationRequiredFromValues<Values extends Record<string, unknown>> = {
5118
5219
  [K in keyof Values]: Values[K] extends Expression.Any ? RequiredFromDependencies<DependenciesOf<Values[K]>> : never
5119
5220
  }[keyof Values]
@@ -6268,7 +6369,7 @@ type AsCurriedResult<
6268
6369
 
6269
6370
  export interface InsertApi {
6270
6371
  <Target extends MutationTargetLike>(
6271
- target: Target
6372
+ target: Target & TableDialectConstraint<Target, Dialect>
6272
6373
  ): QueryPlan<
6273
6374
  {},
6274
6375
  never,
@@ -6285,7 +6386,7 @@ type AsCurriedResult<
6285
6386
  EmptyFacts
6286
6387
  >
6287
6388
  <Target extends MutationTargetLike, Values extends Record<string, unknown>>(
6288
- target: Target,
6389
+ target: Target & TableDialectConstraint<Target, Dialect>,
6289
6390
  values: MutationValuesInput<"insert", Target, Values> & MutationValuesDialectConstraint<Values, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>
6290
6391
  ): QueryPlan<
6291
6392
  {},
@@ -6318,9 +6419,9 @@ type AsCurriedResult<
6318
6419
  >(
6319
6420
  target: ConflictTarget & ConflictConstraintNameConstraint<ConflictTarget>,
6320
6421
  options?: Options & ConflictActionUpdateNonEmptyConstraint<Options>
6321
- ) =>
6422
+ ) =>
6322
6423
  <PlanValue extends QueryPlan<any, any, any, any, any, any, any, any, any, any>>(
6323
- plan: PlanValue & RequireInsertStatement<PlanValue>
6424
+ plan: PlanValue & RequireInsertStatement<PlanValue> & ConflictTargetPlanConstraint<MutationTargetOfPlan<PlanValue>, ConflictTarget>
6324
6425
  ) => QueryPlan<
6325
6426
  SelectionOfPlan<PlanValue>,
6326
6427
  Exclude<RequiredOfPlan<PlanValue> | ConflictRequired<UpdateValues, Options, ConflictTarget>, AvailableNames<AvailableOfPlan<PlanValue>>>,
@@ -6357,7 +6458,7 @@ type AsCurriedResult<
6357
6458
  EmptyFacts
6358
6459
  >
6359
6460
  <Target extends MutationTargetLike, Values extends Record<string, unknown>>(
6360
- target: Target,
6461
+ target: Target & TableDialectConstraint<Target, Dialect>,
6361
6462
  values: MutationValuesInput<"update", Target, Values> & UpdateValuesNonEmptyConstraint<Values> & MutationValuesDialectConstraint<Values, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>
6362
6463
  ): QueryPlan<
6363
6464
  {},
@@ -6382,9 +6483,9 @@ type AsCurriedResult<
6382
6483
  const Columns extends DdlColumnInput,
6383
6484
  UpdateValues extends MutationInputOf<Table.UpdateOf<Target>> | undefined = undefined
6384
6485
  >(
6385
- target: Target,
6486
+ target: Target & TableDialectConstraint<Target, Dialect>,
6386
6487
  values: Values & MutationValuesDialectConstraint<Values, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>,
6387
- conflictColumns: ValidateTargetColumnInput<Target, Columns>,
6488
+ conflictColumns: ValidateConflictColumnInput<Target, Columns, false>,
6388
6489
  updateValues?: UpdateValues & UpdateValuesNonEmptyConstraint<Exclude<UpdateValues, undefined>> & MutationValuesDialectConstraint<Exclude<UpdateValues, undefined>, Dialect, TextDb, NumericDb, BoolDb, TimestampDb, NullDb>
6389
6490
  ) => QueryPlan<
6390
6491
  {},
@@ -6406,7 +6507,7 @@ type AsCurriedResult<
6406
6507
 
6407
6508
  interface DeleteApi {
6408
6509
  <Target extends MutationTargetLike>(
6409
- target: Target
6510
+ target: Target & TableDialectConstraint<Target, Dialect>
6410
6511
  ): QueryPlan<
6411
6512
  {},
6412
6513
  never,
@@ -6442,7 +6543,7 @@ type AsCurriedResult<
6442
6543
  }
6443
6544
 
6444
6545
  type TruncateApi = <Target extends MutationTargetLike>(
6445
- target: Target,
6546
+ target: Target & TableDialectConstraint<Target, Dialect>,
6446
6547
  options?: TruncateOptions
6447
6548
  ) => QueryPlan<
6448
6549
  {},
@@ -6469,10 +6570,10 @@ type AsCurriedResult<
6469
6570
  MatchedPredicate extends PredicateInput | undefined = undefined,
6470
6571
  NotMatchedPredicate extends PredicateInput | undefined = undefined
6471
6572
  >(
6472
- target: Target,
6573
+ target: Target & TableDialectConstraint<Target, Dialect>,
6473
6574
  source: Source & (
6474
6575
  SourceRequiredOf<Source> extends never ? unknown : SourceRequirementError<Source>
6475
- ) & SourceDialectConstraint<Source, Dialect> & MergeSourceNameConstraint<Target, Source>,
6576
+ ) & MergeSourceNameConstraint<Target, Source> & SourceDialectConstraint<Source, Dialect>,
6476
6577
  on: On,
6477
6578
  options: MergeOptions<Target, MatchedValues, InsertValues, MatchedPredicate, NotMatchedPredicate>
6478
6579
  ) => QueryPlan<
@@ -6674,7 +6775,7 @@ type AsCurriedResult<
6674
6775
  >
6675
6776
 
6676
6777
  type CreateTableApi = <Target extends SchemaTableLike>(
6677
- target: Target,
6778
+ target: Target & TableDialectConstraint<Target, Dialect>,
6678
6779
  options?: CreateTableOptions
6679
6780
  ) => QueryPlan<
6680
6781
  {},
@@ -6690,7 +6791,7 @@ type AsCurriedResult<
6690
6791
  >
6691
6792
 
6692
6793
  type DropTableApi = <Target extends SchemaTableLike>(
6693
- target: Target,
6794
+ target: Target & TableDialectConstraint<Target, Dialect>,
6694
6795
  options?: DropTableOptions
6695
6796
  ) => QueryPlan<
6696
6797
  {},
@@ -6706,7 +6807,7 @@ type AsCurriedResult<
6706
6807
  >
6707
6808
 
6708
6809
  type CreateIndexApi = <Target extends SchemaTableLike, const Columns extends DdlColumnInput, Name extends string = string>(
6709
- target: Target,
6810
+ target: Target & TableDialectConstraint<Target, Dialect>,
6710
6811
  columns: Columns & ValidateDdlColumnInput<Target, Columns>,
6711
6812
  options?: CreateIndexOptions<Name>
6712
6813
  ) => QueryPlan<
@@ -6723,7 +6824,7 @@ type AsCurriedResult<
6723
6824
  >
6724
6825
 
6725
6826
  type DropIndexApi = <Target extends SchemaTableLike, const Columns extends DdlColumnInput, Name extends string = string>(
6726
- target: Target,
6827
+ target: Target & TableDialectConstraint<Target, Dialect>,
6727
6828
  columns: Columns & ValidateDdlColumnInput<Target, Columns>,
6728
6829
  options?: DropIndexOptions<Name>
6729
6830
  ) => 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