@effect-app/infra 0.223.0 → 0.223.2
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/CHANGELOG.md +25 -0
- package/_cjs/services/query/dsl.cjs +39 -2
- package/_cjs/services/query/dsl.cjs.map +1 -1
- package/dist/services/RepositoryBase.d.ts +19 -23
- package/dist/services/RepositoryBase.d.ts.map +1 -1
- package/dist/services/RepositoryBase.js +1 -1
- package/dist/services/query/dsl.d.ts +27 -5
- package/dist/services/query/dsl.d.ts.map +1 -1
- package/dist/services/query/dsl.js +41 -4
- package/dist/services/query/new-kid-interpreter.d.ts +1 -1
- package/package.json +10 -10
- package/src/services/RepositoryBase.ts +39 -39
- package/src/services/query/dsl.ts +187 -35
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/query.test.ts +62 -39
|
@@ -5,10 +5,12 @@ import type { FieldValues } from "@effect-app/infra/filter/types"
|
|
|
5
5
|
import type { FieldPath, FieldPathValue } from "@effect-app/infra/filter/types/path/eager"
|
|
6
6
|
import type { Ops } from "@effect-app/infra/services/Store/filterApi/proxy"
|
|
7
7
|
import type { NonNegativeInt } from "@effect-app/schema"
|
|
8
|
-
import type { Option, S } from "effect-app"
|
|
9
|
-
import { Data } from "effect-app"
|
|
8
|
+
import type { Option, Pipeable, S } from "effect-app"
|
|
9
|
+
import { Data, flow } from "effect-app"
|
|
10
10
|
import type { Covariant } from "effect/Types"
|
|
11
11
|
|
|
12
|
+
import { pipeArguments } from "effect/Pipeable"
|
|
13
|
+
|
|
12
14
|
export type QAll<TFieldValues extends FieldValues, A = TFieldValues, R = never, TType extends "one" | "many" = "many"> =
|
|
13
15
|
| Query<TFieldValues>
|
|
14
16
|
| QueryWhere<TFieldValues>
|
|
@@ -24,7 +26,7 @@ export interface QueryTogether<
|
|
|
24
26
|
out A = TFieldValues,
|
|
25
27
|
out R = never,
|
|
26
28
|
out TType extends "many" | "one" | "count" = "many"
|
|
27
|
-
> {
|
|
29
|
+
> extends Pipeable.Pipeable {
|
|
28
30
|
readonly [QId]: {
|
|
29
31
|
readonly _TFieldValues: Covariant<TFieldValues>
|
|
30
32
|
readonly _T: Covariant<T>
|
|
@@ -75,6 +77,10 @@ export class Initial<TFieldValues extends FieldValues> extends Data.TaggedClass(
|
|
|
75
77
|
constructor() {
|
|
76
78
|
super({ value: "initial" as const })
|
|
77
79
|
}
|
|
80
|
+
pipe() {
|
|
81
|
+
// eslint-disable-next-line prefer-rest-params
|
|
82
|
+
return pipeArguments(this, arguments)
|
|
83
|
+
}
|
|
78
84
|
}
|
|
79
85
|
|
|
80
86
|
export class Where<TFieldValues extends FieldValues> extends Data.TaggedClass("where")<{
|
|
@@ -82,6 +88,11 @@ export class Where<TFieldValues extends FieldValues> extends Data.TaggedClass("w
|
|
|
82
88
|
operation: [string, Ops, any] | [string, any]
|
|
83
89
|
}> implements QueryWhere<TFieldValues> {
|
|
84
90
|
readonly [QId]!: any
|
|
91
|
+
|
|
92
|
+
pipe() {
|
|
93
|
+
// eslint-disable-next-line prefer-rest-params
|
|
94
|
+
return pipeArguments(this, arguments)
|
|
95
|
+
}
|
|
85
96
|
}
|
|
86
97
|
|
|
87
98
|
export class And<TFieldValues extends FieldValues> extends Data.TaggedClass("and")<{
|
|
@@ -89,6 +100,10 @@ export class And<TFieldValues extends FieldValues> extends Data.TaggedClass("and
|
|
|
89
100
|
operation: [string, Ops, any] | [string, any] | ((q: Query<TFieldValues>) => QueryWhere<TFieldValues>)
|
|
90
101
|
}> implements QueryWhere<TFieldValues> {
|
|
91
102
|
readonly [QId]!: any
|
|
103
|
+
pipe() {
|
|
104
|
+
// eslint-disable-next-line prefer-rest-params
|
|
105
|
+
return pipeArguments(this, arguments)
|
|
106
|
+
}
|
|
92
107
|
}
|
|
93
108
|
|
|
94
109
|
export class Or<TFieldValues extends FieldValues> extends Data.TaggedClass("or")<{
|
|
@@ -96,6 +111,10 @@ export class Or<TFieldValues extends FieldValues> extends Data.TaggedClass("or")
|
|
|
96
111
|
operation: [string, Ops, any] | [string, any] | ((q: Query<TFieldValues>) => QueryWhere<TFieldValues>)
|
|
97
112
|
}> implements QueryWhere<TFieldValues> {
|
|
98
113
|
readonly [QId]!: any
|
|
114
|
+
pipe() {
|
|
115
|
+
// eslint-disable-next-line prefer-rest-params
|
|
116
|
+
return pipeArguments(this, arguments)
|
|
117
|
+
}
|
|
99
118
|
}
|
|
100
119
|
|
|
101
120
|
export class Page<TFieldValues extends FieldValues> extends Data.TaggedClass("page")<{
|
|
@@ -104,18 +123,30 @@ export class Page<TFieldValues extends FieldValues> extends Data.TaggedClass("pa
|
|
|
104
123
|
skip?: number | undefined
|
|
105
124
|
}> implements QueryEnd<TFieldValues> {
|
|
106
125
|
readonly [QId]!: any
|
|
126
|
+
pipe() {
|
|
127
|
+
// eslint-disable-next-line prefer-rest-params
|
|
128
|
+
return pipeArguments(this, arguments)
|
|
129
|
+
}
|
|
107
130
|
}
|
|
108
131
|
|
|
109
132
|
export class One<TFieldValues extends FieldValues> extends Data.TaggedClass("one")<{
|
|
110
133
|
current: Query<TFieldValues> | QueryWhere<TFieldValues> | QueryEnd<TFieldValues>
|
|
111
134
|
}> implements QueryEnd<TFieldValues, "one"> {
|
|
112
135
|
readonly [QId]!: any
|
|
136
|
+
pipe() {
|
|
137
|
+
// eslint-disable-next-line prefer-rest-params
|
|
138
|
+
return pipeArguments(this, arguments)
|
|
139
|
+
}
|
|
113
140
|
}
|
|
114
141
|
|
|
115
142
|
export class Count<TFieldValues extends FieldValues> extends Data.TaggedClass("count")<{
|
|
116
143
|
current: Query<TFieldValues> | QueryWhere<TFieldValues> | QueryEnd<TFieldValues>
|
|
117
144
|
}> implements QueryEnd<TFieldValues, "count"> {
|
|
118
145
|
readonly [QId]!: any
|
|
146
|
+
pipe() {
|
|
147
|
+
// eslint-disable-next-line prefer-rest-params
|
|
148
|
+
return pipeArguments(this, arguments)
|
|
149
|
+
}
|
|
119
150
|
}
|
|
120
151
|
|
|
121
152
|
export class Order<TFieldValues extends FieldValues, TFieldName extends FieldPath<TFieldValues>>
|
|
@@ -127,6 +158,10 @@ export class Order<TFieldValues extends FieldValues, TFieldName extends FieldPat
|
|
|
127
158
|
implements QueryEnd<TFieldValues>
|
|
128
159
|
{
|
|
129
160
|
readonly [QId]!: any
|
|
161
|
+
pipe() {
|
|
162
|
+
// eslint-disable-next-line prefer-rest-params
|
|
163
|
+
return pipeArguments(this, arguments)
|
|
164
|
+
}
|
|
130
165
|
}
|
|
131
166
|
|
|
132
167
|
export class Project<A, TFieldValues extends FieldValues, R, TType extends "one" | "many" = "many">
|
|
@@ -138,6 +173,10 @@ export class Project<A, TFieldValues extends FieldValues, R, TType extends "one"
|
|
|
138
173
|
implements QueryProjection<TFieldValues, A, R>
|
|
139
174
|
{
|
|
140
175
|
readonly [QId]!: any
|
|
176
|
+
pipe() {
|
|
177
|
+
// eslint-disable-next-line prefer-rest-params
|
|
178
|
+
return pipeArguments(this, arguments)
|
|
179
|
+
}
|
|
141
180
|
}
|
|
142
181
|
|
|
143
182
|
export const make: <TFieldValues extends FieldValues>() => Query<TFieldValues> = () => new Initial()
|
|
@@ -145,10 +184,10 @@ export const make: <TFieldValues extends FieldValues>() => Query<TFieldValues> =
|
|
|
145
184
|
export const where: FilterWhere = (...operation: any[]) => (current: any) => new Where({ current, operation } as any)
|
|
146
185
|
|
|
147
186
|
export const and: FilterContinuation = (...operation: any[]) => (current: any) =>
|
|
148
|
-
new And({ current, operation: typeof operation[0] === "function" ? operation[
|
|
187
|
+
new And({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any)
|
|
149
188
|
|
|
150
189
|
export const or: FilterContinuation = (...operation: any[]) => (current: any) =>
|
|
151
|
-
new Or({ current, operation: typeof operation[0] === "function" ? operation[
|
|
190
|
+
new Or({ current, operation: typeof operation[0] === "function" ? flow(...operation as [any]) : operation } as any)
|
|
152
191
|
|
|
153
192
|
export const order: <TFieldValues extends FieldValues, TFieldName extends FieldPath<TFieldValues>>(
|
|
154
193
|
field: TFieldName,
|
|
@@ -308,24 +347,25 @@ export type FilterContinuations = {
|
|
|
308
347
|
): (
|
|
309
348
|
current: QueryWhere<TFieldValues>
|
|
310
349
|
) => QueryWhere<TFieldValues>
|
|
350
|
+
// breaks flow pipe type inference
|
|
351
|
+
// <
|
|
352
|
+
// TFieldValues extends FieldValues,
|
|
353
|
+
// TFieldName extends FieldPath<TFieldValues>,
|
|
354
|
+
// V extends FieldPathValue<TFieldValues, TFieldName>
|
|
355
|
+
// >(
|
|
356
|
+
// path: TFieldName,
|
|
357
|
+
// op: "neq",
|
|
358
|
+
// value: V
|
|
359
|
+
// ): (
|
|
360
|
+
// current: QueryWhere<TFieldValues>
|
|
361
|
+
// ) => QueryWhere<TFieldValues>
|
|
311
362
|
<
|
|
312
363
|
TFieldValues extends FieldValues,
|
|
313
364
|
TFieldName extends FieldPath<TFieldValues>,
|
|
314
365
|
V extends FieldPathValue<TFieldValues, TFieldName>
|
|
315
366
|
>(
|
|
316
367
|
path: TFieldName,
|
|
317
|
-
op: "neq",
|
|
318
|
-
value: V
|
|
319
|
-
): (
|
|
320
|
-
current: QueryWhere<TFieldValues>
|
|
321
|
-
) => QueryWhere<TFieldValues>
|
|
322
|
-
<
|
|
323
|
-
TFieldValues extends FieldValues,
|
|
324
|
-
TFieldName extends FieldPath<TFieldValues>,
|
|
325
|
-
V extends FieldPathValue<TFieldValues, TFieldName>
|
|
326
|
-
>(
|
|
327
|
-
path: TFieldName,
|
|
328
|
-
op: "gt" | "gte" | "lt" | "lte",
|
|
368
|
+
op: "gt" | "gte" | "lt" | "lte" | "neq",
|
|
329
369
|
value: V // only numbers?
|
|
330
370
|
): (
|
|
331
371
|
current: QueryWhere<TFieldValues>
|
|
@@ -354,23 +394,135 @@ export type FilterContinuations = {
|
|
|
354
394
|
) => QueryWhere<TFieldValues>
|
|
355
395
|
}
|
|
356
396
|
|
|
357
|
-
export type
|
|
397
|
+
export type FilterContinuationClosure = {
|
|
398
|
+
<TFieldValues extends FieldValues>(
|
|
399
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>
|
|
400
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
401
|
+
|
|
402
|
+
<TFieldValues extends FieldValues>(
|
|
403
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
404
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
405
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
406
|
+
|
|
407
|
+
<TFieldValues extends FieldValues>(
|
|
408
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
409
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
410
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
411
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
412
|
+
|
|
413
|
+
<TFieldValues extends FieldValues>(
|
|
414
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
415
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
416
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
417
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
418
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
419
|
+
|
|
420
|
+
<TFieldValues extends FieldValues>(
|
|
421
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
422
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
423
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
424
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
425
|
+
ff: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
426
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
427
|
+
<TFieldValues extends FieldValues>(
|
|
428
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
429
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
430
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
431
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
432
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
433
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
434
|
+
<TFieldValues extends FieldValues>(
|
|
435
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
436
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
437
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
438
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
439
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
440
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
441
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
442
|
+
<TFieldValues extends FieldValues>(
|
|
443
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
444
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
445
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
446
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
447
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
448
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
449
|
+
fi: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
450
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
358
451
|
<TFieldValues extends FieldValues>(
|
|
359
|
-
fb: (
|
|
360
|
-
|
|
452
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
453
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
454
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
455
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
456
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
457
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
458
|
+
fi: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
459
|
+
fj: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
460
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
461
|
+
<TFieldValues extends FieldValues>(
|
|
462
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
463
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
464
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
465
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
466
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
467
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
468
|
+
fi: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
469
|
+
fj: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
470
|
+
fk: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
471
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
472
|
+
<TFieldValues extends FieldValues>(
|
|
473
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
474
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
475
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
476
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
477
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
478
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
479
|
+
fi: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
480
|
+
fj: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
481
|
+
fk: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
482
|
+
fl: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
483
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
484
|
+
<TFieldValues extends FieldValues>(
|
|
485
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
486
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
487
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
488
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
489
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
490
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
491
|
+
fi: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
492
|
+
fj: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
493
|
+
fk: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
494
|
+
fl: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
495
|
+
fm: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
496
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
497
|
+
<TFieldValues extends FieldValues>(
|
|
498
|
+
fb: (current: Query<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
499
|
+
fc: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
500
|
+
fd: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
501
|
+
fe: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
502
|
+
fg: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
503
|
+
fh: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
504
|
+
fi: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
505
|
+
fj: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
506
|
+
fk: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
507
|
+
fl: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
508
|
+
fm: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>,
|
|
509
|
+
fn: (query: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
510
|
+
): (current: QueryWhere<TFieldValues>) => QueryWhere<TFieldValues>
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
export type FilterContinuation =
|
|
514
|
+
& FilterContinuationClosure
|
|
515
|
+
& {
|
|
516
|
+
<
|
|
517
|
+
TFieldValues extends FieldValues,
|
|
518
|
+
TFieldName extends FieldPath<TFieldValues>,
|
|
519
|
+
V extends FieldPathValue<TFieldValues, TFieldName>
|
|
520
|
+
>(f: {
|
|
521
|
+
path: TFieldName
|
|
522
|
+
op: Ops
|
|
523
|
+
value: V
|
|
524
|
+
}): (
|
|
525
|
+
current: QueryWhere<TFieldValues>
|
|
361
526
|
) => QueryWhere<TFieldValues>
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
) => QueryWhere<TFieldValues>
|
|
365
|
-
<
|
|
366
|
-
TFieldValues extends FieldValues,
|
|
367
|
-
TFieldName extends FieldPath<TFieldValues>,
|
|
368
|
-
V extends FieldPathValue<TFieldValues, TFieldName>
|
|
369
|
-
>(f: {
|
|
370
|
-
path: TFieldName
|
|
371
|
-
op: Ops
|
|
372
|
-
value: V
|
|
373
|
-
}): (
|
|
374
|
-
current: QueryWhere<TFieldValues>
|
|
375
|
-
) => QueryWhere<TFieldValues>
|
|
376
|
-
} & FilterContinuations
|
|
527
|
+
}
|
|
528
|
+
& FilterContinuations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAgB,CAAC,EAAE,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcjE,qBAAa,
|
|
1
|
+
{"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAgB,CAAC,EAAE,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcjE,qBAAa,SAAU,SAAQ,cAK7B;CAAG;AACL,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,UAAiB,OAAQ,SAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,SAAS,CAAC;KAAG;CACvE;;;;;;;;;;;;;;;;;;;;;;;;;AAGD,qBAAa,WAAY,SAAQ,gBAA6D;CAAG"}
|
package/test/query.test.ts
CHANGED
|
@@ -12,48 +12,71 @@ const str = S.struct({ _tag: S.literal("string"), value: S.string })
|
|
|
12
12
|
const num = S.struct({ _tag: S.literal("number"), value: S.number })
|
|
13
13
|
const someUnion = S.union(str, num)
|
|
14
14
|
|
|
15
|
-
export class
|
|
15
|
+
export class Something extends S.Class<Something>()({
|
|
16
16
|
id: S.StringId.withDefault,
|
|
17
17
|
displayName: S.NonEmptyString255,
|
|
18
18
|
n: S.Date.withDefault,
|
|
19
19
|
union: someUnion.pipe(S.withDefaultConstructor(() => ({ _tag: "string" as const, value: "hi" })))
|
|
20
20
|
}) {}
|
|
21
|
-
export declare namespace
|
|
22
|
-
export
|
|
21
|
+
export declare namespace Something {
|
|
22
|
+
export interface Encoded extends S.Schema.Encoded<typeof Something> {}
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
const MakeSomeService = Effect.succeed({ a: 1 })
|
|
26
26
|
export class SomeService extends TagClassMakeId("SomeService", MakeSomeService)<SomeService>() {}
|
|
27
27
|
|
|
28
|
-
const q =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
28
|
+
const q = make<Something.Encoded>()
|
|
29
|
+
.pipe( // provided automatically inside Repo.q2()
|
|
30
|
+
where("displayName", "Verona"),
|
|
31
|
+
or(
|
|
32
|
+
where("displayName", "Riley"),
|
|
33
|
+
and("n", "gt", "2021-01-01T00:00:00Z") // TODO: work with To type translation, so Date?
|
|
34
|
+
),
|
|
35
|
+
order("displayName"),
|
|
36
|
+
page({ take: 10 }),
|
|
37
|
+
project(
|
|
38
|
+
S.transformToOrFail(
|
|
39
|
+
S.struct({ id: S.StringId, displayName: S.string }), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
|
|
40
|
+
S.struct(pick(Something.fields, "id", "displayName")),
|
|
41
|
+
(_) => Effect.andThen(SomeService, _)
|
|
42
|
+
)
|
|
43
43
|
)
|
|
44
44
|
)
|
|
45
|
-
)
|
|
46
45
|
|
|
47
46
|
const items = [
|
|
48
|
-
new
|
|
49
|
-
new
|
|
50
|
-
new
|
|
47
|
+
new Something({ displayName: S.NonEmptyString255("Verona"), n: new Date("2020-01-01T00:00:00Z") }),
|
|
48
|
+
new Something({ displayName: S.NonEmptyString255("Riley") }),
|
|
49
|
+
new Something({
|
|
51
50
|
displayName: S.NonEmptyString255("Riley"),
|
|
52
51
|
n: new Date("2020-01-01T00:00:00Z"),
|
|
53
52
|
union: { _tag: "number", value: 1 }
|
|
54
53
|
})
|
|
55
54
|
]
|
|
56
55
|
|
|
56
|
+
// TODO: .merge queries?
|
|
57
|
+
// where(x, y).or(a, b) + where(z, v) = (where(x, y) or(a,b)) and where(z, v)) ?
|
|
58
|
+
|
|
59
|
+
it("merge", () => {
|
|
60
|
+
const a = make().pipe(where("a", "b"), or("c", "d"))
|
|
61
|
+
const b = make().pipe(where("d", "e"), or("f", "g"))
|
|
62
|
+
|
|
63
|
+
const merge = (b: any) => (a: any) => pipe(a, and(() => b))
|
|
64
|
+
|
|
65
|
+
const r = pipe(a, merge(b), toFilter, (_) => _.filter.build())
|
|
66
|
+
|
|
67
|
+
// TODO: instead this should probably scope the first where/or together e.g (where x, or y) and (...)
|
|
68
|
+
const expected = make().pipe(
|
|
69
|
+
where("a", "b"),
|
|
70
|
+
or("c", "d"),
|
|
71
|
+
and(where("d", "e"), or("f", "g")),
|
|
72
|
+
toFilter,
|
|
73
|
+
(_) => _.filter.build()
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
console.log(JSON.stringify({ r, expected }, undefined, 2))
|
|
77
|
+
expect(r).toEqual(expected)
|
|
78
|
+
})
|
|
79
|
+
|
|
57
80
|
it("works", () => {
|
|
58
81
|
console.log("raw", inspect(q, undefined, 25))
|
|
59
82
|
const interpreted = toFilter(q)
|
|
@@ -62,16 +85,16 @@ it("works", () => {
|
|
|
62
85
|
console
|
|
63
86
|
.log("filtersBuilt", inspect(filtersBuilt, undefined, 25))
|
|
64
87
|
|
|
65
|
-
const processed = memFilter(interpreted)(items.map((_) => S.encodeSync(
|
|
88
|
+
const processed = memFilter(interpreted)(items.map((_) => S.encodeSync(Something)(_)))
|
|
66
89
|
|
|
67
90
|
expect(processed).toEqual(items.slice(0, 2).toReversed().map((_) => pick(_, "id", "displayName")))
|
|
68
91
|
})
|
|
69
92
|
|
|
70
|
-
class
|
|
93
|
+
class SomethingRepo extends RepositoryDefaultImpl<SomethingRepo>()(
|
|
71
94
|
"test",
|
|
72
|
-
|
|
95
|
+
Something
|
|
73
96
|
) {
|
|
74
|
-
static readonly Test = Layer.effect(
|
|
97
|
+
static readonly Test = Layer.effect(SomethingRepo, SomethingRepo.makeWith({}, (_) => new SomethingRepo(_))).pipe(
|
|
75
98
|
Layer.provide(Layer.merge(MemoryStoreLive, ContextMapContainer.live))
|
|
76
99
|
)
|
|
77
100
|
}
|
|
@@ -79,24 +102,24 @@ class TestRepo extends RepositoryDefaultImpl<TestRepo>()(
|
|
|
79
102
|
it("works with repo", () =>
|
|
80
103
|
Effect
|
|
81
104
|
.gen(function*($) {
|
|
82
|
-
yield* $(
|
|
105
|
+
yield* $(SomethingRepo.saveAndPublish(items))
|
|
83
106
|
|
|
84
|
-
const q1 = yield* $(
|
|
107
|
+
const q1 = yield* $(SomethingRepo.query(() => q))
|
|
85
108
|
// same as above, but with the `flow` helper
|
|
86
109
|
const q2 = yield* $(
|
|
87
|
-
|
|
110
|
+
SomethingRepo
|
|
88
111
|
.query(flow(
|
|
89
112
|
where("displayName", "Verona"),
|
|
90
|
-
or(
|
|
113
|
+
or(
|
|
91
114
|
where("displayName", "Riley"),
|
|
92
115
|
and("n", "gt", "2021-01-01T00:00:00Z") // TODO: work with To type translation, so Date?
|
|
93
|
-
)
|
|
116
|
+
),
|
|
94
117
|
order("displayName"),
|
|
95
118
|
page({ take: 10 }),
|
|
96
119
|
project(
|
|
97
120
|
S.transformOrFail(
|
|
98
121
|
S.struct({ displayName: S.string }), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
|
|
99
|
-
S.struct(pick(
|
|
122
|
+
S.struct(pick(Something.fields, "displayName")),
|
|
100
123
|
(_) => Effect.andThen(SomeService, _),
|
|
101
124
|
() => Effect.die(new Error("not implemented"))
|
|
102
125
|
)
|
|
@@ -106,23 +129,23 @@ it("works with repo", () =>
|
|
|
106
129
|
expect(q1).toEqual(items.slice(0, 2).toReversed().map((_) => pick(_, "id", "displayName")))
|
|
107
130
|
expect(q2).toEqual(items.slice(0, 2).toReversed().map((_) => pick(_, "displayName")))
|
|
108
131
|
})
|
|
109
|
-
.pipe(Effect.provide(Layer.mergeAll(
|
|
132
|
+
.pipe(Effect.provide(Layer.mergeAll(SomethingRepo.Test, SomeService.toLayer())), Effect.runPromise))
|
|
110
133
|
|
|
111
134
|
it("collect", () =>
|
|
112
135
|
Effect
|
|
113
136
|
.gen(function*($) {
|
|
114
|
-
yield* $(
|
|
137
|
+
yield* $(SomethingRepo.saveAndPublish(items))
|
|
115
138
|
|
|
116
139
|
expect(
|
|
117
140
|
yield* $(
|
|
118
|
-
|
|
141
|
+
SomethingRepo
|
|
119
142
|
.query(flow(
|
|
120
143
|
where("displayName", "Riley"), // TODO: work with To type translation, so Date?
|
|
121
144
|
// one,
|
|
122
145
|
project(
|
|
123
146
|
S.transformTo(
|
|
124
147
|
// TODO: sample case with narrowing down a union?
|
|
125
|
-
S.encodedSchema(S.struct(pick(
|
|
148
|
+
S.encodedSchema(S.struct(pick(Something.fields, "displayName", "n"))), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
|
|
126
149
|
S.typeSchema(S.option(S.string)),
|
|
127
150
|
(_) =>
|
|
128
151
|
_.displayName === "Riley" && _.n === "2020-01-01T00:00:00.000Z"
|
|
@@ -138,14 +161,14 @@ it("collect", () =>
|
|
|
138
161
|
|
|
139
162
|
expect(
|
|
140
163
|
yield* $(
|
|
141
|
-
|
|
164
|
+
SomethingRepo
|
|
142
165
|
.query(flow(
|
|
143
166
|
where("union._tag", "string"),
|
|
144
167
|
one,
|
|
145
168
|
project(
|
|
146
169
|
S.transformTo(
|
|
147
170
|
// TODO: sample case with narrowing down a union?
|
|
148
|
-
S.encodedSchema(S.struct(pick(
|
|
171
|
+
S.encodedSchema(S.struct(pick(Something.fields, "union"))), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
|
|
149
172
|
S.typeSchema(S.option(S.string)),
|
|
150
173
|
(_) =>
|
|
151
174
|
_.union._tag === "string"
|
|
@@ -159,4 +182,4 @@ it("collect", () =>
|
|
|
159
182
|
)
|
|
160
183
|
.toEqual("hi")
|
|
161
184
|
})
|
|
162
|
-
.pipe(Effect.provide(Layer.mergeAll(
|
|
185
|
+
.pipe(Effect.provide(Layer.mergeAll(SomethingRepo.Test, SomeService.toLayer())), Effect.runPromise))
|