@effect-app/infra 3.0.3 → 3.0.5
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 +15 -0
- package/dist/Emailer/service.d.ts +1 -1
- package/dist/MainFiberSet.d.ts +1 -1
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -1
- package/dist/Model/Repository/internal/internal.js +2 -2
- package/dist/Model/query/new-kid-interpreter.d.ts +1 -1
- package/dist/Operations.d.ts +1 -1
- package/dist/QueueMaker/errors.d.ts +1 -1
- package/dist/QueueMaker/errors.d.ts.map +1 -1
- package/dist/RequestFiberSet.d.ts +1 -1
- package/dist/Store/service.d.ts +2 -2
- package/dist/adapters/SQL/Model.d.ts +6 -6
- package/dist/adapters/ServiceBus.d.ts +2 -2
- package/dist/adapters/memQueue.d.ts +1 -1
- package/dist/api/routing/middleware/RouterMiddleware.d.ts +2 -3
- package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.d.ts +5 -5
- package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/middleware.js +6 -6
- package/dist/api/routing.d.ts +2 -2
- package/dist/api/routing.d.ts.map +1 -1
- package/dist/api/routing.js +2 -3
- package/package.json +6 -6
- package/src/Model/Repository/internal/internal.ts +1 -2
- package/src/api/routing/middleware/RouterMiddleware.ts +2 -3
- package/src/api/routing/middleware/middleware.ts +5 -5
- package/src/api/routing.ts +5 -6
- package/test/controller.test.ts +73 -63
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/fixtures.d.ts +11 -10
- package/test/dist/fixtures.d.ts.map +1 -1
- package/test/dist/fixtures.js +6 -6
- 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 +5 -5
- package/test/rawQuery.test.ts +4 -4
- package/test/requires.test.ts +6 -5
- package/test/rpc-multi-middleware.test.ts +29 -35
- package/wallaby.cjs +0 -1
|
@@ -3,13 +3,12 @@
|
|
|
3
3
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
4
4
|
import { type RpcMiddleware } from "@effect/rpc"
|
|
5
5
|
import { type Context, type Layer } from "effect-app"
|
|
6
|
-
import type
|
|
7
|
-
import { type MiddlewareMakerId } from "effect-app/rpc"
|
|
6
|
+
import { type GetContextConfig, type MiddlewareMakerId, type RpcContextMap } from "effect-app/rpc"
|
|
8
7
|
// module:
|
|
9
8
|
//
|
|
10
9
|
|
|
11
10
|
export type RouterMiddleware<
|
|
12
|
-
RequestContextMap extends Record<string,
|
|
11
|
+
RequestContextMap extends Record<string, RpcContextMap.Any>, // what services will the middlware provide dynamically to the next, or raise errors.
|
|
13
12
|
MakeMiddlewareE, // what the middleware construction can fail with
|
|
14
13
|
MakeMiddlewareR, // what the middlware requires to be constructed
|
|
15
14
|
ContextProviderA, // what the context provider provides
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
2
|
import { Cause, Duration, Effect, Layer, ParseResult, Request, Schedule, type Schema } from "effect"
|
|
3
|
-
import
|
|
3
|
+
import { ConfigureInterruptibilityMiddleware, DevMode, LoggerMiddleware, RequestCacheMiddleware } from "effect-app/middleware"
|
|
4
4
|
import { pretty } from "effect-app/utils"
|
|
5
5
|
import { logError, reportError } from "../../../errorReporter.js"
|
|
6
6
|
import { InfraLogger } from "../../../logger.js"
|
|
@@ -18,7 +18,7 @@ export const RequestCacheLayers = Layer.mergeAll(
|
|
|
18
18
|
)
|
|
19
19
|
|
|
20
20
|
export const RequestCacheMiddlewareLive = Layer.succeed(
|
|
21
|
-
|
|
21
|
+
RequestCacheMiddleware,
|
|
22
22
|
(effect) => effect.pipe(Effect.provide(RequestCacheLayers))
|
|
23
23
|
)
|
|
24
24
|
|
|
@@ -28,7 +28,7 @@ const optimisticConcurrencySchedule = Schedule.once.pipe(
|
|
|
28
28
|
)
|
|
29
29
|
|
|
30
30
|
export const ConfigureInterruptibilityMiddlewareLive = Layer.effect(
|
|
31
|
-
|
|
31
|
+
ConfigureInterruptibilityMiddleware,
|
|
32
32
|
Effect.gen(function*() {
|
|
33
33
|
const cache = new Map()
|
|
34
34
|
const getCached = (key: string, schema: Schema.Schema.Any) => {
|
|
@@ -51,9 +51,9 @@ export const ConfigureInterruptibilityMiddlewareLive = Layer.effect(
|
|
|
51
51
|
)
|
|
52
52
|
|
|
53
53
|
export const LoggerMiddlewareLive = Layer.effect(
|
|
54
|
-
|
|
54
|
+
LoggerMiddleware,
|
|
55
55
|
Effect.gen(function*() {
|
|
56
|
-
const devMode = yield*
|
|
56
|
+
const devMode = yield* DevMode
|
|
57
57
|
return (effect, { headers, payload, rpc }) =>
|
|
58
58
|
Effect
|
|
59
59
|
.annotateCurrentSpan({
|
package/src/api/routing.ts
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
5
|
import { Rpc, RpcGroup, type RpcSerialization, RpcServer } from "@effect/rpc"
|
|
6
6
|
import { type Array, Effect, Layer, type NonEmptyReadonlyArray, Predicate, S, Schema, type Scope } from "effect-app"
|
|
7
|
-
import type { GetEffectContext, GetEffectError, RPCContextMap } from "effect-app/client/req"
|
|
8
7
|
import { type HttpHeaders } from "effect-app/http"
|
|
9
|
-
import { DevMode } from "effect-app/
|
|
8
|
+
import { DevMode } from "effect-app/middleware"
|
|
9
|
+
import { type GetEffectContext, type GetEffectError, type RpcContextMap } from "effect-app/rpc"
|
|
10
10
|
import { type TypeTestId } from "effect-app/TypeTest"
|
|
11
11
|
import { typedKeysOf, typedValuesOf } from "effect-app/utils"
|
|
12
12
|
import { type Service } from "effect/Effect"
|
|
@@ -93,7 +93,7 @@ type FilterRequestModules<T> = {
|
|
|
93
93
|
[K in keyof T as T[K] extends AnyRequestModule ? K : never]: T[K]
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
type
|
|
96
|
+
type RpcRouteR<
|
|
97
97
|
T extends [any, (req: any, headers: HttpHeaders.Headers) => Effect<any, any, any>]
|
|
98
98
|
> = T extends [
|
|
99
99
|
any,
|
|
@@ -153,7 +153,7 @@ export type RouteMatcher<
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
export const makeRouter = <
|
|
156
|
-
RequestContextMap extends Record<string,
|
|
156
|
+
RequestContextMap extends Record<string, RpcContextMap.Any>,
|
|
157
157
|
MakeMiddlewareE,
|
|
158
158
|
MakeMiddlewareR,
|
|
159
159
|
ContextProviderA,
|
|
@@ -347,7 +347,6 @@ export const makeRouter = <
|
|
|
347
347
|
match: any
|
|
348
348
|
) => Effect<THandlers, MakeE, MakeR> | Generator<YieldWrap<Effect<any, MakeE, MakeR>>, THandlers, any>
|
|
349
349
|
) => {
|
|
350
|
-
console.log({ dependencies, make })
|
|
351
350
|
const dependenciesL = (dependencies ? Layer.mergeAll(...dependencies as any) : Layer.empty) as Layer.Layer<
|
|
352
351
|
LayerUtils.GetLayersSuccess<MakeDependencies>,
|
|
353
352
|
LayerUtils.GetLayersError<MakeDependencies>,
|
|
@@ -428,7 +427,7 @@ export const makeRouter = <
|
|
|
428
427
|
})) as unknown as Layer<
|
|
429
428
|
{ [K in keyof RequestModules]: Rpc.Handler<K> },
|
|
430
429
|
MakeE,
|
|
431
|
-
|
|
430
|
+
RpcRouteR<typeof mapped[keyof typeof mapped]>
|
|
432
431
|
>
|
|
433
432
|
|
|
434
433
|
return RpcServer
|
package/test/controller.test.ts
CHANGED
|
@@ -5,91 +5,101 @@ import { type RpcSerialization } from "@effect/rpc"
|
|
|
5
5
|
import { expect, expectTypeOf, it } from "@effect/vitest"
|
|
6
6
|
import { Context, Effect, Layer, S, Scope } from "effect-app"
|
|
7
7
|
import { InvalidStateError, makeRpcClient, NotLoggedInError, UnauthorizedError } from "effect-app/client"
|
|
8
|
-
import { DefaultGenericMiddlewares
|
|
8
|
+
import { DefaultGenericMiddlewares } from "effect-app/middleware"
|
|
9
|
+
import { makeMiddleware, Tag } from "effect-app/rpc"
|
|
9
10
|
import { TypeTestId } from "effect-app/TypeTest"
|
|
10
11
|
import { DefaultGenericMiddlewaresLive } from "../src/api/routing/middleware.js"
|
|
11
12
|
import { sort } from "../src/api/routing/tsort.js"
|
|
12
13
|
import { AllowAnonymous, AllowAnonymousLive, CustomError1, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElse, SomeService, Test, TestLive } from "./fixtures.js"
|
|
13
14
|
|
|
14
15
|
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
15
|
-
class MyContextProvider extends
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
16
|
+
class MyContextProvider extends Context.DefineService(
|
|
17
|
+
Tag<MyContextProvider, {
|
|
18
|
+
provides: Some
|
|
19
|
+
requires: SomeElse
|
|
20
|
+
}>()("MyContextProvider", {}),
|
|
21
|
+
{
|
|
22
|
+
effect: Effect.gen(function*() {
|
|
23
|
+
yield* SomeService
|
|
24
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
25
|
+
|
|
26
|
+
return Effect.fnUntraced(function*(effect) {
|
|
27
|
+
yield* SomeElse
|
|
28
|
+
// the only requirements you can have are the one provided by HttpLayerRouter.Provided
|
|
29
|
+
yield* Scope.Scope
|
|
30
|
+
|
|
31
|
+
yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
|
|
32
|
+
yield* Effect.succeed("this is a generator")
|
|
33
|
+
|
|
34
|
+
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
35
|
+
// yield* SomeElse
|
|
36
|
+
|
|
37
|
+
// currently the effectful context provider cannot trigger an error when building the per request context
|
|
38
|
+
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
39
|
+
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
40
|
+
|
|
41
|
+
return yield* Effect.provideService(effect, Some, new Some({ a: 1 }))
|
|
42
|
+
})
|
|
39
43
|
})
|
|
40
|
-
}
|
|
41
|
-
|
|
44
|
+
}
|
|
45
|
+
) {}
|
|
42
46
|
|
|
43
47
|
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
44
|
-
class MyContextProvider3 extends
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
48
|
+
class MyContextProvider3 extends Context.DefineService(
|
|
49
|
+
Tag<MyContextProvider3, {
|
|
50
|
+
provides: Some
|
|
51
|
+
requires: SomeElse
|
|
52
|
+
}>()("MyContextProvider3", {}),
|
|
53
|
+
{
|
|
54
|
+
dependencies: [Layer.effect(SomeService, SomeService.make)],
|
|
55
|
+
effect: Effect.gen(function*() {
|
|
56
|
+
yield* SomeService
|
|
57
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
58
|
+
|
|
59
|
+
return Effect.fnUntraced(function*(effect) {
|
|
60
|
+
yield* SomeElse
|
|
61
|
+
// the only requirements you can have are the one provided by HttpLayerRouter.Provided
|
|
62
|
+
yield* Scope.Scope
|
|
63
|
+
|
|
64
|
+
yield* Effect.logInfo("MyContextProviderGen", "this is a generator")
|
|
65
|
+
yield* Effect.succeed("this is a generator")
|
|
66
|
+
|
|
67
|
+
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
68
|
+
// yield* SomeElse
|
|
69
|
+
|
|
70
|
+
// currently the effectful context provider cannot trigger an error when building the per request context
|
|
71
|
+
// this is allowed here but mergeContextProviders/MergedContextProvider will trigger an error
|
|
72
|
+
// if (Math.random() > 0.5) return yield* new CustomError2()
|
|
73
|
+
|
|
74
|
+
return yield* Effect.provideService(effect, Some, new Some({ a: 1 }))
|
|
75
|
+
})
|
|
69
76
|
})
|
|
70
|
-
}
|
|
71
|
-
|
|
77
|
+
}
|
|
78
|
+
) {}
|
|
72
79
|
|
|
73
80
|
expectTypeOf(MyContextProvider3.Default).toEqualTypeOf<Layer.Layer<MyContextProvider3, CustomError1, never>>()
|
|
74
81
|
|
|
75
82
|
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
76
|
-
class MyContextProvider2 extends
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
class MyContextProvider2 extends Context.DefineService(
|
|
84
|
+
Tag<MyContextProvider2, { provides: SomeElse }>()("MyContextProvider2", {}),
|
|
85
|
+
{
|
|
86
|
+
effect: Effect.gen(function*() {
|
|
87
|
+
if (Math.random() > 0.5) return yield* new CustomError1()
|
|
79
88
|
|
|
80
|
-
|
|
81
|
-
|
|
89
|
+
return Effect.fnUntraced(function*(effect) {
|
|
90
|
+
// we test without dependencies, so that we end up with an R of never.
|
|
82
91
|
|
|
83
|
-
|
|
92
|
+
return yield* Effect.provideService(effect, SomeElse, new SomeElse({ b: 2 }))
|
|
93
|
+
})
|
|
84
94
|
})
|
|
85
|
-
}
|
|
86
|
-
|
|
95
|
+
}
|
|
96
|
+
) {}
|
|
87
97
|
|
|
88
98
|
//
|
|
89
99
|
|
|
90
100
|
const Str = Context.GenericTag<"str", "str">("str")
|
|
91
101
|
|
|
92
|
-
export class BogusMiddleware extends
|
|
102
|
+
export class BogusMiddleware extends Context.DefineService(Tag<BogusMiddleware>()("BogusMiddleware", {}), {
|
|
93
103
|
effect: Effect.gen(function*() {
|
|
94
104
|
yield* Str
|
|
95
105
|
// yield* Effect.context<"test-dep">()
|
|
@@ -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;AAC7F,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAW,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY,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;AAC7F,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAEnD,OAAO,EAAW,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAO7D,OAAO,EAAE,cAAc,EAAsB,YAAY,EAAE,iBAAiB,EAAE,YAAY,EAAoB,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAY,MAAM,eAAe,CAAA;;cAuE1I,QAAQ;;;;AAD9C,cAAM,kBAAmB,SAAQ,uBAahC;CAAG;;;;;;;AAMJ,qBAAa,eAAgB,SAAQ,oBAUnC;CACD;AAgED,eAAO,MAAM,WAAW;;;;;;YAIM,CAAA;AAE9B,MAAM,MAAM,aAAa,GAAG;IAC1B,yCAAyC;IACzC,cAAc,CAAC,EAAE,IAAI,CAAA;IACrB,iEAAiE;IACjE,UAAU,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC/B,CAAA;AACD,eAAO,MAAuB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAI/B,CAAA;;;;;;;;;;AAEF,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;;;;;AAItC,qBAAa,gBAAiB,SAAQ,qBAKpC;CAAG;;;;;AASL,qBAAa,aAAc,SAAQ,kBAOjC;CAAG;;;;;AAEL,qBAAa,iBAAkB,SAAQ,sBAKrC;CAAG;AAUL,eAAO,MAAQ,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAE,QAAQ;;qGAK9B,CAAA;AAED,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAGd,CAAA"}
|
package/test/dist/fixtures.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Context, Effect, Layer, S, Scope } from "effect-app";
|
|
2
|
-
import { NotLoggedInError,
|
|
2
|
+
import { NotLoggedInError, UnauthorizedError } from "effect-app/client";
|
|
3
|
+
import { RpcContextMap } from "effect-app/rpc";
|
|
3
4
|
declare const UserProfile_base: S.EnhancedClass<UserProfile, {
|
|
4
5
|
id: typeof S.String;
|
|
5
6
|
roles: S.Array$<typeof S.String> & {
|
|
@@ -36,7 +37,7 @@ declare const Some_base: (abstract new (service: {
|
|
|
36
37
|
} & {
|
|
37
38
|
use: <X>(body: (_: {
|
|
38
39
|
a: number;
|
|
39
|
-
}) => X) => X extends Effect.Effect<infer
|
|
40
|
+
}) => X) => X extends Effect.Effect<infer A, infer E_1, infer R_3> ? Effect.Effect<A, E_1, Some | R_3> : Effect.Effect<X, never, Some>;
|
|
40
41
|
};
|
|
41
42
|
export declare class Some extends Some_base {
|
|
42
43
|
}
|
|
@@ -62,7 +63,7 @@ declare const SomeElse_base: (abstract new (service: {
|
|
|
62
63
|
} & {
|
|
63
64
|
use: <X>(body: (_: {
|
|
64
65
|
b: number;
|
|
65
|
-
}) => X) => X extends Effect.Effect<infer
|
|
66
|
+
}) => X) => X extends Effect.Effect<infer A, infer E_1, infer R_3> ? Effect.Effect<A, E_1, R_3 | SomeElse> : Effect.Effect<X, never, SomeElse>;
|
|
66
67
|
};
|
|
67
68
|
export declare class SomeElse extends SomeElse_base {
|
|
68
69
|
}
|
|
@@ -88,7 +89,7 @@ declare const SomeService_base: (abstract new (service: {
|
|
|
88
89
|
} & {
|
|
89
90
|
use: <X>(body: (_: {
|
|
90
91
|
a: number;
|
|
91
|
-
}) => X) => X extends Effect.Effect<infer
|
|
92
|
+
}) => X) => X extends Effect.Effect<infer A, infer E_1, infer R_3> ? Effect.Effect<A, E_1, R_3 | SomeService> : Effect.Effect<X, never, SomeService>;
|
|
92
93
|
};
|
|
93
94
|
export declare class SomeService extends SomeService_base {
|
|
94
95
|
}
|
|
@@ -105,15 +106,15 @@ export declare class SomeElseMiddleware extends SomeElseMiddleware_base {
|
|
|
105
106
|
}
|
|
106
107
|
export declare const SomeElseMiddlewareLive: Layer.Layer<SomeElseMiddleware, never, never>;
|
|
107
108
|
export declare const RequestContextMap: {
|
|
108
|
-
readonly allowAnonymous:
|
|
109
|
-
readonly requireRoles:
|
|
110
|
-
readonly test:
|
|
109
|
+
readonly allowAnonymous: RpcContextMap.Inverted<[typeof UserProfile], typeof NotLoggedInError>;
|
|
110
|
+
readonly requireRoles: RpcContextMap.Custom<never, typeof UnauthorizedError, string[]>;
|
|
111
|
+
readonly test: RpcContextMap.RpcContextMap<never, typeof S.Never>;
|
|
111
112
|
};
|
|
112
113
|
type _RequestContextMap = typeof RequestContextMap;
|
|
113
114
|
export interface RequestContextMap extends _RequestContextMap {
|
|
114
115
|
}
|
|
115
116
|
declare const AllowAnonymous_base: import("effect-app/rpc").TagClass<AllowAnonymous, "AllowAnonymous", {
|
|
116
|
-
readonly dynamic: import("effect-app/rpc").RpcDynamic<"allowAnonymous",
|
|
117
|
+
readonly dynamic: import("effect-app/rpc").RpcDynamic<"allowAnonymous", RpcContextMap.Inverted<[typeof UserProfile], typeof NotLoggedInError>>;
|
|
117
118
|
}, {
|
|
118
119
|
requires: SomeElse;
|
|
119
120
|
}>;
|
|
@@ -121,7 +122,7 @@ export declare class AllowAnonymous extends AllowAnonymous_base {
|
|
|
121
122
|
}
|
|
122
123
|
export declare const AllowAnonymousLive: Layer.Layer<AllowAnonymous, never, never>;
|
|
123
124
|
declare const RequireRoles_base: import("effect-app/rpc").TagClass<RequireRoles, "RequireRoles", {
|
|
124
|
-
readonly dynamic: import("effect-app/rpc").RpcDynamic<"requireRoles",
|
|
125
|
+
readonly dynamic: import("effect-app/rpc").RpcDynamic<"requireRoles", RpcContextMap.Custom<never, typeof UnauthorizedError, string[]>>;
|
|
125
126
|
readonly dependsOn: readonly [typeof AllowAnonymous];
|
|
126
127
|
}, {
|
|
127
128
|
requires: never;
|
|
@@ -131,7 +132,7 @@ export declare class RequireRoles extends RequireRoles_base {
|
|
|
131
132
|
}
|
|
132
133
|
export declare const RequireRolesLive: Layer.Layer<RequireRoles, never, SomeService>;
|
|
133
134
|
declare const Test_base: import("effect-app/rpc").TagClass<Test, "Test", {
|
|
134
|
-
readonly dynamic: import("effect-app/rpc").RpcDynamic<"test",
|
|
135
|
+
readonly dynamic: import("effect-app/rpc").RpcDynamic<"test", RpcContextMap.RpcContextMap<never, typeof S.Never>>;
|
|
135
136
|
}, {
|
|
136
137
|
requires: never;
|
|
137
138
|
provides: never;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"fixtures.d.ts","sourceRoot":"","sources":["../fixtures.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAC7D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAyB,aAAa,EAAO,MAAM,gBAAgB,CAAA;;;;;;;;;;;;;AAG1E,qBAAa,WAAY,SAAQ,gBAKhC;CACA;;;;;;;;;;;;;;;;;;;;;;;;;AAED,qBAAa,IAAK,SAAQ,SAA2D;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;AACxF,qBAAa,QAAS,SAAQ,aAAmE;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;AAEpG,qBAAa,WAAY,SAAQ,gBAAgE;CAAG;;cAGhC,IAAI;;AAAxE,qBAAa,cAAe,SAAQ,mBAA+D;CAClG;AAED,eAAO,MAAM,kBAAkB,2CAM9B,CAAA;;cAE2E,QAAQ;;AAApF,qBAAa,kBAAmB,SAAQ,uBAA2E;CAAG;AAEtH,eAAO,MAAM,sBAAsB,+CAUlC,CAAA;AASD,eAAO,MAAM,iBAAiB;;;;CAIpB,CAAA;AAEV,KAAK,kBAAkB,GAAG,OAAO,iBAAiB,CAAA;AAClD,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;CAAG;;;;cAEI,QAAQ;;AAA5E,qBAAa,cAAe,SAAQ,mBAElC;CAAG;AAEL,eAAO,MAAM,kBAAkB,2CAyB9B,CAAA;;;;;;;;AAID,qBAAa,YAAa,SAAQ,iBAKhC;CAAG;AAEL,eAAO,MAAM,gBAAgB,+CAuB5B,CAAA;;;;;;;AAGD,qBAAa,IAAK,SAAQ,SAExB;CAAG;AAEL,eAAO,MAAM,QAAQ,iCAOpB,CAAA;;;;AAED,qBAAa,YAAa,SAAQ,iBAAmD;CAAG;;;;AACxF,qBAAa,YAAa,SAAQ,iBAAmD;CAAG"}
|
package/test/dist/fixtures.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context, Effect, Layer, S, Scope } from "effect-app";
|
|
2
|
-
import { NotLoggedInError,
|
|
3
|
-
import { contextMap, getConfig, Tag } from "effect-app/rpc";
|
|
2
|
+
import { NotLoggedInError, UnauthorizedError } from "effect-app/client";
|
|
3
|
+
import { contextMap, getConfig, RpcContextMap, Tag } from "effect-app/rpc";
|
|
4
4
|
import { TaggedError } from "effect-app/Schema";
|
|
5
5
|
export class UserProfile extends Context.assignTag("UserProfile")(S.Class("UserProfile")({
|
|
6
6
|
id: S.String,
|
|
@@ -37,9 +37,9 @@ const requestConfig = getConfig();
|
|
|
37
37
|
//
|
|
38
38
|
// consider if we want to support Context of one Service
|
|
39
39
|
export const RequestContextMap = {
|
|
40
|
-
allowAnonymous:
|
|
41
|
-
requireRoles:
|
|
42
|
-
test:
|
|
40
|
+
allowAnonymous: RpcContextMap.makeInverted([UserProfile], NotLoggedInError),
|
|
41
|
+
requireRoles: RpcContextMap.makeCustom(null, UnauthorizedError, Array()),
|
|
42
|
+
test: RpcContextMap.make(null, S.Never)
|
|
43
43
|
};
|
|
44
44
|
export class AllowAnonymous extends Tag()("AllowAnonymous", {
|
|
45
45
|
dynamic: contextMap(RequestContextMap, "allowAnonymous")
|
|
@@ -101,4 +101,4 @@ export class CustomError1 extends TaggedError()("CustomError1", {}) {
|
|
|
101
101
|
}
|
|
102
102
|
export class CustomError2 extends TaggedError()("CustomError1", {}) {
|
|
103
103
|
}
|
|
104
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZml4dHVyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9maXh0dXJlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUM3RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBRS9DLE1BQU0sT0FBTyxXQUFZLFNBQVEsT0FBTyxDQUFDLFNBQVMsQ0FBMkIsYUFBYSxDQUFDLENBQ3pGLENBQUMsQ0FBQyxLQUFLLENBQWMsYUFBYSxDQUFDLENBQUM7SUFDbEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNO0lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztDQUN6QixDQUFDLENBQ0g7Q0FDQTtBQUVELE1BQU0sT0FBTyxJQUFLLFNBQVEsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQVE7Q0FBRztBQUN4RixNQUFNLE9BQU8sUUFBUyxTQUFRLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFZO0NBQUc7QUFDcEcsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0FBQ2hELE1BQU0sT0FBTyxXQUFZLFNB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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requires.test.d.ts","sourceRoot":"","sources":["../requires.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAGvE,OAAO,EAAE,cAAc,EAAyC,YAAY,EAAoB,IAAI,EAAE,kBAAkB,EAA0B,cAAc,EAAmC,IAAI,EAAY,MAAM,eAAe,CAAA;;
|
|
1
|
+
{"version":3,"file":"requires.test.d.ts","sourceRoot":"","sources":["../requires.test.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAGvE,OAAO,EAAE,cAAc,EAAyC,YAAY,EAAoB,IAAI,EAAE,kBAAkB,EAA0B,cAAc,EAAmC,IAAI,EAAY,MAAM,eAAe,CAAA;;cAG9L,IAAI;;;;AAD9C,qBAAa,sBAAuB,SAAQ,2BAY3C;CACA;AAkBD,eAAO,MAAM,eAAe;;;;;;;;;;SAKK,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-multi-middleware.test.d.ts","sourceRoot":"","sources":["../rpc-multi-middleware.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAkD,MAAM,aAAa,CAAA;AAEvF,OAAO,EAA2B,KAAK,EAAE,MAAM,QAAQ,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-multi-middleware.test.d.ts","sourceRoot":"","sources":["../rpc-multi-middleware.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAkD,MAAM,aAAa,CAAA;AAEvF,OAAO,EAA2B,KAAK,EAAE,MAAM,QAAQ,CAAA;AAQvD,OAAO,EAA4M,WAAW,EAAE,MAAM,eAAe,CAAA;AA4CrP,eAAO,MAAM,OAAO,uFAMhB,CAAA;AAiBJ,eAAO,MAAM,YAAY,yKAItB,CAAA;AAEH,eAAO,MAAM,YAAY,+FAgByB,CAAA"}
|
package/test/fixtures.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Context, Effect, Layer, S, Scope } from "effect-app"
|
|
2
|
-
import { NotLoggedInError,
|
|
3
|
-
import { contextMap, getConfig, Tag } from "effect-app/rpc"
|
|
2
|
+
import { NotLoggedInError, UnauthorizedError } from "effect-app/client"
|
|
3
|
+
import { contextMap, getConfig, RpcContextMap, Tag } from "effect-app/rpc"
|
|
4
4
|
import { TaggedError } from "effect-app/Schema"
|
|
5
5
|
|
|
6
6
|
export class UserProfile extends Context.assignTag<UserProfile, UserProfile>("UserProfile")(
|
|
@@ -50,9 +50,9 @@ const requestConfig = getConfig<RequestContextMap>()
|
|
|
50
50
|
//
|
|
51
51
|
// consider if we want to support Context of one Service
|
|
52
52
|
export const RequestContextMap = {
|
|
53
|
-
allowAnonymous:
|
|
54
|
-
requireRoles:
|
|
55
|
-
test:
|
|
53
|
+
allowAnonymous: RpcContextMap.makeInverted([UserProfile], NotLoggedInError),
|
|
54
|
+
requireRoles: RpcContextMap.makeCustom(null as never, UnauthorizedError, Array<string>()),
|
|
55
|
+
test: RpcContextMap.make(null as never, S.Never)
|
|
56
56
|
} as const
|
|
57
57
|
|
|
58
58
|
type _RequestContextMap = typeof RequestContextMap
|
package/test/rawQuery.test.ts
CHANGED
|
@@ -137,7 +137,7 @@ describe("select first-level array fields", () => {
|
|
|
137
137
|
})
|
|
138
138
|
.pipe(setupRequestContextFromCurrent())
|
|
139
139
|
|
|
140
|
-
it("works well in CosmosDB", () =>
|
|
140
|
+
it.skipIf(!process.env["STORAGE_URL"])("works well in CosmosDB", () =>
|
|
141
141
|
test
|
|
142
142
|
.pipe(Effect.provide(SomethingRepo.TestCosmos), rt.runPromise))
|
|
143
143
|
|
|
@@ -232,7 +232,7 @@ describe("filter first-level array fields as groups", () => {
|
|
|
232
232
|
})
|
|
233
233
|
.pipe(setupRequestContextFromCurrent())
|
|
234
234
|
|
|
235
|
-
it("works well in CosmosDB", () =>
|
|
235
|
+
it.skipIf(!process.env["STORAGE_URL"])("works well in CosmosDB", () =>
|
|
236
236
|
test
|
|
237
237
|
.pipe(Effect.provide(SomethingRepo.TestCosmos), rt.runPromise))
|
|
238
238
|
|
|
@@ -302,7 +302,7 @@ describe("1", () => {
|
|
|
302
302
|
})
|
|
303
303
|
.pipe(setupRequestContextFromCurrent())
|
|
304
304
|
|
|
305
|
-
it("works well in CosmosDB", () =>
|
|
305
|
+
it.skipIf(!process.env["STORAGE_URL"])("works well in CosmosDB", () =>
|
|
306
306
|
test
|
|
307
307
|
.pipe(Effect.provide(SomethingRepo.TestCosmos), rt.runPromise))
|
|
308
308
|
|
|
@@ -330,7 +330,7 @@ describe("multi-level", () => {
|
|
|
330
330
|
})
|
|
331
331
|
.pipe(setupRequestContextFromCurrent())
|
|
332
332
|
|
|
333
|
-
it("works well in CosmosDB", () =>
|
|
333
|
+
it.skipIf(!process.env["STORAGE_URL"])("works well in CosmosDB", () =>
|
|
334
334
|
test
|
|
335
335
|
.pipe(Effect.provide(SomethingRepo.TestCosmos), rt.runPromise))
|
|
336
336
|
|
package/test/requires.test.ts
CHANGED
|
@@ -4,11 +4,12 @@ import { describe, expect, expectTypeOf, it } from "@effect/vitest"
|
|
|
4
4
|
import { Context, Effect, Either, Layer, S } from "effect-app"
|
|
5
5
|
import { NotLoggedInError, UnauthorizedError } from "effect-app/client"
|
|
6
6
|
import { HttpHeaders } from "effect-app/http"
|
|
7
|
-
import { makeMiddleware,
|
|
7
|
+
import { makeMiddleware, Tag } from "effect-app/rpc"
|
|
8
8
|
import { AllowAnonymous, AllowAnonymousLive, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElseMiddleware, SomeElseMiddlewareLive, SomeMiddleware, SomeMiddlewareLive, SomeService, Test, TestLive } from "./fixtures.js"
|
|
9
9
|
|
|
10
|
-
export class RequiresSomeMiddleware
|
|
11
|
-
|
|
10
|
+
export class RequiresSomeMiddleware extends Context.DefineService(
|
|
11
|
+
Tag<RequiresSomeMiddleware, { requires: Some }>()("RequiresSomeMiddleware", {}),
|
|
12
|
+
{
|
|
12
13
|
effect: Effect.gen(function*() {
|
|
13
14
|
// yield* Effect.context<"test-dep">()
|
|
14
15
|
return Effect.fnUntraced(function*(effect) {
|
|
@@ -17,8 +18,8 @@ export class RequiresSomeMiddleware
|
|
|
17
18
|
return yield* effect
|
|
18
19
|
})
|
|
19
20
|
})
|
|
20
|
-
}
|
|
21
|
-
{
|
|
21
|
+
}
|
|
22
|
+
) {
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
const middleware3 = makeMiddleware(RequestContextMap)
|
|
@@ -6,7 +6,8 @@ import { Console, Effect, Either, Layer } from "effect"
|
|
|
6
6
|
import { S } from "effect-app"
|
|
7
7
|
import { NotLoggedInError } from "effect-app/client"
|
|
8
8
|
import { HttpLayerRouter } from "effect-app/http"
|
|
9
|
-
import { DefaultGenericMiddlewares
|
|
9
|
+
import { DefaultGenericMiddlewares } from "effect-app/middleware"
|
|
10
|
+
import { makeMiddleware, middlewareGroup } from "effect-app/rpc"
|
|
10
11
|
import { createServer } from "http"
|
|
11
12
|
import { DefaultGenericMiddlewaresLive } from "../src/api/routing.js"
|
|
12
13
|
import { AllowAnonymous, AllowAnonymousLive, RequestContextMap, RequireRoles, RequireRolesLive, Some, SomeElseMiddleware, SomeElseMiddlewareLive, SomeMiddleware, SomeMiddlewareLive, SomeService, Test, TestLive, UserProfile } from "./fixtures.js"
|
|
@@ -17,56 +18,49 @@ const middleware = makeMiddleware(RequestContextMap)
|
|
|
17
18
|
.middleware(SomeElseMiddleware, SomeMiddleware)
|
|
18
19
|
.middleware(...DefaultGenericMiddlewares)
|
|
19
20
|
|
|
20
|
-
const UserRpcs = middlewareGroup(middleware)(
|
|
21
|
-
.make(
|
|
21
|
+
const UserRpcs = middlewareGroup(middleware)(
|
|
22
|
+
RpcGroup.make(
|
|
22
23
|
middleware.rpc("getUser", {
|
|
23
24
|
success: S.Literal("awesome")
|
|
24
25
|
}),
|
|
25
26
|
middleware.rpc("doSomething", {
|
|
26
27
|
success: S.Literal("also-awesome"),
|
|
27
|
-
config: { allowAnonymous: true }
|
|
28
|
+
config: { allowAnonymous: true } // type safe config based on `RequestContextMap`
|
|
28
29
|
})
|
|
29
|
-
)
|
|
30
|
+
)
|
|
31
|
+
)
|
|
30
32
|
|
|
31
|
-
const impl =
|
|
32
|
-
.
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
return "also-awesome" as const
|
|
43
|
-
})
|
|
44
|
-
})
|
|
45
|
-
return impl
|
|
33
|
+
const impl = UserRpcs
|
|
34
|
+
.toLayerDynamic({
|
|
35
|
+
getUser: Effect.fn(function*(_payload, _headers) {
|
|
36
|
+
yield* Some
|
|
37
|
+
yield* UserProfile // we only access it while protected by allowAnonymous: false
|
|
38
|
+
return "awesome" as const
|
|
39
|
+
}),
|
|
40
|
+
doSomething: Effect.fn(function*() {
|
|
41
|
+
console.log(yield* Effect.serviceOption(UserProfile)) // we access it optionally, while allowAnonymous: true
|
|
42
|
+
return "also-awesome" as const
|
|
43
|
+
})
|
|
46
44
|
})
|
|
47
|
-
.pipe(Layer.unwrapEffect)
|
|
48
45
|
|
|
49
46
|
expectTypeOf<Layer.Layer.Context<typeof impl>>().toEqualTypeOf<never>()
|
|
50
47
|
|
|
51
|
-
const UserRpcsBad = middlewareGroup(middleware)(
|
|
52
|
-
.make(
|
|
48
|
+
const UserRpcsBad = middlewareGroup(middleware)(
|
|
49
|
+
RpcGroup.make(
|
|
53
50
|
middleware.rpc("doSomethingElse", {
|
|
54
51
|
success: S.Literal("also-awesome2"),
|
|
55
52
|
config: { allowAnonymous: true }
|
|
56
53
|
})
|
|
57
|
-
)
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
})
|
|
67
|
-
return impl
|
|
54
|
+
)
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
export const badImpl = UserRpcsBad
|
|
58
|
+
.toLayerDynamic({
|
|
59
|
+
doSomethingElse: Effect.fn(function*() {
|
|
60
|
+
console.log(yield* UserProfile) // bad boy! allowAnonymous: false, so `UserProfile` must fall through to the Layer R.
|
|
61
|
+
return "also-awesome2" as const
|
|
62
|
+
})
|
|
68
63
|
})
|
|
69
|
-
.pipe(Layer.unwrapEffect)
|
|
70
64
|
|
|
71
65
|
expectTypeOf<Layer.Layer.Context<typeof badImpl>>().toEqualTypeOf<UserProfile>()
|
|
72
66
|
|
package/wallaby.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require("../../wallaby.base.cjs")
|