better-effect 0.2.0 → 0.3.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.
@@ -0,0 +1,232 @@
1
+ import { Err, InferErr, InferOk, Result } from "better-result";
2
+ //#region src/service/types.d.ts
3
+ type ServiceToken<A = unknown> = (abstract new (...args: any[]) => A) & {
4
+ readonly name: string;
5
+ };
6
+ type AnyServiceToken = ServiceToken<any>;
7
+ type ServiceClass<A = unknown> = (new (...args: any[]) => A) & {
8
+ readonly name: string;
9
+ };
10
+ type ServiceInstance<T extends AnyServiceToken> = InstanceType<T>;
11
+ type MethodRequirements<T> = { [K in keyof T]: T[K] extends ((...args: any[]) => infer Return) ? EffectRequirements<Return> : never; }[keyof T];
12
+ /** Services required by the Effect-returning methods of a Service class. */
13
+ type ServiceRequirements<T extends AnyServiceToken> = MethodRequirements<InstanceType<T>>;
14
+ //#endregion
15
+ //#region src/effect/types.d.ts
16
+ /**
17
+ * Type-only identity for a Service requirement yielded by a generator.
18
+ *
19
+ * The declaration has no runtime value. Service iterators return their
20
+ * resolved instances without yielding a marker at runtime.
21
+ */
22
+ declare const ServiceRequirementTypeId: unique symbol;
23
+ /** Type-only identity for requirement metadata attached to Effect results. */
24
+ declare const EffectRequirementsTypeId: unique symbol;
25
+ /**
26
+ * Metadata carried by the yield type of a Service token.
27
+ *
28
+ * This interface is intentionally phantom: it is used only while TypeScript
29
+ * infers a generator's yielded values.
30
+ */
31
+ interface ServiceRequirement<T extends AnyServiceToken> {
32
+ readonly [ServiceRequirementTypeId]: T;
33
+ }
34
+ /**
35
+ * A better-result Result with phantom metadata for required Services.
36
+ */
37
+ type EffectResult<A, E, Requirements = never> = Result<A, E> & {
38
+ readonly [EffectRequirementsTypeId]?: Requirements;
39
+ };
40
+ type AnyEffectResult = EffectResult<unknown, unknown, any>;
41
+ /** Values that an Effect generator may yield. */
42
+ type EffectYield = Err<never, unknown> | ServiceRequirement<AnyServiceToken>;
43
+ /** Extract the error channel from Result values yielded by a generator. */
44
+ type InferYieldError<Y> = Y extends Err<never, infer E> ? E : never;
45
+ /** Extract Service tokens carried by yielded Service requirements. */
46
+ type InferYieldRequirements<Y> = Y extends ServiceRequirement<infer Requirement> ? Requirement : never;
47
+ type InferEffectRequirements<T> = T extends unknown ? typeof EffectRequirementsTypeId extends keyof T ? T extends {
48
+ readonly [EffectRequirementsTypeId]?: infer Requirements;
49
+ } ? Requirements : never : never : never;
50
+ /** Extract phantom Service requirements from an Effect result or Promise. */
51
+ type EffectRequirements<T> = InferEffectRequirements<Awaited<T>>;
52
+ /** Extract the success value from an Effect result or Promise. */
53
+ type EffectSuccess<T> = Awaited<T> extends Result<infer A, unknown> ? A : never;
54
+ /** Extract the error value from an Effect result or Promise. */
55
+ type EffectError<T> = Awaited<T> extends Result<unknown, infer E> ? E : never;
56
+ /** Build the public result type produced from an Effect generator. */
57
+ type EffectFromGenerator<Yield, Returned extends Result<any, any>> = EffectResult<InferOk<Returned>, InferYieldError<Yield> | InferErr<Returned>, InferYieldRequirements<Yield> | EffectRequirements<Returned>>;
58
+ //#endregion
59
+ //#region src/service/service.d.ts
60
+ declare function Service<Self>(): {
61
+ new (): {};
62
+ [Symbol.asyncIterator](this: ServiceToken<Self>): AsyncGenerator<ServiceRequirement<ServiceToken<Self>>, Self, unknown>;
63
+ };
64
+ //#endregion
65
+ //#region src/service/runtime.d.ts
66
+ interface ServiceResolver {
67
+ resolve<T extends AnyServiceToken>(token: T): InstanceType<T> | PromiseLike<InstanceType<T>>;
68
+ }
69
+ declare class ServiceRuntime {
70
+ static run<A>(resolver: ServiceResolver, program: () => A): A;
71
+ static current(): ServiceResolver;
72
+ static resolve<T extends AnyServiceToken>(token: T): Promise<InstanceType<T>>;
73
+ }
74
+ //#endregion
75
+ //#region src/service/errors.d.ts
76
+ declare class ServiceRuntimeNotConfiguredError extends Error {
77
+ constructor();
78
+ }
79
+ declare class ServiceNotFoundError extends Error {
80
+ readonly service: AnyServiceToken;
81
+ constructor(service: AnyServiceToken);
82
+ }
83
+ //#endregion
84
+ //#region src/scope/errors.d.ts
85
+ declare class ScopeRuntimeNotConfiguredError extends Error {
86
+ constructor();
87
+ }
88
+ declare class ScopeClosedError extends Error {
89
+ constructor();
90
+ }
91
+ declare class ScopeCloseError extends Error {
92
+ readonly causes: readonly unknown[];
93
+ constructor(causes: readonly unknown[]);
94
+ }
95
+ declare class ResourceNotDisposableError extends Error {
96
+ constructor();
97
+ }
98
+ //#endregion
99
+ //#region src/scope/types.d.ts
100
+ type MaybePromise$1<T> = T | PromiseLike<T>;
101
+ type ScopeOutcome = {
102
+ readonly status: 'success';
103
+ } | {
104
+ readonly status: 'failure';
105
+ readonly cause: unknown;
106
+ };
107
+ type ScopeFinalizer = (outcome: ScopeOutcome) => MaybePromise$1<void>;
108
+ type CleanupFailureDiagnostic = {
109
+ readonly outcome: ScopeOutcome;
110
+ readonly error: ScopeCloseError;
111
+ };
112
+ type SyncDisposableResource = {
113
+ [Symbol.dispose]: () => void;
114
+ [Symbol.asyncDispose]?: () => MaybePromise$1<void>;
115
+ };
116
+ type AsyncDisposableResource = {
117
+ [Symbol.dispose]?: () => void;
118
+ [Symbol.asyncDispose]: () => MaybePromise$1<void>;
119
+ };
120
+ type DisposableResource = SyncDisposableResource | AsyncDisposableResource;
121
+ //#endregion
122
+ //#region src/utils/types.d.ts
123
+ type MaybePromise<T> = T | PromiseLike<T>;
124
+ //#endregion
125
+ //#region src/layer/types.d.ts
126
+ interface LayerProvider {
127
+ readonly service: ServiceClass<any>;
128
+ readonly acquire: () => MaybePromise<unknown>;
129
+ readonly release?: (instance: unknown, outcome: ScopeOutcome) => MaybePromise<void>;
130
+ }
131
+ type LayerSpec<Provided extends AnyServiceToken, Required extends AnyServiceToken = never> = {
132
+ readonly provided: Provided;
133
+ readonly required: Required;
134
+ };
135
+ type AnyLayerSpec = LayerSpec<AnyServiceToken, AnyServiceToken>;
136
+ type LayerGenerator<S extends ServiceClass<any>, Yield extends ServiceRequirement<AnyServiceToken> = ServiceRequirement<AnyServiceToken>> = () => AsyncGenerator<Yield, InstanceType<S>, unknown>;
137
+ type LayerGeneratorRequirements<S extends ServiceClass<any>, Yield extends ServiceRequirement<AnyServiceToken>> = ServiceRequirements<S> | InferYieldRequirements<Yield>;
138
+ //#endregion
139
+ //#region src/layer/inference.d.ts
140
+ type AnyLayer = Layer<any>;
141
+ type LayerSpecs<L extends AnyLayer> = L extends Layer<infer Specs> ? Specs : never;
142
+ type LayerProvided<L extends AnyLayer> = LayerSpecs<L> extends LayerSpec<infer Provided, any> ? Provided : never;
143
+ type LayerRawRequired<L extends AnyLayer> = LayerSpecs<L> extends LayerSpec<any, infer Required> ? Required : never;
144
+ type LayerSpecProvided<Specs extends AnyLayerSpec> = Specs extends LayerSpec<infer Provided, any> ? Provided : never;
145
+ type SameServiceToken<Left extends AnyServiceToken, Right extends AnyServiceToken> = [Left] extends [Right] ? [Right] extends [Left] ? true : false : false;
146
+ type IsOverridden<Provided extends AnyServiceToken, Replacements extends AnyServiceToken> = Replacements extends AnyServiceToken ? SameServiceToken<Provided, Replacements> : false;
147
+ type RemoveOverriddenSpecs<Specs extends AnyLayerSpec, Replacements extends AnyServiceToken> = Specs extends LayerSpec<infer Provided, any> ? true extends IsOverridden<Provided, Replacements> ? never : Specs : never;
148
+ type ReplaceLayerSpecs<Current extends AnyLayerSpec, Replacement extends AnyLayerSpec> = RemoveOverriddenSpecs<Current, LayerSpecProvided<Replacement>> | Replacement;
149
+ type OverrideLayerSpecs<Current extends AnyLayerSpec, Overrides extends readonly AnyLayer[]> = Overrides extends readonly [infer Head extends AnyLayer, ...infer Tail extends readonly AnyLayer[]] ? OverrideLayerSpecs<ReplaceLayerSpecs<Current, LayerSpecs<Head>>, Tail> : Current;
150
+ type RequirementProvided<Requirement extends AnyServiceToken, Provided extends AnyServiceToken> = Provided extends AnyServiceToken ? Provided extends (abstract new (...args: any[]) => InstanceType<Requirement>) ? true : false : false;
151
+ type MissingRequirement<Requirement extends AnyServiceToken, Provided extends AnyServiceToken> = true extends RequirementProvided<Requirement, Provided> ? never : Requirement;
152
+ /** Service tokens from `Required` that are not supplied by `Provided`. */
153
+ type MissingServices<Required, Provided extends AnyServiceToken> = Required extends AnyServiceToken ? MissingRequirement<Required, Provided> : never;
154
+ type LayerMissing<L extends AnyLayer> = MissingServices<LayerRawRequired<L>, LayerProvided<L>>;
155
+ type MissingLayerServices<Missing extends AnyServiceToken> = {
156
+ readonly __betterEffectMissingServices: Missing;
157
+ };
158
+ type CompleteLayer<L extends AnyLayer> = [LayerMissing<L>] extends [never] ? L : L & MissingLayerServices<LayerMissing<L>>;
159
+ /** Services required by an execution result that are not in its environment. */
160
+ type ExecutionMissing<Provided extends AnyServiceToken, ProgramResult> = MissingServices<EffectRequirements<ProgramResult>, Provided>;
161
+ /** Named diagnostic contract for an execution with unavailable Services. */
162
+ type MissingRuntimeServices<Missing extends AnyServiceToken> = {
163
+ readonly __betterEffectMissingRuntimeServices: Missing;
164
+ };
165
+ type ExecutionProgram<A> = () => A | PromiseLike<A>;
166
+ /** Keep execution callbacks unchanged when their Effect requirements are met. */
167
+ type CompleteExecution<Provided extends AnyServiceToken, A> = [ExecutionMissing<Provided, A>] extends [never] ? ExecutionProgram<A> : ExecutionProgram<A> & MissingRuntimeServices<ExecutionMissing<Provided, A>>;
168
+ //#endregion
169
+ //#region src/layer/layer.d.ts
170
+ declare const LayerTypeId: unique symbol;
171
+ declare class Layer<Specs extends AnyLayerSpec = AnyLayerSpec> {
172
+ readonly [LayerTypeId]: Specs;
173
+ readonly providers: readonly LayerProvider[];
174
+ private constructor();
175
+ static make<S extends ServiceClass<any>>(service: S, acquire: () => MaybePromise<InstanceType<S>>): Layer<LayerSpec<S, ServiceRequirements<S>>>;
176
+ static succeed<S extends ServiceClass<any>>(service: S, instance: InstanceType<S>): Layer<LayerSpec<S, ServiceRequirements<S>>>;
177
+ static scoped<S extends ServiceClass<any>>(service: S, acquire: () => MaybePromise<InstanceType<S>>, release: (instance: InstanceType<S>) => MaybePromise<void>): Layer<LayerSpec<S, ServiceRequirements<S>>>;
178
+ static scopedGen<S extends ServiceClass<any>, Yield extends ServiceRequirement<AnyServiceToken>>(service: S, factory: LayerGenerator<S, Yield>, release: (instance: InstanceType<S>, outcome: ScopeOutcome) => MaybePromise<void>): Layer<LayerSpec<S, LayerGeneratorRequirements<S, Yield>>>;
179
+ static gen<S extends ServiceClass<any>, Yield extends ServiceRequirement<AnyServiceToken>>(service: S, factory: LayerGenerator<S, Yield>): Layer<LayerSpec<S, LayerGeneratorRequirements<S, Yield>>>;
180
+ static merge<const Layers extends readonly Layer<any>[]>(...layers: Layers): Layer<Layers[number] extends Layer<infer Specs> ? Specs : never>;
181
+ static override<Base extends Layer<any>, const Overrides extends readonly Layer<any>[]>(base: Base, ...overrides: Overrides): Layer<OverrideLayerSpecs<Base extends Layer<infer Specs> ? Specs : never, Overrides>>;
182
+ }
183
+ //#endregion
184
+ //#region src/layer/errors.d.ts
185
+ declare class DuplicateServiceError extends Error {
186
+ readonly service: ServiceClass<any>;
187
+ constructor(service: ServiceClass<any>);
188
+ }
189
+ declare class LayerRegistrationError extends Error {
190
+ readonly service: ServiceClass<any> | undefined;
191
+ readonly registrationCause: unknown;
192
+ readonly cleanupCause?: unknown;
193
+ constructor(service: ServiceClass<any> | undefined, registrationCause: unknown, cleanupCause?: unknown);
194
+ }
195
+ declare class LayerDisposeError extends Error {
196
+ readonly causes: readonly unknown[];
197
+ constructor(causes: readonly unknown[]);
198
+ }
199
+ declare class LayerGeneratorYieldError extends Error {
200
+ readonly service: ServiceClass<any>;
201
+ constructor(service: ServiceClass<any>);
202
+ }
203
+ declare class BuiltLayerDisposedError extends Error {
204
+ constructor();
205
+ }
206
+ //#endregion
207
+ //#region src/runtime/outcome.d.ts
208
+ type RuntimeShutdownDiagnostic = {
209
+ readonly outcome: ScopeOutcome;
210
+ readonly error: LayerDisposeError;
211
+ };
212
+ type CleanupFailureObserver = (diagnostic: CleanupFailureDiagnostic | RuntimeShutdownDiagnostic) => MaybePromise$1<void>;
213
+ type RuntimeOptions = {
214
+ readonly onCleanupFailure?: CleanupFailureObserver;
215
+ };
216
+ //#endregion
217
+ //#region src/layer/backend.d.ts
218
+ interface LayerBackend extends ServiceResolver {
219
+ register(provider: LayerProvider): void | PromiseLike<void>;
220
+ disposeAll(): void | PromiseLike<void>;
221
+ }
222
+ //#endregion
223
+ //#region src/layer/runtime.d.ts
224
+ interface BuiltLayer<Provided extends AnyServiceToken = AnyServiceToken> {
225
+ readonly backend: LayerBackend;
226
+ run<A>(program: CompleteExecution<Provided, A>): Promise<Awaited<A>>;
227
+ dispose(outcome?: ScopeOutcome): Promise<void>;
228
+ }
229
+ declare const buildLayer: <L extends AnyLayer>(layer: CompleteLayer<L>, backend: LayerBackend, options?: RuntimeOptions) => Promise<BuiltLayer<LayerProvided<L>>>;
230
+ //#endregion
231
+ export { ServiceNotFoundError as A, EffectSuccess as B, MaybePromise$1 as C, ScopeCloseError as D, ResourceNotDisposableError as E, AnyEffectResult as F, ServiceInstance as G, ServiceRequirement as H, EffectError as I, ServiceRequirements as K, EffectFromGenerator as L, ServiceResolver as M, ServiceRuntime as N, ScopeClosedError as O, Service as P, EffectRequirements as R, DisposableResource as S, ScopeOutcome as T, AnyServiceToken as U, EffectYield as V, ServiceClass as W, LayerProvided as _, RuntimeOptions as a, LayerProvider as b, DuplicateServiceError as c, LayerRegistrationError as d, Layer as f, LayerMissing as g, CompleteLayer as h, CleanupFailureObserver as i, ServiceRuntimeNotConfiguredError as j, ScopeRuntimeNotConfiguredError as k, LayerDisposeError as l, CompleteExecution as m, buildLayer as n, RuntimeShutdownDiagnostic as o, AnyLayer as p, ServiceToken as q, LayerBackend as r, BuiltLayerDisposedError as s, BuiltLayer as t, LayerGeneratorYieldError as u, LayerRawRequired as v, ScopeFinalizer as w, CleanupFailureDiagnostic as x, LayerSpecs as y, EffectResult as z };
232
+ //# sourceMappingURL=index-Bg6ofRE1.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-Bg6ofRE1.d.mts","names":[],"sources":["../src/service/types.ts","../src/effect/types.ts","../src/service/service.ts","../src/service/runtime.ts","../src/service/errors.ts","../src/scope/errors.ts","../src/scope/types.ts","../src/utils/types.ts","../src/layer/types.ts","../src/layer/inference.ts","../src/layer/layer.ts","../src/layer/errors.ts","../src/runtime/outcome.ts","../src/layer/backend.ts","../src/layer/runtime.ts"],"mappings":";;KAEY,aAAa,iCAAiC,gBAAgB;WAC/D;;KAGC,kBAAkB;KAElB,aAAa,wBAAwB,gBAAgB;WACtD;;KAGC,gBAAgB,UAAU,mBAAmB,aAAa;KAEjE,mBAAmB,QACrB,WAAW,IAAI,EAAE,gBAAe,sBAAsB,UAAS,mBAAmB,yBAC7E;;KAGI,oBAAoB,UAAU,mBAAmB,mBAAmB,aAAa;;;;;;;;;cCTxE;;cAGA;;;;;;;UAQJ,mBAAmB,UAAU;YAClC,2BAA2B;;;;;KAM3B,aAAa,GAAG,GAAG,wBAAwB,OAAW,GAAG;YACzD,4BAA4B;;KAG5B,kBAAkB;;KAGlB,cAAc,sBAAsB,mBAAmB;;KAGvD,gBAAgB,KAAK,UAAU,iBAAiB,KAAK;;KAGrD,uBAAuB,KACjC,UAAU,yBAAyB,eAAe;KAE/C,wBAAwB,KAAK,2BACvB,uCAAuC,IAC5C;YACY,kCAAkC;IAE5C;;KAMI,mBAAmB,KAAK,wBAAwB,QAAQ;;KAGxD,cAAc,KAAK,QAAQ,WAAW,aAAiB,cAAc;;KAGrE,YAAY,KAAK,QAAQ,WAAW,sBAA0B,KAAK;;KAGnE,oBAAoB,OAAO,iBAAiB,oBAAwB,aAC9E,QAAQ,WACR,gBAAgB,SAAS,SAAS,WAClC,uBAAuB,SAAS,mBAAmB;;;iBC7DrC,QAAQ;;GAIZ,OAAA,eAAA,MAAA,aAAa,QAClB,eAAe,mBAAmB,aAAa,QAAQ;;;;UCL7C;EACf,QAAQ,UAAU,iBAAiB,OAAO,IAAI,aAAa,KAAK,YAAY,aAAa;;cAK9E;SACJ,IAAI,GAAG,UAAU,iBAAiB,eAAe,IAAI;SAIrD,WAAW;SAUL,QAAQ,UAAU,iBAAiB,OAAO,IAAI,QAAQ,aAAa;;;;cCzBrE,yCAAyC;EACpD;;cAOW,6BAA6B;WACnB,SAAS;EAA9B,YAAqB,SAAS;;;;cCXnB,uCAAuC;EAClD;;cAOW,yBAAyB;EACpC;;cAOW,wBAAwB;WACd;EAArB,YAAqB;;cASV,mCAAmC;EAC9C;;;;KCzBU,eAAa,KAAK,IAAI,YAAY;KAElC;WAEG;;WAGA;WACA;;KAGH,kBAAkB,SAAS,iBAAiB;KAE5C;WACD,SAAS;WACT,OAAO;;KAGb;GACF,OAAO;GAEP,OAAO,sBAAsB;;KAG3B;GACF,OAAO;GAEP,OAAO,qBAAqB;;KAGnB,qBAAqB,yBAAyB;;;KChC9C,aAAa,KAAK,IAAI,YAAY;;;UCK7B;WACN,SAAS;WAET,eAAe;WAEf,WAAW,mBAAmB,SAAS,iBAAiB;;KAGvD,UACV,iBAAiB,iBACjB,iBAAiB;WAER,UAAU;WACV,UAAU;;KAGT,eAAe,UAAU,iBAAiB;KAE1C,eACV,UAAU,mBACV,cAAc,mBAAmB,mBAAmB,mBAAmB,0BAC/D,eAAe,OAAO,aAAa;KAEjC,2BACV,UAAU,mBACV,cAAc,mBAAmB,oBAC/B,oBAAoB,KAAK,uBAAuB;;;KCvBxC,WAAW;KAEX,WAAW,UAAU,YAAY,UAAU,YAAY,SAAS;KAEhE,cAAc,UAAU,YAClC,WAAW,WAAW,gBAAgB,iBAAiB;KAE7C,iBAAiB,UAAU,YACrC,WAAW,WAAW,qBAAqB,YAAY;KAEpD,kBAAkB,cAAc,gBACnC,cAAc,gBAAgB,iBAAiB;KAE5C,iBAAiB,aAAa,iBAAiB,cAAc,oBAChE,eACS,UACN,gBAAgB;KAKhB,aACH,iBAAiB,iBACjB,qBAAqB,mBACnB,qBAAqB,kBAAkB,iBAAiB,UAAU;KAEjE,sBAAsB,cAAc,cAAc,qBAAqB,mBAC1E,cAAc,gBAAgB,8BACb,aAAa,UAAU,wBAElC;KAGH,kBAAkB,gBAAgB,cAAc,oBAAoB,gBACrE,sBAAsB,SAAS,kBAAkB,gBACjD;KAEQ,mBACV,gBAAgB,cAChB,2BAA2B,cACzB,kCACI,aAAa,mBACV,sBAAsB,cAE7B,mBAAmB,kBAAkB,SAAS,WAAW,QAAQ,QACjE;KAEC,oBACH,oBAAoB,iBACpB,iBAAiB,mBACf,iBAAiB,kBACjB,mCAAkC,gBAAgB,aAAa;KAK9D,mBAAmB,oBAAoB,iBAAiB,iBAAiB,gCAC/D,oBAAoB,aAAa,oBAAoB;;KAGxD,gBACV,UACA,iBAAiB,mBACf,iBAAiB,kBAAkB,mBAAmB,UAAU;KAExD,aAAa,UAAU,YAAY,gBAC7C,iBAAiB,IACjB,cAAc;KAGX,qBAAqB,gBAAgB;WAC/B,+BAA+B;;KAG9B,cAAc,UAAU,aAAa,aAAa,sBAC1D,IACA,IAAI,qBAAqB,aAAa;;KAG9B,iBAAiB,iBAAiB,iBAAiB,iBAAiB,gBAC9E,mBAAmB,gBACnB;;KAIU,uBAAuB,gBAAgB;WACxC,sCAAsC;;KAG5C,iBAAiB,WAAW,IAAI,YAAY;;KAGrC,kBAAkB,iBAAiB,iBAAiB,MAC9D,iBAAiB,UAAU,sBAEzB,iBAAiB,KACjB,iBAAiB,KAAK,uBAAuB,iBAAiB,UAAU;;;cCzF9D;cAED,MAAM,cAAc,eAAe;YAC5B,cAAc;WAEvB,oBAAoB;UAEtB;SAIA,KAAK,UAAU,mBACpB,SAAS,GAET,eAAe,aAAa,aAAa,MACxC,MAAM,UAAU,GAAG,oBAAoB;SASnC,QAAQ,UAAU,mBACvB,SAAS,GACT,UAAU,aAAa,KACtB,MAAM,UAAU,GAAG,oBAAoB;SAInC,OAAO,UAAU,mBACtB,SAAS,GACT,eAAe,aAAa,aAAa,KACzC,UAAU,UAAU,aAAa,OAAO,qBACvC,MAAM,UAAU,GAAG,oBAAoB;SAWnC,UAAU,UAAU,mBAAmB,cAAc,mBAAmB,kBAC7E,SAAS,GACT,SAAS,eAAe,GAAG,QAC3B,UAAU,UAAU,aAAa,IAAI,SAAS,iBAAiB,qBAC9D,MAAM,UAAU,GAAG,2BAA2B,GAAG;SAU7C,IAAI,UAAU,mBAAmB,cAAc,mBAAmB,kBACvE,SAAS,GACT,SAAS,eAAe,GAAG,SAC1B,MAAM,UAAU,GAAG,2BAA2B,GAAG;SAI7C,YAAY,wBAAwB,iBACtC,QAAQ,SACV,MAAM,uBAAuB,YAAY,SAAS;SAkB9C,SAAS,aAAa,kBAAkB,2BAA2B,cACxE,MAAM,SACH,WAAW,YACb,MAAM,mBAAmB,aAAa,YAAY,SAAS,eAAe;;;;cCvGlE,8BAA8B;WACpB,SAAS;EAA9B,YAAqB,SAAS;;cAOnB,+BAA+B;WAE/B,SAAS;WACT;WACA;EAHX,YACW,SAAS,+BACT,4BACA;;cAUA,0BAA0B;WAChB;EAArB,YAAqB;;cAOV,iCAAiC;WACvB,SAAS;EAA9B,YAAqB,SAAS;;cAOnB,gCAAgC;EAC3C;;;;KCjCU;WACD,SAAS;WACT,OAAO;;KAGN,0BACV,YAAY,2BAA2B,8BACpC;KAEO;WACD,mBAAmB;;;;UCdb,qBAAqB;EACpC,SAAS,UAAU,uBAAuB;EAC1C,qBAAqB;;;;UCmBN,WAAW,iBAAiB,kBAAkB;WACpD,SAAS;EAElB,IAAI,GAAG,SAAS,kBAAkB,UAAU,KAAK,QAAQ,QAAQ;EAEjE,QAAQ,UAAU,eAAe;;cA6KtB,aAAoB,UAAU,UAAQ,OAC1C,cAAc,IAAE,SACd,cAAY,UACZ,mBACR,QAAQ,WAAW,cAAc"}
package/dist/index.d.mts CHANGED
@@ -1,62 +1,50 @@
1
- import { a as ServiceResolver, c as ServiceClass, i as MaybePromise$1, l as ServiceInstance, n as LayerGenerator, o as ServiceRuntime, r as LayerProvider, s as AnyServiceToken, t as LayerBackend, u as ServiceToken } from "./backend-CNAls62W.mjs";
2
- import { Result, UnhandledException } from "better-result";
3
- //#region src/service/service.d.ts
4
- declare function Service<Self>(): {
5
- new (): {};
6
- [Symbol.asyncIterator](): AsyncGenerator<never, Self, unknown>;
7
- };
8
- //#endregion
9
- //#region src/service/errors.d.ts
10
- declare class ServiceRuntimeNotConfiguredError extends Error {
11
- constructor();
12
- }
13
- declare class ServiceNotFoundError extends Error {
14
- readonly service: AnyServiceToken;
15
- constructor(service: AnyServiceToken);
1
+ import { A as ServiceNotFoundError, B as EffectSuccess, C as MaybePromise$1, D as ScopeCloseError, E as ResourceNotDisposableError, F as AnyEffectResult, G as ServiceInstance, H as ServiceRequirement, I as EffectError, K as ServiceRequirements, L as EffectFromGenerator, M as ServiceResolver, N as ServiceRuntime, O as ScopeClosedError, P as Service, R as EffectRequirements, S as DisposableResource, T as ScopeOutcome, U as AnyServiceToken, V as EffectYield, W as ServiceClass, _ as LayerProvided, a as RuntimeOptions, c as DuplicateServiceError, d as LayerRegistrationError, f as Layer, g as LayerMissing, h as CompleteLayer, i as CleanupFailureObserver, j as ServiceRuntimeNotConfiguredError, k as ScopeRuntimeNotConfiguredError, l as LayerDisposeError, m as CompleteExecution, n as buildLayer, o as RuntimeShutdownDiagnostic, p as AnyLayer, q as ServiceToken, r as LayerBackend, s as BuiltLayerDisposedError, t as BuiltLayer, u as LayerGeneratorYieldError, v as LayerRawRequired, w as ScopeFinalizer, x as CleanupFailureDiagnostic, y as LayerSpecs, z as EffectResult } from "./index-Bg6ofRE1.mjs";
2
+ import { Err, Result, UnhandledException } from "better-result";
3
+ //#region src/scope/scope.d.ts
4
+ interface Scope {
5
+ addFinalizer(finalizer: ScopeFinalizer): void;
6
+ acquire<R>(acquire: () => MaybePromise$1<R>, release: (resource: R, outcome: ScopeOutcome) => MaybePromise$1<void>): Promise<R>;
7
+ add<R extends DisposableResource>(resource: R): Promise<R>;
8
+ fork(): CloseableScope;
16
9
  }
17
- //#endregion
18
- //#region src/layer/layer.d.ts
19
- declare class Layer {
20
- readonly providers: readonly LayerProvider[];
21
- private constructor();
22
- static make<S extends ServiceClass<any>>(service: S, acquire: () => MaybePromise$1<InstanceType<S>>): Layer;
23
- static succeed<S extends ServiceClass<any>>(service: S, instance: InstanceType<S>): Layer;
24
- static scoped<S extends ServiceClass<any>>(service: S, acquire: () => MaybePromise$1<InstanceType<S>>, release: (instance: InstanceType<S>) => MaybePromise$1<void>): Layer;
25
- static gen<S extends ServiceClass<any>>(service: S, factory: LayerGenerator<S>): Layer;
26
- static merge(...layers: readonly Layer[]): Layer;
27
- static override(base: Layer, ...overrides: readonly Layer[]): Layer;
10
+ interface CloseableScope extends Scope {
11
+ close(outcome?: ScopeOutcome): Promise<void>;
28
12
  }
13
+ declare const Scope: {
14
+ readonly make: () => CloseableScope;
15
+ readonly current: () => Scope;
16
+ readonly provide: <A>(scope: Scope, program: () => A) => A;
17
+ readonly [Symbol.iterator]: () => Generator<never, Scope, unknown>;
18
+ readonly run: <A>(program: (scope: Scope) => A | PromiseLike<A>) => Promise<Awaited<A>>;
19
+ };
29
20
  //#endregion
30
- //#region src/layer/runtime.d.ts
31
- interface BuiltLayer {
32
- readonly backend: LayerBackend;
33
- run<A>(program: () => A): A;
34
- dispose(): Promise<void>;
35
- }
36
- declare const buildLayer: (layer: Layer, backend: LayerBackend) => Promise<BuiltLayer>;
37
- //#endregion
38
- //#region src/layer/errors.d.ts
39
- declare class DuplicateServiceError extends Error {
40
- readonly service: ServiceClass<any>;
41
- constructor(service: ServiceClass<any>);
42
- }
43
- declare class LayerRegistrationError extends Error {
44
- readonly service: ServiceClass<any> | undefined;
45
- readonly registrationCause: unknown;
46
- readonly cleanupCause?: unknown;
47
- constructor(service: ServiceClass<any> | undefined, registrationCause: unknown, cleanupCause?: unknown);
48
- }
49
- declare class LayerDisposeError extends Error {
50
- readonly causes: readonly unknown[];
51
- constructor(causes: readonly unknown[]);
52
- }
53
- declare class LayerGeneratorYieldError extends Error {
54
- readonly service: ServiceClass<any>;
55
- constructor(service: ServiceClass<any>);
56
- }
57
- declare class BuiltLayerDisposedError extends Error {
58
- constructor();
59
- }
21
+ //#region src/effect/effect.d.ts
22
+ type AnyResult = Result<any, any>;
23
+ /**
24
+ * Compose better-result operations while preserving Service requirements in
25
+ * a phantom type channel.
26
+ */
27
+ declare function gen<Yield extends EffectYield, Returned extends AnyResult>(body: () => Generator<Yield, Returned, unknown>): EffectFromGenerator<Yield, Returned>;
28
+ declare function gen<Yield extends EffectYield, Returned extends AnyResult>(body: () => AsyncGenerator<Yield, Returned, unknown>): Promise<EffectFromGenerator<Yield, Returned>>;
29
+ /**
30
+ * Acquire a resource in the current Scope and register its release callback.
31
+ *
32
+ * Acquisition failures are represented in the Effect Result error channel;
33
+ * release failures remain owned by Scope cleanup.
34
+ */
35
+ declare function acquireRelease<R>(acquire: () => MaybePromise$1<R>, release: (resource: R, outcome: ScopeOutcome) => MaybePromise$1<void>): AsyncGenerator<Err<never, UnhandledException>, R, unknown>;
36
+ /**
37
+ * Register an already-acquired disposable resource in the current Scope.
38
+ *
39
+ * Registration failures are represented in the Effect Result error channel;
40
+ * disposal failures remain owned by Scope cleanup.
41
+ */
42
+ declare function add<R extends DisposableResource>(resource: R): AsyncGenerator<Err<never, UnhandledException>, R, unknown>;
43
+ declare const Effect: {
44
+ readonly gen: typeof gen;
45
+ readonly acquireRelease: typeof acquireRelease;
46
+ readonly add: typeof add;
47
+ };
60
48
  //#endregion
61
49
  //#region src/resource/errors.d.ts
62
50
  declare const ResourceReleaseFailure_base: import("better-result").TaggedErrorClass<"ResourceReleaseFailure">;
@@ -70,10 +58,6 @@ declare class ResourceReleaseFailure extends ResourceReleaseFailure_base<{
70
58
  type MaybePromise<T> = T | PromiseLike<T>;
71
59
  type AsyncResult<T, E> = MaybePromise<Result<T, E>>;
72
60
  type ReleaseOutcome = void | Result<void, unknown>;
73
- type DisposableResource = {
74
- [Symbol.dispose]?: () => void;
75
- [Symbol.asyncDispose]?: () => MaybePromise<void>;
76
- };
77
61
  type ReleaseFailureObserver = (failure: ResourceReleaseFailure) => MaybePromise<void>;
78
62
  type AcquireUseReleaseOptions<R, A, AcquireError, UseError> = {
79
63
  readonly name: string;
@@ -97,14 +81,20 @@ declare const Resource: {
97
81
  };
98
82
  //#endregion
99
83
  //#region src/runtime/runtime.d.ts
100
- declare class Runtime {
84
+ declare class Runtime<Provided extends AnyServiceToken = AnyServiceToken> {
101
85
  private readonly built;
102
86
  private constructor();
103
- static make(layer: Layer, backend: LayerBackend): Promise<Runtime>;
104
- static run<A>(layer: Layer, backend: LayerBackend, program: () => A | PromiseLike<A>): Promise<Awaited<A>>;
105
- run<A>(program: () => A): A;
87
+ static make<L extends AnyLayer>(layer: CompleteLayer<L>, backend: LayerBackend, options?: RuntimeOptions): Promise<Runtime<LayerProvided<L>>>;
88
+ static run<A, L extends AnyLayer>(layer: CompleteLayer<L>, backend: LayerBackend, program: CompleteExecution<LayerProvided<L>, A>, options?: RuntimeOptions): Promise<Awaited<A>>;
89
+ run<A>(program: CompleteExecution<Provided, A>): Promise<Awaited<A>>;
90
+ private runUnchecked;
106
91
  dispose(): Promise<void>;
92
+ private disposeWithOutcome;
107
93
  }
108
94
  //#endregion
109
- export { type AcquireUseReleaseOptions, type AnyServiceToken, type AsyncResult, type BuiltLayer, BuiltLayerDisposedError, type DisposableResource, DuplicateServiceError, Layer, type LayerBackend, LayerDisposeError, LayerGeneratorYieldError, LayerRegistrationError, type ReleaseFailureObserver, type ReleaseOutcome, Resource, ResourceReleaseFailure, Runtime, Service, type ServiceClass, type ServiceInstance, ServiceNotFoundError, type ServiceResolver, ServiceRuntime, ServiceRuntimeNotConfiguredError, type ServiceToken, buildLayer };
95
+ //#region src/runtime/types.d.ts
96
+ /** Runtime handle whose provided Services are inferred from a Layer. */
97
+ type RuntimeFor<L extends AnyLayer> = Runtime<LayerProvided<L>>;
98
+ //#endregion
99
+ export { type AcquireUseReleaseOptions, type AnyEffectResult, type AnyServiceToken, type AsyncResult, type BuiltLayer, BuiltLayerDisposedError, type CleanupFailureDiagnostic, type CleanupFailureObserver, type CloseableScope, type DisposableResource, DuplicateServiceError, Effect, type EffectError, type EffectRequirements, type EffectResult, type EffectSuccess, type EffectYield, Layer, type LayerBackend, LayerDisposeError, LayerGeneratorYieldError, type LayerMissing, type LayerProvided, type LayerRawRequired, LayerRegistrationError, type LayerSpecs, type ReleaseFailureObserver, type ReleaseOutcome, Resource, ResourceNotDisposableError, ResourceReleaseFailure, Runtime, type RuntimeFor, type RuntimeOptions, type RuntimeShutdownDiagnostic, Scope, ScopeCloseError, ScopeClosedError, type ScopeFinalizer, type ScopeOutcome, ScopeRuntimeNotConfiguredError, Service, type ServiceClass, type ServiceInstance, ServiceNotFoundError, type ServiceRequirement, type ServiceRequirements, type ServiceResolver, ServiceRuntime, ServiceRuntimeNotConfiguredError, type ServiceToken, buildLayer };
110
100
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/service/service.ts","../src/service/errors.ts","../src/layer/layer.ts","../src/layer/runtime.ts","../src/layer/errors.ts","../src/resource/errors.ts","../src/resource/types.ts","../src/resource/resource.ts","../src/runtime/runtime.ts"],"mappings":";;;iBAIgB,QAAQ;;GAGoB,OAAA,kBAAA,sBAAsB;;;;cCLrD,yCAAyC;EACpD;;cAOW,6BAA6B;WACnB,SAAS;EAA9B,YAAqB,SAAS;;;;cCFnB;WACF,oBAAoB;UAEtB;SAIA,KAAK,UAAU,mBACpB,SAAS,GAET,eAAe,eAAa,aAAa,MACxC;SASI,QAAQ,UAAU,mBAAmB,SAAS,GAAG,UAAU,aAAa,KAAK;SAI7E,OAAO,UAAU,mBACtB,SAAS,GACT,eAAe,eAAa,aAAa,KACzC,UAAU,UAAU,aAAa,OAAO,uBACvC;SAWI,IAAI,UAAU,mBAAmB,SAAS,GAAG,SAAS,eAAe,KAAK;SAI1E,SAAS,iBAAiB,UAAU;SAkBpC,SAAS,MAAM,UAAU,oBAAoB,UAAU;;;;UC5D/C;WACN,SAAS;EAElB,IAAI,GAAG,eAAe,IAAI;EAE1B,WAAW;;cA+CA,aAAU,OAAiB,OAAK,SAAW,iBAAe,QAAQ;;;cC5DlE,8BAA8B;WACpB,SAAS;EAA9B,YAAqB,SAAS;;cAOnB,+BAA+B;WAE/B,SAAS;WACT;WACA;EAHX,YACW,SAAS,+BACT,4BACA;;cAUA,0BAA0B;WAChB;EAArB,YAAqB;;cAOV,iCAAiC;WACvB,SAAS;EAA9B,YAAqB,SAAS;;cAOnB,gCAAgC;EAC3C;;;;;cCvCW,+BAA+B;WACjC;WACA;WACA;;;;KCDC,aAAa,KAAK,IAAI,YAAY;KAElC,YAAY,GAAG,KAAK,aAAa,OAAW,GAAG;KAE/C,wBAAwB;KAExB;GACT,OAAO;GAEP,OAAO,sBAAsB;;KAGpB,0BAA0B,SAAS,2BAA2B;KAE9D,yBAAyB,GAAG,GAAG,cAAc;WAC9C;WAEA,eAAe,YAAY,GAAG;WAE9B,MAAM,UAAU,MAAM,YAAY,GAAG;WAErC,WAAW,UAAU,MAAM,aAAa;;;;;;;;WASxC,mBAAmB;;;;cC1BxB,oBAAqB,GAAG,GAAG,cAAc,YAAQ,MAAA,SAAA,KAAA,SAAA,oBAMpD,yBAAyB,GAAG,GAAG,cAAc,cAAY,QAC1D,OAAW,GAAG,eAAe,WAAW,qBAAqB;cAWlD;qCAAA;;;;cCxBA;mBAC0B;UAA9B;SAEM,KAAK,OAAO,OAAO,SAAS,eAAe,QAAQ;SAMnD,IAAI,GACf,OAAO,OACP,SAAS,cACT,eAAe,IAAI,YAAY,KAC9B,QAAQ,QAAQ;EAUnB,IAAI,GAAG,eAAe,IAAI;EAI1B,WAAW"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/scope/scope.ts","../src/effect/effect.ts","../src/resource/errors.ts","../src/resource/types.ts","../src/resource/resource.ts","../src/runtime/runtime.ts","../src/runtime/types.ts"],"mappings":";;;UAUiB;EACf,aAAa,WAAW;EAExB,QAAQ,GACN,eAAe,eAAa,IAC5B,UAAU,UAAU,GAAG,SAAS,iBAAiB,uBAChD,QAAQ;EAEX,IAAI,UAAU,oBAAoB,UAAU,IAAI,QAAQ;EAExD,QAAQ;;UAGO,uBAAuB;EACtC,MAAM,UAAU,eAAe;;cAgKpB;WACH,YAAA;WAIG,eAAA;WAIH,UAAA,GAAC,OAAS,OAAK,eAAiB,MAAI;YAKtB,OAAA,iBAAA,iBAAiB;WAInC,MAAA,GAAC,UAAY,OAAO,UAAU,IAAI,YAAY,OAAK,QAAQ,QAAQ;;;;KChMpE,YAAY;;;;;iBAcD,IAAI,cAAc,aAAa,iBAAiB,WAC9D,YAAY,UAAU,OAAO,qBAC5B,oBAAoB,OAAO;iBAEd,IAAI,cAAc,aAAa,iBAAiB,WAC9D,YAAY,eAAe,OAAO,qBACjC,QAAQ,oBAAoB,OAAO;;;;;;;iBAmBtB,eAAe,GAC7B,eAAe,eAAa,IAC5B,UAAU,UAAU,GAAG,SAAS,iBAAiB,uBAChD,eAAe,WAAW,qBAAqB;;;;;;;iBAYlC,IAAI,UAAU,oBAC5B,UAAU,IACT,eAAe,WAAW,qBAAqB;cAMrC;;;;;;;;cCtEA,+BAA+B;WACjC;WACA;WACA;;;;KCCC,aAAa,KAAK,IAAI,YAAY;KAElC,YAAY,GAAG,KAAK,aAAa,OAAW,GAAG;KAE/C,wBAAwB;KAExB,0BAA0B,SAAS,2BAA2B;KAE9D,yBAAyB,GAAG,GAAG,cAAc;WAC9C;WAEA,eAAe,YAAY,GAAG;WAE9B,MAAM,UAAU,MAAM,YAAY,GAAG;WAErC,WAAW,UAAU,MAAM,aAAa;;;;;;;;WASxC,mBAAmB;;;;cCpBxB,oBAAqB,GAAG,GAAG,cAAc,YAAQ,MAAA,SAAA,KAAA,SAAA,oBAMpD,yBAAyB,GAAG,GAAG,cAAc,cAAY,QAC1D,OAAW,GAAG,eAAe,WAAW,qBAAqB;cAoBlD;qCAAA;;;;cCpBA,QAAQ,iBAAiB,kBAAkB;mBACjB;UAA9B;SAEM,KAAK,UAAU,UAC1B,OAAO,cAAc,IACrB,SAAS,cACT,UAAS,iBACR,QAAQ,QAAQ,cAAc;SAMpB,IAAI,GAAG,UAAU,UAC5B,OAAO,cAAc,IACrB,SAAS,cACT,SAAS,kBAAkB,cAAc,IAAI,IAC7C,UAAS,iBACR,QAAQ,QAAQ;EAoDnB,IAAI,GAAG,SAAS,kBAAkB,UAAU,KAAK,QAAQ,QAAQ;UAIzD;EAIR,WAAW;UAIH;;;;;KC9FE,WAAW,UAAU,YAAY,QAAQ,cAAc"}