effect-app 4.0.0-beta.99 → 4.0.1
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 +2042 -0
- package/dist/Array.d.ts +1 -17
- package/dist/Array.d.ts.map +1 -1
- package/dist/Array.js +3 -27
- package/dist/Chunk.d.ts +3 -27
- package/dist/Chunk.d.ts.map +1 -1
- package/dist/Chunk.js +4 -39
- 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/DateTime.d.ts +33 -0
- package/dist/DateTime.d.ts.map +1 -0
- package/dist/DateTime.js +18 -0
- package/dist/Effect.d.ts +3 -14
- package/dist/Effect.d.ts.map +1 -1
- package/dist/Effect.js +8 -26
- 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 +0 -4
- package/dist/Function.d.ts.map +1 -1
- package/dist/Function.js +1 -7
- 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 +610 -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 +34 -0
- package/dist/Model/dsl.d.ts.map +1 -0
- package/dist/Model/dsl.js +45 -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 +369 -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 -2
- package/dist/Option.d.ts.map +1 -1
- package/dist/Option.js +3 -7
- package/dist/Pure.d.ts +9 -7
- package/dist/Pure.d.ts.map +1 -1
- package/dist/Pure.js +20 -17
- 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 +279 -75
- package/dist/Schema/ext.d.ts.map +1 -1
- package/dist/Schema/ext.js +330 -72
- 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 +224 -7
- package/dist/Schema.d.ts.map +1 -1
- package/dist/Schema.js +190 -24
- 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 +8 -6
- 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/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 +154 -34
- 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/migration/nativeEffect.d.ts +21 -0
- package/dist/migration/nativeEffect.d.ts.map +1 -0
- package/dist/migration/nativeEffect.js +598 -0
- 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 -45
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +33 -49
- 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 +25 -266
- package/src/Array.ts +7 -39
- package/src/Chunk.ts +6 -55
- 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/DateTime.ts +473 -0
- package/src/Effect.ts +10 -32
- package/src/Emailer.ts +51 -0
- package/src/Function.ts +0 -7
- 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 +987 -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 +130 -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 +531 -0
- package/src/Model/query.ts +13 -0
- package/src/Model.ts +5 -0
- package/src/NonEmptySet.ts +6 -4
- package/src/Option.ts +3 -8
- package/src/Pure.ts +20 -17
- 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 +405 -95
- 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 +10 -5
- package/src/Store.ts +325 -0
- package/src/_ext/Array.ts +4 -2
- 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 +295 -129
- 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/migration/nativeEffect.ts +645 -0
- 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 -175
- package/src/validation.ts +2 -2
- package/src/withToast.ts +133 -0
- package/test/dateTimeLocal.test.ts +55 -0
- package/test/dist/dateTimeLocal.test.d.ts.map +1 -0
- package/test/dist/nativeEffectMigration.test.d.ts.map +1 -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/nativeEffectMigration.test.ts +77 -0
- 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/dist/_ext/date.d.ts +0 -15
- package/dist/_ext/date.d.ts.map +0 -1
- package/dist/_ext/date.js +0 -16
- package/dist/_ext/misc.d.ts +0 -14
- package/dist/_ext/misc.d.ts.map +0 -1
- package/dist/_ext/misc.js +0 -17
- package/eslint.config.mjs +0 -26
- package/src/Operations.ts +0 -55
- package/src/_ext/date.ts +0 -27
- package/src/_ext/misc.ts +0 -46
- package/tsconfig.json.bak +0 -12
package/src/client/clientFor.ts
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
3
|
|
|
4
4
|
import * as Record from "effect/Record"
|
|
5
|
-
import type * as
|
|
5
|
+
import type * as Stream from "effect/Stream"
|
|
6
6
|
import type { Path } from "path-parser"
|
|
7
7
|
import qs from "query-string"
|
|
8
|
-
import type * as Effect from "../Effect.
|
|
9
|
-
import type * as S from "../Schema.
|
|
10
|
-
import { type Req } from "./apiClientFactory.
|
|
8
|
+
import type * as Effect from "../Effect.ts"
|
|
9
|
+
import type * as S from "../Schema.ts"
|
|
10
|
+
import { type Req } from "./apiClientFactory.ts"
|
|
11
11
|
|
|
12
12
|
export function makePathWithQuery(
|
|
13
13
|
path: Path,
|
|
@@ -63,56 +63,124 @@ export type Client<M extends RequestsAny, ModuleName extends string> = RequestHa
|
|
|
63
63
|
ModuleName
|
|
64
64
|
>
|
|
65
65
|
|
|
66
|
-
export type ExtractResponse<T> = T extends S.Codec<any> ?
|
|
66
|
+
export type ExtractResponse<T> = T extends S.Codec<any> ? T["Type"]
|
|
67
67
|
: T extends unknown ? void
|
|
68
68
|
: never
|
|
69
69
|
|
|
70
|
-
export type ExtractEResponse<T> = T extends S.Codec<any> ?
|
|
70
|
+
export type ExtractEResponse<T> = T extends S.Codec<any> ? T["Encoded"]
|
|
71
71
|
: T extends unknown ? void
|
|
72
72
|
: never
|
|
73
73
|
|
|
74
|
-
type IsEmpty<T> = keyof T extends never ? true
|
|
75
|
-
: false
|
|
76
|
-
|
|
77
|
-
// v4: Request.RequestTypeId, S.symbolSerializable, S.symbolWithResult removed — use keyof Request to filter internal props
|
|
78
|
-
type Cruft = "_tag" | keyof Request.Request<any, any, any>
|
|
79
|
-
|
|
80
74
|
export interface ClientForOptions {
|
|
81
75
|
readonly skipQueryKey?: readonly string[]
|
|
76
|
+
/**
|
|
77
|
+
* Middleware tag to attach to every rpc on the client. Schema-only — the
|
|
78
|
+
* client never invokes the middleware (no Live impl required), but its
|
|
79
|
+
* declared `error` schema joins the rpc failure union via
|
|
80
|
+
* `Rpc.exitSchema`'s `rpc.middlewares[*].error` walk. Required when
|
|
81
|
+
* middleware can throw errors that aren't part of the resource's declared
|
|
82
|
+
* error union (e.g. auth middleware throwing `NotLoggedInError`); without
|
|
83
|
+
* it the client decode would fail with a `SchemaError` for stream rpcs.
|
|
84
|
+
*/
|
|
82
85
|
}
|
|
83
86
|
|
|
84
|
-
|
|
85
|
-
|
|
87
|
+
// $Project/$Configuration.Index
|
|
88
|
+
// -> "$Project", "$Configuration", "Index"
|
|
89
|
+
export const makeQueryKey = ({ id, options }: { id: string; options?: ClientForOptions }) =>
|
|
90
|
+
id
|
|
91
|
+
.split("/")
|
|
92
|
+
.filter((segment: string) => !options || !options.skipQueryKey?.includes(segment))
|
|
93
|
+
.map((segment: string) => "$" + segment)
|
|
94
|
+
.join(".")
|
|
95
|
+
.split(".")
|
|
96
|
+
|
|
97
|
+
export interface RequestHandlerWithInput<I, A, E, R, Request extends Req, Id extends string> {
|
|
98
|
+
handler: (i: I) => Effect.Effect<A, E, R>
|
|
86
99
|
id: Id
|
|
87
100
|
options?: ClientForOptions
|
|
88
101
|
Request: Request
|
|
102
|
+
queryKeyProjectionHash?: string
|
|
103
|
+
disableQueryInvalidation?: boolean
|
|
89
104
|
}
|
|
90
105
|
|
|
91
|
-
|
|
92
|
-
|
|
106
|
+
/** Type alias: a no-input handler is simply `RequestHandlerWithInput<void, …>`. */
|
|
107
|
+
export type RequestHandler<A, E, R, Request extends Req, Id extends string> = RequestHandlerWithInput<
|
|
108
|
+
void,
|
|
109
|
+
A,
|
|
110
|
+
E,
|
|
111
|
+
R,
|
|
112
|
+
Request,
|
|
113
|
+
Id
|
|
114
|
+
>
|
|
115
|
+
|
|
116
|
+
export interface RequestStreamHandlerWithInput<I, A, E, R, Request extends Req, Id extends string, Final = A> {
|
|
117
|
+
handler: (i: I) => Stream.Stream<A, E, R>
|
|
93
118
|
id: Id
|
|
94
119
|
options?: ClientForOptions
|
|
95
120
|
Request: Request
|
|
121
|
+
/**
|
|
122
|
+
* Phantom type property (never set at runtime) that carries the `Final` type to
|
|
123
|
+
* `StreamMutationWithExtensions`. The tilde prefix follows the Effect convention for
|
|
124
|
+
* phantom/virtual properties and prevents accidental runtime access.
|
|
125
|
+
* Stream failures bubble through the execute effect's typed error channel `E`;
|
|
126
|
+
* the reactive `AsyncResult` ref also mirrors the failure for live progress UI.
|
|
127
|
+
*/
|
|
128
|
+
readonly "~final"?: Final
|
|
96
129
|
}
|
|
97
130
|
|
|
131
|
+
/** Type alias: a no-input stream handler is simply `RequestStreamHandlerWithInput<void, …>`. */
|
|
132
|
+
export type RequestStreamHandler<A, E, R, Request extends Req, Id extends string, Final = A> =
|
|
133
|
+
RequestStreamHandlerWithInput<void, A, E, R, Request, Id, Final>
|
|
134
|
+
|
|
98
135
|
// make sure this is exported or d.ts of apiClientFactory breaks?!
|
|
99
|
-
type
|
|
136
|
+
export type RequestInputFromMake<I extends { readonly make: (...args: any[]) => any }> = Parameters<I["make"]> extends
|
|
137
|
+
[] ? void : Parameters<I["make"]>[0]
|
|
138
|
+
|
|
139
|
+
// Has no input only when the request schema declares no payload fields (the auto-added
|
|
140
|
+
// `_tag` field is ignored). Any payload fields (even all-optional) produce a function handler.
|
|
141
|
+
type HasNoFields<I> = I extends { readonly fields: infer F extends S.Struct.Fields }
|
|
142
|
+
? [Exclude<keyof F, "_tag">] extends [never] ? true : false
|
|
143
|
+
: false
|
|
144
|
+
|
|
145
|
+
type RequestInput<I extends { readonly make: (...args: any[]) => any }> = Parameters<I["make"]>[0]
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Caller-facing input type for a request. `void` when the request schema has no fields;
|
|
149
|
+
* otherwise `make`'s first param type.
|
|
150
|
+
*/
|
|
151
|
+
export type HandlerInput<I extends { readonly make: (...args: any[]) => any }> = HasNoFields<I> extends true ? void
|
|
152
|
+
: RequestInput<I>
|
|
153
|
+
|
|
154
|
+
/** Extracts the final-value type from a stream request. Defaults to the success type when no `final` schema is set. */
|
|
155
|
+
type FinalTypeOf<T extends Req> = T extends { readonly final: infer F extends S.Top } ? F["Type"]
|
|
156
|
+
: T["success"]["Type"]
|
|
157
|
+
|
|
158
|
+
// `T["success"]` / `T["error"]` are constrained to `S.Top` via `Req`, so we
|
|
159
|
+
// can read `["DecodingServices"]` directly. Avoids the conditional in
|
|
160
|
+
// `S.Codec.DecodingServices<X> = X extends Top ? X["DecodingServices"] : never`,
|
|
161
|
+
// which tsgo (native) fails to reduce in this generic position and leaves as
|
|
162
|
+
// `unknown`, polluting the `R` channel of every client handler.
|
|
163
|
+
type RequestHandlerFor<R, E, T extends Req, Id extends string> = T["stream"] extends true
|
|
164
|
+
? RequestStreamHandlerWithInput<
|
|
165
|
+
HandlerInput<T>,
|
|
166
|
+
T["success"]["Type"],
|
|
167
|
+
T["error"]["Type"] | E,
|
|
168
|
+
R | T["success"]["DecodingServices"] | T["error"]["DecodingServices"],
|
|
169
|
+
T,
|
|
170
|
+
Id,
|
|
171
|
+
FinalTypeOf<T>
|
|
172
|
+
>
|
|
173
|
+
: RequestHandlerWithInput<
|
|
174
|
+
HandlerInput<T>,
|
|
175
|
+
T["success"]["Type"],
|
|
176
|
+
T["error"]["Type"] | E,
|
|
177
|
+
R | T["success"]["DecodingServices"] | T["error"]["DecodingServices"],
|
|
178
|
+
T,
|
|
179
|
+
Id
|
|
180
|
+
>
|
|
100
181
|
|
|
101
182
|
export type RequestHandlers<R, E, M extends RequestsAny, ModuleName extends string> = {
|
|
102
|
-
[K in keyof M as M[K] extends Req ? K : never]:
|
|
103
|
-
?
|
|
104
|
-
|
|
105
|
-
S.Schema.Type<M[K]["error"]> | E,
|
|
106
|
-
R | ReqDecodingServices<M[K]>,
|
|
107
|
-
M[K],
|
|
108
|
-
`${ModuleName}.${K & string}`
|
|
109
|
-
>
|
|
110
|
-
: RequestHandlerWithInput<
|
|
111
|
-
Omit<S.Schema.Type<M[K]>, Cruft>,
|
|
112
|
-
S.Schema.Type<M[K]["success"]>,
|
|
113
|
-
S.Schema.Type<M[K]["error"]> | E,
|
|
114
|
-
R | ReqDecodingServices<M[K]>,
|
|
115
|
-
M[K],
|
|
116
|
-
`${ModuleName}.${K & string}`
|
|
117
|
-
>
|
|
183
|
+
[K in keyof M as M[K] extends Req ? K : never]: Extract<M[K], Req> extends infer T extends Req
|
|
184
|
+
? RequestHandlerFor<R, E, T, `${ModuleName}.${K & string}`>
|
|
185
|
+
: never
|
|
118
186
|
}
|
package/src/client/errors.ts
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
/** @effect-diagnostics overriddenSchemaConstructor:skip-file */
|
|
2
2
|
import { TaggedErrorClass } from "effect-app/Schema"
|
|
3
3
|
import * as Cause from "effect/Cause"
|
|
4
|
-
import * as S from "../Schema.
|
|
4
|
+
import * as S from "../Schema.ts"
|
|
5
5
|
|
|
6
|
-
export const tryToJson = (error:
|
|
6
|
+
export const tryToJson = (error: unknown) => {
|
|
7
7
|
try {
|
|
8
|
-
|
|
8
|
+
const errorJson = (error as any).toJSON()
|
|
9
|
+
return errorJson && typeof errorJson === "object" ? errorJson as Record<string, unknown> : { error }
|
|
9
10
|
} catch {
|
|
10
11
|
try {
|
|
11
|
-
return error.toString()
|
|
12
|
+
return { error: (error as any).toString() }
|
|
12
13
|
} catch (err) {
|
|
13
14
|
try {
|
|
14
|
-
return `Failed to convert error: ${err}`
|
|
15
|
+
return { error: `Failed to convert error: ${err}` }
|
|
15
16
|
} catch {
|
|
16
|
-
return `Failed to convert error: unknown failure`
|
|
17
|
+
return { error: `Failed to convert error: unknown failure` }
|
|
17
18
|
}
|
|
18
19
|
}
|
|
19
20
|
}
|
|
@@ -29,7 +30,7 @@ export class NotFoundError<ItemType = string> extends TaggedErrorClass<NotFoundE
|
|
|
29
30
|
props: { type: string; id: unknown; cause?: unknown },
|
|
30
31
|
disableValidation?: boolean
|
|
31
32
|
) {
|
|
32
|
-
super(props
|
|
33
|
+
super(props, disableValidation as any)
|
|
33
34
|
}
|
|
34
35
|
override get message() {
|
|
35
36
|
return `Didn't find ${(this as any).type}#${JSON.stringify((this as any).id)}`
|
|
@@ -47,7 +48,7 @@ export class InvalidStateError extends TaggedErrorClass<InvalidStateError>()("In
|
|
|
47
48
|
}) {
|
|
48
49
|
constructor(messageOrObject: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
|
|
49
50
|
super(
|
|
50
|
-
typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject }
|
|
51
|
+
typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject },
|
|
51
52
|
disableValidation as any
|
|
52
53
|
)
|
|
53
54
|
}
|
|
@@ -61,7 +62,7 @@ export class ServiceUnavailableError extends TaggedErrorClass<ServiceUnavailable
|
|
|
61
62
|
}) {
|
|
62
63
|
constructor(messageOrObject: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
|
|
63
64
|
super(
|
|
64
|
-
typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject }
|
|
65
|
+
typeof messageOrObject === "object" ? messageOrObject : { message: messageOrObject },
|
|
65
66
|
disableValidation as any
|
|
66
67
|
)
|
|
67
68
|
}
|
|
@@ -77,7 +78,7 @@ export class ValidationError extends TaggedErrorClass<ValidationError>()("Valida
|
|
|
77
78
|
props: { errors: ReadonlyArray<unknown>; cause?: unknown },
|
|
78
79
|
disableValidation?: boolean
|
|
79
80
|
) {
|
|
80
|
-
super(props
|
|
81
|
+
super(props, disableValidation as any)
|
|
81
82
|
}
|
|
82
83
|
override get message() {
|
|
83
84
|
return `Validation failed: ${(this as any).errors.map((e: any) => JSON.stringify(e, undefined, 2)).join(",\n")}`
|
|
@@ -91,7 +92,7 @@ export class NotLoggedInError extends TaggedErrorClass<NotLoggedInError>()("NotL
|
|
|
91
92
|
message: S.String
|
|
92
93
|
}) {
|
|
93
94
|
constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
|
|
94
|
-
super(messageFallback(messageOrObject)
|
|
95
|
+
super(messageFallback(messageOrObject), disableValidation as any)
|
|
95
96
|
}
|
|
96
97
|
override toString() {
|
|
97
98
|
return `NotLoggedInError: ${this.message}`
|
|
@@ -105,7 +106,7 @@ export class LoginError extends TaggedErrorClass<LoginError>()("NotLoggedInError
|
|
|
105
106
|
message: S.String
|
|
106
107
|
}) {
|
|
107
108
|
constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
|
|
108
|
-
super(messageFallback(messageOrObject)
|
|
109
|
+
super(messageFallback(messageOrObject), disableValidation as any)
|
|
109
110
|
}
|
|
110
111
|
override toString() {
|
|
111
112
|
return `LoginError: ${this.message}`
|
|
@@ -116,7 +117,7 @@ export class UnauthorizedError extends TaggedErrorClass<UnauthorizedError>()("Un
|
|
|
116
117
|
message: S.String
|
|
117
118
|
}) {
|
|
118
119
|
constructor(messageOrObject?: string | { message: string; cause?: unknown }, disableValidation?: boolean) {
|
|
119
|
-
super(messageFallback(messageOrObject)
|
|
120
|
+
super(messageFallback(messageOrObject), disableValidation as any)
|
|
120
121
|
}
|
|
121
122
|
override toString() {
|
|
122
123
|
return `UnauthorizedError: ${this.message}`
|
|
@@ -144,7 +145,7 @@ export class OptimisticConcurrencyException extends TaggedErrorClass<OptimisticC
|
|
|
144
145
|
disableValidation?: boolean
|
|
145
146
|
) {
|
|
146
147
|
super(
|
|
147
|
-
"message" in args ? args : { message: `Existing ${args.type} ${args.id} record changed` }
|
|
148
|
+
"message" in args ? args : { message: `Existing ${args.type} ${args.id} record changed` },
|
|
148
149
|
disableValidation as any
|
|
149
150
|
)
|
|
150
151
|
if (!("message" in args)) {
|
|
@@ -156,6 +157,45 @@ export class OptimisticConcurrencyException extends TaggedErrorClass<OptimisticC
|
|
|
156
157
|
}
|
|
157
158
|
}
|
|
158
159
|
|
|
160
|
+
/**
|
|
161
|
+
* Raised by a store adapter when a database operation fails for an
|
|
162
|
+
* infrastructure reason (request timeout, throttle, 5xx, dropped socket, or any
|
|
163
|
+
* non-conflict error). Distinct from `OptimisticConcurrencyException`, which is
|
|
164
|
+
* an expected etag conflict.
|
|
165
|
+
*
|
|
166
|
+
* `transient` is set by the adapter for failures worth retrying (timeout /
|
|
167
|
+
* throttle / 5xx / network). `cause` is the underlying adapter error, carried
|
|
168
|
+
* through a `Defect` schema so it serializes (an `Error` encodes to
|
|
169
|
+
* `{ name, message, cause }`) instead of breaking JSON encoding of the channel.
|
|
170
|
+
*
|
|
171
|
+
* Treated by the api/client/FE machinery like an unexpected (500-class) error.
|
|
172
|
+
*/
|
|
173
|
+
export class DatabaseError extends TaggedErrorClass<DatabaseError>()(
|
|
174
|
+
"DatabaseError",
|
|
175
|
+
{
|
|
176
|
+
message: S.String,
|
|
177
|
+
transient: S.Boolean,
|
|
178
|
+
cause: S.optional(S.Defect())
|
|
179
|
+
}
|
|
180
|
+
) {
|
|
181
|
+
constructor(
|
|
182
|
+
args: { message?: string; transient?: boolean; cause?: unknown },
|
|
183
|
+
disableValidation?: boolean
|
|
184
|
+
) {
|
|
185
|
+
super(
|
|
186
|
+
{
|
|
187
|
+
message: args.message ?? "Database operation failed",
|
|
188
|
+
transient: args.transient ?? false,
|
|
189
|
+
cause: args.cause
|
|
190
|
+
},
|
|
191
|
+
disableValidation as any
|
|
192
|
+
)
|
|
193
|
+
}
|
|
194
|
+
override toString() {
|
|
195
|
+
return `DatabaseError: ${this.message}`
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
159
199
|
const MutationOnlyErrors = [
|
|
160
200
|
InvalidStateError,
|
|
161
201
|
OptimisticConcurrencyException
|
|
@@ -167,7 +207,8 @@ const GeneralErrors = [
|
|
|
167
207
|
LoginError,
|
|
168
208
|
UnauthorizedError,
|
|
169
209
|
ValidationError,
|
|
170
|
-
ServiceUnavailableError
|
|
210
|
+
ServiceUnavailableError,
|
|
211
|
+
DatabaseError
|
|
171
212
|
] as const
|
|
172
213
|
|
|
173
214
|
export const SupportedErrors = S.Union([
|
|
@@ -202,11 +243,16 @@ export const silenceError = (e: Record<PropertyKey, any>) => {
|
|
|
202
243
|
}
|
|
203
244
|
|
|
204
245
|
export class CauseException<E> extends Error {
|
|
205
|
-
|
|
246
|
+
readonly originalCause: Cause.Cause<E>
|
|
247
|
+
readonly _tag: string
|
|
248
|
+
|
|
249
|
+
constructor(originalCause: Cause.Cause<E>, _tag: string) {
|
|
206
250
|
const limit = Error.stackTraceLimit
|
|
207
251
|
Error.stackTraceLimit = 0
|
|
208
252
|
super()
|
|
209
253
|
Error.stackTraceLimit = limit
|
|
254
|
+
this.originalCause = originalCause
|
|
255
|
+
this._tag = _tag
|
|
210
256
|
this.cause = Cause.squash(originalCause)
|
|
211
257
|
// v4: makeFiberFailure removed — use Cause.prettyErrors instead
|
|
212
258
|
const errors = Cause.prettyErrors(originalCause)
|
|
@@ -247,17 +293,17 @@ export class CauseException<E> extends Error {
|
|
|
247
293
|
}
|
|
248
294
|
}
|
|
249
295
|
|
|
250
|
-
export const tryToReport = (error: { toReport(): unknown
|
|
296
|
+
export const tryToReport = (error: { toReport(): Record<string, unknown>; toString(): string }) => {
|
|
251
297
|
try {
|
|
252
298
|
return error.toReport()
|
|
253
299
|
} catch {
|
|
254
300
|
try {
|
|
255
|
-
return error.toString()
|
|
301
|
+
return { error: error.toString() }
|
|
256
302
|
} catch (err) {
|
|
257
303
|
try {
|
|
258
|
-
return `Failed to convert error: ${err}`
|
|
304
|
+
return { error: `Failed to convert error: ${err}` }
|
|
259
305
|
} catch {
|
|
260
|
-
return `Failed to convert error: unknown failure`
|
|
306
|
+
return { error: `Failed to convert error: unknown failure` }
|
|
261
307
|
}
|
|
262
308
|
}
|
|
263
309
|
}
|