@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.
Files changed (30) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/api/internal/auth.d.ts +2 -2
  3. package/dist/api/internal/auth.d.ts.map +1 -1
  4. package/dist/api/internal/auth.js +5 -5
  5. package/dist/api/routing/middleware/DynamicMiddleware.d.ts +129 -6
  6. package/dist/api/routing/middleware/DynamicMiddleware.d.ts.map +1 -1
  7. package/dist/api/routing/middleware/DynamicMiddleware.js +78 -7
  8. package/dist/api/routing/middleware/dynamic-middleware.d.ts +8 -9
  9. package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +1 -1
  10. package/dist/api/routing/middleware/dynamic-middleware.js +3 -3
  11. package/dist/api/routing/middleware/generic-middleware.d.ts +5 -0
  12. package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
  13. package/dist/api/routing/middleware/generic-middleware.js +1 -1
  14. package/dist/api/routing/middleware/middleware-api.d.ts +17 -0
  15. package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -0
  16. package/dist/api/routing/middleware/middleware-api.js +19 -0
  17. package/dist/api/routing/middleware/middleware.d.ts +3 -3
  18. package/dist/api/routing/middleware.d.ts +1 -0
  19. package/dist/api/routing/middleware.d.ts.map +1 -1
  20. package/dist/api/routing/middleware.js +2 -1
  21. package/package.json +5 -1
  22. package/src/api/internal/auth.ts +4 -5
  23. package/src/api/routing/middleware/DynamicMiddleware.ts +296 -15
  24. package/src/api/routing/middleware/dynamic-middleware.ts +12 -23
  25. package/src/api/routing/middleware/generic-middleware.ts +5 -0
  26. package/src/api/routing/middleware/middleware-api.ts +44 -0
  27. package/src/api/routing/middleware.ts +1 -0
  28. package/test/controller.test.ts +35 -25
  29. package/test/dist/controller.test.d.ts.map +1 -1
  30. package/test/dist/middleware-api.test.d.ts.map +1 -0
@@ -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 Effect.Service<AllowAnonymous>()("AllowAnonymous", {
84
+ class AllowAnonymous extends Middleware.Tag<AllowAnonymous>()("AllowAnonymous", {
85
+ dynamic: contextMap<RequestContextMap>()("allowAnonymous")
86
+ })({
85
87
  effect: Effect.gen(function*() {
86
- return {
87
- handle: Effect.fn(function*(opts: { allowAnonymous?: false }, headers: Record<string, string>) {
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 (!opts.allowAnonymous) {
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 extends Effect.Service<RequireRoles>()("RequireRoles", {
107
- effect: Effect.gen(function*() {
108
- yield* Some
109
- return {
110
- handle: Effect.fn(
111
- function*(cfg: { requireRoles?: readonly string[] }, _headers: Record<string, string>) {
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 } = cfg
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 Effect.Service<Test>()("Test", {
129
+ class Test extends Middleware.Tag<Test>()("Test", { dynamic: contextMap<RequestContextMap>()("test") })({
128
130
  effect: Effect.gen(function*() {
129
- return {
130
- handle: Effect.fn(function*(_cfg, _headers) {
131
- return Option.none<Context<never>>()
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":"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"}
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"}