@typed/fx 2.0.0-beta.0 → 2.0.0-beta.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.
Files changed (139) hide show
  1. package/README.md +24 -1
  2. package/dist/Fx/combinators/additive.d.ts +94 -0
  3. package/dist/Fx/combinators/additive.d.ts.map +1 -0
  4. package/dist/Fx/combinators/additive.js +92 -0
  5. package/dist/Fx/combinators/catch.d.ts +61 -0
  6. package/dist/Fx/combinators/catch.d.ts.map +1 -1
  7. package/dist/Fx/combinators/catch.js +54 -0
  8. package/dist/Fx/combinators/changesWithEffect.d.ts +20 -0
  9. package/dist/Fx/combinators/changesWithEffect.d.ts.map +1 -0
  10. package/dist/Fx/combinators/changesWithEffect.js +28 -0
  11. package/dist/Fx/combinators/dropUntil.d.ts +29 -0
  12. package/dist/Fx/combinators/dropUntil.d.ts.map +1 -0
  13. package/dist/Fx/combinators/dropUntil.js +23 -0
  14. package/dist/Fx/combinators/flatMapConcurrently.d.ts.map +1 -1
  15. package/dist/Fx/combinators/flatMapConcurrently.js +3 -2
  16. package/dist/Fx/combinators/index.d.ts +10 -0
  17. package/dist/Fx/combinators/index.d.ts.map +1 -1
  18. package/dist/Fx/combinators/index.js +10 -0
  19. package/dist/Fx/combinators/keyed.d.ts +1 -1
  20. package/dist/Fx/combinators/keyed.d.ts.map +1 -1
  21. package/dist/Fx/combinators/mapBoth.d.ts +21 -0
  22. package/dist/Fx/combinators/mapBoth.d.ts.map +1 -0
  23. package/dist/Fx/combinators/mapBoth.js +14 -0
  24. package/dist/Fx/combinators/mapError.d.ts +17 -0
  25. package/dist/Fx/combinators/mapError.d.ts.map +1 -0
  26. package/dist/Fx/combinators/mapError.js +16 -0
  27. package/dist/Fx/combinators/provide.d.ts +34 -1
  28. package/dist/Fx/combinators/provide.d.ts.map +1 -1
  29. package/dist/Fx/combinators/provide.js +27 -0
  30. package/dist/Fx/combinators/result.d.ts +23 -0
  31. package/dist/Fx/combinators/result.d.ts.map +1 -0
  32. package/dist/Fx/combinators/result.js +32 -0
  33. package/dist/Fx/combinators/scan.d.ts +33 -0
  34. package/dist/Fx/combinators/scan.d.ts.map +1 -0
  35. package/dist/Fx/combinators/scan.js +38 -0
  36. package/dist/Fx/combinators/skip.d.ts +13 -0
  37. package/dist/Fx/combinators/skip.d.ts.map +1 -1
  38. package/dist/Fx/combinators/skip.js +11 -0
  39. package/dist/Fx/combinators/skipWhile.d.ts +49 -0
  40. package/dist/Fx/combinators/skipWhile.d.ts.map +1 -0
  41. package/dist/Fx/combinators/skipWhile.js +66 -0
  42. package/dist/Fx/combinators/slice.d.ts +13 -0
  43. package/dist/Fx/combinators/slice.d.ts.map +1 -1
  44. package/dist/Fx/combinators/slice.js +11 -0
  45. package/dist/Fx/combinators/take.d.ts +13 -0
  46. package/dist/Fx/combinators/take.d.ts.map +1 -1
  47. package/dist/Fx/combinators/take.js +11 -0
  48. package/dist/Fx/combinators/takeUntil.d.ts +14 -0
  49. package/dist/Fx/combinators/takeUntil.d.ts.map +1 -1
  50. package/dist/Fx/combinators/takeUntil.js +14 -0
  51. package/dist/Fx/combinators/takeWhile.d.ts +29 -0
  52. package/dist/Fx/combinators/takeWhile.d.ts.map +1 -0
  53. package/dist/Fx/combinators/takeWhile.js +23 -0
  54. package/dist/Fx/combinators/zip.d.ts +75 -0
  55. package/dist/Fx/combinators/zip.d.ts.map +1 -0
  56. package/dist/Fx/combinators/zip.js +100 -0
  57. package/dist/Fx/constructors/at.d.ts +2 -2
  58. package/dist/Fx/constructors/at.d.ts.map +1 -1
  59. package/dist/Fx/constructors/periodic.d.ts +1 -1
  60. package/dist/Fx/constructors/periodic.d.ts.map +1 -1
  61. package/dist/Push/Push.d.ts +64 -1
  62. package/dist/Push/Push.d.ts.map +1 -1
  63. package/dist/Push/Push.js +57 -0
  64. package/dist/RefSubject/RefArray.d.ts.map +1 -1
  65. package/dist/RefSubject/RefArray.js +2 -1
  66. package/dist/RefSubject/RefChunk.d.ts.map +1 -1
  67. package/dist/RefSubject/RefChunk.js +2 -1
  68. package/dist/RefSubject/RefDateTime.d.ts +4 -4
  69. package/dist/RefSubject/RefDateTime.d.ts.map +1 -1
  70. package/dist/RefSubject/RefHashMap.d.ts.map +1 -1
  71. package/dist/RefSubject/RefHashMap.js +5 -1
  72. package/dist/RefSubject/RefIterable.d.ts +1 -1
  73. package/dist/RefSubject/RefIterable.d.ts.map +1 -1
  74. package/dist/RefSubject/RefIterable.js +6 -1
  75. package/dist/RefSubject/RefRecord.d.ts.map +1 -1
  76. package/dist/RefSubject/RefRecord.js +3 -2
  77. package/dist/RefSubject/RefSubject.d.ts +48 -1
  78. package/dist/RefSubject/RefSubject.d.ts.map +1 -1
  79. package/dist/RefSubject/RefSubject.js +80 -1
  80. package/dist/RefSubject/RefTrie.d.ts +7 -7
  81. package/dist/RefSubject/RefTrie.d.ts.map +1 -1
  82. package/dist/RefSubject/RefTrie.js +8 -3
  83. package/dist/Sink/combinators.d.ts +57 -0
  84. package/dist/Sink/combinators.d.ts.map +1 -1
  85. package/dist/Sink/combinators.js +104 -1
  86. package/dist/Versioned/Versioned.d.ts +30 -0
  87. package/dist/Versioned/Versioned.d.ts.map +1 -1
  88. package/dist/Versioned/Versioned.js +18 -0
  89. package/package.json +10 -6
  90. package/src/Fx/combinators/additive.ts +142 -0
  91. package/src/Fx/combinators/catch.ts +256 -0
  92. package/src/Fx/combinators/changesWithEffect.ts +66 -0
  93. package/src/Fx/combinators/dropUntil.ts +47 -0
  94. package/src/Fx/combinators/flatMapConcurrently.ts +5 -2
  95. package/src/Fx/combinators/index.ts +10 -0
  96. package/src/Fx/combinators/keyed.ts +2 -2
  97. package/src/Fx/combinators/mapBoth.ts +40 -0
  98. package/src/Fx/combinators/mapError.ts +28 -0
  99. package/src/Fx/combinators/provide.ts +63 -1
  100. package/src/Fx/combinators/result.ts +39 -0
  101. package/src/Fx/combinators/scan.ts +82 -0
  102. package/src/Fx/combinators/skip.ts +21 -0
  103. package/src/Fx/combinators/skipWhile.ts +100 -0
  104. package/src/Fx/combinators/slice.ts +23 -0
  105. package/src/Fx/combinators/take.ts +21 -0
  106. package/src/Fx/combinators/takeUntil.ts +38 -0
  107. package/src/Fx/combinators/takeWhile.ts +47 -0
  108. package/src/Fx/combinators/zip.ts +175 -0
  109. package/src/Fx/constructors/at.ts +3 -3
  110. package/src/Fx/constructors/periodic.ts +1 -1
  111. package/src/Fx.additive-combinators.test.ts +126 -0
  112. package/src/Fx.catch-additive.test.ts +206 -0
  113. package/src/Fx.catch.test.ts +1 -2
  114. package/src/Fx.dropUntil.test.ts +61 -0
  115. package/src/Fx.lifecycle.test.ts +1 -2
  116. package/src/Fx.mapError-mapBoth.test.ts +101 -0
  117. package/src/Fx.provide-combinators.test.ts +94 -0
  118. package/src/Fx.result-changesWithEffect.test.ts +112 -0
  119. package/src/Fx.scan.test.ts +73 -0
  120. package/src/Fx.takeWhile-skipWhile.test.ts +84 -0
  121. package/src/Fx.zip-merge-additive.test.ts +171 -0
  122. package/src/Fx.zip.test.ts +133 -0
  123. package/src/Push/Push.ts +170 -1
  124. package/src/Push.additive.test.ts +256 -0
  125. package/src/RefSubject/RefArray.ts +4 -1
  126. package/src/RefSubject/RefChunk.ts +2 -1
  127. package/src/RefSubject/RefDateTime.ts +6 -6
  128. package/src/RefSubject/RefHashMap.ts +10 -1
  129. package/src/RefSubject/RefIterable.ts +11 -2
  130. package/src/RefSubject/RefRecord.ts +9 -2
  131. package/src/RefSubject/RefSubject.ts +108 -9
  132. package/src/RefSubject/RefTrie.ts +19 -10
  133. package/src/RefSubject.additive-parity.test.ts +101 -0
  134. package/src/Sink/combinators.ts +123 -1
  135. package/src/Sink.combinators.test.ts +88 -0
  136. package/src/Sink.reduce-collect-head-last.test.ts +107 -0
  137. package/src/Versioned/Versioned.ts +76 -0
  138. package/src/Versioned.filterMap.test.ts +91 -0
  139. package/tsconfig.json +0 -6
@@ -0,0 +1,107 @@
1
+ import { assert, describe, it } from "vitest";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Option from "effect/Option";
4
+ import * as Ref from "effect/Ref";
5
+ import { Fx, Sink } from "./index.js";
6
+
7
+ describe("Sink.reduce", () => {
8
+ it("reduces values with pure function", () =>
9
+ Effect.gen(function* () {
10
+ const ref = yield* Ref.make(0);
11
+ const sink = Sink.reduce(ref, (acc: number, n: number) => acc + n);
12
+ yield* Fx.fromIterable([1, 2, 3]).run(sink);
13
+ const result = yield* Ref.get(ref);
14
+ assert.strictEqual(result, 6);
15
+ }).pipe(Effect.scoped, Effect.runPromise));
16
+
17
+ it("uses initial value when no elements", () =>
18
+ Effect.gen(function* () {
19
+ const ref = yield* Ref.make(10);
20
+ const sink = Sink.reduce(ref, (acc: number, n: number) => acc + n);
21
+ yield* Fx.fromIterable<number>([]).run(sink);
22
+ const result = yield* Ref.get(ref);
23
+ assert.strictEqual(result, 10);
24
+ }).pipe(Effect.scoped, Effect.runPromise));
25
+ });
26
+
27
+ describe("Sink.reduceEffect", () => {
28
+ it("reduces values with effectful function", () =>
29
+ Effect.gen(function* () {
30
+ const ref = yield* Ref.make(0);
31
+ const sink = Sink.reduceEffect(ref, (acc: number, n: number) => Effect.succeed(acc + n));
32
+ yield* Fx.fromIterable([1, 2, 3]).run(sink);
33
+ const result = yield* Ref.get(ref);
34
+ assert.strictEqual(result, 6);
35
+ }).pipe(Effect.scoped, Effect.runPromise));
36
+
37
+ it("skips step when reducer effect fails, continues with rest", () =>
38
+ Effect.gen(function* () {
39
+ const ref = yield* Ref.make(0);
40
+ const sink = Sink.reduceEffect(ref, (acc: number, n: number) =>
41
+ n === 2 ? Effect.fail("skip") : Effect.succeed(acc + n),
42
+ );
43
+ yield* Fx.fromIterable([1, 2, 3]).run(sink);
44
+ const result = yield* Ref.get(ref);
45
+ assert.strictEqual(result, 4);
46
+ }).pipe(Effect.scoped, Effect.runPromise));
47
+ });
48
+
49
+ describe("Sink.collect", () => {
50
+ it("collects all values into array", () =>
51
+ Effect.gen(function* () {
52
+ const ref = yield* Ref.make<ReadonlyArray<number>>([]);
53
+ const sink = Sink.collect(ref);
54
+ yield* Fx.fromIterable([1, 2, 3]).run(sink);
55
+ const result = yield* Ref.get(ref);
56
+ assert.deepStrictEqual(result, [1, 2, 3]);
57
+ }).pipe(Effect.scoped, Effect.runPromise));
58
+
59
+ it("returns empty array when no elements", () =>
60
+ Effect.gen(function* () {
61
+ const ref = yield* Ref.make<ReadonlyArray<number>>([]);
62
+ const sink = Sink.collect(ref);
63
+ yield* Fx.fromIterable<number>([]).run(sink);
64
+ const result = yield* Ref.get(ref);
65
+ assert.deepStrictEqual(result, []);
66
+ }).pipe(Effect.scoped, Effect.runPromise));
67
+ });
68
+
69
+ describe("Sink.head", () => {
70
+ it("keeps only first value", () =>
71
+ Effect.gen(function* () {
72
+ const ref = yield* Ref.make(Option.none<number>());
73
+ const sink = Sink.head(ref);
74
+ yield* Fx.fromIterable([1, 2, 3]).run(sink);
75
+ const result = yield* Ref.get(ref);
76
+ assert.deepStrictEqual(result, Option.some(1));
77
+ }).pipe(Effect.scoped, Effect.runPromise));
78
+
79
+ it("remains none when no elements", () =>
80
+ Effect.gen(function* () {
81
+ const ref = yield* Ref.make(Option.none<number>());
82
+ const sink = Sink.head(ref);
83
+ yield* Fx.fromIterable<number>([]).run(sink);
84
+ const result = yield* Ref.get(ref);
85
+ assert.deepStrictEqual(result, Option.none());
86
+ }).pipe(Effect.scoped, Effect.runPromise));
87
+ });
88
+
89
+ describe("Sink.last", () => {
90
+ it("keeps only last value", () =>
91
+ Effect.gen(function* () {
92
+ const ref = yield* Ref.make(Option.none<number>());
93
+ const sink = Sink.last(ref);
94
+ yield* Fx.fromIterable([1, 2, 3]).run(sink);
95
+ const result = yield* Ref.get(ref);
96
+ assert.deepStrictEqual(result, Option.some(3));
97
+ }).pipe(Effect.scoped, Effect.runPromise));
98
+
99
+ it("remains none when no elements", () =>
100
+ Effect.gen(function* () {
101
+ const ref = yield* Ref.make(Option.none<number>());
102
+ const sink = Sink.last(ref);
103
+ yield* Fx.fromIterable<number>([]).run(sink);
104
+ const result = yield* Ref.get(ref);
105
+ assert.deepStrictEqual(result, Option.none());
106
+ }).pipe(Effect.scoped, Effect.runPromise));
107
+ });
@@ -17,6 +17,8 @@ import * as Option from "effect/Option";
17
17
  import { pipeArguments } from "effect/Pipeable";
18
18
  import type * as Scope from "effect/Scope";
19
19
  import * as ServiceMap from "effect/ServiceMap";
20
+ import { filterMap as fxFilterMap } from "../Fx/combinators/filterMap.js";
21
+ import { filterMapEffect as fxFilterMapEffect } from "../Fx/combinators/filterMapEffect.js";
20
22
  import { map as fxMap } from "../Fx/combinators/map.js";
21
23
  import { mapEffect as fxMapEffect } from "../Fx/combinators/mapEffect.js";
22
24
  import {
@@ -332,6 +334,80 @@ export const mapEffect: {
332
334
  },
333
335
  );
334
336
 
337
+ /**
338
+ * Filter-maps a Versioned's output as both an Fx and Effect; the Effect value becomes `Option` (Some when the predicate holds, None otherwise).
339
+ * @since 1.18.0
340
+ * @category combinators
341
+ */
342
+ export const filterMap: {
343
+ <A, E, R, C, B, D>(options: {
344
+ onFx: (a: A) => Option.Option<C>;
345
+ onEffect: (b: B) => Option.Option<D>;
346
+ }): <R0, E0, R2, E2>(
347
+ versioned: Versioned<R0, E0, A, E, R, B, E2, R2>,
348
+ ) => Versioned<never, never, C, E, R, Option.Option<D>, E0 | E2, R0 | R2>;
349
+
350
+ <R0, E0, A, E, R, B, E2, R2, C, D>(
351
+ versioned: Versioned<R0, E0, A, E, R, B, E2, R2>,
352
+ options: {
353
+ onFx: (a: A) => Option.Option<C>;
354
+ onEffect: (b: B) => Option.Option<D>;
355
+ },
356
+ ): Versioned<never, never, C, E, R, Option.Option<D>, E0 | E2, R0 | R2>;
357
+ } = dual(
358
+ 2,
359
+ function filterMap<R0, E0, A, E, R, B, E2, R2, C, D>(
360
+ versioned: Versioned<R0, E0, A, E, R, B, E2, R2>,
361
+ options: {
362
+ onFx: (a: A) => Option.Option<C>;
363
+ onEffect: (b: B) => Option.Option<D>;
364
+ },
365
+ ): Versioned<never, never, C, E, R, Option.Option<D>, E0 | E2, R0 | R2> {
366
+ return transform(
367
+ versioned,
368
+ (fx) => fxFilterMap(fx, options.onFx),
369
+ (effect) => Effect.map(effect, options.onEffect),
370
+ );
371
+ },
372
+ );
373
+
374
+ /**
375
+ * Filter-maps a Versioned's output as both an Fx and Effect using an Effect; the Effect value becomes `Option`.
376
+ * @since 1.18.0
377
+ * @category combinators
378
+ */
379
+ export const filterMapEffect: {
380
+ <A, C, E3, R3, B, D, E4, R4>(options: {
381
+ onFx: (a: A) => Effect.Effect<Option.Option<C>, E3, R3>;
382
+ onEffect: (b: B) => Effect.Effect<Option.Option<D>, E4, R4>;
383
+ }): <R0, E0, R, E, R2, E2>(
384
+ versioned: Versioned<R0, E0, A, E, R, B, E2, R2>,
385
+ ) => Versioned<never, never, C, E | E3, R | R3, Option.Option<D>, E0 | E2 | E4, R0 | R2 | R4>;
386
+
387
+ <R0, E0, A, E, R, B, E2, R2, C, E3, R3, D, E4, R4>(
388
+ versioned: Versioned<R0, E0, A, E, R, B, E2, R2>,
389
+ options: {
390
+ onFx: (a: A) => Effect.Effect<Option.Option<C>, E3, R3>;
391
+ onEffect: (b: B) => Effect.Effect<Option.Option<D>, E4, R4>;
392
+ },
393
+ ): Versioned<never, never, C, E | E3, R | R3, Option.Option<D>, E0 | E2 | E4, R0 | R2 | R4>;
394
+ } = dual(
395
+ 2,
396
+ function filterMapEffect<R0, E0, A, E, R, B, E2, R2, C, E3, R3, D, E4, R4>(
397
+ versioned: Versioned<R0, E0, A, E, R, B, E2, R2>,
398
+ options: {
399
+ onFx: (a: A) => Effect.Effect<Option.Option<C>, E3, R3>;
400
+ onEffect: (b: B) => Effect.Effect<Option.Option<D>, E4, R4>;
401
+ },
402
+ ): Versioned<never, never, C, E | E3, R | R3, Option.Option<D>, E0 | E2 | E4, R0 | R2 | R4> {
403
+ return transform(
404
+ versioned,
405
+ (fx) => fxFilterMapEffect(fx, options.onFx),
406
+ (effect) => Effect.flatMap(effect, options.onEffect),
407
+ );
408
+ },
409
+ );
410
+
335
411
  /**
336
412
  * Combines multiple Versioned values into a single tuple.
337
413
  * @since 1.0.0
@@ -0,0 +1,91 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { Effect, Option } from "effect";
3
+ import * as Fx from "./Fx/index.js";
4
+ import * as Versioned from "./Versioned.js";
5
+
6
+ describe("Versioned filterMap / filterMapEffect", () => {
7
+ const evenOption = (n: number) => (n % 2 === 0 ? Option.some(n) : Option.none<number>());
8
+
9
+ describe("filterMap", () => {
10
+ it("filters Fx and maps Effect to Option (Some when matched)", () =>
11
+ Effect.gen(function* () {
12
+ const v = Versioned.of(8);
13
+ const filtered = Versioned.filterMap(v, {
14
+ onFx: evenOption,
15
+ onEffect: evenOption,
16
+ });
17
+ expect(yield* filtered.asEffect()).toEqual(Option.some(8));
18
+ expect(yield* Fx.collectAll(filtered)).toEqual([8]);
19
+ }).pipe(Effect.runPromise));
20
+
21
+ it("filters Fx and maps Effect to Option (None when not matched)", () =>
22
+ Effect.gen(function* () {
23
+ const v = Versioned.of(7);
24
+ const filtered = Versioned.filterMap(v, {
25
+ onFx: evenOption,
26
+ onEffect: evenOption,
27
+ });
28
+ expect(yield* filtered.asEffect()).toEqual(Option.none());
29
+ expect(yield* Fx.collectAll(filtered)).toEqual([]);
30
+ }).pipe(Effect.runPromise));
31
+
32
+ it("supports curried form", () =>
33
+ Effect.gen(function* () {
34
+ const filterEven = Versioned.filterMap({
35
+ onFx: evenOption,
36
+ onEffect: evenOption,
37
+ });
38
+ const v = Versioned.of(10);
39
+ const filtered = filterEven(v);
40
+ expect(yield* filtered.asEffect()).toEqual(Option.some(10));
41
+ expect(yield* Fx.collectAll(filtered)).toEqual([10]);
42
+ }).pipe(Effect.runPromise));
43
+
44
+ it("can map to different types on Fx vs Effect", () =>
45
+ Effect.gen(function* () {
46
+ const v = Versioned.of(3);
47
+ const filtered = Versioned.filterMap(v, {
48
+ onFx: (n) => (n > 0 ? Option.some(String(n)) : Option.none()),
49
+ onEffect: (n) => (n > 0 ? Option.some(n + 1) : Option.none()),
50
+ });
51
+ expect(yield* filtered.asEffect()).toEqual(Option.some(4));
52
+ expect(yield* Fx.collectAll(filtered)).toEqual(["3"]);
53
+ }).pipe(Effect.runPromise));
54
+ });
55
+
56
+ describe("filterMapEffect", () => {
57
+ it("effectful filterMap on Fx and Effect (Some when matched)", () =>
58
+ Effect.gen(function* () {
59
+ const v = Versioned.of(4);
60
+ const filtered = Versioned.filterMapEffect(v, {
61
+ onFx: (n) => Effect.succeed(evenOption(n)),
62
+ onEffect: (n) => Effect.succeed(evenOption(n)),
63
+ });
64
+ expect(yield* filtered.asEffect()).toEqual(Option.some(4));
65
+ expect(yield* Fx.collectAll(filtered)).toEqual([4]);
66
+ }).pipe(Effect.runPromise));
67
+
68
+ it("effectful filterMap (None when not matched)", () =>
69
+ Effect.gen(function* () {
70
+ const v = Versioned.of(5);
71
+ const filtered = Versioned.filterMapEffect(v, {
72
+ onFx: (n) => Effect.succeed(evenOption(n)),
73
+ onEffect: (n) => Effect.succeed(evenOption(n)),
74
+ });
75
+ expect(yield* filtered.asEffect()).toEqual(Option.none());
76
+ expect(yield* Fx.collectAll(filtered)).toEqual([]);
77
+ }).pipe(Effect.runPromise));
78
+
79
+ it("supports curried form", () =>
80
+ Effect.gen(function* () {
81
+ const filterEven = Versioned.filterMapEffect({
82
+ onFx: (n: number) => Effect.succeed(evenOption(n)),
83
+ onEffect: (n: number) => Effect.succeed(evenOption(n)),
84
+ });
85
+ const v = Versioned.of(6);
86
+ const filtered = filterEven(v);
87
+ expect(yield* filtered.asEffect()).toEqual(Option.some(6));
88
+ expect(yield* Fx.collectAll(filtered)).toEqual([6]);
89
+ }).pipe(Effect.runPromise));
90
+ });
91
+ });
package/tsconfig.json DELETED
@@ -1,6 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.base.json",
3
- "compilerOptions": { "rootDir": "src", "outDir": "dist" },
4
- "include": ["src"],
5
- "exclude": ["**/*.test.ts"]
6
- }