@effect-app/infra 2.80.0 → 2.81.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 +8 -0
- package/dist/api/internal/auth.d.ts +2 -2
- package/dist/api/internal/auth.d.ts.map +1 -1
- package/dist/api/internal/auth.js +5 -5
- package/dist/api/routing/middleware/DynamicMiddleware.d.ts +129 -6
- package/dist/api/routing/middleware/DynamicMiddleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/DynamicMiddleware.js +78 -7
- package/dist/api/routing/middleware/dynamic-middleware.d.ts +8 -9
- package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/dynamic-middleware.js +3 -3
- package/dist/api/routing/middleware/generic-middleware.d.ts +5 -0
- package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware/generic-middleware.js +1 -1
- package/dist/api/routing/middleware/middleware-api.d.ts +17 -0
- package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -0
- package/dist/api/routing/middleware/middleware-api.js +19 -0
- package/dist/api/routing/middleware/middleware.d.ts +3 -3
- package/dist/api/routing/middleware.d.ts +1 -0
- package/dist/api/routing/middleware.d.ts.map +1 -1
- package/dist/api/routing/middleware.js +2 -1
- package/package.json +5 -1
- package/src/api/internal/auth.ts +4 -5
- package/src/api/routing/middleware/DynamicMiddleware.ts +296 -15
- package/src/api/routing/middleware/dynamic-middleware.ts +12 -23
- package/src/api/routing/middleware/generic-middleware.ts +5 -0
- package/src/api/routing/middleware/middleware-api.ts +44 -0
- package/src/api/routing/middleware.ts +1 -0
- package/test/controller.test.ts +35 -25
- package/test/dist/controller.test.d.ts.map +1 -1
- package/test/dist/middleware-api.test.d.ts.map +1 -0
package/test/controller.test.ts
CHANGED
|
@@ -6,11 +6,11 @@ import { expect, expectTypeOf, it } from "@effect/vitest"
|
|
|
6
6
|
import { type Array, Context, Effect, Layer, Option, S, Scope } from "effect-app"
|
|
7
7
|
import { InvalidStateError, makeRpcClient, type RPCContextMap, UnauthorizedError } from "effect-app/client"
|
|
8
8
|
import { Class, TaggedError } from "effect-app/Schema"
|
|
9
|
-
import { DefaultGenericMiddlewares, implementMiddleware, makeMiddleware, Middleware, Tag } from "../src/api/routing/middleware.js"
|
|
9
|
+
import { contextMap, DefaultGenericMiddlewares, implementMiddleware, makeMiddleware, makeNewMiddleware, Middleware, Tag } from "../src/api/routing/middleware.js"
|
|
10
10
|
import { sort } from "../src/api/routing/tsort.js"
|
|
11
11
|
import { SomeService } from "./query.test.js"
|
|
12
12
|
|
|
13
|
-
class UserProfile extends Context.assignTag<UserProfile, UserProfile>("UserProfile")(
|
|
13
|
+
export class UserProfile extends Context.assignTag<UserProfile, UserProfile>("UserProfile")(
|
|
14
14
|
Class<UserProfile>("UserProfile")({
|
|
15
15
|
id: S.String,
|
|
16
16
|
roles: S.Array(S.String)
|
|
@@ -18,7 +18,7 @@ class UserProfile extends Context.assignTag<UserProfile, UserProfile>("UserProfi
|
|
|
18
18
|
) {
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
class NotLoggedInError extends TaggedError<NotLoggedInError>()("NotLoggedInError", {
|
|
21
|
+
export class NotLoggedInError extends TaggedError<NotLoggedInError>()("NotLoggedInError", {
|
|
22
22
|
message: S.String
|
|
23
23
|
}) {}
|
|
24
24
|
|
|
@@ -81,14 +81,16 @@ export type RequestContextMap = {
|
|
|
81
81
|
const Str = Context.GenericTag<"str", "str">("str")
|
|
82
82
|
const Str2 = Context.GenericTag<"str2", "str">("str2")
|
|
83
83
|
|
|
84
|
-
class AllowAnonymous extends
|
|
84
|
+
class AllowAnonymous extends Middleware.Tag<AllowAnonymous>()("AllowAnonymous", {
|
|
85
|
+
dynamic: contextMap<RequestContextMap>()("allowAnonymous")
|
|
86
|
+
})({
|
|
85
87
|
effect: Effect.gen(function*() {
|
|
86
|
-
return
|
|
87
|
-
|
|
88
|
+
return Effect.fnUntraced(
|
|
89
|
+
function*(options) {
|
|
88
90
|
yield* Scope.Scope // provided by HttpRouter.HttpRouter.Provided
|
|
89
|
-
const isLoggedIn = !!headers["x-user"]
|
|
91
|
+
const isLoggedIn = !!options.headers["x-user"]
|
|
90
92
|
if (!isLoggedIn) {
|
|
91
|
-
if (!
|
|
93
|
+
if (!options.config.allowAnonymous) {
|
|
92
94
|
return yield* new NotLoggedInError({ message: "Not logged in" })
|
|
93
95
|
}
|
|
94
96
|
return Option.none()
|
|
@@ -97,40 +99,38 @@ class AllowAnonymous extends Effect.Service<AllowAnonymous>()("AllowAnonymous",
|
|
|
97
99
|
UserProfile,
|
|
98
100
|
{ id: "whatever", roles: ["user", "manager"] }
|
|
99
101
|
))
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
+
}
|
|
103
|
+
)
|
|
102
104
|
})
|
|
103
105
|
}) {}
|
|
104
106
|
|
|
105
107
|
// @effect-diagnostics-next-line missingEffectServiceDependency:off
|
|
106
|
-
class RequireRoles
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
function*(
|
|
108
|
+
class RequireRoles
|
|
109
|
+
extends Middleware.Tag<RequireRoles>()("RequireRoles", { dynamic: contextMap<RequestContextMap>()("requireRoles") })({
|
|
110
|
+
effect: Effect.gen(function*() {
|
|
111
|
+
yield* Some
|
|
112
|
+
return Effect.fnUntraced(
|
|
113
|
+
function*(options) {
|
|
112
114
|
// we don't know if the service will be provided or not, so we use option..
|
|
113
115
|
const userProfile = yield* Effect.serviceOption(UserProfile)
|
|
114
|
-
const { requireRoles } =
|
|
116
|
+
const { requireRoles } = options.config
|
|
115
117
|
if (requireRoles && !userProfile.value?.roles?.some((role) => requireRoles.includes(role))) {
|
|
116
118
|
return yield* new UnauthorizedError({ message: "don't have the right roles" })
|
|
117
119
|
}
|
|
118
120
|
return Option.none<Context<never>>()
|
|
119
121
|
}
|
|
120
122
|
)
|
|
121
|
-
}
|
|
123
|
+
})
|
|
122
124
|
})
|
|
123
|
-
|
|
125
|
+
{
|
|
124
126
|
static dependsOn = [AllowAnonymous]
|
|
125
127
|
}
|
|
126
128
|
|
|
127
|
-
class Test extends
|
|
129
|
+
class Test extends Middleware.Tag<Test>()("Test", { dynamic: contextMap<RequestContextMap>()("test") })({
|
|
128
130
|
effect: Effect.gen(function*() {
|
|
129
|
-
return {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
})
|
|
133
|
-
}
|
|
131
|
+
return Effect.fn(function*(_options) {
|
|
132
|
+
return Option.none<Context<never>>()
|
|
133
|
+
})
|
|
134
134
|
})
|
|
135
135
|
}) {}
|
|
136
136
|
|
|
@@ -195,6 +195,16 @@ const middleware2 = makeMiddleware<RequestContextMap>()({
|
|
|
195
195
|
}
|
|
196
196
|
})
|
|
197
197
|
|
|
198
|
+
export const middleware3 = makeNewMiddleware<RequestContextMap>()(
|
|
199
|
+
...genericMiddlewares
|
|
200
|
+
)
|
|
201
|
+
.addDynamicMiddleware(AllowAnonymous)
|
|
202
|
+
.addDynamicMiddleware(Test)
|
|
203
|
+
.addDynamicMiddleware(RequireRoles)
|
|
204
|
+
.make()
|
|
205
|
+
|
|
206
|
+
expectTypeOf(middleware3).toEqualTypeOf<typeof middleware2>()
|
|
207
|
+
|
|
198
208
|
export type RequestConfig = {
|
|
199
209
|
/** Disable authentication requirement */
|
|
200
210
|
allowAnonymous?: true
|
|
@@ -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,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAA;AAEtE,OAAO,EAAE,KAAK,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../controller.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-api.test.d.ts","sourceRoot":"","sources":["../middleware-api.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAyB,MAAM,YAAY,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,KAAK,aAAa,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC3F,OAAO,EAA4D,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAC5G,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,aAAa,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,gBAAgB,CAAC,CAAA;IAC5E,YAAY,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,iBAAiB,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAA;CACnF,CAAA;;;;;;;;;AAED,qBAAa,cAAe,SAAQ,mBAoBlC;CAAG;AAyBL,eAAO,MAAM,UAAU;;;;;CAQd,CAAA"}
|