@effect-app/infra 2.87.1 → 2.88.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 (40) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/dist/api/routing/middleware/RouterMiddleware.d.ts +4 -22
  3. package/dist/api/routing/middleware/RouterMiddleware.d.ts.map +1 -1
  4. package/dist/api/routing/middleware/RouterMiddleware.js +1 -1
  5. package/dist/api/routing/middleware/RpcMiddleware.d.ts +13 -13
  6. package/dist/api/routing/middleware/RpcMiddleware.d.ts.map +1 -1
  7. package/dist/api/routing/middleware/RpcMiddleware.js +1 -1
  8. package/dist/api/routing/middleware/dynamic-middleware.d.ts +1 -9
  9. package/dist/api/routing/middleware/dynamic-middleware.d.ts.map +1 -1
  10. package/dist/api/routing/middleware/generic-middleware.d.ts +8 -8
  11. package/dist/api/routing/middleware/generic-middleware.d.ts.map +1 -1
  12. package/dist/api/routing/middleware/generic-middleware.js +23 -7
  13. package/dist/api/routing/middleware/middleware-api.d.ts +59 -30
  14. package/dist/api/routing/middleware/middleware-api.d.ts.map +1 -1
  15. package/dist/api/routing/middleware/middleware-api.js +44 -35
  16. package/dist/api/routing/middleware/middleware.d.ts +7 -7
  17. package/dist/api/routing/middleware/middleware.d.ts.map +1 -1
  18. package/dist/api/routing/middleware/middleware.js +5 -5
  19. package/dist/api/routing.d.ts +28 -22
  20. package/dist/api/routing.d.ts.map +1 -1
  21. package/dist/api/routing.js +1 -1
  22. package/package.json +2 -2
  23. package/src/api/routing/middleware/RouterMiddleware.ts +8 -86
  24. package/src/api/routing/middleware/RpcMiddleware.ts +13 -12
  25. package/src/api/routing/middleware/dynamic-middleware.ts +0 -47
  26. package/src/api/routing/middleware/generic-middleware.ts +45 -14
  27. package/src/api/routing/middleware/middleware-api.ts +147 -101
  28. package/src/api/routing/middleware/middleware.ts +5 -5
  29. package/src/api/routing.ts +50 -35
  30. package/test/contextProvider.test.ts +27 -24
  31. package/test/controller.test.ts +45 -23
  32. package/test/dist/contextProvider.test.d.ts.map +1 -1
  33. package/test/dist/controller.test.d.ts.map +1 -1
  34. package/test/dist/fixtures.d.ts +38 -44
  35. package/test/dist/fixtures.d.ts.map +1 -1
  36. package/test/dist/fixtures.js +21 -9
  37. package/test/dist/requires.test.d.ts.map +1 -1
  38. package/test/fixtures.ts +22 -13
  39. package/test/layerUtils.test.ts +4 -2
  40. package/test/requires.test.ts +119 -97
@@ -1,8 +1,8 @@
1
- import { expect, expectTypeOf, it } from "@effect/vitest"
1
+ import { describe, expect, expectTypeOf, it } from "@effect/vitest"
2
2
  import { Effect, Either, Layer, S } from "effect-app"
3
3
  import { NotLoggedInError, UnauthorizedError } from "effect-app/client"
4
4
  import { makeMiddleware, Middleware } from "../src/api/routing.js"
5
- import { AllowAnonymous, type RequestContextMap, RequireRoles, Some, SomeElse, Test } from "./fixtures.js"
5
+ import { AllowAnonymous, RequestContextMap, RequireRoles, Some, SomeElse, SomeService, Test } from "./fixtures.js"
6
6
 
7
7
  export class SomeMiddleware extends Middleware.Tag<SomeMiddleware>()("SomeMiddleware", {
8
8
  provides: Some
@@ -17,6 +17,18 @@ export class SomeMiddleware extends Middleware.Tag<SomeMiddleware>()("SomeMiddle
17
17
  }) {
18
18
  }
19
19
 
20
+ // functionally equivalent to the one above
21
+ export class SomeMiddlewareWrap extends Middleware.Tag<SomeMiddlewareWrap>()("SomeMiddlewareWrap", {
22
+ provides: Some,
23
+ wrap: true
24
+ })({
25
+ effect: Effect.gen(function*() {
26
+ // yield* Effect.context<"test-dep">()
27
+ return ({ next }) => next.pipe(Effect.provideService(Some, new Some({ a: 1 })))
28
+ })
29
+ }) {
30
+ }
31
+
20
32
  export class SomeElseMiddleware extends Middleware.Tag<SomeElseMiddleware>()("SomeElseMiddleware", {
21
33
  provides: SomeElse,
22
34
  wrap: true
@@ -48,109 +60,119 @@ export class RequiresSomeMiddleware extends Middleware.Tag<RequiresSomeMiddlewar
48
60
  }) {
49
61
  }
50
62
 
51
- it("requires gets enforced", async () => {
52
- const middleware3 = makeMiddleware<RequestContextMap>()
53
- .middleware(RequiresSomeMiddleware)
54
- .middleware(SomeMiddleware)
55
- .middleware(RequireRoles)
56
- .middleware(AllowAnonymous, Test)
57
- .middleware(SomeElseMiddleware)
63
+ const middleware3 = makeMiddleware(RequestContextMap)
64
+ .middleware(RequiresSomeMiddleware)
65
+ .middleware(SomeMiddleware)
66
+ .middleware(RequireRoles)
67
+ .middleware(AllowAnonymous, Test)
68
+ .middleware(SomeElseMiddleware)
58
69
 
59
- const layer = middleware3.Default.pipe(Layer.provide(Layer.succeed(Some, new Some({ a: 1 }))))
70
+ const _middlewareSideways = makeMiddleware(RequestContextMap)
71
+ .middleware(RequiresSomeMiddleware)
72
+ .middleware(SomeMiddleware)
73
+ .middleware(RequireRoles, AllowAnonymous, Test)
74
+ .middleware(SomeElseMiddleware)
60
75
 
61
- type Default = typeof middleware3["Default"]
62
- type LayerContext = Layer.Layer.Context<Default>
63
- expectTypeOf({} as LayerContext).toEqualTypeOf<Some>()
76
+ const _middlewareSidewaysFully = makeMiddleware(RequestContextMap)
77
+ .middleware(RequiresSomeMiddleware, SomeMiddleware, RequireRoles, AllowAnonymous, Test, SomeElseMiddleware)
64
78
 
65
- await Effect
66
- .gen(function*() {
67
- const mw = yield* middleware3
68
- const mwM = mw.effect(
69
- Object.assign({}, S.Any, { config: { requireRoles: ["manager"] } }),
70
- (_req) => Effect.void,
71
- "some-module"
72
- )
73
- yield* mwM({}, { "x-user": "test-user", "x-is-manager": "true" })
74
- })
75
- .pipe(
76
- Effect.scoped,
77
- Effect.provide(layer),
78
- Effect.runPromise
79
- )
79
+ const _middleware3Bis = makeMiddleware(RequestContextMap)
80
+ .middleware(RequiresSomeMiddleware)
81
+ .middleware(SomeMiddlewareWrap)
82
+ .middleware(RequireRoles)
83
+ .middleware(AllowAnonymous, Test)
84
+ .middleware(SomeElseMiddleware)
80
85
 
81
- await Effect
82
- .gen(function*() {
83
- const mw = yield* middleware3
84
- const mwM = mw.effect(
85
- Object.assign({}, S.Any, { config: { allowAnonymous: true } }),
86
- (_req) => Effect.void,
87
- "some-module"
88
- )
89
- yield* mwM({}, {})
90
- })
91
- .pipe(
92
- Effect.scoped,
93
- Effect.provide(layer),
94
- Effect.runPromise
95
- )
86
+ expectTypeOf(_middlewareSideways).toEqualTypeOf<typeof middleware3>()
87
+ expectTypeOf(_middlewareSidewaysFully).toEqualTypeOf<typeof _middlewareSideways>()
88
+ expectTypeOf(_middleware3Bis).toEqualTypeOf<typeof middleware3>()
89
+
90
+ type Default = typeof middleware3["Default"]
91
+ type LayerContext = Layer.Layer.Context<Default>
92
+ expectTypeOf({} as LayerContext).toEqualTypeOf<SomeService>()
96
93
 
97
- expect(
98
- await Effect
99
- .gen(function*() {
100
- const mw = yield* middleware3
101
- const mwM = mw.effect(
102
- Object.assign({}, S.Any, { config: {} }),
103
- (_req) => Effect.void,
104
- "some-module"
94
+ const testSuite = (_mw: typeof middleware3) =>
95
+ describe("middleware" + _mw, () => {
96
+ it.effect(
97
+ "works",
98
+ Effect.fn(function*() {
99
+ const layer = _mw.Default.pipe(Layer.provide(SomeService.toLayer()))
100
+ yield* Effect
101
+ .gen(function*() {
102
+ const mw = yield* _mw
103
+ const mwM = mw.effect(
104
+ Object.assign({}, S.Any, { config: { requireRoles: ["manager"] } }),
105
+ (_req) => Effect.void,
106
+ "some-module"
107
+ )
108
+ yield* mwM({}, { "x-user": "test-user", "x-is-manager": "true" })
109
+ })
110
+ .pipe(
111
+ Effect.scoped,
112
+ Effect.provide(layer)
113
+ )
114
+
115
+ expect(
116
+ yield* Effect
117
+ .gen(function*() {
118
+ const mw = yield* _mw
119
+ const mwM = mw.effect(
120
+ Object.assign({}, S.Any, { config: {} }),
121
+ (_req) => Effect.void,
122
+ "some-module"
123
+ )
124
+ yield* mwM({}, {})
125
+ })
126
+ .pipe(
127
+ Effect.scoped,
128
+ Effect.provide(layer),
129
+ Effect.either
130
+ )
105
131
  )
106
- yield* mwM({}, {})
107
- })
108
- .pipe(
109
- Effect.scoped,
110
- Effect.provide(layer),
111
- Effect.either,
112
- Effect.runPromise
113
- )
114
- )
115
- .toEqual(Either.left(new NotLoggedInError()))
132
+ .toEqual(Either.left(new NotLoggedInError()))
116
133
 
117
- expect(
118
- await Effect
119
- .gen(function*() {
120
- const mw = yield* middleware3
121
- const mwM = mw.effect(
122
- Object.assign({}, S.Any, { config: { requireRoles: ["manager"] } }),
123
- (_req) => Effect.void,
124
- "some-module"
134
+ expect(
135
+ yield* Effect
136
+ .gen(function*() {
137
+ const mw = yield* _mw
138
+ const mwM = mw.effect(
139
+ Object.assign({}, S.Any, { config: { requireRoles: ["manager"] } }),
140
+ (_req) => Effect.void,
141
+ "some-module"
142
+ )
143
+ yield* mwM({}, {})
144
+ })
145
+ .pipe(
146
+ Effect.scoped,
147
+ Effect.provide(layer),
148
+ Effect.either
149
+ )
125
150
  )
126
- yield* mwM({}, {})
127
- })
128
- .pipe(
129
- Effect.scoped,
130
- Effect.provide(layer),
131
- Effect.either,
132
- Effect.runPromise
133
- )
134
- )
135
- .toEqual(Either.left(new NotLoggedInError()))
151
+ .toEqual(Either.left(new NotLoggedInError()))
136
152
 
137
- expect(
138
- await Effect
139
- .gen(function*() {
140
- const mw = yield* middleware3
141
- const mwM = mw.effect(
142
- Object.assign({}, S.Any, { config: { requireRoles: ["manager"] } }),
143
- (_req) => Effect.void,
144
- "some-module"
153
+ expect(
154
+ yield* Effect
155
+ .gen(function*() {
156
+ const mw = yield* _mw
157
+ const mwM = mw.effect(
158
+ Object.assign({}, S.Any, { config: { requireRoles: ["manager"] } }),
159
+ (_req) => Effect.void,
160
+ "some-module"
161
+ )
162
+ yield* mwM({}, { "x-user": "test-user" })
163
+ })
164
+ .pipe(
165
+ Effect.scoped,
166
+ Effect.provide(layer),
167
+ Effect.either
168
+ )
145
169
  )
146
- yield* mwM({}, { "x-user": "test-user" })
170
+ .toEqual(Either.left(new UnauthorizedError({ message: "don't have the right roles" })))
147
171
  })
148
- .pipe(
149
- Effect.scoped,
150
- Effect.provide(layer),
151
- Effect.either,
152
- Effect.runPromise
153
- )
154
- )
155
- .toEqual(Either.left(new UnauthorizedError({ message: "don't have the right roles" })))
156
- })
172
+ )
173
+ })
174
+
175
+ testSuite(middleware3)
176
+ testSuite(_middleware3Bis)
177
+ testSuite(_middlewareSideways)
178
+ testSuite(_middlewareSidewaysFully)