@effect-app/infra 3.9.0 → 4.0.0-beta.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.
- package/CHANGELOG.md +22 -0
- package/_check.sh +3 -0
- package/dist/CUPS.d.ts +22 -12
- package/dist/CUPS.d.ts.map +1 -1
- package/dist/CUPS.js +28 -29
- package/dist/Emailer/Sendgrid.js +13 -12
- package/dist/Emailer/service.d.ts +3 -13
- package/dist/Emailer/service.d.ts.map +1 -1
- package/dist/Emailer/service.js +3 -3
- package/dist/MainFiberSet.d.ts +18 -41
- package/dist/MainFiberSet.d.ts.map +1 -1
- package/dist/MainFiberSet.js +10 -10
- package/dist/Model/Repository/ext.d.ts.map +1 -1
- package/dist/Model/Repository/ext.js +13 -10
- package/dist/Model/Repository/internal/internal.d.ts +5 -5
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +52 -42
- package/dist/Model/Repository/legacy.d.ts +9 -9
- package/dist/Model/Repository/legacy.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.d.ts +4 -4
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -1
- package/dist/Model/Repository/makeRepo.js +1 -1
- package/dist/Model/Repository/service.d.ts +11 -11
- package/dist/Model/Repository/service.d.ts.map +1 -1
- package/dist/Model/Repository/validation.d.ts +17 -47
- package/dist/Model/Repository/validation.d.ts.map +1 -1
- package/dist/Model/Repository/validation.js +2 -2
- package/dist/Model/query/dsl.d.ts +22 -22
- package/dist/Model/query/dsl.d.ts.map +1 -1
- package/dist/Model/query/dsl.js +1 -1
- package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
- package/dist/Model/query/new-kid-interpreter.js +7 -7
- package/dist/Operations.d.ts +22 -63
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Operations.js +14 -14
- package/dist/OperationsRepo.d.ts +23 -7
- package/dist/OperationsRepo.d.ts.map +1 -1
- package/dist/OperationsRepo.js +4 -5
- package/dist/QueueMaker/SQLQueue.d.ts +6 -8
- package/dist/QueueMaker/SQLQueue.d.ts.map +1 -1
- package/dist/QueueMaker/SQLQueue.js +20 -24
- package/dist/QueueMaker/errors.js +1 -1
- package/dist/QueueMaker/memQueue.d.ts +2 -5
- package/dist/QueueMaker/memQueue.d.ts.map +1 -1
- package/dist/QueueMaker/memQueue.js +22 -26
- package/dist/QueueMaker/sbqueue.d.ts +2 -5
- package/dist/QueueMaker/sbqueue.d.ts.map +1 -1
- package/dist/QueueMaker/sbqueue.js +24 -28
- package/dist/RequestContext.d.ts +28 -41
- package/dist/RequestContext.d.ts.map +1 -1
- package/dist/RequestContext.js +4 -4
- package/dist/RequestFiberSet.d.ts +23 -50
- package/dist/RequestFiberSet.d.ts.map +1 -1
- package/dist/RequestFiberSet.js +14 -14
- package/dist/Store/ContextMapContainer.d.ts +4 -4
- package/dist/Store/ContextMapContainer.d.ts.map +1 -1
- package/dist/Store/ContextMapContainer.js +5 -5
- package/dist/Store/Cosmos.d.ts.map +1 -1
- package/dist/Store/Cosmos.js +21 -28
- package/dist/Store/Disk.d.ts.map +1 -1
- package/dist/Store/Disk.js +12 -16
- package/dist/Store/Memory.d.ts +2 -2
- package/dist/Store/Memory.d.ts.map +1 -1
- package/dist/Store/Memory.js +25 -33
- package/dist/Store/index.js +2 -2
- package/dist/Store/service.d.ts +9 -34
- package/dist/Store/service.d.ts.map +1 -1
- package/dist/Store/service.js +4 -4
- package/dist/Store/utils.d.ts.map +1 -1
- package/dist/Store/utils.js +10 -2
- package/dist/adapters/SQL/Model.d.ts +106 -162
- package/dist/adapters/SQL/Model.d.ts.map +1 -1
- package/dist/adapters/SQL/Model.js +92 -130
- package/dist/adapters/ServiceBus.d.ts +13 -44
- package/dist/adapters/ServiceBus.d.ts.map +1 -1
- package/dist/adapters/ServiceBus.js +13 -15
- package/dist/adapters/cosmos-client.d.ts +7 -3
- package/dist/adapters/cosmos-client.d.ts.map +1 -1
- package/dist/adapters/cosmos-client.js +5 -4
- package/dist/adapters/logger.d.ts +1 -1
- package/dist/adapters/logger.d.ts.map +1 -1
- package/dist/adapters/memQueue.d.ts +8 -21
- package/dist/adapters/memQueue.d.ts.map +1 -1
- package/dist/adapters/memQueue.js +4 -4
- package/dist/adapters/mongo-client.d.ts +6 -6
- package/dist/adapters/mongo-client.d.ts.map +1 -1
- package/dist/adapters/mongo-client.js +5 -4
- package/dist/adapters/redis-client.d.ts +14 -4
- package/dist/adapters/redis-client.d.ts.map +1 -1
- package/dist/adapters/redis-client.js +19 -18
- package/dist/api/ContextProvider.d.ts +10 -15
- package/dist/api/ContextProvider.d.ts.map +1 -1
- package/dist/api/ContextProvider.js +8 -8
- package/dist/api/codec.d.ts +1 -1
- package/dist/api/codec.d.ts.map +1 -1
- package/dist/api/codec.js +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts +1 -1
- package/dist/api/internal/RequestContextMiddleware.d.ts.map +1 -1
- package/dist/api/internal/auth.d.ts +3 -3
- package/dist/api/internal/auth.d.ts.map +1 -1
- package/dist/api/internal/auth.js +8 -8
- package/dist/api/internal/events.d.ts +2 -2
- package/dist/api/internal/events.d.ts.map +1 -1
- package/dist/api/internal/events.js +9 -9
- package/dist/api/internal/health.d.ts +1 -1
- package/dist/api/internal/health.d.ts.map +1 -1
- package/dist/api/internal/health.js +2 -2
- package/dist/api/layerUtils.d.ts +14 -14
- package/dist/api/layerUtils.d.ts.map +1 -1
- package/dist/api/layerUtils.js +5 -5
- package/dist/api/middlewares.d.ts +0 -75
- package/dist/api/middlewares.d.ts.map +1 -1
- package/dist/api/middlewares.js +6 -51
- package/dist/api/reportError.js +4 -4
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -4
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.d.ts +6 -7
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +9 -13
- package/dist/api/routing/schema/jwt.d.ts +1 -1
- package/dist/api/routing/schema/jwt.d.ts.map +1 -1
- package/dist/api/routing/schema/jwt.js +5 -4
- package/dist/api/routing/utils.d.ts +2 -2
- package/dist/api/routing/utils.d.ts.map +1 -1
- package/dist/api/routing/utils.js +10 -8
- package/dist/api/routing.d.ts +39 -37
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +17 -21
- package/dist/api/setupRequest.d.ts +4 -6
- package/dist/api/setupRequest.d.ts.map +1 -1
- package/dist/api/setupRequest.js +10 -9
- package/dist/arbs.d.ts +3 -3
- package/dist/arbs.d.ts.map +1 -1
- package/dist/arbs.js +2 -2
- package/dist/errorReporter.d.ts +1 -1
- package/dist/errorReporter.d.ts.map +1 -1
- package/dist/errorReporter.js +12 -12
- package/dist/fileUtil.d.ts +6 -6
- package/dist/fileUtil.d.ts.map +1 -1
- package/dist/logger/jsonLogger.d.ts.map +1 -1
- package/dist/logger/jsonLogger.js +19 -18
- package/dist/logger/logFmtLogger.d.ts.map +1 -1
- package/dist/logger/logFmtLogger.js +11 -13
- package/dist/logger/shared.d.ts +2 -2
- package/dist/logger/shared.d.ts.map +1 -1
- package/dist/logger/shared.js +7 -9
- package/dist/logger.d.ts +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/rateLimit.d.ts +2 -2
- package/dist/rateLimit.d.ts.map +1 -1
- package/dist/rateLimit.js +5 -5
- package/dist/test.d.ts +2 -2
- package/dist/test.d.ts.map +1 -1
- package/dist/test.js +6 -24
- package/package.json +24 -27
- package/src/CUPS.ts +15 -14
- package/src/Emailer/Sendgrid.ts +15 -13
- package/src/Emailer/service.ts +3 -3
- package/src/MainFiberSet.ts +16 -12
- package/src/Model/Repository/ext.ts +18 -16
- package/src/Model/Repository/internal/internal.ts +80 -69
- package/src/Model/Repository/legacy.ts +9 -9
- package/src/Model/Repository/makeRepo.ts +5 -5
- package/src/Model/Repository/service.ts +12 -12
- package/src/Model/Repository/validation.ts +1 -1
- package/src/Model/query/dsl.ts +13 -13
- package/src/Model/query/new-kid-interpreter.ts +8 -8
- package/src/Operations.ts +17 -14
- package/src/OperationsRepo.ts +3 -4
- package/src/QueueMaker/SQLQueue.ts +86 -89
- package/src/QueueMaker/errors.ts +1 -1
- package/src/QueueMaker/memQueue.ts +90 -91
- package/src/QueueMaker/sbqueue.ts +90 -92
- package/src/RequestContext.ts +3 -3
- package/src/RequestFiberSet.ts +17 -15
- package/src/Store/ContextMapContainer.ts +4 -4
- package/src/Store/Cosmos.ts +20 -27
- package/src/Store/Disk.ts +13 -17
- package/src/Store/Memory.ts +28 -34
- package/src/Store/index.ts +1 -1
- package/src/Store/service.ts +4 -4
- package/src/Store/utils.ts +9 -5
- package/src/adapters/SQL/Model.ts +255 -268
- package/src/adapters/ServiceBus.ts +17 -20
- package/src/adapters/cosmos-client.ts +5 -5
- package/src/adapters/memQueue.ts +3 -3
- package/src/adapters/mongo-client.ts +5 -5
- package/src/adapters/redis-client.ts +25 -19
- package/src/api/ContextProvider.ts +24 -34
- package/src/api/codec.ts +1 -1
- package/src/api/internal/auth.ts +11 -13
- package/src/api/internal/events.ts +11 -11
- package/src/api/internal/health.ts +1 -1
- package/src/api/layerUtils.ts +20 -20
- package/src/api/middlewares.ts +0 -97
- package/src/api/reportError.ts +3 -3
- package/src/api/routing/middleware/RouterMiddleware.ts +5 -6
- package/src/api/routing/middleware/middleware.ts +13 -25
- package/src/api/routing/schema/jwt.ts +9 -7
- package/src/api/routing/utils.ts +12 -10
- package/src/api/routing.ts +77 -79
- package/src/api/setupRequest.ts +9 -8
- package/src/arbs.ts +3 -3
- package/src/errorReporter.ts +12 -12
- package/src/logger/jsonLogger.ts +18 -17
- package/src/logger/logFmtLogger.ts +10 -12
- package/src/logger/shared.ts +6 -8
- package/src/rateLimit.ts +7 -7
- package/src/test.ts +7 -29
- package/test/contextProvider.test.ts +77 -70
- package/test/controller.test.ts +51 -39
- package/test/dist/contextProvider.test.d.ts.map +1 -1
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +33 -81
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +9 -8
- package/test/dist/query.test.d.ts.map +1 -1
- package/test/dist/rawQuery.test.d.ts.map +1 -1
- package/test/dist/requires.test.d.ts.map +1 -1
- package/test/dist/rpc-multi-middleware.test.d.ts.map +1 -1
- package/test/fixtures.ts +9 -7
- package/test/query.test.ts +49 -41
- package/test/rawQuery.test.ts +44 -40
- package/test/requires.test.ts +40 -31
- package/test/rpc-multi-middleware.test.ts +13 -14
- package/test/validateSample.test.ts +2 -2
- package/tsconfig.json +1 -25
- package/dist/api/internal/middlewares.d.ts +0 -15
- package/dist/api/internal/middlewares.d.ts.map +0 -1
- package/dist/api/internal/middlewares.js +0 -168
- package/src/api/internal/middlewares.ts +0 -279
package/src/rateLimit.ts
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// }
|
|
22
22
|
|
|
23
23
|
import { Array, type Duration, Effect, type NonEmptyArray } from "effect-app"
|
|
24
|
-
import type { Semaphore } from "effect
|
|
24
|
+
import type { Semaphore } from "effect/Semaphore"
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* Executes the specified effect, acquiring the specified number of permits
|
|
@@ -30,8 +30,8 @@ import type { Semaphore } from "effect-app/Effect"
|
|
|
30
30
|
* failure, or interruption.
|
|
31
31
|
*/
|
|
32
32
|
export function SEM_withPermitsDuration(permits: number, duration: Duration.Duration) {
|
|
33
|
-
return (self: Semaphore): <
|
|
34
|
-
return (effect) =>
|
|
33
|
+
return (self: Semaphore): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R> => {
|
|
34
|
+
return <A, E, R>(effect: Effect.Effect<A, E, R>) =>
|
|
35
35
|
Effect.uninterruptibleMask(
|
|
36
36
|
(restore) =>
|
|
37
37
|
restore(self.take(permits))
|
|
@@ -52,7 +52,7 @@ export function batchPar<R, E, A, R2, E2, A2, T>(
|
|
|
52
52
|
) {
|
|
53
53
|
return (items: Iterable<T>) =>
|
|
54
54
|
Effect.forEach(
|
|
55
|
-
Array.
|
|
55
|
+
Array.chunksOf(items, n),
|
|
56
56
|
(_, i) =>
|
|
57
57
|
Effect
|
|
58
58
|
.forEach(_, (_, j) => forEachItem(_, j, i), { concurrency: "inherit" })
|
|
@@ -68,7 +68,7 @@ export function batch<R, E, A, R2, E2, A2, T>(
|
|
|
68
68
|
) {
|
|
69
69
|
return (items: Iterable<T>) =>
|
|
70
70
|
Effect.forEach(
|
|
71
|
-
Array.
|
|
71
|
+
Array.chunksOf(items, n),
|
|
72
72
|
(_, i) =>
|
|
73
73
|
Effect
|
|
74
74
|
.forEach(_, (_, j) => forEachItem(_, j, i), { concurrency: "inherit" })
|
|
@@ -101,12 +101,12 @@ export function naiveRateLimit(
|
|
|
101
101
|
forEachBatch: (a: A[]) => Effect.Effect<A2, E2, R2>
|
|
102
102
|
) =>
|
|
103
103
|
Effect.forEach(
|
|
104
|
-
Array.
|
|
104
|
+
Array.chunksOf(items, n),
|
|
105
105
|
(batch, i) =>
|
|
106
106
|
((i === 0)
|
|
107
107
|
? Effect.void
|
|
108
108
|
: Effect.sleep(d))
|
|
109
|
-
.pipe(Effect.
|
|
109
|
+
.pipe(Effect.andThen(
|
|
110
110
|
Effect
|
|
111
111
|
.forEach(batch, forEachItem, { concurrency: n })
|
|
112
112
|
.pipe(Effect.flatMap(forEachBatch))
|
package/src/test.ts
CHANGED
|
@@ -1,36 +1,14 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Predicate, S } from "effect-app"
|
|
1
|
+
import { S } from "effect-app"
|
|
3
2
|
import { copy } from "effect-app/utils"
|
|
4
|
-
import type { PropertySignature } from "effect/Schema"
|
|
5
3
|
import { generate } from "./arbs.js"
|
|
6
4
|
|
|
7
|
-
const isPropertySignature = (u: unknown): u is PropertySignature.All =>
|
|
8
|
-
Predicate.hasProperty(u, S.PropertySignatureTypeId)
|
|
9
|
-
|
|
10
|
-
const defaults = (fields: S.Struct.Fields) => {
|
|
11
|
-
const keys = Object.keys(fields)
|
|
12
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
13
|
-
const out: Record<string, any> = {}
|
|
14
|
-
for (const key of keys) {
|
|
15
|
-
const field = fields[key]
|
|
16
|
-
if (isPropertySignature(field)) {
|
|
17
|
-
const ast = field.ast
|
|
18
|
-
const defaultValue = ast._tag === "PropertySignatureDeclaration" ? ast.defaultValue : ast.to.defaultValue
|
|
19
|
-
if (defaultValue !== undefined) {
|
|
20
|
-
out[key] = defaultValue()
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return out
|
|
25
|
-
}
|
|
26
|
-
|
|
27
5
|
/**
|
|
28
6
|
* Given the schema for an object-like structure, creates a function that generates random instances of that object with some values provided.
|
|
29
7
|
*/
|
|
30
|
-
export const createRandomInstance = <A extends object, I, R>(s: S.
|
|
31
|
-
const gen = generate(
|
|
8
|
+
export const createRandomInstance = <A extends object, I, R>(s: S.Codec<A, I, R> & { fields: S.Struct.Fields }) => {
|
|
9
|
+
const gen = generate(S.toArbitrary(s))
|
|
32
10
|
return (overrides?: Partial<A>) => {
|
|
33
|
-
const v =
|
|
11
|
+
const v = gen.value
|
|
34
12
|
return overrides ? copy(v, overrides) : v
|
|
35
13
|
}
|
|
36
14
|
}
|
|
@@ -38,12 +16,12 @@ export const createRandomInstance = <A extends object, I, R>(s: S.Schema<A, I, R
|
|
|
38
16
|
/**
|
|
39
17
|
* Like `createRandomInstance`, but takes encoded values rather than decoded ones.
|
|
40
18
|
*/
|
|
41
|
-
export const createRandomInstanceI = <A extends object, I>(s: S.
|
|
42
|
-
const gen = generate(
|
|
19
|
+
export const createRandomInstanceI = <A extends object, I>(s: S.Codec<A, I, never> & { fields: S.Struct.Fields }) => {
|
|
20
|
+
const gen = generate(S.toArbitrary(s))
|
|
43
21
|
const encode = S.encodeSync(s)
|
|
44
22
|
const decode = S.decodeSync(s)
|
|
45
23
|
return (overrides?: Partial<I>) => {
|
|
46
|
-
const v =
|
|
24
|
+
const v = gen.value
|
|
47
25
|
if (!overrides) return v
|
|
48
26
|
return decode({ ...encode(v), ...overrides })
|
|
49
27
|
}
|
|
@@ -1,82 +1,89 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
3
3
|
import { expectTypeOf, it } from "@effect/vitest"
|
|
4
|
-
import {
|
|
4
|
+
import { Effect, Layer, Scope, ServiceMap } from "effect-app"
|
|
5
5
|
import { ContextProvider, mergeContextProviders, MergedContextProvider } from "../src/api/ContextProvider.js"
|
|
6
6
|
import { CustomError1, Some, SomeElse, SomeService } from "./fixtures.js"
|
|
7
7
|
|
|
8
8
|
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
9
|
-
class MyContextProvider extends
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
26
|
-
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
27
|
-
|
|
28
|
-
return Context.make(Some, new Some({ a: 1 }))
|
|
9
|
+
class MyContextProvider extends ServiceMap.Service<MyContextProvider>()(
|
|
10
|
+
"MyContextProvider",
|
|
11
|
+
{
|
|
12
|
+
make: Effect.gen(function*() {
|
|
13
|
+
yield* SomeService
|
|
14
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
15
|
+
|
|
16
|
+
return Effect.gen(function*() {
|
|
17
|
+
// the only requirements you can have are the one provided by HttpLayerRouter.Provided
|
|
18
|
+
yield* Scope.Scope
|
|
19
|
+
|
|
20
|
+
yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
|
|
21
|
+
yield* Effect.succeed("this is a generator")
|
|
22
|
+
|
|
23
|
+
return Some.serviceMap({ a: 1 })
|
|
24
|
+
})
|
|
29
25
|
})
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
26
|
+
}
|
|
27
|
+
) {
|
|
28
|
+
static readonly Default = Layer.effect(this, this.make)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
class MyContextProvider2 extends ServiceMap.Service<MyContextProvider2>()(
|
|
32
|
+
"MyContextProvider2",
|
|
33
|
+
{
|
|
34
|
+
make: Effect.gen(function*() {
|
|
35
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
36
|
+
|
|
37
|
+
return Effect.gen(function*() {
|
|
38
|
+
// we test without dependencies, so that we end up with an R of never.
|
|
39
|
+
|
|
40
|
+
return SomeElse.serviceMap({ b: 2 })
|
|
41
|
+
})
|
|
41
42
|
})
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
43
|
+
}
|
|
44
|
+
) {
|
|
45
|
+
static readonly Default = Layer.effect(this, this.make)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
class MyContextProvider2Gen extends ServiceMap.Service<MyContextProvider2Gen>()(
|
|
49
|
+
"MyContextProvider2Gen",
|
|
50
|
+
{
|
|
51
|
+
make: Effect.gen(function*() {
|
|
52
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
53
|
+
|
|
54
|
+
return function*() {
|
|
55
|
+
// we test without dependencies, so that we end up with an R of never
|
|
56
|
+
|
|
57
|
+
return SomeElse.serviceMap({ b: 2 })
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
) {
|
|
62
|
+
static readonly Default = Layer.effect(this, this.make)
|
|
63
|
+
}
|
|
56
64
|
|
|
57
65
|
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
58
|
-
class MyContextProviderGen extends
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}) {}
|
|
66
|
+
class MyContextProviderGen extends ServiceMap.Service<MyContextProviderGen>()(
|
|
67
|
+
"MyContextProviderGen",
|
|
68
|
+
{
|
|
69
|
+
make: Effect.gen(function*() {
|
|
70
|
+
yield* SomeService
|
|
71
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
72
|
+
|
|
73
|
+
return function*() {
|
|
74
|
+
// the only requirements you can have are the one provided by HttpLayerRouter.Provided
|
|
75
|
+
yield* Scope.Scope
|
|
76
|
+
|
|
77
|
+
yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
|
|
78
|
+
yield* Effect.succeed("this is a generator")
|
|
79
|
+
|
|
80
|
+
return Some.serviceMap({ a: 1 })
|
|
81
|
+
}
|
|
82
|
+
})
|
|
83
|
+
}
|
|
84
|
+
) {
|
|
85
|
+
static readonly Default = Layer.effect(this, this.make)
|
|
86
|
+
}
|
|
80
87
|
|
|
81
88
|
export const someContextProvider = ContextProvider({
|
|
82
89
|
effect: Effect.gen(function*() {
|
|
@@ -93,7 +100,7 @@ export const someContextProvider = ContextProvider({
|
|
|
93
100
|
// currently the effectful context provider cannot trigger an error when building the per request context
|
|
94
101
|
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
95
102
|
|
|
96
|
-
return
|
|
103
|
+
return Some.serviceMap({ a: 1 })
|
|
97
104
|
})
|
|
98
105
|
})
|
|
99
106
|
})
|
|
@@ -112,7 +119,7 @@ export const someContextProviderGen = ContextProvider({
|
|
|
112
119
|
// currently the effectful context provider cannot trigger an error when building the per request context
|
|
113
120
|
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
114
121
|
|
|
115
|
-
return
|
|
122
|
+
return Some.serviceMap({ a: 1 })
|
|
116
123
|
}
|
|
117
124
|
})
|
|
118
125
|
})
|
package/test/controller.test.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
3
3
|
import { type MakeContext, type MakeErrors, makeRouter } from "@effect-app/infra/api/routing"
|
|
4
|
-
import { type RpcSerialization } from "@effect/rpc"
|
|
5
4
|
import { expect, expectTypeOf, it } from "@effect/vitest"
|
|
6
|
-
import {
|
|
5
|
+
import { Effect, Layer, S, Scope, ServiceMap } from "effect-app"
|
|
7
6
|
import { InvalidStateError, makeRpcClient, UnauthorizedError } from "effect-app/client"
|
|
8
7
|
import { DefaultGenericMiddlewares } from "effect-app/middleware"
|
|
9
8
|
import * as RpcX from "effect-app/rpc"
|
|
10
9
|
import { MiddlewareMaker } from "effect-app/rpc"
|
|
11
10
|
import { TypeTestId } from "effect-app/TypeTest"
|
|
11
|
+
import { type RpcSerialization } from "effect/unstable/rpc"
|
|
12
12
|
import { DefaultGenericMiddlewaresLive, DevModeMiddlewareLive } from "../src/api/routing/middleware.js"
|
|
13
13
|
import { sort } from "../src/api/routing/tsort.js"
|
|
14
14
|
import { AllowAnonymous, AllowAnonymousLive, CustomError1, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElse, SomeService, Test, TestLive } from "./fixtures.js"
|
|
@@ -37,7 +37,7 @@ class MyContextProvider extends RpcX.RpcMiddleware.Tag<MyContextProvider, {
|
|
|
37
37
|
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
38
38
|
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
39
39
|
|
|
40
|
-
return yield* Effect.provideService(effect, Some,
|
|
40
|
+
return yield* Effect.provideService(effect, Some, Some.of({ a: 1 }))
|
|
41
41
|
})
|
|
42
42
|
}
|
|
43
43
|
})
|
|
@@ -49,7 +49,7 @@ class MyContextProvider3 extends RpcX.RpcMiddleware.Tag<MyContextProvider3, {
|
|
|
49
49
|
requires: SomeElse
|
|
50
50
|
}>()("MyContextProvider3") {
|
|
51
51
|
static Default = Layer.make(this, {
|
|
52
|
-
dependencies: [
|
|
52
|
+
dependencies: [SomeService.Default],
|
|
53
53
|
*make() {
|
|
54
54
|
yield* SomeService
|
|
55
55
|
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
@@ -69,7 +69,7 @@ class MyContextProvider3 extends RpcX.RpcMiddleware.Tag<MyContextProvider3, {
|
|
|
69
69
|
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
70
70
|
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
71
71
|
|
|
72
|
-
return yield* Effect.provideService(effect, Some,
|
|
72
|
+
return yield* Effect.provideService(effect, Some, Some.of({ a: 1 }))
|
|
73
73
|
})
|
|
74
74
|
}
|
|
75
75
|
})
|
|
@@ -91,7 +91,7 @@ class MyContextProvider2
|
|
|
91
91
|
return Effect.fnUntraced(function*(effect) {
|
|
92
92
|
// we test without dependencies, so that we end up with an R of never.
|
|
93
93
|
|
|
94
|
-
return yield* Effect.provideService(effect, SomeElse,
|
|
94
|
+
return yield* Effect.provideService(effect, SomeElse, SomeElse.of({ b: 2 }))
|
|
95
95
|
})
|
|
96
96
|
}
|
|
97
97
|
})
|
|
@@ -99,7 +99,7 @@ class MyContextProvider2
|
|
|
99
99
|
|
|
100
100
|
//
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
class Str extends ServiceMap.Service<Str, "str">()("str") {}
|
|
103
103
|
|
|
104
104
|
export class BogusMiddleware extends RpcX.RpcMiddleware.Tag<BogusMiddleware>()("BogusMiddleware") {
|
|
105
105
|
static Default = Layer.make(this, {
|
|
@@ -147,7 +147,7 @@ class middleware extends MiddlewareMaker
|
|
|
147
147
|
.middleware(MyContextProvider)
|
|
148
148
|
.middleware(...genericMiddlewares)
|
|
149
149
|
{
|
|
150
|
-
static Default = this.layer.pipe(Layer.provide(MiddlewaresLive))
|
|
150
|
+
static Default = this.layer.pipe(Layer.provide([...MiddlewaresLive]))
|
|
151
151
|
// static override [Unify.unifySymbol]?: TagUnify<typeof middleware> // why we need this?
|
|
152
152
|
}
|
|
153
153
|
|
|
@@ -238,12 +238,16 @@ const Something = { Eff, Gen, DoSomething, GetSomething, GetSomething2, meta: {
|
|
|
238
238
|
// const client = ApiClientFactory.makeFor(Layer.empty)(Something)
|
|
239
239
|
// client.pipe(Effect.map(c => c.DoSomething.name))
|
|
240
240
|
|
|
241
|
-
export class SomethingService extends
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
})
|
|
241
|
+
export class SomethingService extends ServiceMap.Service<SomethingService>()(
|
|
242
|
+
"SomethingService",
|
|
243
|
+
{
|
|
244
|
+
make: Effect.gen(function*() {
|
|
245
|
+
return {}
|
|
246
|
+
})
|
|
247
|
+
}
|
|
248
|
+
) {
|
|
249
|
+
static Default = Layer.effect(this, this.make)
|
|
250
|
+
}
|
|
247
251
|
|
|
248
252
|
declare const a: {
|
|
249
253
|
(opt: { a: 1 }): void
|
|
@@ -252,28 +256,36 @@ declare const a: {
|
|
|
252
256
|
(opt: { b: 3 }): void
|
|
253
257
|
}
|
|
254
258
|
|
|
255
|
-
export class SomethingRepo extends
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
})
|
|
259
|
+
export class SomethingRepo extends ServiceMap.Service<SomethingRepo>()(
|
|
260
|
+
"SomethingRepo",
|
|
261
|
+
{
|
|
262
|
+
make: Effect.gen(function*() {
|
|
263
|
+
const smth = yield* SomethingService
|
|
264
|
+
console.log({ smth })
|
|
265
|
+
return {}
|
|
266
|
+
})
|
|
267
|
+
}
|
|
268
|
+
) {
|
|
269
|
+
static Default = Layer.effect(this, this.make).pipe(Layer.provide(SomethingService.Default))
|
|
270
|
+
}
|
|
263
271
|
|
|
264
|
-
export class SomethingService2 extends
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
})
|
|
272
|
+
export class SomethingService2 extends ServiceMap.Service<SomethingService2>()(
|
|
273
|
+
"SomethingService2",
|
|
274
|
+
{
|
|
275
|
+
make: Effect.gen(function*() {
|
|
276
|
+
return {}
|
|
277
|
+
})
|
|
278
|
+
}
|
|
279
|
+
) {
|
|
280
|
+
static Default = Layer.effect(this, this.make)
|
|
281
|
+
}
|
|
270
282
|
|
|
271
283
|
export const { Router, matchAll } = makeRouter(
|
|
272
284
|
middleware
|
|
273
285
|
)
|
|
274
286
|
|
|
275
287
|
export const r2 = makeRouter(
|
|
276
|
-
Object.assign(middleware2, { Default: middleware2.layer.pipe(Layer.provide(MiddlewaresLive)) })
|
|
288
|
+
Object.assign(middleware2, { Default: middleware2.layer.pipe(Layer.provide([...MiddlewaresLive])) })
|
|
277
289
|
)
|
|
278
290
|
|
|
279
291
|
const router = Router(Something)({
|
|
@@ -306,8 +318,8 @@ const router = Router(Something)({
|
|
|
306
318
|
const some = yield* Some
|
|
307
319
|
return yield* Effect.logInfo("Some", some)
|
|
308
320
|
},
|
|
309
|
-
*GetSomething(req) {
|
|
310
|
-
console.log(req
|
|
321
|
+
*GetSomething(req: GetSomething) {
|
|
322
|
+
console.log(req["id"])
|
|
311
323
|
|
|
312
324
|
const _b = yield* Effect.succeed(false)
|
|
313
325
|
if (_b) {
|
|
@@ -319,7 +331,7 @@ const router = Router(Something)({
|
|
|
319
331
|
return yield* Effect.succeed("12")
|
|
320
332
|
}
|
|
321
333
|
if (!_b) {
|
|
322
|
-
return yield* new UnauthorizedError()
|
|
334
|
+
return yield* Effect.fail(new UnauthorizedError())
|
|
323
335
|
} else {
|
|
324
336
|
// expected an error here because a boolean is not a string
|
|
325
337
|
// return _b
|
|
@@ -347,8 +359,8 @@ it("sorts based on requirements", () => {
|
|
|
347
359
|
|
|
348
360
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
349
361
|
const matched = matchAll({ router })
|
|
350
|
-
expectTypeOf({} as Layer.
|
|
351
|
-
RpcSerialization.RpcSerialization | SomeService |
|
|
362
|
+
expectTypeOf({} as Layer.Services<typeof matched>).toEqualTypeOf<
|
|
363
|
+
RpcSerialization.RpcSerialization | SomeService | Str
|
|
352
364
|
>()
|
|
353
365
|
|
|
354
366
|
type makeContext = MakeContext<typeof router[TypeTestId]>
|
|
@@ -371,8 +383,8 @@ const router2 = r2.Router(Something)({
|
|
|
371
383
|
const some = yield* Some
|
|
372
384
|
return yield* Effect.logInfo("Some", some)
|
|
373
385
|
},
|
|
374
|
-
*GetSomething(req) {
|
|
375
|
-
console.log(req
|
|
386
|
+
*GetSomething(req: GetSomething) {
|
|
387
|
+
console.log(req["id"])
|
|
376
388
|
|
|
377
389
|
const _b = yield* Effect.succeed(false)
|
|
378
390
|
if (_b) {
|
|
@@ -384,7 +396,7 @@ const router2 = r2.Router(Something)({
|
|
|
384
396
|
return yield* Effect.succeed("12")
|
|
385
397
|
}
|
|
386
398
|
if (!_b) {
|
|
387
|
-
return yield* new UnauthorizedError()
|
|
399
|
+
return yield* Effect.fail(new UnauthorizedError())
|
|
388
400
|
} else {
|
|
389
401
|
// expected an error here because a boolean is not a string
|
|
390
402
|
// return _b
|
|
@@ -405,8 +417,8 @@ const router2 = r2.Router(Something)({
|
|
|
405
417
|
|
|
406
418
|
// eslint-disable-next-line unused-imports/no-unused-vars
|
|
407
419
|
const matched2 = matchAll({ router: router2 })
|
|
408
|
-
expectTypeOf({} as Layer.
|
|
409
|
-
RpcSerialization.RpcSerialization | SomeService |
|
|
420
|
+
expectTypeOf({} as Layer.Services<typeof matched2>).toEqualTypeOf<
|
|
421
|
+
RpcSerialization.RpcSerialization | SomeService | Str
|
|
410
422
|
>()
|
|
411
423
|
|
|
412
424
|
type makeContext2 = MakeContext<typeof router2[TypeTestId]>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contextProvider.test.d.ts","sourceRoot":"","sources":["../contextProvider.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"contextProvider.test.d.ts","sourceRoot":"","sources":["../contextProvider.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,IAAI,EAAY,WAAW,EAAE,MAAM,eAAe,CAAA;AAkFzE,eAAO,MAAM,mBAAmB;;CAkB9B,CAAA;AACF,eAAO,MAAM,sBAAsB;;CAkBjC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAc,MAAM,+BAA+B,CAAA;
|
|
1
|
+
{"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAc,MAAM,+BAA+B,CAAA;AAE7F,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAoC,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAEvF,OAAO,KAAK,IAAI,MAAM,gBAAgB,CAAA;AAGtC,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAG3D,OAAO,EAAE,cAAc,EAAsB,YAAY,EAAqB,YAAY,EAAoB,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,eAAe,CAAA;;cAuE/G,QAAQ;;AADzE,cAAM,kBACJ,SAAQ,uBAA0F;IAElG,MAAM,CAAC,OAAO,uDAUZ;CACH;;AAID,cAAM,GAAI,SAAQ,QAAuC;CAAG;;;;;AAE5D,qBAAa,eAAgB,SAAQ,oBAA4D;IAC/F,MAAM,CAAC,OAAO,2CAUZ;CACH;AAkFD,eAAO,MAAM,WAAW;;;;;;;;;;YAKM,CAAA;AAE9B,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAqC,CAAA;;;;;;;;;;;;;;AAEtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;;;AACtE,qBAAa,GAAI,SAAQ,QAA0C;CAAG;;;;;;;;;;;;;;;;;;AAEtE,qBAAa,WAAY,SAAQ,gBAEV;CAAG;;;;;;;;;;;;;;;;;;AAgB1B,qBAAa,YAAa,SAAQ,iBAET;CAAG;;;;;;;;;;;;;;;;;;AAE5B,qBAAa,aAAc,SAAQ,kBAEA;CAAG;;;;AAOtC,qBAAa,gBAAiB,SAAQ,qBAOrC;IACC,MAAM,CAAC,OAAO,8CAAgC;CAC/C;;;;AASD,qBAAa,aAAc,SAAQ,kBASlC;IACC,MAAM,CAAC,OAAO,2CAA8E;CAC7F;;;;AAED,qBAAa,iBAAkB,SAAQ,sBAOtC;IACC,MAAM,CAAC,OAAO,+CAAgC;CAC/C;AAED,eAAO,MAAQ,MAAM;;;;;SA3KX,CADF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4Ke,QAAQ;;0FAE9B,CAAA;AAED,eAAO,MAAM,EAAE;;;;;;;;;aA/KL,CADF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLP,CAAA"}
|