effect-app 4.0.0-beta.17 → 4.0.0-beta.170
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 +683 -0
- package/dist/Array.d.ts +1 -1
- package/dist/Chunk.d.ts +1 -1
- package/dist/Chunk.d.ts.map +1 -1
- package/dist/Config/SecretURL.d.ts +1 -1
- package/dist/Config/SecretURL.d.ts.map +1 -1
- package/dist/Config/SecretURL.js +2 -2
- package/dist/Config/internal/configSecretURL.d.ts +1 -1
- package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
- package/dist/Config.d.ts +7 -0
- package/dist/Config.d.ts.map +1 -0
- package/dist/Config.js +6 -0
- package/dist/ConfigProvider.d.ts +39 -0
- package/dist/ConfigProvider.d.ts.map +1 -0
- package/dist/ConfigProvider.js +42 -0
- package/dist/Context.d.ts +40 -0
- package/dist/Context.d.ts.map +1 -0
- package/dist/Context.js +67 -0
- package/dist/Effect.d.ts +9 -10
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +3 -6
- package/dist/Function.d.ts +1 -1
- package/dist/Function.d.ts.map +1 -1
- package/dist/Inputify.type.d.ts +1 -1
- package/dist/Layer.d.ts +6 -5
- package/dist/Layer.d.ts.map +1 -1
- package/dist/Layer.js +1 -1
- package/dist/NonEmptySet.d.ts +1 -1
- package/dist/NonEmptySet.d.ts.map +1 -1
- package/dist/Operations.d.ts +369 -47
- package/dist/Operations.d.ts.map +1 -1
- package/dist/Operations.js +10 -10
- package/dist/Option.d.ts +1 -1
- package/dist/Option.d.ts.map +1 -1
- package/dist/Pure.d.ts +5 -5
- package/dist/Pure.d.ts.map +1 -1
- package/dist/Pure.js +13 -13
- package/dist/Schema/Class.d.ts +69 -20
- package/dist/Schema/Class.d.ts.map +1 -1
- package/dist/Schema/Class.js +190 -22
- package/dist/Schema/FastCheck.d.ts +1 -1
- package/dist/Schema/FastCheck.d.ts.map +1 -1
- package/dist/Schema/Methods.d.ts +1 -1
- package/dist/Schema/SchemaParser.d.ts +5 -0
- package/dist/Schema/SchemaParser.d.ts.map +1 -0
- package/dist/Schema/SchemaParser.js +6 -0
- package/dist/Schema/SpecialJsonSchema.d.ts +33 -0
- package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -0
- package/dist/Schema/SpecialJsonSchema.js +122 -0
- package/dist/Schema/SpecialOpenApi.d.ts +32 -0
- package/dist/Schema/SpecialOpenApi.d.ts.map +1 -0
- package/dist/Schema/SpecialOpenApi.js +123 -0
- package/dist/Schema/brand.d.ts +7 -2
- package/dist/Schema/brand.d.ts.map +1 -1
- package/dist/Schema/brand.js +1 -1
- package/dist/Schema/email.d.ts +1 -1
- package/dist/Schema/email.d.ts.map +1 -1
- package/dist/Schema/email.js +7 -4
- package/dist/Schema/ext.d.ts +121 -48
- package/dist/Schema/ext.d.ts.map +1 -1
- package/dist/Schema/ext.js +129 -53
- package/dist/Schema/moreStrings.d.ts +111 -11
- package/dist/Schema/moreStrings.d.ts.map +1 -1
- package/dist/Schema/moreStrings.js +14 -15
- package/dist/Schema/numbers.d.ts +127 -15
- package/dist/Schema/numbers.d.ts.map +1 -1
- package/dist/Schema/numbers.js +10 -12
- package/dist/Schema/phoneNumber.d.ts +1 -1
- package/dist/Schema/phoneNumber.d.ts.map +1 -1
- package/dist/Schema/phoneNumber.js +6 -3
- package/dist/Schema/schema.d.ts +1 -1
- package/dist/Schema/strings.d.ts +37 -5
- package/dist/Schema/strings.d.ts.map +1 -1
- package/dist/Schema/strings.js +1 -5
- package/dist/Schema.d.ts +102 -56
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +128 -64
- package/dist/Set.d.ts +1 -1
- package/dist/Set.d.ts.map +1 -1
- package/dist/TypeTest.d.ts +1 -1
- package/dist/Types.d.ts +1 -1
- package/dist/Widen.type.d.ts +1 -1
- package/dist/_ext/Array.d.ts +1 -1
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/date.d.ts +1 -1
- package/dist/_ext/misc.d.ts +1 -1
- package/dist/_ext/ord.ext.d.ts +1 -1
- package/dist/_ext/ord.ext.d.ts.map +1 -1
- package/dist/builtin.d.ts +1 -1
- package/dist/builtin.d.ts.map +1 -1
- package/dist/client/apiClientFactory.d.ts +14 -30
- package/dist/client/apiClientFactory.d.ts.map +1 -1
- package/dist/client/apiClientFactory.js +18 -19
- package/dist/client/clientFor.d.ts +30 -11
- package/dist/client/clientFor.d.ts.map +1 -1
- package/dist/client/clientFor.js +9 -1
- package/dist/client/errors.d.ts +44 -19
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +35 -10
- package/dist/client/makeClient.d.ts +243 -29
- package/dist/client/makeClient.d.ts.map +1 -1
- package/dist/client/makeClient.js +53 -23
- package/dist/client.d.ts +1 -1
- package/dist/faker.d.ts +1 -1
- package/dist/faker.d.ts.map +1 -1
- package/dist/http/Request.d.ts +2 -2
- package/dist/http/Request.d.ts.map +1 -1
- package/dist/http/Request.js +5 -5
- package/dist/http/internal/lib.d.ts +1 -1
- package/dist/http.d.ts +1 -1
- package/dist/ids.d.ts +3 -3
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +3 -2
- package/dist/index.d.ts +5 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -8
- package/dist/logger.d.ts +1 -1
- package/dist/middleware.d.ts +8 -8
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +8 -8
- package/dist/rpc/MiddlewareMaker.d.ts +5 -4
- package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
- package/dist/rpc/MiddlewareMaker.js +26 -27
- package/dist/rpc/RpcContextMap.d.ts +3 -3
- package/dist/rpc/RpcContextMap.d.ts.map +1 -1
- package/dist/rpc/RpcContextMap.js +4 -4
- package/dist/rpc/RpcMiddleware.d.ts +5 -4
- package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
- package/dist/rpc/RpcMiddleware.js +1 -1
- package/dist/rpc.d.ts +1 -2
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +1 -2
- package/dist/transform.d.ts +1 -1
- package/dist/transform.d.ts.map +1 -1
- package/dist/transform.js +3 -3
- package/dist/utils/effectify.d.ts +1 -1
- package/dist/utils/extend.d.ts +1 -1
- package/dist/utils/extend.d.ts.map +1 -1
- package/dist/utils/gen.d.ts +2 -2
- package/dist/utils/gen.d.ts.map +1 -1
- package/dist/utils/logLevel.d.ts +2 -2
- package/dist/utils/logLevel.d.ts.map +1 -1
- package/dist/utils/logger.d.ts +3 -3
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +3 -3
- package/dist/utils.d.ts +30 -10
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -4
- package/dist/validation/validators.d.ts +1 -1
- package/dist/validation/validators.d.ts.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/eslint.config.mjs +2 -2
- package/package.json +39 -19
- package/src/Config/SecretURL.ts +2 -1
- package/src/Config.ts +14 -0
- package/src/ConfigProvider.ts +48 -0
- package/src/{ServiceMap.ts → Context.ts} +52 -59
- package/src/Effect.ts +12 -14
- package/src/Layer.ts +5 -4
- package/src/Operations.ts +14 -14
- package/src/Pure.ts +17 -18
- package/src/Schema/Class.ts +279 -62
- package/src/Schema/SchemaParser.ts +12 -0
- package/src/Schema/SpecialJsonSchema.ts +137 -0
- package/src/Schema/SpecialOpenApi.ts +130 -0
- package/src/Schema/brand.ts +9 -1
- package/src/Schema/email.ts +7 -2
- package/src/Schema/ext.ts +217 -87
- package/src/Schema/moreStrings.ts +22 -20
- package/src/Schema/numbers.ts +14 -16
- package/src/Schema/phoneNumber.ts +5 -1
- package/src/Schema/strings.ts +4 -8
- package/src/Schema.ts +265 -105
- package/src/client/apiClientFactory.ts +107 -113
- package/src/client/clientFor.ts +45 -12
- package/src/client/errors.ts +42 -17
- package/src/client/makeClient.ts +319 -63
- package/src/http/Request.ts +7 -4
- package/src/ids.ts +2 -1
- package/src/index.ts +5 -10
- package/src/middleware.ts +7 -9
- package/src/rpc/MiddlewareMaker.ts +36 -47
- package/src/rpc/README.md +2 -2
- package/src/rpc/RpcContextMap.ts +6 -5
- package/src/rpc/RpcMiddleware.ts +5 -4
- package/src/rpc.ts +0 -1
- package/src/transform.ts +2 -2
- package/src/utils/gen.ts +1 -1
- package/src/utils/logger.ts +2 -2
- package/src/utils.ts +47 -11
- package/test/dist/rpc.test.d.ts.map +1 -1
- package/test/dist/secretURL.test.d.ts.map +1 -0
- package/test/dist/special.test.d.ts.map +1 -0
- package/test/rpc.test.ts +38 -6
- package/test/schema.test.ts +591 -17
- package/test/secretURL.test.ts +157 -0
- package/test/special.test.ts +1023 -0
- package/test/utils.test.ts +6 -6
- package/tsconfig.base.json +3 -4
- package/tsconfig.json +0 -1
- package/tsconfig.json.bak +2 -2
- package/tsconfig.src.json +29 -29
- package/tsconfig.test.json +2 -2
- package/dist/ServiceMap.d.ts +0 -44
- package/dist/ServiceMap.d.ts.map +0 -1
- package/dist/ServiceMap.js +0 -91
package/src/client/makeClient.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { SchemaTransformation } from "effect"
|
|
2
|
+
import type * as Exit from "effect/Exit"
|
|
1
3
|
import { type GetContextConfig, type GetEffectError, type RequestContextMapTagAny } from "../rpc/RpcContextMap.js"
|
|
2
4
|
import * as S from "../Schema.js"
|
|
3
5
|
import { AST } from "../Schema.js"
|
|
@@ -8,33 +10,105 @@ const merge = (a: any, b: Array<any>) =>
|
|
|
8
10
|
/**
|
|
9
11
|
* Whatever the input, we will only decode or encode to void
|
|
10
12
|
*/
|
|
11
|
-
const ForceVoid
|
|
13
|
+
export const ForceVoid = S
|
|
14
|
+
.declare((_: unknown): _ is unknown => true)
|
|
15
|
+
.pipe(
|
|
16
|
+
S.decodeTo(S.Any, SchemaTransformation.transform<unknown, unknown>({ decode: () => void 0, encode: () => void 0 }))
|
|
17
|
+
)
|
|
12
18
|
|
|
13
19
|
type SchemaOrFields<T> = T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct<T> : S.Void
|
|
14
20
|
|
|
15
|
-
type
|
|
21
|
+
type TaggedRequestSchema<Tag extends string, Payload extends S.Struct.Fields> = S.Struct<
|
|
22
|
+
{ readonly _tag: S.tag<Tag> } & Payload
|
|
23
|
+
>
|
|
24
|
+
|
|
25
|
+
type QueryOnlyRequests<Resource> = {
|
|
26
|
+
[K in keyof Resource as Resource[K] extends { readonly type: "query" } ? K : never]: Resource[K]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
type QueryOnlyResources<Resources> = {
|
|
30
|
+
[K in keyof Resources]: QueryOnlyRequests<Resources[K]>
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
type InputFromPayload<Payload extends S.Struct.Fields> = keyof Payload extends never ? void
|
|
34
|
+
: S.Schema.Type<S.Struct<Payload>>
|
|
35
|
+
|
|
36
|
+
type OutputFromSuccess<Success extends S.Top> = Success extends typeof ForceVoid ? void : S.Schema.Type<Success>
|
|
37
|
+
|
|
38
|
+
type InvalidationResources = Record<string, Record<string, unknown>>
|
|
39
|
+
|
|
40
|
+
export type InvalidateQueryInstruction = {
|
|
41
|
+
readonly filters?: Record<string, unknown>
|
|
42
|
+
readonly options?: Record<string, unknown>
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export type InvalidationCallback<Resources, Input = unknown, Success = unknown, Failure = unknown> = (
|
|
46
|
+
queryKey: readonly string[],
|
|
47
|
+
resources: QueryOnlyResources<Resources>,
|
|
48
|
+
...args: [Input] extends [void] ? [exit: Exit.Exit<Success, Failure>]
|
|
49
|
+
: [input: Input, exit: Exit.Exit<Success, Failure>]
|
|
50
|
+
) => ReadonlyArray<InvalidateQueryInstruction>
|
|
51
|
+
|
|
52
|
+
export type InvalidationConfig<Resources, Input = unknown, Success = unknown, Failure = unknown> = {
|
|
53
|
+
readonly invalidatesQueries: InvalidationCallback<Resources, Input, Success, Failure>
|
|
54
|
+
readonly invalidationResources?: Resources
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
type InvalidationConfigForCommand<
|
|
58
|
+
Resources,
|
|
59
|
+
Payload extends S.Struct.Fields,
|
|
60
|
+
Success extends S.Top,
|
|
61
|
+
Error extends S.Top
|
|
62
|
+
> = InvalidationConfig<
|
|
63
|
+
Resources,
|
|
64
|
+
InputFromPayload<Payload>,
|
|
65
|
+
OutputFromSuccess<Success>,
|
|
66
|
+
S.Schema.Type<Error>
|
|
67
|
+
>
|
|
68
|
+
|
|
69
|
+
export const configureInvalidation = <Resources>() =>
|
|
70
|
+
<Input, Success, Failure>(
|
|
71
|
+
invalidatesQueries: InvalidationCallback<Resources, NoInfer<Input>, NoInfer<Success>, NoInfer<Failure>>
|
|
72
|
+
): InvalidationConfig<Resources, Input, Success, Failure> => ({ invalidatesQueries })
|
|
73
|
+
|
|
74
|
+
export const configureInvalidationCallback = <Resources>() =>
|
|
75
|
+
<Input, Success, Failure>(
|
|
76
|
+
invalidatesQueries: InvalidationCallback<Resources, NoInfer<Input>, NoInfer<Success>, NoInfer<Failure>>
|
|
77
|
+
): InvalidationCallback<Resources, Input, Success, Failure> => invalidatesQueries
|
|
78
|
+
|
|
79
|
+
export const configureInvalidationResources = <Resources>() =>
|
|
80
|
+
({}) as Pick<InvalidationConfig<Resources>, "invalidationResources">
|
|
81
|
+
|
|
82
|
+
type TaggedRequestForResult<
|
|
83
|
+
Self,
|
|
16
84
|
Tag extends string,
|
|
17
85
|
Payload extends S.Struct.Fields,
|
|
18
86
|
Success extends S.Top,
|
|
19
87
|
Error extends S.Top,
|
|
20
|
-
Config
|
|
88
|
+
Config,
|
|
89
|
+
ModuleName extends string,
|
|
90
|
+
Type extends "command" | "query",
|
|
91
|
+
Resources = never
|
|
21
92
|
> =
|
|
22
|
-
& S.
|
|
93
|
+
& S.EnhancedClass<Self, TaggedRequestSchema<Tag, Payload>, {}>
|
|
23
94
|
& {
|
|
24
|
-
new(...args: any[]): any
|
|
25
95
|
readonly _tag: Tag
|
|
26
|
-
readonly fields: { readonly _tag: S.tag<Tag> } & Payload
|
|
27
96
|
readonly success: Success
|
|
28
97
|
readonly error: Error
|
|
29
98
|
readonly config: Config
|
|
30
99
|
readonly "~decodingServices": S.Codec.DecodingServices<Success> | S.Codec.DecodingServices<Error>
|
|
100
|
+
readonly "~encodingServices": S.Codec.EncodingServices<Success> | S.Codec.EncodingServices<Error>
|
|
101
|
+
readonly id: `${ModuleName}.${Tag}`
|
|
102
|
+
readonly moduleName: ModuleName
|
|
103
|
+
readonly type: Type
|
|
104
|
+
readonly "~invalidationResources"?: Resources
|
|
31
105
|
}
|
|
32
106
|
|
|
33
107
|
export const makeRpcClient = <
|
|
34
108
|
RequestContextMap extends RequestContextMapTagAny,
|
|
35
109
|
GeneralErrors extends S.Top = never
|
|
36
110
|
>(rcs: RequestContextMap, generalErrors?: GeneralErrors) => {
|
|
37
|
-
// Long way around
|
|
111
|
+
// Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc... (??)
|
|
38
112
|
type ServiceMap = {
|
|
39
113
|
success: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
|
|
40
114
|
error: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
|
|
@@ -47,64 +121,246 @@ export const makeRpcClient = <
|
|
|
47
121
|
: [GeneralErrors] extends [never] ? GetEffectError<RequestContextMap["config"], C>
|
|
48
122
|
: MergeError<GetEffectError<RequestContextMap["config"], C>>
|
|
49
123
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
config:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
:
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
124
|
+
// TODO: filter errors based on config + take care of inversion
|
|
125
|
+
const errorSchemas = Object.values(rcs.config).map((_) => _.error)
|
|
126
|
+
|
|
127
|
+
function makeRequestClass<Tag extends string, Fields extends S.Struct.Fields, C extends Partial<ServiceMap>>(
|
|
128
|
+
tag: Tag,
|
|
129
|
+
fields: Fields,
|
|
130
|
+
config?: C
|
|
131
|
+
) {
|
|
132
|
+
const failureSchema = merge(
|
|
133
|
+
config?.error ? S.isSchema(config.error) ? config.error : S.Struct(config.error) : undefined,
|
|
134
|
+
[...errorSchemas, generalErrors].filter(Boolean)
|
|
135
|
+
)
|
|
136
|
+
const successSchema = config?.success
|
|
137
|
+
? S.isSchema(config.success)
|
|
138
|
+
? AST.isVoid(config.success.ast) ? ForceVoid : config.success
|
|
139
|
+
: S.Struct(config.success)
|
|
140
|
+
: ForceVoid
|
|
141
|
+
|
|
142
|
+
const RequestClass = S.TaggedClass<any>()(tag, fields)
|
|
143
|
+
Object.assign(RequestClass, {
|
|
144
|
+
_tag: tag,
|
|
145
|
+
success: successSchema,
|
|
146
|
+
error: failureSchema,
|
|
147
|
+
config
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
return RequestClass
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function makeTaggedRequestWithMeta<ModuleName extends string, Type extends "command" | "query">(
|
|
154
|
+
moduleName: ModuleName,
|
|
155
|
+
type: Type
|
|
156
|
+
) {
|
|
157
|
+
function TaggedRequestWithMeta<Self, Resources extends InvalidationResources = never>(): {
|
|
158
|
+
<
|
|
159
|
+
Tag extends string,
|
|
160
|
+
Payload extends S.Struct.Fields,
|
|
161
|
+
Success extends S.Top | S.Struct.Fields,
|
|
162
|
+
Error extends S.Top | S.Struct.Fields,
|
|
163
|
+
C extends RequestConfig & Record<string, any>
|
|
164
|
+
>(
|
|
165
|
+
tag: Tag,
|
|
166
|
+
fields: Payload,
|
|
167
|
+
config:
|
|
168
|
+
& Omit<C, "invalidatesQueries">
|
|
169
|
+
& { success: Success; error: Error },
|
|
170
|
+
invalidatesQueries?: InvalidationCallback<
|
|
171
|
+
Resources,
|
|
172
|
+
InputFromPayload<Payload>,
|
|
173
|
+
OutputFromSuccess<SchemaOrFields<Success>>,
|
|
174
|
+
S.Schema.Type<ErrorResult<C & { success: Success; error: Error }>>
|
|
175
|
+
>
|
|
176
|
+
): TaggedRequestForResult<
|
|
177
|
+
Self,
|
|
178
|
+
Tag,
|
|
179
|
+
Payload,
|
|
180
|
+
SchemaOrFields<Success>,
|
|
181
|
+
ErrorResult<C & { success: Success; error: Error }>,
|
|
182
|
+
Omit<
|
|
183
|
+
& Omit<C, "invalidatesQueries">
|
|
184
|
+
& {
|
|
185
|
+
success: Success
|
|
186
|
+
error: Error
|
|
187
|
+
}
|
|
188
|
+
& Partial<
|
|
189
|
+
InvalidationConfigForCommand<
|
|
190
|
+
Resources,
|
|
191
|
+
Payload,
|
|
192
|
+
SchemaOrFields<Success>,
|
|
193
|
+
ErrorResult<C & { success: Success; error: Error }>
|
|
194
|
+
>
|
|
195
|
+
>,
|
|
196
|
+
"success" | "error"
|
|
197
|
+
>,
|
|
198
|
+
ModuleName,
|
|
199
|
+
Type,
|
|
200
|
+
Resources
|
|
201
|
+
>
|
|
202
|
+
<
|
|
203
|
+
Tag extends string,
|
|
204
|
+
Payload extends S.Struct.Fields,
|
|
205
|
+
Success extends S.Top | S.Struct.Fields,
|
|
206
|
+
C extends RequestConfig & Record<string, any> & { error?: never }
|
|
207
|
+
>(
|
|
208
|
+
tag: Tag,
|
|
209
|
+
fields: Payload,
|
|
210
|
+
config:
|
|
211
|
+
& Omit<C, "invalidatesQueries">
|
|
212
|
+
& { success: Success },
|
|
213
|
+
invalidatesQueries?: InvalidationCallback<
|
|
214
|
+
Resources,
|
|
215
|
+
InputFromPayload<Payload>,
|
|
216
|
+
OutputFromSuccess<SchemaOrFields<Success>>,
|
|
217
|
+
S.Schema.Type<ErrorResult<C & { success: Success }>>
|
|
218
|
+
>
|
|
219
|
+
): TaggedRequestForResult<
|
|
220
|
+
Self,
|
|
221
|
+
Tag,
|
|
222
|
+
Payload,
|
|
223
|
+
SchemaOrFields<Success>,
|
|
224
|
+
ErrorResult<C & { success: Success }>,
|
|
225
|
+
Omit<
|
|
226
|
+
& Omit<C, "invalidatesQueries">
|
|
227
|
+
& {
|
|
228
|
+
success: Success
|
|
229
|
+
}
|
|
230
|
+
& Partial<
|
|
231
|
+
InvalidationConfigForCommand<
|
|
232
|
+
Resources,
|
|
233
|
+
Payload,
|
|
234
|
+
SchemaOrFields<Success>,
|
|
235
|
+
ErrorResult<C & { success: Success }>
|
|
236
|
+
>
|
|
237
|
+
>,
|
|
238
|
+
"success" | "error"
|
|
239
|
+
>,
|
|
240
|
+
ModuleName,
|
|
241
|
+
Type,
|
|
242
|
+
Resources
|
|
243
|
+
>
|
|
244
|
+
<
|
|
245
|
+
Tag extends string,
|
|
246
|
+
Payload extends S.Struct.Fields,
|
|
247
|
+
Error extends S.Top | S.Struct.Fields,
|
|
248
|
+
C extends RequestConfig & Record<string, any> & { success?: never }
|
|
249
|
+
>(
|
|
250
|
+
tag: Tag,
|
|
251
|
+
fields: Payload,
|
|
252
|
+
config:
|
|
253
|
+
& Omit<C, "invalidatesQueries">
|
|
254
|
+
& { error: Error },
|
|
255
|
+
invalidatesQueries?: InvalidationCallback<
|
|
256
|
+
Resources,
|
|
257
|
+
InputFromPayload<Payload>,
|
|
258
|
+
void,
|
|
259
|
+
S.Schema.Type<ErrorResult<C & { error: Error }>>
|
|
260
|
+
>
|
|
261
|
+
): TaggedRequestForResult<
|
|
262
|
+
Self,
|
|
263
|
+
Tag,
|
|
264
|
+
Payload,
|
|
265
|
+
typeof ForceVoid,
|
|
266
|
+
ErrorResult<C & { error: Error }>,
|
|
267
|
+
Omit<
|
|
268
|
+
& Omit<C, "invalidatesQueries">
|
|
269
|
+
& {
|
|
270
|
+
error: Error
|
|
271
|
+
}
|
|
272
|
+
& Partial<
|
|
273
|
+
InvalidationConfigForCommand<
|
|
274
|
+
Resources,
|
|
275
|
+
Payload,
|
|
276
|
+
typeof ForceVoid,
|
|
277
|
+
ErrorResult<C & { error: Error }>
|
|
278
|
+
>
|
|
279
|
+
>,
|
|
280
|
+
"success" | "error"
|
|
281
|
+
>,
|
|
282
|
+
ModuleName,
|
|
283
|
+
Type,
|
|
284
|
+
Resources
|
|
285
|
+
>
|
|
286
|
+
<
|
|
287
|
+
Tag extends string,
|
|
288
|
+
Payload extends S.Struct.Fields,
|
|
289
|
+
C extends RequestConfig & Record<string, any> & { success?: never; error?: never }
|
|
290
|
+
>(
|
|
291
|
+
tag: Tag,
|
|
292
|
+
fields: Payload,
|
|
293
|
+
config: Omit<C, "invalidatesQueries">,
|
|
294
|
+
invalidatesQueries?: InvalidationCallback<
|
|
295
|
+
Resources,
|
|
296
|
+
InputFromPayload<Payload>,
|
|
297
|
+
void,
|
|
298
|
+
S.Schema.Type<ErrorResult<C>>
|
|
299
|
+
>
|
|
300
|
+
): TaggedRequestForResult<
|
|
301
|
+
Self,
|
|
302
|
+
Tag,
|
|
303
|
+
Payload,
|
|
304
|
+
typeof ForceVoid,
|
|
305
|
+
ErrorResult<C>,
|
|
306
|
+
Omit<
|
|
307
|
+
& Omit<C, "invalidatesQueries">
|
|
308
|
+
& Partial<InvalidationConfigForCommand<Resources, Payload, typeof ForceVoid, ErrorResult<C>>>,
|
|
309
|
+
"success" | "error"
|
|
310
|
+
>,
|
|
311
|
+
ModuleName,
|
|
312
|
+
Type,
|
|
313
|
+
Resources
|
|
314
|
+
>
|
|
315
|
+
<Tag extends string, Payload extends S.Struct.Fields>(
|
|
316
|
+
tag: Tag,
|
|
317
|
+
fields: Payload
|
|
318
|
+
): TaggedRequestForResult<
|
|
319
|
+
Self,
|
|
320
|
+
Tag,
|
|
321
|
+
Payload,
|
|
322
|
+
typeof ForceVoid,
|
|
323
|
+
ErrorResult<{}>,
|
|
324
|
+
Record<string, never>,
|
|
325
|
+
ModuleName,
|
|
326
|
+
Type
|
|
327
|
+
>
|
|
328
|
+
} {
|
|
329
|
+
return (<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap>(
|
|
330
|
+
tag: Tag,
|
|
331
|
+
fields: Fields,
|
|
332
|
+
config?: C,
|
|
333
|
+
invalidatesQueries?: InvalidationCallback<Resources, unknown, unknown, unknown>
|
|
334
|
+
) => {
|
|
335
|
+
const requestConfig = invalidatesQueries === undefined ? config : { ...config, invalidatesQueries }
|
|
336
|
+
const cls = makeRequestClass(tag, fields, requestConfig)
|
|
337
|
+
Object.assign(cls, { id: `${moduleName}.${tag}`, moduleName, type })
|
|
338
|
+
return cls
|
|
339
|
+
}) as any
|
|
340
|
+
}
|
|
341
|
+
return Object.assign(TaggedRequestWithMeta, { moduleName, type } as const)
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
function TaggedRequestFor<ModuleName extends string>(moduleName: ModuleName) {
|
|
345
|
+
const Query = makeTaggedRequestWithMeta(moduleName, "query")
|
|
346
|
+
const Command = makeTaggedRequestWithMeta(moduleName, "command")
|
|
347
|
+
|
|
348
|
+
return {
|
|
349
|
+
moduleName,
|
|
350
|
+
/**
|
|
351
|
+
* Create query request classes for this module.
|
|
352
|
+
* Queries read state and should not mutate server state.
|
|
353
|
+
*/
|
|
354
|
+
Query,
|
|
355
|
+
/**
|
|
356
|
+
* Create command request classes for this module.
|
|
357
|
+
* Commands mutate state and should avoid returning complex read models.
|
|
358
|
+
*/
|
|
359
|
+
Command
|
|
360
|
+
} as const
|
|
105
361
|
}
|
|
106
362
|
|
|
107
363
|
return {
|
|
108
|
-
|
|
364
|
+
TaggedRequestFor
|
|
109
365
|
}
|
|
110
366
|
}
|
package/src/http/Request.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Option } from "effect"
|
|
1
2
|
import type { HttpClientResponse } from "effect/unstable/http/HttpClientResponse"
|
|
2
3
|
import * as Effect from "../Effect.js"
|
|
3
4
|
import { HttpClient, HttpClientError, HttpClientRequest, HttpHeaders } from "./internal/lib.js"
|
|
@@ -24,16 +25,18 @@ export const demandJson = (client: HttpClient.HttpClient) =>
|
|
|
24
25
|
.mapRequest(client, (_) => HttpClientRequest.acceptJson(_))
|
|
25
26
|
.pipe(HttpClient.transform((r, request) =>
|
|
26
27
|
Effect.tap(r, (response) =>
|
|
27
|
-
|
|
28
|
-
.
|
|
29
|
-
|
|
28
|
+
Option
|
|
29
|
+
.exists(
|
|
30
|
+
HttpHeaders.get(response.headers, "Content-Type"),
|
|
31
|
+
(_) => _.startsWith("application/json")
|
|
32
|
+
)
|
|
30
33
|
? Effect.void
|
|
31
34
|
: Effect.fail(
|
|
32
35
|
new HttpClientError.DecodeError({
|
|
33
36
|
request,
|
|
34
37
|
response,
|
|
35
38
|
description: "not json response: "
|
|
36
|
-
+ HttpHeaders.get(response.headers, "Content-Type")
|
|
39
|
+
+ Option.getOrElse(HttpHeaders.get(response.headers, "Content-Type"), () => "<missing>")
|
|
37
40
|
})
|
|
38
41
|
))
|
|
39
42
|
))
|
package/src/ids.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Effect } from "effect"
|
|
1
2
|
import { brandedStringId, type Codec, NonEmptyString255, StringId, type StringIdBrand, withDefaultMake } from "effect-app/Schema"
|
|
2
3
|
import type { B } from "effect-app/Schema/schema"
|
|
3
4
|
import type { Simplify } from "effect/Types"
|
|
@@ -17,7 +18,7 @@ export const RequestId = extendM(
|
|
|
17
18
|
const make = StringId.make as () => NonEmptyString255
|
|
18
19
|
return ({
|
|
19
20
|
make,
|
|
20
|
-
withDefault:
|
|
21
|
+
withDefault: S.withConstructorDefault(Effect.sync(make))(s as typeof s & S.WithoutConstructorDefault)
|
|
21
22
|
})
|
|
22
23
|
}
|
|
23
24
|
)
|
package/src/index.ts
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
|
+
// eslint-disable-next-line import/no-unassigned-import
|
|
1
2
|
import "./builtin.js"
|
|
2
3
|
|
|
3
|
-
import * as ServiceMap from "./ServiceMap.js"
|
|
4
|
-
|
|
5
4
|
export * as Fnc from "./Function.js"
|
|
6
5
|
export * as Utils from "./utils.js"
|
|
7
6
|
|
|
8
7
|
export * as Array from "./Array.js"
|
|
8
|
+
export * as Config from "./Config.js"
|
|
9
|
+
export * as ConfigProvider from "./ConfigProvider.js"
|
|
10
|
+
export * as Context from "./Context.js"
|
|
9
11
|
export * as Effect from "./Effect.js"
|
|
10
12
|
export * as Layer from "./Layer.js"
|
|
11
13
|
export * as NonEmptySet from "./NonEmptySet.js"
|
|
12
|
-
export * as ServiceMap from "./ServiceMap.js"
|
|
13
14
|
export * as Set from "./Set.js"
|
|
14
15
|
|
|
15
|
-
export {
|
|
16
|
-
/**
|
|
17
|
-
* @deprecated use ServiceMap directly instead
|
|
18
|
-
*/
|
|
19
|
-
ServiceMap as Context
|
|
20
|
-
}
|
|
21
|
-
|
|
22
16
|
export { type NonEmptyArray, type NonEmptyReadonlyArray } from "./Array.js"
|
|
23
17
|
|
|
24
18
|
export * from "effect"
|
|
@@ -26,5 +20,6 @@ export * from "effect"
|
|
|
26
20
|
export type * as Types from "./Types.js"
|
|
27
21
|
|
|
28
22
|
export * as SecretURL from "./Config/SecretURL.js"
|
|
23
|
+
export * as RpcX from "./rpc.js"
|
|
29
24
|
export * as S from "./Schema.js"
|
|
30
25
|
export { copy } from "./utils.js"
|
package/src/middleware.ts
CHANGED
|
@@ -1,20 +1,18 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { Context } from "effect-app"
|
|
3
|
+
import { RpcMiddleware } from "./rpc.js"
|
|
4
4
|
|
|
5
|
-
export class DevMode extends
|
|
5
|
+
export class DevMode extends Context.Reference("DevMode", { defaultValue: () => false }) {}
|
|
6
6
|
|
|
7
|
-
export class RequestCacheMiddleware
|
|
8
|
-
extends RpcX.RpcMiddleware.Tag<RequestCacheMiddleware>()("RequestCacheMiddleware")
|
|
9
|
-
{}
|
|
7
|
+
export class RequestCacheMiddleware extends RpcMiddleware.Tag<RequestCacheMiddleware>()("RequestCacheMiddleware") {}
|
|
10
8
|
|
|
11
9
|
export class ConfigureInterruptibilityMiddleware
|
|
12
|
-
extends
|
|
10
|
+
extends RpcMiddleware.Tag<ConfigureInterruptibilityMiddleware>()("ConfigureInterruptibilityMiddleware")
|
|
13
11
|
{}
|
|
14
12
|
|
|
15
|
-
export class LoggerMiddleware extends
|
|
13
|
+
export class LoggerMiddleware extends RpcMiddleware.Tag<LoggerMiddleware>()("LoggerMiddleware") {}
|
|
16
14
|
|
|
17
|
-
export class DevModeMiddleware extends
|
|
15
|
+
export class DevModeMiddleware extends RpcMiddleware.Tag<DevModeMiddleware>()("DevModeMiddleware") {}
|
|
18
16
|
|
|
19
17
|
export const DefaultGenericMiddlewares = [
|
|
20
18
|
RequestCacheMiddleware,
|