effect-app 4.0.0-beta.99 → 4.0.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 +2028 -0
- package/dist/Array.d.ts +2 -1
- package/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +4 -4
- package/dist/Chunk.d.ts +2 -2
- package/dist/Chunk.d.ts.map +1 -1
- package/dist/Config/SecretURL.d.ts +3 -1
- package/dist/Config/SecretURL.d.ts.map +1 -1
- package/dist/Config/SecretURL.js +3 -6
- package/dist/Config/internal/configSecretURL.d.ts.map +1 -1
- package/dist/Config/internal/configSecretURL.js +2 -2
- package/dist/Config.d.ts +0 -5
- package/dist/Config.d.ts.map +1 -1
- package/dist/Config.js +7 -5
- package/dist/ConfigProvider.d.ts +0 -37
- package/dist/ConfigProvider.d.ts.map +1 -1
- package/dist/ConfigProvider.js +5 -41
- package/dist/Context.d.ts +6 -4
- package/dist/Context.d.ts.map +1 -1
- package/dist/Context.js +4 -3
- package/dist/DataDependencies.d.ts +136 -0
- package/dist/DataDependencies.d.ts.map +1 -0
- package/dist/DataDependencies.js +112 -0
- package/dist/Effect.d.ts +3 -3
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +6 -9
- package/dist/Emailer.d.ts +51 -0
- package/dist/Emailer.d.ts.map +1 -0
- package/dist/Emailer.js +7 -0
- package/dist/Function.d.ts.map +1 -1
- package/dist/Layer.d.ts +6 -3
- package/dist/Layer.d.ts.map +1 -1
- package/dist/Layer.js +3 -2
- package/dist/Model/Repository/Registry.d.ts +22 -0
- package/dist/Model/Repository/Registry.d.ts.map +1 -0
- package/dist/Model/Repository/Registry.js +18 -0
- package/dist/Model/Repository/dependency.d.ts +6 -0
- package/dist/Model/Repository/dependency.d.ts.map +1 -0
- package/dist/Model/Repository/dependency.js +29 -0
- package/dist/Model/Repository/ext.d.ts +60 -0
- package/dist/Model/Repository/ext.d.ts.map +1 -0
- package/dist/Model/Repository/ext.js +124 -0
- package/dist/Model/Repository/internal/internal.d.ts +68 -0
- package/dist/Model/Repository/internal/internal.d.ts.map +1 -0
- package/dist/Model/Repository/internal/internal.js +611 -0
- package/dist/Model/Repository/legacy.d.ts +21 -0
- package/dist/Model/Repository/legacy.d.ts.map +1 -0
- package/dist/Model/Repository/legacy.js +2 -0
- package/dist/Model/Repository/makeRepo.d.ts +71 -0
- package/dist/Model/Repository/makeRepo.d.ts.map +1 -0
- package/dist/Model/Repository/makeRepo.js +30 -0
- package/dist/Model/Repository/service.d.ts +121 -0
- package/dist/Model/Repository/service.d.ts.map +1 -0
- package/dist/Model/Repository/service.js +2 -0
- package/dist/Model/Repository/validation.d.ts +72 -0
- package/dist/Model/Repository/validation.d.ts.map +1 -0
- package/dist/Model/Repository/validation.js +39 -0
- package/dist/Model/Repository.d.ts +8 -0
- package/dist/Model/Repository.d.ts.map +1 -0
- package/dist/Model/Repository.js +8 -0
- package/dist/Model/dsl.d.ts +33 -0
- package/dist/Model/dsl.d.ts.map +1 -0
- package/dist/Model/dsl.js +43 -0
- package/dist/Model/filter/filterApi.d.ts +30 -0
- package/dist/Model/filter/filterApi.d.ts.map +1 -0
- package/dist/Model/filter/filterApi.js +2 -0
- package/dist/Model/filter/types/errors.d.ts +29 -0
- package/dist/Model/filter/types/errors.d.ts.map +1 -0
- package/dist/Model/filter/types/errors.js +2 -0
- package/dist/Model/filter/types/fields.d.ts +15 -0
- package/dist/Model/filter/types/fields.d.ts.map +1 -0
- package/dist/Model/filter/types/fields.js +2 -0
- package/dist/Model/filter/types/path/common.d.ts +316 -0
- package/dist/Model/filter/types/path/common.d.ts.map +1 -0
- package/dist/Model/filter/types/path/common.js +2 -0
- package/dist/Model/filter/types/path/eager.d.ts +94 -0
- package/dist/Model/filter/types/path/eager.d.ts.map +1 -0
- package/dist/Model/filter/types/path/eager.js +36 -0
- package/dist/Model/filter/types/path/index.d.ts +4 -0
- package/dist/Model/filter/types/path/index.d.ts.map +1 -0
- package/dist/Model/filter/types/path/index.js +3 -0
- package/dist/Model/filter/types/utils.d.ts +79 -0
- package/dist/Model/filter/types/utils.d.ts.map +1 -0
- package/dist/Model/filter/types/utils.js +2 -0
- package/dist/Model/filter/types/validator.d.ts +30 -0
- package/dist/Model/filter/types/validator.d.ts.map +1 -0
- package/dist/Model/filter/types/validator.js +2 -0
- package/dist/Model/filter/types.d.ts +5 -0
- package/dist/Model/filter/types.d.ts.map +1 -0
- package/dist/Model/filter/types.js +7 -0
- package/dist/Model/query/dsl.d.ts +630 -0
- package/dist/Model/query/dsl.d.ts.map +1 -0
- package/dist/Model/query/dsl.js +376 -0
- package/dist/Model/query/new-kid-interpreter.d.ts +132 -0
- package/dist/Model/query/new-kid-interpreter.d.ts.map +1 -0
- package/dist/Model/query/new-kid-interpreter.js +370 -0
- package/dist/Model/query.d.ts +15 -0
- package/dist/Model/query.d.ts.map +1 -0
- package/dist/Model/query.js +3 -0
- package/dist/Model.d.ts +6 -0
- package/dist/Model.d.ts.map +1 -0
- package/dist/Model.js +6 -0
- package/dist/NonEmptySet.d.ts +3 -1
- package/dist/NonEmptySet.d.ts.map +1 -1
- package/dist/NonEmptySet.js +2 -2
- package/dist/Option.d.ts +1 -0
- package/dist/Option.d.ts.map +1 -1
- package/dist/Option.js +3 -1
- package/dist/Pure.d.ts +5 -3
- package/dist/Pure.d.ts.map +1 -1
- package/dist/Pure.js +5 -2
- package/dist/QueueMaker.d.ts +11 -0
- package/dist/QueueMaker.d.ts.map +1 -0
- package/dist/QueueMaker.js +11 -0
- package/dist/RequestContext.d.ts +87 -0
- package/dist/RequestContext.d.ts.map +1 -0
- package/dist/RequestContext.js +45 -0
- package/dist/RequestScopedDependencies.d.ts +21 -0
- package/dist/RequestScopedDependencies.d.ts.map +1 -0
- package/dist/RequestScopedDependencies.js +16 -0
- package/dist/Schema/Class.d.ts +163 -16
- package/dist/Schema/Class.d.ts.map +1 -1
- package/dist/Schema/Class.js +193 -21
- package/dist/Schema/FastCheck.d.ts.map +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 +15 -2
- package/dist/Schema/SpecialJsonSchema.d.ts.map +1 -1
- package/dist/Schema/SpecialJsonSchema.js +70 -12
- package/dist/Schema/SpecialOpenApi.d.ts +1 -1
- package/dist/Schema/SpecialOpenApi.js +3 -3
- package/dist/Schema/brand.d.ts +5 -5
- package/dist/Schema/brand.d.ts.map +1 -1
- package/dist/Schema/brand.js +6 -4
- package/dist/Schema/email.d.ts.map +1 -1
- package/dist/Schema/email.js +8 -5
- package/dist/Schema/ext.d.ts +297 -72
- package/dist/Schema/ext.d.ts.map +1 -1
- package/dist/Schema/ext.js +331 -67
- package/dist/Schema/moreStrings.d.ts +82 -48
- package/dist/Schema/moreStrings.d.ts.map +1 -1
- package/dist/Schema/moreStrings.js +85 -51
- package/dist/Schema/numbers.d.ts +33 -21
- package/dist/Schema/numbers.d.ts.map +1 -1
- package/dist/Schema/numbers.js +64 -12
- package/dist/Schema/phoneNumber.d.ts.map +1 -1
- package/dist/Schema/phoneNumber.js +6 -6
- package/dist/Schema/schema.d.ts +1 -1
- package/dist/Schema/schema.d.ts.map +1 -1
- package/dist/Schema/schema.js +2 -2
- package/dist/Schema/strings.d.ts +18 -4
- package/dist/Schema/strings.d.ts.map +1 -1
- package/dist/Schema/strings.js +1 -5
- package/dist/Schema.d.ts +223 -6
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +189 -23
- package/dist/SchemaAST.d.ts +2 -0
- package/dist/SchemaAST.d.ts.map +1 -0
- package/dist/SchemaAST.js +2 -0
- package/dist/Set.d.ts +4 -1
- package/dist/Set.d.ts.map +1 -1
- package/dist/Set.js +3 -2
- package/dist/Store.d.ts +215 -0
- package/dist/Store.d.ts.map +1 -0
- package/dist/Store.js +113 -0
- package/dist/_ext/Array.d.ts +1 -1
- package/dist/_ext/Array.d.ts.map +1 -1
- package/dist/_ext/Array.js +4 -2
- package/dist/_ext/misc.d.ts +4 -1
- package/dist/_ext/misc.d.ts.map +1 -1
- package/dist/_ext/misc.js +4 -2
- package/dist/_ext/ord.ext.d.ts +2 -1
- package/dist/_ext/ord.ext.d.ts.map +1 -1
- package/dist/_ext/ord.ext.js +2 -2
- package/dist/builtin.d.ts +2 -14
- package/dist/builtin.d.ts.map +1 -1
- package/dist/builtin.js +1 -1
- package/dist/client/InvalidationKeys.d.ts +30 -0
- package/dist/client/InvalidationKeys.d.ts.map +1 -0
- package/dist/client/InvalidationKeys.js +37 -0
- package/dist/client/apiClientFactory.d.ts +13 -8
- package/dist/client/apiClientFactory.d.ts.map +1 -1
- package/dist/client/apiClientFactory.js +148 -29
- package/dist/client/clientFor.d.ts +48 -13
- package/dist/client/clientFor.d.ts.map +1 -1
- package/dist/client/clientFor.js +9 -1
- package/dist/client/errors.d.ts +74 -28
- package/dist/client/errors.d.ts.map +1 -1
- package/dist/client/errors.js +41 -10
- package/dist/client/makeClient.d.ts +487 -32
- package/dist/client/makeClient.d.ts.map +1 -1
- package/dist/client/makeClient.js +47 -21
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -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 +2 -2
- package/dist/http/internal/lib.d.ts +12 -12
- package/dist/http/internal/lib.d.ts.map +1 -1
- package/dist/http/internal/lib.js +13 -13
- package/dist/ids.d.ts +32 -14
- package/dist/ids.d.ts.map +1 -1
- package/dist/ids.js +38 -7
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/middleware.d.ts +12 -6
- package/dist/middleware.d.ts.map +1 -1
- package/dist/middleware.js +13 -7
- package/dist/rpc/Invalidation.d.ts +1124 -0
- package/dist/rpc/Invalidation.d.ts.map +1 -0
- package/dist/rpc/Invalidation.js +178 -0
- package/dist/rpc/MiddlewareMaker.d.ts +10 -7
- package/dist/rpc/MiddlewareMaker.d.ts.map +1 -1
- package/dist/rpc/MiddlewareMaker.js +57 -37
- package/dist/rpc/RpcContextMap.d.ts +2 -2
- package/dist/rpc/RpcContextMap.d.ts.map +1 -1
- package/dist/rpc/RpcMiddleware.d.ts +13 -10
- package/dist/rpc/RpcMiddleware.d.ts.map +1 -1
- package/dist/rpc/RpcMiddleware.js +2 -2
- package/dist/rpc.d.ts +1 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -2
- package/dist/runtime.d.ts +19 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +40 -0
- package/dist/setupRequest.d.ts +20 -0
- package/dist/setupRequest.d.ts.map +1 -0
- package/dist/setupRequest.js +72 -0
- package/dist/toast.d.ts +51 -0
- package/dist/toast.d.ts.map +1 -0
- package/dist/toast.js +34 -0
- package/dist/transform.d.ts +1 -1
- package/dist/transform.d.ts.map +1 -1
- package/dist/transform.js +4 -5
- package/dist/utils/effectify.d.ts +1 -1
- package/dist/utils/effectify.d.ts.map +1 -1
- package/dist/utils/effectify.js +2 -2
- package/dist/utils/extend.d.ts +6 -1
- package/dist/utils/extend.d.ts.map +1 -1
- package/dist/utils/extend.js +24 -6
- package/dist/utils/gen.d.ts +4 -4
- 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 +2 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -2
- package/dist/utils.d.ts +34 -39
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -37
- package/dist/validation/validators.d.ts.map +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/withToast.d.ts +30 -0
- package/dist/withToast.d.ts.map +1 -0
- package/dist/withToast.js +64 -0
- package/package.json +26 -266
- package/src/Array.ts +5 -5
- package/src/Chunk.ts +3 -3
- package/src/Config/SecretURL.ts +6 -3
- package/src/Config/internal/configSecretURL.ts +2 -2
- package/src/Config.ts +6 -13
- package/src/ConfigProvider.ts +4 -47
- package/src/Context.ts +9 -8
- package/src/DataDependencies.ts +171 -0
- package/src/Effect.ts +9 -12
- package/src/Emailer.ts +51 -0
- package/src/Inputify.type.ts +1 -1
- package/src/Layer.ts +8 -5
- package/src/Model/Repository/Registry.ts +35 -0
- package/src/Model/Repository/dependency.ts +32 -0
- package/src/Model/Repository/ext.ts +374 -0
- package/src/Model/Repository/internal/internal.ts +988 -0
- package/src/Model/Repository/legacy.ts +29 -0
- package/src/Model/Repository/makeRepo.ts +168 -0
- package/src/Model/Repository/service.ts +676 -0
- package/src/Model/Repository/validation.ts +38 -0
- package/src/Model/Repository.ts +7 -0
- package/src/Model/dsl.ts +129 -0
- package/src/Model/filter/filterApi.ts +78 -0
- package/src/Model/filter/types/errors.ts +47 -0
- package/src/Model/filter/types/fields.ts +50 -0
- package/src/Model/filter/types/path/common.ts +404 -0
- package/src/Model/filter/types/path/eager.ts +329 -0
- package/src/Model/filter/types/path/index.ts +4 -0
- package/src/Model/filter/types/utils.ts +128 -0
- package/src/Model/filter/types/validator.ts +46 -0
- package/src/Model/filter/types.ts +6 -0
- package/src/Model/query/dsl.ts +3092 -0
- package/src/Model/query/new-kid-interpreter.ts +532 -0
- package/src/Model/query.ts +13 -0
- package/src/Model.ts +5 -0
- package/src/NonEmptySet.ts +6 -4
- package/src/Option.ts +2 -0
- package/src/Pure.ts +6 -3
- package/src/QueueMaker.ts +11 -0
- package/src/RequestContext.ts +48 -0
- package/src/RequestScopedDependencies.ts +45 -0
- package/src/Schema/Class.ts +550 -56
- package/src/Schema/SchemaParser.ts +12 -0
- package/src/Schema/SpecialJsonSchema.ts +75 -7
- package/src/Schema/SpecialOpenApi.ts +5 -5
- package/src/Schema/brand.ts +27 -12
- package/src/Schema/email.ts +9 -7
- package/src/Schema/ext.ts +408 -91
- package/src/Schema/moreStrings.ts +213 -88
- package/src/Schema/numbers.ts +107 -29
- package/src/Schema/phoneNumber.ts +8 -9
- package/src/Schema/schema.ts +1 -1
- package/src/Schema/strings.ts +23 -14
- package/src/Schema.ts +403 -46
- package/src/SchemaAST.ts +1 -0
- package/src/Set.ts +6 -2
- package/src/Store.ts +325 -0
- package/src/_ext/Array.ts +4 -2
- package/src/_ext/misc.ts +4 -1
- package/src/_ext/ord.ext.ts +2 -1
- package/src/builtin-json.d.ts +24 -0
- package/src/builtin.ts +16 -21
- package/src/client/InvalidationKeys.ts +55 -0
- package/src/client/apiClientFactory.ts +291 -126
- package/src/client/clientFor.ts +101 -33
- package/src/client/errors.ts +66 -20
- package/src/client/makeClient.ts +519 -60
- package/src/client.ts +6 -4
- package/src/http/Request.ts +4 -4
- package/src/http/internal/lib.ts +12 -12
- package/src/http.ts +1 -1
- package/src/ids.ts +45 -8
- package/src/index.ts +20 -16
- package/src/middleware.ts +12 -8
- package/src/rpc/Invalidation.ts +278 -0
- package/src/rpc/MiddlewareMaker.ts +86 -79
- package/src/rpc/README.md +2 -2
- package/src/rpc/RpcContextMap.ts +4 -4
- package/src/rpc/RpcMiddleware.ts +18 -13
- package/src/rpc.ts +4 -4
- package/src/runtime.ts +57 -0
- package/src/setupRequest.ts +138 -0
- package/src/toast.ts +54 -0
- package/src/transform.ts +4 -4
- package/src/utils/effectify.ts +1 -1
- package/src/utils/extend.ts +24 -5
- package/src/utils/gen.ts +7 -7
- package/src/utils/logLevel.ts +1 -1
- package/src/utils/logger.ts +3 -2
- package/src/utils.ts +85 -158
- package/src/validation.ts +2 -2
- package/src/withToast.ts +133 -0
- package/test/dist/rpc.test.d.ts.map +1 -1
- package/test/dist/rpcMiddlewareContext.test.d.ts.map +1 -0
- package/test/moreStrings.test.ts +55 -10
- package/test/rpc.test.ts +28 -11
- package/test/rpcMiddlewareContext.test.ts +63 -0
- package/test/schema.test.ts +318 -55
- package/test/secretURL.test.ts +4 -1
- package/test/special.test.ts +663 -131
- package/test/utils.test.ts +5 -5
- package/tsconfig.base.json +6 -4
- package/tsconfig.json +9 -1
- package/tsconfig.src.json +29 -29
- package/tsconfig.test.json +2 -2
- package/dist/Operations.d.ts +0 -124
- package/dist/Operations.d.ts.map +0 -1
- package/dist/Operations.js +0 -29
- package/eslint.config.mjs +0 -26
- package/src/Operations.ts +0 -55
- package/tsconfig.json.bak +0 -12
package/src/client/makeClient.ts
CHANGED
|
@@ -1,21 +1,105 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { type GetContextConfig, type
|
|
3
|
-
import * as S from "../Schema.
|
|
4
|
-
import { AST } from "../Schema.
|
|
1
|
+
import type * as Exit from "effect/Exit"
|
|
2
|
+
import { type GetContextConfig, type RpcContextMap } from "../rpc/RpcContextMap.ts"
|
|
3
|
+
import * as S from "../Schema.ts"
|
|
4
|
+
import { AST } from "../Schema.ts"
|
|
5
|
+
import type { ClientForOptions } from "./clientFor.ts"
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Minimal structural shape for an rpc-client middleware tag.
|
|
9
|
+
* Captures only what `makeRpcClient` and routing/client factory consume from it
|
|
10
|
+
* (no `Default` layer required — that is provided to `makeRouter`).
|
|
11
|
+
*/
|
|
12
|
+
export interface ClientMiddleware<RequestContextMap extends Record<string, RpcContextMap.Any>> {
|
|
13
|
+
readonly requestContextMap: RequestContextMap
|
|
14
|
+
readonly requestContext: unknown
|
|
15
|
+
readonly provides?: unknown
|
|
16
|
+
readonly requires?: unknown
|
|
17
|
+
}
|
|
5
18
|
|
|
6
19
|
const merge = (a: any, b: Array<any>) =>
|
|
7
20
|
a !== undefined && b.length ? S.Union([a, ...b]) : a !== undefined ? a : b.length ? S.Union(b) : S.Never
|
|
8
21
|
|
|
22
|
+
type SchemaOrFields<T> = T extends S.Top ? T : T extends S.Struct.Fields ? S.Struct<T> : S.Void
|
|
23
|
+
|
|
24
|
+
type TaggedRequestSchema<Tag extends string, Payload extends S.Struct.Fields> = S.Struct<
|
|
25
|
+
{ readonly _tag: S.tag<Tag> } & Payload
|
|
26
|
+
>
|
|
27
|
+
|
|
28
|
+
type QueryOnlyRequests<Resource> = {
|
|
29
|
+
[K in keyof Resource as Resource[K] extends { readonly type: "query" } ? K : never]: Resource[K]
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type QueryOnlyResources<Resources> = {
|
|
33
|
+
[K in keyof Resources]: QueryOnlyRequests<Resources[K]>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
type InputFromPayload<Payload extends S.Struct.Fields> = keyof Payload extends never ? void
|
|
37
|
+
: S.Struct<Payload>["Type"]
|
|
38
|
+
|
|
39
|
+
type OutputFromSuccess<Success extends S.Top> = Success extends typeof S.Void ? void : Success["Type"]
|
|
40
|
+
|
|
41
|
+
type InvalidationResources = Record<string, Record<string, unknown>>
|
|
42
|
+
|
|
9
43
|
/**
|
|
10
|
-
*
|
|
44
|
+
* An invalidation instruction returned from `invalidatesQueries`. One of:
|
|
45
|
+
* - a raw query key (`ReadonlyArray<string>`)
|
|
46
|
+
* - an RPC handler object (`{ id, options? }`) — query key derived from `id`
|
|
47
|
+
* - a compatibility `{ filters: { queryKey }, options? }` shape
|
|
48
|
+
*
|
|
49
|
+
* Predicate filters are intentionally not represented: atom invalidation is keyed by
|
|
50
|
+
* concrete query keys.
|
|
11
51
|
*/
|
|
12
|
-
export
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
52
|
+
export type InvalidateQueryInstruction<
|
|
53
|
+
Filters = { readonly queryKey: ReadonlyArray<unknown> },
|
|
54
|
+
Options = Record<string, unknown>
|
|
55
|
+
> =
|
|
56
|
+
| ReadonlyArray<string>
|
|
57
|
+
| {
|
|
58
|
+
readonly id: string
|
|
59
|
+
readonly options?: ClientForOptions
|
|
60
|
+
}
|
|
61
|
+
| {
|
|
62
|
+
readonly filters: Filters
|
|
63
|
+
readonly options?: Options
|
|
64
|
+
}
|
|
17
65
|
|
|
18
|
-
type
|
|
66
|
+
export type InvalidationCallback<Resources, Input = unknown, Success = unknown, Failure = unknown> = (
|
|
67
|
+
queryKey: readonly string[],
|
|
68
|
+
resources: QueryOnlyResources<Resources>,
|
|
69
|
+
...args: [Input] extends [void] ? [exit: Exit.Exit<Success, Failure>]
|
|
70
|
+
: [input: Input, exit: Exit.Exit<Success, Failure>]
|
|
71
|
+
) => ReadonlyArray<InvalidateQueryInstruction>
|
|
72
|
+
|
|
73
|
+
export type InvalidationConfig<Resources, Input = unknown, Success = unknown, Failure = unknown> = {
|
|
74
|
+
readonly invalidatesQueries: InvalidationCallback<Resources, Input, Success, Failure>
|
|
75
|
+
readonly invalidationResources?: Resources
|
|
76
|
+
readonly disableQueryInvalidation?: boolean
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type InvalidationConfigForCommand<
|
|
80
|
+
Resources,
|
|
81
|
+
Payload extends S.Struct.Fields,
|
|
82
|
+
Success extends S.Top,
|
|
83
|
+
Error extends S.Top
|
|
84
|
+
> = InvalidationConfig<
|
|
85
|
+
Resources,
|
|
86
|
+
InputFromPayload<Payload>,
|
|
87
|
+
OutputFromSuccess<Success>,
|
|
88
|
+
Error["Type"]
|
|
89
|
+
>
|
|
90
|
+
|
|
91
|
+
export const configureInvalidation = <Resources>() =>
|
|
92
|
+
<Input, Success, Failure>(
|
|
93
|
+
invalidatesQueries: InvalidationCallback<Resources, NoInfer<Input>, NoInfer<Success>, NoInfer<Failure>>
|
|
94
|
+
): InvalidationConfig<Resources, Input, Success, Failure> => ({ invalidatesQueries })
|
|
95
|
+
|
|
96
|
+
export const configureInvalidationCallback = <Resources>() =>
|
|
97
|
+
<Input, Success, Failure>(
|
|
98
|
+
invalidatesQueries: InvalidationCallback<Resources, NoInfer<Input>, NoInfer<Success>, NoInfer<Failure>>
|
|
99
|
+
): InvalidationCallback<Resources, Input, Success, Failure> => invalidatesQueries
|
|
100
|
+
|
|
101
|
+
export const configureInvalidationResources = <Resources>() =>
|
|
102
|
+
({}) as Pick<InvalidationConfig<Resources>, "invalidationResources">
|
|
19
103
|
|
|
20
104
|
type TaggedRequestForResult<
|
|
21
105
|
Self,
|
|
@@ -24,119 +108,451 @@ type TaggedRequestForResult<
|
|
|
24
108
|
Success extends S.Top,
|
|
25
109
|
Error extends S.Top,
|
|
26
110
|
Config,
|
|
27
|
-
ModuleName extends string
|
|
111
|
+
ModuleName extends string,
|
|
112
|
+
Type extends "command" | "query",
|
|
113
|
+
Stream extends boolean,
|
|
114
|
+
Resources = never,
|
|
115
|
+
Final extends S.Top = never,
|
|
116
|
+
Middleware = unknown
|
|
28
117
|
> =
|
|
29
|
-
& S.
|
|
118
|
+
& S.Opaque<Self, S.ExtendedSchemaNoEncoded, TaggedRequestSchema<Tag, Payload>, {}>
|
|
30
119
|
& {
|
|
120
|
+
readonly fields: TaggedRequestSchema<Tag, Payload>["fields"]
|
|
31
121
|
readonly _tag: Tag
|
|
32
122
|
readonly success: Success
|
|
33
123
|
readonly error: Error
|
|
34
124
|
readonly config: Config
|
|
35
|
-
readonly "~decodingServices": S.Codec.DecodingServices<Success> | S.Codec.DecodingServices<Error>
|
|
36
|
-
readonly "~encodingServices": S.Codec.EncodingServices<Success> | S.Codec.EncodingServices<Error>
|
|
37
125
|
readonly id: `${ModuleName}.${Tag}`
|
|
38
126
|
readonly moduleName: ModuleName
|
|
127
|
+
readonly type: Type
|
|
128
|
+
readonly stream: Stream
|
|
129
|
+
readonly middleware?: Middleware
|
|
130
|
+
readonly "~invalidationResources"?: Resources
|
|
39
131
|
}
|
|
132
|
+
& ([Final] extends [never] ? {} : { readonly final: Final })
|
|
40
133
|
|
|
41
134
|
export const makeRpcClient = <
|
|
42
|
-
|
|
135
|
+
Middleware extends ClientMiddleware<Record<string, RpcContextMap.Any>>,
|
|
43
136
|
GeneralErrors extends S.Top = never
|
|
44
|
-
>(
|
|
137
|
+
>(middleware: Middleware, generalErrors?: GeneralErrors) => {
|
|
45
138
|
// Long way around Context/C extends etc to support actual jsdoc from passed in RequestConfig etc... (??)
|
|
46
139
|
type ServiceMap = {
|
|
47
140
|
success: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
|
|
48
141
|
error: S.Top | S.Struct.Fields // SchemaOrFields will make a Schema type out of Struct.Fields
|
|
142
|
+
final?: S.Top | S.Struct.Fields // optional final-value schema for stream requests
|
|
143
|
+
stream?: boolean // request metadata — stripped from stored config
|
|
49
144
|
}
|
|
50
145
|
|
|
51
|
-
type RequestConfig = GetContextConfig<
|
|
146
|
+
type RequestConfig = GetContextConfig<Middleware["requestContextMap"]>
|
|
52
147
|
|
|
148
|
+
// Errors raised by RPC middleware (e.g. `NotLoggedInError` from auth) used to
|
|
149
|
+
// be merged into `resource.error` here so they would surface in the wire
|
|
150
|
+
// failure schema. That merging is gone — the canonical source for middleware
|
|
151
|
+
// errors is now the middleware tag attached to the rpc on both server and
|
|
152
|
+
// client (see `ApiClientFactory.makeFor({ middleware })`). `Rpc.exitSchema`
|
|
153
|
+
// unions in `rpc.middlewares[*].error` automatically.
|
|
53
154
|
type MergeError<E> = [GeneralErrors] extends [never] ? SchemaOrFields<E> : S.Union<[SchemaOrFields<E>, GeneralErrors]>
|
|
54
155
|
type ErrorResult<C> = C extends { error: infer E } ? MergeError<E>
|
|
55
|
-
: [GeneralErrors] extends [never] ?
|
|
56
|
-
:
|
|
57
|
-
|
|
58
|
-
// TODO: filter errors based on config + take care of inversion
|
|
59
|
-
const errorSchemas = Object.values(rcs.config).map((_) => _.error)
|
|
156
|
+
: [GeneralErrors] extends [never] ? typeof S.Never
|
|
157
|
+
: GeneralErrors
|
|
60
158
|
|
|
61
|
-
function makeRequestClass<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap
|
|
159
|
+
function makeRequestClass<Tag extends string, Fields extends S.Struct.Fields, C extends Partial<ServiceMap>>(
|
|
62
160
|
tag: Tag,
|
|
63
161
|
fields: Fields,
|
|
64
162
|
config?: C
|
|
65
163
|
) {
|
|
66
164
|
const failureSchema = merge(
|
|
67
165
|
config?.error ? S.isSchema(config.error) ? config.error : S.Struct(config.error) : undefined,
|
|
68
|
-
[
|
|
166
|
+
[generalErrors].filter(Boolean)
|
|
69
167
|
)
|
|
70
168
|
const successSchema = config?.success
|
|
71
169
|
? S.isSchema(config.success)
|
|
72
|
-
? AST.isVoid(config.success.ast) ?
|
|
170
|
+
? AST.isVoid(config.success.ast) ? S.Void : config.success
|
|
73
171
|
: S.Struct(config.success)
|
|
74
|
-
:
|
|
172
|
+
: S.Void
|
|
173
|
+
|
|
174
|
+
const finalConfig = (config as any)?.final
|
|
175
|
+
const finalSchema = finalConfig && S.isSchema(finalConfig) ? finalConfig : undefined
|
|
176
|
+
|
|
177
|
+
// Strip stream from the stored config — it's request metadata, not handler config
|
|
178
|
+
const { stream: _stream, ...restConfig } = config ?? ({} as C)
|
|
75
179
|
|
|
76
|
-
const RequestClass = S.
|
|
180
|
+
const RequestClass = S.Opaque()(S.TaggedStruct(tag, fields))
|
|
77
181
|
Object.assign(RequestClass, {
|
|
78
182
|
_tag: tag,
|
|
79
183
|
success: successSchema,
|
|
80
184
|
error: failureSchema,
|
|
81
|
-
|
|
185
|
+
...(finalSchema !== undefined ? { final: finalSchema } : {}),
|
|
186
|
+
config: restConfig
|
|
82
187
|
})
|
|
83
188
|
|
|
84
189
|
return RequestClass
|
|
85
190
|
}
|
|
86
191
|
|
|
87
|
-
function
|
|
88
|
-
|
|
89
|
-
|
|
192
|
+
function makeTaggedRequestWithMeta<
|
|
193
|
+
ModuleName extends string,
|
|
194
|
+
Type extends "command" | "query"
|
|
195
|
+
>(
|
|
196
|
+
moduleName: ModuleName,
|
|
197
|
+
type: Type
|
|
198
|
+
) {
|
|
199
|
+
function TaggedRequestWithMeta<Self, Resources extends InvalidationResources = never>(): {
|
|
200
|
+
// ─── stream: true overloads (must come before non-stream so TypeScript picks them) ───────────
|
|
201
|
+
<
|
|
202
|
+
Tag extends string,
|
|
203
|
+
Payload extends S.Struct.Fields,
|
|
204
|
+
Success extends S.Top | S.Struct.Fields,
|
|
205
|
+
Error extends S.Top | S.Struct.Fields,
|
|
206
|
+
Final extends S.Top | S.Struct.Fields = never,
|
|
207
|
+
C extends RequestConfig & Record<string, any> = RequestConfig & Record<string, any>
|
|
208
|
+
>(
|
|
90
209
|
tag: Tag,
|
|
91
210
|
fields: Payload,
|
|
92
|
-
config:
|
|
211
|
+
config:
|
|
212
|
+
& Omit<C, "invalidatesQueries">
|
|
213
|
+
& { stream: true; success: Success; error: Error; final?: Final },
|
|
214
|
+
invalidatesQueries?: InvalidationCallback<
|
|
215
|
+
Resources,
|
|
216
|
+
InputFromPayload<Payload>,
|
|
217
|
+
OutputFromSuccess<SchemaOrFields<Success>>,
|
|
218
|
+
ErrorResult<C & { success: Success; error: Error }>["Type"]
|
|
219
|
+
>
|
|
93
220
|
): TaggedRequestForResult<
|
|
94
221
|
Self,
|
|
95
222
|
Tag,
|
|
96
223
|
Payload,
|
|
97
|
-
SchemaOrFields<
|
|
98
|
-
ErrorResult<C>,
|
|
99
|
-
Omit<
|
|
100
|
-
|
|
224
|
+
SchemaOrFields<Success>,
|
|
225
|
+
ErrorResult<C & { success: Success; error: Error }>,
|
|
226
|
+
Omit<
|
|
227
|
+
& Omit<C, "invalidatesQueries">
|
|
228
|
+
& {
|
|
229
|
+
success: Success
|
|
230
|
+
error: Error
|
|
231
|
+
}
|
|
232
|
+
& Partial<
|
|
233
|
+
InvalidationConfigForCommand<
|
|
234
|
+
Resources,
|
|
235
|
+
Payload,
|
|
236
|
+
SchemaOrFields<Success>,
|
|
237
|
+
ErrorResult<C & { success: Success; error: Error }>
|
|
238
|
+
>
|
|
239
|
+
>,
|
|
240
|
+
"success" | "error" | "stream"
|
|
241
|
+
>,
|
|
242
|
+
ModuleName,
|
|
243
|
+
Type,
|
|
244
|
+
true,
|
|
245
|
+
Resources,
|
|
246
|
+
[Final] extends [never] ? never : SchemaOrFields<Final>,
|
|
247
|
+
Middleware
|
|
101
248
|
>
|
|
102
|
-
<
|
|
249
|
+
<
|
|
250
|
+
Tag extends string,
|
|
251
|
+
Payload extends S.Struct.Fields,
|
|
252
|
+
Success extends S.Top | S.Struct.Fields,
|
|
253
|
+
Final extends S.Top | S.Struct.Fields = never,
|
|
254
|
+
C extends RequestConfig & Record<string, any> & { error?: never } =
|
|
255
|
+
& RequestConfig
|
|
256
|
+
& Record<string, any>
|
|
257
|
+
& { error?: never }
|
|
258
|
+
>(
|
|
103
259
|
tag: Tag,
|
|
104
260
|
fields: Payload,
|
|
105
|
-
config:
|
|
261
|
+
config:
|
|
262
|
+
& Omit<C, "invalidatesQueries">
|
|
263
|
+
& { stream: true; success: Success; final?: Final },
|
|
264
|
+
invalidatesQueries?: InvalidationCallback<
|
|
265
|
+
Resources,
|
|
266
|
+
InputFromPayload<Payload>,
|
|
267
|
+
OutputFromSuccess<SchemaOrFields<Success>>,
|
|
268
|
+
ErrorResult<C & { success: Success }>["Type"]
|
|
269
|
+
>
|
|
106
270
|
): TaggedRequestForResult<
|
|
107
271
|
Self,
|
|
108
272
|
Tag,
|
|
109
273
|
Payload,
|
|
110
|
-
SchemaOrFields<
|
|
111
|
-
ErrorResult<C>,
|
|
112
|
-
Omit<
|
|
113
|
-
|
|
274
|
+
SchemaOrFields<Success>,
|
|
275
|
+
ErrorResult<C & { success: Success }>,
|
|
276
|
+
Omit<
|
|
277
|
+
& Omit<C, "invalidatesQueries">
|
|
278
|
+
& { success: Success }
|
|
279
|
+
& Partial<
|
|
280
|
+
InvalidationConfigForCommand<
|
|
281
|
+
Resources,
|
|
282
|
+
Payload,
|
|
283
|
+
SchemaOrFields<Success>,
|
|
284
|
+
ErrorResult<C & { success: Success }>
|
|
285
|
+
>
|
|
286
|
+
>,
|
|
287
|
+
"success" | "error" | "stream"
|
|
288
|
+
>,
|
|
289
|
+
ModuleName,
|
|
290
|
+
Type,
|
|
291
|
+
true,
|
|
292
|
+
Resources,
|
|
293
|
+
[Final] extends [never] ? never : SchemaOrFields<Final>,
|
|
294
|
+
Middleware
|
|
114
295
|
>
|
|
115
|
-
|
|
296
|
+
// ─── stream: true without `success` overloads ────────────────────────────────────────────────
|
|
297
|
+
<
|
|
298
|
+
Tag extends string,
|
|
299
|
+
Payload extends S.Struct.Fields,
|
|
300
|
+
Error extends S.Top | S.Struct.Fields,
|
|
301
|
+
C extends RequestConfig & Record<string, any> & { success?: never } =
|
|
302
|
+
& RequestConfig
|
|
303
|
+
& Record<string, any>
|
|
304
|
+
& { success?: never }
|
|
305
|
+
>(
|
|
116
306
|
tag: Tag,
|
|
117
307
|
fields: Payload,
|
|
118
|
-
config:
|
|
308
|
+
config:
|
|
309
|
+
& Omit<C, "invalidatesQueries">
|
|
310
|
+
& { stream: true; error: Error },
|
|
311
|
+
invalidatesQueries?: InvalidationCallback<
|
|
312
|
+
Resources,
|
|
313
|
+
InputFromPayload<Payload>,
|
|
314
|
+
void,
|
|
315
|
+
ErrorResult<C & { error: Error }>["Type"]
|
|
316
|
+
>
|
|
119
317
|
): TaggedRequestForResult<
|
|
120
318
|
Self,
|
|
121
319
|
Tag,
|
|
122
320
|
Payload,
|
|
123
|
-
typeof
|
|
321
|
+
typeof S.Void,
|
|
322
|
+
ErrorResult<C & { error: Error }>,
|
|
323
|
+
Omit<
|
|
324
|
+
& Omit<C, "invalidatesQueries">
|
|
325
|
+
& { error: Error }
|
|
326
|
+
& Partial<
|
|
327
|
+
InvalidationConfigForCommand<
|
|
328
|
+
Resources,
|
|
329
|
+
Payload,
|
|
330
|
+
typeof S.Void,
|
|
331
|
+
ErrorResult<C & { error: Error }>
|
|
332
|
+
>
|
|
333
|
+
>,
|
|
334
|
+
"success" | "error" | "stream"
|
|
335
|
+
>,
|
|
336
|
+
ModuleName,
|
|
337
|
+
Type,
|
|
338
|
+
true,
|
|
339
|
+
Resources,
|
|
340
|
+
never,
|
|
341
|
+
Middleware
|
|
342
|
+
>
|
|
343
|
+
<
|
|
344
|
+
Tag extends string,
|
|
345
|
+
Payload extends S.Struct.Fields,
|
|
346
|
+
C extends RequestConfig & Record<string, any> & { success?: never; error?: never } =
|
|
347
|
+
& RequestConfig
|
|
348
|
+
& Record<string, any>
|
|
349
|
+
& { success?: never; error?: never }
|
|
350
|
+
>(
|
|
351
|
+
tag: Tag,
|
|
352
|
+
fields: Payload,
|
|
353
|
+
config:
|
|
354
|
+
& Omit<C, "invalidatesQueries">
|
|
355
|
+
& { stream: true },
|
|
356
|
+
invalidatesQueries?: InvalidationCallback<
|
|
357
|
+
Resources,
|
|
358
|
+
InputFromPayload<Payload>,
|
|
359
|
+
void,
|
|
360
|
+
ErrorResult<C>["Type"]
|
|
361
|
+
>
|
|
362
|
+
): TaggedRequestForResult<
|
|
363
|
+
Self,
|
|
364
|
+
Tag,
|
|
365
|
+
Payload,
|
|
366
|
+
typeof S.Void,
|
|
124
367
|
ErrorResult<C>,
|
|
125
|
-
Omit<
|
|
126
|
-
|
|
368
|
+
Omit<
|
|
369
|
+
& Omit<C, "invalidatesQueries">
|
|
370
|
+
& Partial<InvalidationConfigForCommand<Resources, Payload, typeof S.Void, ErrorResult<C>>>,
|
|
371
|
+
"success" | "error" | "stream"
|
|
372
|
+
>,
|
|
373
|
+
ModuleName,
|
|
374
|
+
Type,
|
|
375
|
+
true,
|
|
376
|
+
Resources,
|
|
377
|
+
never,
|
|
378
|
+
Middleware
|
|
379
|
+
>
|
|
380
|
+
// ─── non-stream overloads ────────────────────────────────────────────────────────────────────
|
|
381
|
+
<
|
|
382
|
+
Tag extends string,
|
|
383
|
+
Payload extends S.Struct.Fields,
|
|
384
|
+
Success extends S.Top | S.Struct.Fields,
|
|
385
|
+
Error extends S.Top | S.Struct.Fields,
|
|
386
|
+
Final extends S.Top | S.Struct.Fields = never,
|
|
387
|
+
C extends RequestConfig & Record<string, any> = RequestConfig & Record<string, any>
|
|
388
|
+
>(
|
|
389
|
+
tag: Tag,
|
|
390
|
+
fields: Payload,
|
|
391
|
+
config:
|
|
392
|
+
& Omit<C, "invalidatesQueries">
|
|
393
|
+
& { success: Success; error: Error; final?: Final },
|
|
394
|
+
invalidatesQueries?: InvalidationCallback<
|
|
395
|
+
Resources,
|
|
396
|
+
InputFromPayload<Payload>,
|
|
397
|
+
OutputFromSuccess<SchemaOrFields<Success>>,
|
|
398
|
+
ErrorResult<C & { success: Success; error: Error }>["Type"]
|
|
399
|
+
>
|
|
400
|
+
): TaggedRequestForResult<
|
|
401
|
+
Self,
|
|
402
|
+
Tag,
|
|
403
|
+
Payload,
|
|
404
|
+
SchemaOrFields<Success>,
|
|
405
|
+
ErrorResult<C & { success: Success; error: Error }>,
|
|
406
|
+
Omit<
|
|
407
|
+
& Omit<C, "invalidatesQueries">
|
|
408
|
+
& {
|
|
409
|
+
success: Success
|
|
410
|
+
error: Error
|
|
411
|
+
}
|
|
412
|
+
& Partial<
|
|
413
|
+
InvalidationConfigForCommand<
|
|
414
|
+
Resources,
|
|
415
|
+
Payload,
|
|
416
|
+
SchemaOrFields<Success>,
|
|
417
|
+
ErrorResult<C & { success: Success; error: Error }>
|
|
418
|
+
>
|
|
419
|
+
>,
|
|
420
|
+
"success" | "error" | "stream"
|
|
421
|
+
>,
|
|
422
|
+
ModuleName,
|
|
423
|
+
Type,
|
|
424
|
+
false,
|
|
425
|
+
Resources,
|
|
426
|
+
[Final] extends [never] ? never : SchemaOrFields<Final>,
|
|
427
|
+
Middleware
|
|
428
|
+
>
|
|
429
|
+
<
|
|
430
|
+
Tag extends string,
|
|
431
|
+
Payload extends S.Struct.Fields,
|
|
432
|
+
Success extends S.Top | S.Struct.Fields,
|
|
433
|
+
Final extends S.Top | S.Struct.Fields = never,
|
|
434
|
+
C extends RequestConfig & Record<string, any> & { error?: never } =
|
|
435
|
+
& RequestConfig
|
|
436
|
+
& Record<string, any>
|
|
437
|
+
& {
|
|
438
|
+
error?: never
|
|
439
|
+
}
|
|
440
|
+
>(
|
|
441
|
+
tag: Tag,
|
|
442
|
+
fields: Payload,
|
|
443
|
+
config:
|
|
444
|
+
& Omit<C, "invalidatesQueries">
|
|
445
|
+
& { success: Success; final?: Final },
|
|
446
|
+
invalidatesQueries?: InvalidationCallback<
|
|
447
|
+
Resources,
|
|
448
|
+
InputFromPayload<Payload>,
|
|
449
|
+
OutputFromSuccess<SchemaOrFields<Success>>,
|
|
450
|
+
ErrorResult<C & { success: Success }>["Type"]
|
|
451
|
+
>
|
|
452
|
+
): TaggedRequestForResult<
|
|
453
|
+
Self,
|
|
454
|
+
Tag,
|
|
455
|
+
Payload,
|
|
456
|
+
SchemaOrFields<Success>,
|
|
457
|
+
ErrorResult<C & { success: Success }>,
|
|
458
|
+
Omit<
|
|
459
|
+
& Omit<C, "invalidatesQueries">
|
|
460
|
+
& {
|
|
461
|
+
success: Success
|
|
462
|
+
}
|
|
463
|
+
& Partial<
|
|
464
|
+
InvalidationConfigForCommand<
|
|
465
|
+
Resources,
|
|
466
|
+
Payload,
|
|
467
|
+
SchemaOrFields<Success>,
|
|
468
|
+
ErrorResult<C & { success: Success }>
|
|
469
|
+
>
|
|
470
|
+
>,
|
|
471
|
+
"success" | "error" | "stream"
|
|
472
|
+
>,
|
|
473
|
+
ModuleName,
|
|
474
|
+
Type,
|
|
475
|
+
false,
|
|
476
|
+
Resources,
|
|
477
|
+
[Final] extends [never] ? never : SchemaOrFields<Final>,
|
|
478
|
+
Middleware
|
|
479
|
+
>
|
|
480
|
+
<
|
|
481
|
+
Tag extends string,
|
|
482
|
+
Payload extends S.Struct.Fields,
|
|
483
|
+
Error extends S.Top | S.Struct.Fields,
|
|
484
|
+
C extends RequestConfig & Record<string, any> & { success?: never }
|
|
485
|
+
>(
|
|
486
|
+
tag: Tag,
|
|
487
|
+
fields: Payload,
|
|
488
|
+
config:
|
|
489
|
+
& Omit<C, "invalidatesQueries">
|
|
490
|
+
& { error: Error },
|
|
491
|
+
invalidatesQueries?: InvalidationCallback<
|
|
492
|
+
Resources,
|
|
493
|
+
InputFromPayload<Payload>,
|
|
494
|
+
void,
|
|
495
|
+
ErrorResult<C & { error: Error }>["Type"]
|
|
496
|
+
>
|
|
497
|
+
): TaggedRequestForResult<
|
|
498
|
+
Self,
|
|
499
|
+
Tag,
|
|
500
|
+
Payload,
|
|
501
|
+
typeof S.Void,
|
|
502
|
+
ErrorResult<C & { error: Error }>,
|
|
503
|
+
Omit<
|
|
504
|
+
& Omit<C, "invalidatesQueries">
|
|
505
|
+
& {
|
|
506
|
+
error: Error
|
|
507
|
+
}
|
|
508
|
+
& Partial<
|
|
509
|
+
InvalidationConfigForCommand<
|
|
510
|
+
Resources,
|
|
511
|
+
Payload,
|
|
512
|
+
typeof S.Void,
|
|
513
|
+
ErrorResult<C & { error: Error }>
|
|
514
|
+
>
|
|
515
|
+
>,
|
|
516
|
+
"success" | "error" | "stream"
|
|
517
|
+
>,
|
|
518
|
+
ModuleName,
|
|
519
|
+
Type,
|
|
520
|
+
false,
|
|
521
|
+
Resources,
|
|
522
|
+
never,
|
|
523
|
+
Middleware
|
|
127
524
|
>
|
|
128
|
-
<
|
|
525
|
+
<
|
|
526
|
+
Tag extends string,
|
|
527
|
+
Payload extends S.Struct.Fields,
|
|
528
|
+
C extends RequestConfig & Record<string, any> & { success?: never; error?: never }
|
|
529
|
+
>(
|
|
129
530
|
tag: Tag,
|
|
130
531
|
fields: Payload,
|
|
131
|
-
config: C
|
|
532
|
+
config: Omit<C, "invalidatesQueries">,
|
|
533
|
+
invalidatesQueries?: InvalidationCallback<
|
|
534
|
+
Resources,
|
|
535
|
+
InputFromPayload<Payload>,
|
|
536
|
+
void,
|
|
537
|
+
ErrorResult<C>["Type"]
|
|
538
|
+
>
|
|
132
539
|
): TaggedRequestForResult<
|
|
133
540
|
Self,
|
|
134
541
|
Tag,
|
|
135
542
|
Payload,
|
|
136
|
-
typeof
|
|
543
|
+
typeof S.Void,
|
|
137
544
|
ErrorResult<C>,
|
|
138
|
-
Omit<
|
|
139
|
-
|
|
545
|
+
Omit<
|
|
546
|
+
& Omit<C, "invalidatesQueries">
|
|
547
|
+
& Partial<InvalidationConfigForCommand<Resources, Payload, typeof S.Void, ErrorResult<C>>>,
|
|
548
|
+
"success" | "error" | "stream"
|
|
549
|
+
>,
|
|
550
|
+
ModuleName,
|
|
551
|
+
Type,
|
|
552
|
+
false,
|
|
553
|
+
Resources,
|
|
554
|
+
never,
|
|
555
|
+
Middleware
|
|
140
556
|
>
|
|
141
557
|
<Tag extends string, Payload extends S.Struct.Fields>(
|
|
142
558
|
tag: Tag,
|
|
@@ -145,23 +561,66 @@ export const makeRpcClient = <
|
|
|
145
561
|
Self,
|
|
146
562
|
Tag,
|
|
147
563
|
Payload,
|
|
148
|
-
typeof
|
|
564
|
+
typeof S.Void,
|
|
149
565
|
ErrorResult<{}>,
|
|
150
|
-
Record<string, never
|
|
151
|
-
|
|
566
|
+
// Empty config, NOT `Record<string, never>`: the config type flows into
|
|
567
|
+
// `GetEffectContext`/`GetEffectError` as `T`, and `keyof Record<string, never>`
|
|
568
|
+
// is `string` — so an inverted key like `allowAnonymous` would satisfy
|
|
569
|
+
// `key extends keyof T`, then `T[key]` (`never`) `extends true` (true, since
|
|
570
|
+
// `never` is assignable to everything) and the middleware wrongly takes the
|
|
571
|
+
// "allowAnonymous: true" (anonymous) branch, dropping `UserProfile`. `{}` has
|
|
572
|
+
// `keyof {} = never`, so no config key is treated as set and the defaults
|
|
573
|
+
// (auth required, `UserProfile` provided) apply — same as passing `{}` explicitly.
|
|
574
|
+
{},
|
|
575
|
+
ModuleName,
|
|
576
|
+
Type,
|
|
577
|
+
false,
|
|
578
|
+
never,
|
|
579
|
+
never,
|
|
580
|
+
Middleware
|
|
152
581
|
>
|
|
153
582
|
} {
|
|
154
583
|
return (<Tag extends string, Fields extends S.Struct.Fields, C extends ServiceMap>(
|
|
155
584
|
tag: Tag,
|
|
156
585
|
fields: Fields,
|
|
157
|
-
config?: C
|
|
586
|
+
config?: C,
|
|
587
|
+
invalidatesQueries?: InvalidationCallback<Resources>
|
|
158
588
|
) => {
|
|
159
|
-
const
|
|
160
|
-
|
|
589
|
+
const isStream = (config as any)?.stream === true
|
|
590
|
+
const requestConfig = invalidatesQueries === undefined ? config : { ...config, invalidatesQueries }
|
|
591
|
+
const cls = makeRequestClass(tag, fields, requestConfig)
|
|
592
|
+
Object.assign(cls, {
|
|
593
|
+
id: `${moduleName}.${tag}`,
|
|
594
|
+
moduleName,
|
|
595
|
+
type,
|
|
596
|
+
stream: isStream,
|
|
597
|
+
middleware
|
|
598
|
+
})
|
|
161
599
|
return cls
|
|
162
600
|
}) as any
|
|
163
601
|
}
|
|
164
|
-
return Object.assign(TaggedRequestWithMeta, { moduleName } as const)
|
|
602
|
+
return Object.assign(TaggedRequestWithMeta, { moduleName, type } as const)
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
function TaggedRequestFor<ModuleName extends string>(moduleName: ModuleName) {
|
|
606
|
+
const Query = makeTaggedRequestWithMeta(moduleName, "query")
|
|
607
|
+
const Command = makeTaggedRequestWithMeta(moduleName, "command")
|
|
608
|
+
|
|
609
|
+
return {
|
|
610
|
+
moduleName,
|
|
611
|
+
/**
|
|
612
|
+
* Create query request classes for this module.
|
|
613
|
+
* Queries read state and should not mutate server state.
|
|
614
|
+
* Pass `stream: true` in the config to produce a Stream of `success` values (QueryStream behaviour).
|
|
615
|
+
*/
|
|
616
|
+
Query,
|
|
617
|
+
/**
|
|
618
|
+
* Create command request classes for this module.
|
|
619
|
+
* Commands mutate state and should avoid returning complex read models.
|
|
620
|
+
* Pass `stream: true` in the config to produce a Stream of `success` values (CommandStream behaviour).
|
|
621
|
+
*/
|
|
622
|
+
Command
|
|
623
|
+
} as const
|
|
165
624
|
}
|
|
166
625
|
|
|
167
626
|
return {
|