@effect-app/infra 0.223.1 → 0.224.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.
@@ -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[0] : operation } as any)
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[0] : operation } as any)
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 FilterContinuation = {
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
- current: Query<TFieldValues>
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
- current: QueryWhere<TFieldValues>
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,CAAE,SAAQ,MAKrB;CAAG;AACL,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;IACzB,KAAY,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;CAC9C;;;;;;;;;;;;;;;;;;;;;;;;;AAGD,qBAAa,WAAY,SAAQ,gBAA6D;CAAG"}
1
+ {"version":3,"file":"query.test.d.ts","sourceRoot":"","sources":["../query.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAgB,CAAC,EAAU,MAAM,YAAY,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAazE,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"}
@@ -1,6 +1,5 @@
1
- import { Effect, flow, Layer, Option, pipe, S } from "effect-app"
1
+ import { Effect, flow, Layer, Option, pipe, S, Struct } from "effect-app"
2
2
  import { TagClassMakeId } from "effect-app/service"
3
- import { pick } from "effect-app/utils"
4
3
  import { inspect } from "util"
5
4
  import { expect, it } from "vitest"
6
5
  import { and, make, one, or, order, page, project, toFilter, where } from "../src/services/query.js"
@@ -12,48 +11,71 @@ const str = S.struct({ _tag: S.literal("string"), value: S.string })
12
11
  const num = S.struct({ _tag: S.literal("number"), value: S.number })
13
12
  const someUnion = S.union(str, num)
14
13
 
15
- export class s extends S.Class<s>()({
14
+ export class Something extends S.Class<Something>()({
16
15
  id: S.StringId.withDefault,
17
16
  displayName: S.NonEmptyString255,
18
17
  n: S.Date.withDefault,
19
18
  union: someUnion.pipe(S.withDefaultConstructor(() => ({ _tag: "string" as const, value: "hi" })))
20
19
  }) {}
21
- export declare namespace s {
22
- export type From = S.Schema.Encoded<typeof s>
20
+ export declare namespace Something {
21
+ export interface Encoded extends S.Schema.Encoded<typeof Something> {}
23
22
  }
24
23
 
25
24
  const MakeSomeService = Effect.succeed({ a: 1 })
26
25
  export class SomeService extends TagClassMakeId("SomeService", MakeSomeService)<SomeService>() {}
27
26
 
28
- const q = pipe(
29
- make<s.From>(), // provided automatically inside Repo.q2()
30
- where("displayName", "Verona"),
31
- or(flow(
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.transformOrFail(
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(s.fields, "id", "displayName")),
41
- (_) => Effect.andThen(SomeService, _),
42
- () => Effect.die(new Error("not implemented"))
27
+ const q = make<Something.Encoded>()
28
+ .pipe( // provided automatically inside Repo.q2()
29
+ where("displayName", "Verona"),
30
+ or(
31
+ where("displayName", "Riley"),
32
+ and("n", "gt", "2021-01-01T00:00:00Z") // TODO: work with To type translation, so Date?
33
+ ),
34
+ order("displayName"),
35
+ page({ take: 10 }),
36
+ project(
37
+ S.transformToOrFail(
38
+ 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
39
+ S.struct(Struct.pick(Something.fields, "id", "displayName")),
40
+ (_) => Effect.andThen(SomeService, _)
41
+ )
43
42
  )
44
43
  )
45
- )
46
44
 
47
45
  const items = [
48
- new s({ displayName: S.NonEmptyString255("Verona"), n: new Date("2020-01-01T00:00:00Z") }),
49
- new s({ displayName: S.NonEmptyString255("Riley") }),
50
- new s({
46
+ new Something({ displayName: S.NonEmptyString255("Verona"), n: new Date("2020-01-01T00:00:00Z") }),
47
+ new Something({ displayName: S.NonEmptyString255("Riley") }),
48
+ new Something({
51
49
  displayName: S.NonEmptyString255("Riley"),
52
50
  n: new Date("2020-01-01T00:00:00Z"),
53
51
  union: { _tag: "number", value: 1 }
54
52
  })
55
53
  ]
56
54
 
55
+ // TODO: .merge queries?
56
+ // where(x, y).or(a, b) + where(z, v) = (where(x, y) or(a,b)) and where(z, v)) ?
57
+
58
+ it("merge", () => {
59
+ const a = make().pipe(where("a", "b"), or("c", "d"))
60
+ const b = make().pipe(where("d", "e"), or("f", "g"))
61
+
62
+ const merge = (b: any) => (a: any) => pipe(a, and(() => b))
63
+
64
+ const r = pipe(a, merge(b), toFilter, (_) => _.filter.build())
65
+
66
+ // TODO: instead this should probably scope the first where/or together e.g (where x, or y) and (...)
67
+ const expected = make().pipe(
68
+ where("a", "b"),
69
+ or("c", "d"),
70
+ and(where("d", "e"), or("f", "g")),
71
+ toFilter,
72
+ (_) => _.filter.build()
73
+ )
74
+
75
+ console.log(JSON.stringify({ r, expected }, undefined, 2))
76
+ expect(r).toEqual(expected)
77
+ })
78
+
57
79
  it("works", () => {
58
80
  console.log("raw", inspect(q, undefined, 25))
59
81
  const interpreted = toFilter(q)
@@ -62,16 +84,16 @@ it("works", () => {
62
84
  console
63
85
  .log("filtersBuilt", inspect(filtersBuilt, undefined, 25))
64
86
 
65
- const processed = memFilter(interpreted)(items.map((_) => S.encodeSync(s)(_)))
87
+ const processed = memFilter(interpreted)(items.map((_) => S.encodeSync(Something)(_)))
66
88
 
67
- expect(processed).toEqual(items.slice(0, 2).toReversed().map((_) => pick(_, "id", "displayName")))
89
+ expect(processed).toEqual(items.slice(0, 2).toReversed().map(Struct.pick("id", "displayName")))
68
90
  })
69
91
 
70
- class TestRepo extends RepositoryDefaultImpl<TestRepo>()(
92
+ class SomethingRepo extends RepositoryDefaultImpl<SomethingRepo>()(
71
93
  "test",
72
- s
94
+ Something
73
95
  ) {
74
- static readonly Test = Layer.effect(TestRepo, TestRepo.makeWith({}, (_) => new TestRepo(_))).pipe(
96
+ static readonly Test = Layer.effect(SomethingRepo, SomethingRepo.makeWith({}, (_) => new SomethingRepo(_))).pipe(
75
97
  Layer.provide(Layer.merge(MemoryStoreLive, ContextMapContainer.live))
76
98
  )
77
99
  }
@@ -79,50 +101,49 @@ class TestRepo extends RepositoryDefaultImpl<TestRepo>()(
79
101
  it("works with repo", () =>
80
102
  Effect
81
103
  .gen(function*($) {
82
- yield* $(TestRepo.saveAndPublish(items))
104
+ yield* $(SomethingRepo.saveAndPublish(items))
83
105
 
84
- const q1 = yield* $(TestRepo.query(() => q))
106
+ const q1 = yield* $(SomethingRepo.query(() => q))
85
107
  // same as above, but with the `flow` helper
86
108
  const q2 = yield* $(
87
- TestRepo
109
+ SomethingRepo
88
110
  .query(flow(
89
111
  where("displayName", "Verona"),
90
- or(flow(
112
+ or(
91
113
  where("displayName", "Riley"),
92
114
  and("n", "gt", "2021-01-01T00:00:00Z") // TODO: work with To type translation, so Date?
93
- )),
115
+ ),
94
116
  order("displayName"),
95
117
  page({ take: 10 }),
96
118
  project(
97
- S.transformOrFail(
119
+ S.transformToOrFail(
98
120
  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(s.fields, "displayName")),
100
- (_) => Effect.andThen(SomeService, _),
101
- () => Effect.die(new Error("not implemented"))
121
+ S.struct(Struct.pick(Something.fields, "displayName")),
122
+ (_) => Effect.andThen(SomeService, _)
102
123
  )
103
124
  )
104
125
  ))
105
126
  )
106
- expect(q1).toEqual(items.slice(0, 2).toReversed().map((_) => pick(_, "id", "displayName")))
107
- expect(q2).toEqual(items.slice(0, 2).toReversed().map((_) => pick(_, "displayName")))
127
+ expect(q1).toEqual(items.slice(0, 2).toReversed().map(Struct.pick("id", "displayName")))
128
+ expect(q2).toEqual(items.slice(0, 2).toReversed().map(Struct.pick("displayName")))
108
129
  })
109
- .pipe(Effect.provide(Layer.mergeAll(TestRepo.Test, SomeService.toLayer())), Effect.runPromise))
130
+ .pipe(Effect.provide(Layer.mergeAll(SomethingRepo.Test, SomeService.toLayer())), Effect.runPromise))
110
131
 
111
132
  it("collect", () =>
112
133
  Effect
113
134
  .gen(function*($) {
114
- yield* $(TestRepo.saveAndPublish(items))
135
+ yield* $(SomethingRepo.saveAndPublish(items))
115
136
 
116
137
  expect(
117
138
  yield* $(
118
- TestRepo
139
+ SomethingRepo
119
140
  .query(flow(
120
141
  where("displayName", "Riley"), // TODO: work with To type translation, so Date?
121
142
  // one,
122
143
  project(
123
144
  S.transformTo(
124
145
  // TODO: sample case with narrowing down a union?
125
- S.encodedSchema(S.struct(pick(s.fields, "displayName", "n"))), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
146
+ S.encodedSchema(S.struct(Struct.pick(Something.fields, "displayName", "n"))), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
126
147
  S.typeSchema(S.option(S.string)),
127
148
  (_) =>
128
149
  _.displayName === "Riley" && _.n === "2020-01-01T00:00:00.000Z"
@@ -138,14 +159,14 @@ it("collect", () =>
138
159
 
139
160
  expect(
140
161
  yield* $(
141
- TestRepo
162
+ SomethingRepo
142
163
  .query(flow(
143
164
  where("union._tag", "string"),
144
165
  one,
145
166
  project(
146
167
  S.transformTo(
147
168
  // TODO: sample case with narrowing down a union?
148
- S.encodedSchema(S.struct(pick(s.fields, "union"))), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
169
+ S.encodedSchema(S.struct(Struct.pick(Something.fields, "union"))), // for projection performance benefit, this should be limited to the fields interested, and leads to SELECT fields
149
170
  S.typeSchema(S.option(S.string)),
150
171
  (_) =>
151
172
  _.union._tag === "string"
@@ -159,4 +180,4 @@ it("collect", () =>
159
180
  )
160
181
  .toEqual("hi")
161
182
  })
162
- .pipe(Effect.provide(Layer.mergeAll(TestRepo.Test, SomeService.toLayer())), Effect.runPromise))
183
+ .pipe(Effect.provide(Layer.mergeAll(SomethingRepo.Test, SomeService.toLayer())), Effect.runPromise))