unwrapped 0.1.0 → 0.1.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 +6 -0
- package/dist/core/index.d.mts +105 -0
- package/dist/core/index.d.ts +105 -0
- package/dist/core/index.js +434 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/index.mjs +404 -0
- package/dist/core/index.mjs.map +1 -0
- package/dist/vue/index.d.mts +64 -0
- package/dist/vue/index.d.ts +64 -0
- package/dist/vue/index.js +183 -0
- package/dist/vue/index.js.map +1 -0
- package/dist/vue/index.mjs +160 -0
- package/dist/vue/index.mjs.map +1 -0
- package/package.json +1 -1
- package/.changeset/README.md +0 -8
- package/.changeset/config.json +0 -11
- package/.github/workflows/main.yml +0 -19
- package/.github/workflows/publish.yml +0 -36
- package/tsconfig.json +0 -26
- package/tsup.config.core.ts +0 -11
- package/tsup.config.vue.ts +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/index.ts","../../src/core/error.ts","../../src/core/result.ts","../../src/core/asyncResult.ts","../../src/core/cache.ts"],"sourcesContent":["export * from \"./error\";\nexport * from \"./result\";\nexport * from \"./asyncResult\";\nexport * from \"./cache\";","export class ErrorBase {\n code: string;\n message?: string | undefined;\n thrownError?: any;\n\n constructor(code: string, message?: string, thrownError?: any, log: boolean = true) {\n this.code = code;\n this.message = message;\n this.thrownError = thrownError;\n\n if (log) {\n this.logError();\n }\n }\n\n toString(): string {\n return `Error ${this.code}: ${this.message ?? ''}`;\n }\n\n logError(): void {\n console.error(this.toString(), this.thrownError);\n }\n}","import { ErrorBase } from \"./error\";\n\nexport type ResultState<T, E = ErrorBase> =\n | { status: 'success'; value: T }\n | { status: 'error'; error: E };\n\n\nexport class Result<T, E = ErrorBase> {\n private _state: ResultState<T, E>;\n\n constructor(state: ResultState<T, E>) {\n this._state = state;\n }\n\n get state() {\n return this._state;\n }\n\n static ok<T, E = ErrorBase>(value: T): Result<T, E> {\n return new Result({ status: 'success', value });\n }\n\n static err<E>(error: E): Result<never, E> {\n return new Result({ status: 'error', error });\n }\n\n static errTag(code: string, message?: string): Result<never, ErrorBase> {\n return Result.err(new ErrorBase(code, message));\n }\n\n unwrapOrNull(): T | null {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return null;\n }\n\n unwrapOrThrow(): T {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n throw new Error('Tried to unwrap a Result that is not successful');\n }\n\n unwrapOr<O>(defaultValue: O): T | O {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return defaultValue;\n }\n\n isSuccess(): boolean {\n return this._state.status === 'success';\n }\n\n isError(): boolean {\n return this._state.status === 'error';\n }\n\n static tryPromise<T, E>(promise: Promise<T>, errorMapper: (error: unknown) => E): Promise<Result<T, E>> {\n return promise\n .then((value) => Result.ok<T, E>(value))\n .catch((error) => Result.err(errorMapper(error)));\n }\n\n static tryFunction<T, E extends ErrorBase = ErrorBase>(fn: () => Promise<T>, errorMapper: (error: unknown) => E): Promise<Result<T, E>> {\n return Result.tryPromise(fn(), errorMapper);\n }\n\n chain<O, E2>(fn: (input: T) => ResultState<O, E | E2>): Result<O, E | E2> {\n if (this._state.status === 'success') {\n return new Result<O, E | E2>(fn(this._state.value));\n }\n return Result.err<E>(this._state.error);\n }\n\n *[Symbol.iterator](): Generator<Result<T, E>, T, any> {\n yield this;\n\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return undefined as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static run<T, E>(generator: () => Generator<Result<any, E>, T, any>): Result<T, E> {\n const iterator = generator();\n let result = iterator.next();\n\n while (!result.done) {\n const yielded = result.value;\n if (yielded._state.status === 'error') {\n return Result.err(yielded._state.error);\n }\n result = iterator.next(yielded._state.value);\n }\n\n return Result.ok(result.value);\n }\n}\n","import type { ErrorBase } from \"./error\";\nimport { Result, type ResultState } from \"./result\";\n\nexport type AsyncResultState<T, E> =\n | { status: 'idle' }\n | { status: 'loading'; promise: Promise<Result<T, E>> }\n | ResultState<T, E>;\n\nexport type ChainFunction<I, O, E> = (input: I) => Result<O, E> | Promise<Result<O, E>>;\nexport type FlatChainFunction<I, O, E> = (input: I) => AsyncResult<O, E>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AsyncResultListener<T, E> = (result: AsyncResult<T, E>) => any;\n\nexport class AsyncResult<T, E = ErrorBase> {\n private _state: AsyncResultState<T, E>;\n private _listeners: Set<AsyncResultListener<T, E>> = new Set();\n\n constructor(state?: AsyncResultState<T, E>) {\n this._state = state || { status: 'idle' };\n }\n\n get state() {\n return this._state;\n }\n\n private set state(newState: AsyncResultState<T, E>) {\n this._state = newState;\n this._listeners.forEach((listener) => listener(this));\n }\n\n static ok<T>(value: T): AsyncResult<T, never> {\n return new AsyncResult<T, never>({ status: 'success', value });\n }\n\n static err<E>(error: E): AsyncResult<never, E> {\n return new AsyncResult<never, E>({ status: 'error', error });\n }\n\n isSuccess() {\n return this._state.status === 'success';\n }\n\n isError() {\n return this._state.status === 'error';\n }\n\n isLoading() {\n return this._state.status === 'loading';\n }\n\n listen(listener: AsyncResultListener<T, E>, immediate = true) {\n this._listeners.add(listener);\n if (immediate) {\n listener(this);\n }\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n listenUntilSettled(listener: AsyncResultListener<T, E>, immediate = true) {\n const unsub = this.listen((result) => {\n listener(result);\n if (result.state.status === 'success' || result.state.status === 'error') {\n unsub();\n }\n }, immediate);\n\n return unsub;\n }\n\n setState(newState: AsyncResultState<T, E>) {\n this.state = newState;\n }\n\n copyOnceSettled(other: AsyncResult<T, E>) {\n this.updateFromResultPromise(other.toResultPromise());\n }\n\n update(newState: AsyncResultState<T, E>) {\n this.state = newState;\n }\n\n updateToValue(value: T) {\n this.state = { status: 'success', value };\n }\n\n updateToError(error: E) {\n this.state = { status: 'error', error };\n }\n\n updateFromResultPromise(promise: Promise<Result<T, E>>) {\n this.state = { status: 'loading', promise };\n promise\n .then((res) => {\n this.state = res.state;\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n }\n\n static fromResultPromise<T, E>(promise: Promise<Result<T, E>>): AsyncResult<T, E> {\n const result = new AsyncResult<T, E>();\n result.updateFromResultPromise(promise);\n return result;\n }\n\n updateFromValuePromise(promise: Promise<T>) {\n const resultStatePromise = async (): Promise<Result<T, E>> => {\n try {\n const value = await promise;\n return Result.ok(value);\n } catch (error) {\n return Result.err(error as E);\n }\n };\n this.updateFromResultPromise(resultStatePromise());\n }\n\n static fromValuePromise<T, E>(promise: Promise<T>): AsyncResult<T, E> {\n const result = new AsyncResult<T, E>();\n result.updateFromValuePromise(promise);\n return result;\n }\n\n async waitForSettled(): Promise<AsyncResult<T, E>> {\n if (this._state.status === 'loading') {\n try {\n const value = await this._state.promise;\n this._state = value.state;\n } catch (error) {\n this._state = { status: 'error', error: error as E };\n }\n }\n return this;\n }\n\n async waitForSettledResult(): Promise<Result<T, E>> {\n const settled = await this.waitForSettled();\n if (settled.state.status === 'idle' || settled.state.status === 'loading') {\n throw new Error('Cannot convert idle or loading AsyncResult to ResultState');\n }\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n return Result.ok(settled.state.value);\n }\n\n async toResultPromise(): Promise<Result<T, E>> {\n if (this._state.status === 'idle') {\n throw new Error('Cannot convert idle AsyncResult to ResultState');\n }\n if (this._state.status === 'loading') {\n try {\n const value = await this._state.promise;\n this._state = value.state;\n } catch (error) {\n this._state = { status: 'error', error: error as E };\n }\n }\n return new Result(this._state);\n }\n\n async toValuePromiseThrow(): Promise<T> {\n const settled = await this.waitForSettled();\n return settled.unwrapOrThrow();\n }\n\n async toValueOrNullPromise(): Promise<T | null> {\n const settled = await this.waitForSettled();\n return settled.unwrapOrNull();\n }\n\n unwrapOrNull(): T | null {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return null;\n }\n\n async unwrapOrNullOnceSettled(): Promise<T | null> {\n return (await this.waitForSettled()).unwrapOrNull();\n }\n\n unwrapOrThrow(): T {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n throw new Error('Tried to unwrap an AsyncResult that is not successful');\n }\n\n async unwrapOrThrowOnceSettled(): Promise<T> {\n return (await this.waitForSettled()).unwrapOrThrow();\n }\n\n chain<O, E2>(fn: ChainFunction<T, O, E | E2>): AsyncResult<O, E | E2> {\n const newResultBuilder = async (): Promise<Result<O, E | E2>> => {\n const settled = await this.waitForSettled();\n if (settled.state.status === 'loading' || settled.state.status === 'idle') {\n throw new Error('Unexpected state after waitForSettled'); // TODO handle this case properly\n }\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n\n return fn(settled.state.value);\n };\n\n return AsyncResult.fromResultPromise<O, E | E2>(newResultBuilder());\n }\n\n flatChain<O, E2>(fn: FlatChainFunction<T, O, E | E2>): AsyncResult<O, E | E2> {\n const newResultBuilder = async (): Promise<Result<O, E | E2>> => {\n const settled = await this.waitForSettledResult();\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n\n const nextAsyncResult = fn(settled.state.value);\n const nextSettled = await nextAsyncResult.waitForSettledResult();\n return nextSettled;\n }\n\n return AsyncResult.fromResultPromise<O, E | E2>(newResultBuilder());\n }\n\n // pipeParallel PipeFunction[] -> AsyncResult<T, E>[]\n // pipeParallelAndCollapse PipeFunction[] -> AsyncResult<T[], E>\n\n mirror(other: AsyncResult<T, E>) {\n return other.listen((newState) => {\n this.setState(newState.state);\n }, true);\n }\n\n mirrorUntilSettled(other: AsyncResult<T, E>) {\n return other.listenUntilSettled((newState) => {\n this.setState(newState.state);\n }, true);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static ensureAvailable<R extends readonly AsyncResult<any, any>[]>(results: R): AsyncResult<{ [K in keyof R]: R[K] extends AsyncResult<infer T, any> ? T : never }, R[number] extends AsyncResult<any, infer E> ? E : never> {\n if (results.length === 0) {\n // empty case — TS infers void tuple, so handle gracefully\n return AsyncResult.ok(undefined as never);\n }\n\n const promise = Promise.all(results.map((r) => r.waitForSettled())).then(\n (settledResults) => {\n for (const res of settledResults) {\n if (res.state.status === 'error') {\n return Result.err(res.state.error);\n }\n }\n\n const values = settledResults.map((r) => r.unwrapOrNull()!) as {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K in keyof R]: R[K] extends AsyncResult<infer T, any>\n ? T\n : never;\n };\n\n return Result.ok(values);\n }\n );\n\n return AsyncResult.fromResultPromise(promise);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n *[Symbol.iterator](): Generator<AsyncResult<T, E>, T, any> {\n yield this;\n\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return undefined as T;\n }\n\n private static _runGeneratorProcessor<T, E>(iterator: Generator<AsyncResult<any, any>, T, any>): () => Promise<Result<T, E>> {\n return async (): Promise<Result<T, E>> => {\n let result = iterator.next();\n\n while (!result.done) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const yielded = result.value as AsyncResult<any, E>;\n const settled = await yielded.waitForSettledResult();\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n result = iterator.next(settled.state.value);\n }\n\n return Result.ok(result.value);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static run<T, E = ErrorBase>(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>): AsyncResult<T, E> {\n const iterator = generatorFunc();\n return AsyncResult.fromResultPromise<T, E>(AsyncResult._runGeneratorProcessor<T, E>(iterator)());\n }\n\n runInPlace(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>) {\n const iterator = generatorFunc();\n this.updateFromResultPromise(AsyncResult._runGeneratorProcessor<T, E>(iterator)());\n }\n}\n","import { AsyncResult, type AsyncResultState, type ChainFunction } from \"./asyncResult\";\nimport type { ErrorBase } from \"./error\";\n\ntype KeyedAsyncCacheRefetchOptions = {\n policy: 'refetch' | 'if-error' | 'no-refetch';\n};\n\ntype CacheItem<P, V, E> = {\n result: AsyncResult<V, E>;\n fetcherParams: P;\n};\n\nconst _defaultRefetchOptions: KeyedAsyncCacheRefetchOptions = { policy: 'no-refetch' };\n\nfunction defaultParamsToKey<P>(params: P): string {\n if (typeof params === 'object') {\n return JSON.stringify(params);\n }\n return String(params);\n}\n\nexport class KeyedAsyncCache<P, V, E = ErrorBase> {\n private _cache: Map<string, CacheItem<P, V, E>> = new Map();\n private _fetcher: ChainFunction<P, V, E>;\n private _paramsToKey: (params: P) => string;\n\n constructor(fetcher: ChainFunction<P, V, E>, paramsToKey: (params: P) => string = defaultParamsToKey) {\n this._fetcher = fetcher;\n this._paramsToKey = paramsToKey;\n }\n\n private makeCacheItem(result: AsyncResult<V, E>, fetcherParams: P): CacheItem<P, V, E> {\n return { result, fetcherParams };\n }\n\n private shouldRefetch(existingResult: CacheItem<P, V, E>, refetch: KeyedAsyncCacheRefetchOptions): boolean {\n if (refetch.policy === 'refetch') {\n return true;\n }\n if (refetch.policy === 'if-error') {\n return existingResult.result.state.status === 'error';\n }\n return false;\n }\n\n get(params: P, refetch: KeyedAsyncCacheRefetchOptions = _defaultRefetchOptions): AsyncResult<V, E> {\n const key = this._paramsToKey(params);\n if (this._cache.has(key)) {\n const cacheItem = this._cache.get(key)!;\n if (!this.shouldRefetch(cacheItem, refetch)) {\n return cacheItem.result;\n } else {\n cacheItem.result.updateFromResultPromise(Promise.resolve(this._fetcher(cacheItem.fetcherParams)));\n return cacheItem.result;\n }\n }\n\n const asyncResult = AsyncResult.fromResultPromise(Promise.resolve(this._fetcher(params)));\n this._cache.set(key, this.makeCacheItem(asyncResult, params));\n return asyncResult;\n }\n\n async getSettledState(params: P, refetch: KeyedAsyncCacheRefetchOptions = _defaultRefetchOptions): Promise<AsyncResultState<V, E>> {\n const asyncResult = this.get(params, refetch);\n await asyncResult.waitForSettled();\n return asyncResult.state;\n }\n\n anyLoading(): boolean {\n for (const cacheItem of this._cache.values()) {\n if (cacheItem.result.isLoading()) {\n return true;\n }\n }\n return false;\n }\n\n clear() {\n this._cache.clear();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,404 @@
|
|
|
1
|
+
// src/core/error.ts
|
|
2
|
+
var ErrorBase = class {
|
|
3
|
+
code;
|
|
4
|
+
message;
|
|
5
|
+
thrownError;
|
|
6
|
+
constructor(code, message, thrownError, log = true) {
|
|
7
|
+
this.code = code;
|
|
8
|
+
this.message = message;
|
|
9
|
+
this.thrownError = thrownError;
|
|
10
|
+
if (log) {
|
|
11
|
+
this.logError();
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
toString() {
|
|
15
|
+
return `Error ${this.code}: ${this.message ?? ""}`;
|
|
16
|
+
}
|
|
17
|
+
logError() {
|
|
18
|
+
console.error(this.toString(), this.thrownError);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// src/core/result.ts
|
|
23
|
+
var Result = class _Result {
|
|
24
|
+
_state;
|
|
25
|
+
constructor(state) {
|
|
26
|
+
this._state = state;
|
|
27
|
+
}
|
|
28
|
+
get state() {
|
|
29
|
+
return this._state;
|
|
30
|
+
}
|
|
31
|
+
static ok(value) {
|
|
32
|
+
return new _Result({ status: "success", value });
|
|
33
|
+
}
|
|
34
|
+
static err(error) {
|
|
35
|
+
return new _Result({ status: "error", error });
|
|
36
|
+
}
|
|
37
|
+
static errTag(code, message) {
|
|
38
|
+
return _Result.err(new ErrorBase(code, message));
|
|
39
|
+
}
|
|
40
|
+
unwrapOrNull() {
|
|
41
|
+
if (this._state.status === "success") {
|
|
42
|
+
return this._state.value;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
unwrapOrThrow() {
|
|
47
|
+
if (this._state.status === "success") {
|
|
48
|
+
return this._state.value;
|
|
49
|
+
}
|
|
50
|
+
throw new Error("Tried to unwrap a Result that is not successful");
|
|
51
|
+
}
|
|
52
|
+
unwrapOr(defaultValue) {
|
|
53
|
+
if (this._state.status === "success") {
|
|
54
|
+
return this._state.value;
|
|
55
|
+
}
|
|
56
|
+
return defaultValue;
|
|
57
|
+
}
|
|
58
|
+
isSuccess() {
|
|
59
|
+
return this._state.status === "success";
|
|
60
|
+
}
|
|
61
|
+
isError() {
|
|
62
|
+
return this._state.status === "error";
|
|
63
|
+
}
|
|
64
|
+
static tryPromise(promise, errorMapper) {
|
|
65
|
+
return promise.then((value) => _Result.ok(value)).catch((error) => _Result.err(errorMapper(error)));
|
|
66
|
+
}
|
|
67
|
+
static tryFunction(fn, errorMapper) {
|
|
68
|
+
return _Result.tryPromise(fn(), errorMapper);
|
|
69
|
+
}
|
|
70
|
+
chain(fn) {
|
|
71
|
+
if (this._state.status === "success") {
|
|
72
|
+
return new _Result(fn(this._state.value));
|
|
73
|
+
}
|
|
74
|
+
return _Result.err(this._state.error);
|
|
75
|
+
}
|
|
76
|
+
*[Symbol.iterator]() {
|
|
77
|
+
yield this;
|
|
78
|
+
if (this._state.status === "success") {
|
|
79
|
+
return this._state.value;
|
|
80
|
+
}
|
|
81
|
+
return void 0;
|
|
82
|
+
}
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
|
+
static run(generator) {
|
|
85
|
+
const iterator = generator();
|
|
86
|
+
let result = iterator.next();
|
|
87
|
+
while (!result.done) {
|
|
88
|
+
const yielded = result.value;
|
|
89
|
+
if (yielded._state.status === "error") {
|
|
90
|
+
return _Result.err(yielded._state.error);
|
|
91
|
+
}
|
|
92
|
+
result = iterator.next(yielded._state.value);
|
|
93
|
+
}
|
|
94
|
+
return _Result.ok(result.value);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
// src/core/asyncResult.ts
|
|
99
|
+
var AsyncResult = class _AsyncResult {
|
|
100
|
+
_state;
|
|
101
|
+
_listeners = /* @__PURE__ */ new Set();
|
|
102
|
+
constructor(state) {
|
|
103
|
+
this._state = state || { status: "idle" };
|
|
104
|
+
}
|
|
105
|
+
get state() {
|
|
106
|
+
return this._state;
|
|
107
|
+
}
|
|
108
|
+
set state(newState) {
|
|
109
|
+
this._state = newState;
|
|
110
|
+
this._listeners.forEach((listener) => listener(this));
|
|
111
|
+
}
|
|
112
|
+
static ok(value) {
|
|
113
|
+
return new _AsyncResult({ status: "success", value });
|
|
114
|
+
}
|
|
115
|
+
static err(error) {
|
|
116
|
+
return new _AsyncResult({ status: "error", error });
|
|
117
|
+
}
|
|
118
|
+
isSuccess() {
|
|
119
|
+
return this._state.status === "success";
|
|
120
|
+
}
|
|
121
|
+
isError() {
|
|
122
|
+
return this._state.status === "error";
|
|
123
|
+
}
|
|
124
|
+
isLoading() {
|
|
125
|
+
return this._state.status === "loading";
|
|
126
|
+
}
|
|
127
|
+
listen(listener, immediate = true) {
|
|
128
|
+
this._listeners.add(listener);
|
|
129
|
+
if (immediate) {
|
|
130
|
+
listener(this);
|
|
131
|
+
}
|
|
132
|
+
return () => {
|
|
133
|
+
this._listeners.delete(listener);
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
listenUntilSettled(listener, immediate = true) {
|
|
137
|
+
const unsub = this.listen((result) => {
|
|
138
|
+
listener(result);
|
|
139
|
+
if (result.state.status === "success" || result.state.status === "error") {
|
|
140
|
+
unsub();
|
|
141
|
+
}
|
|
142
|
+
}, immediate);
|
|
143
|
+
return unsub;
|
|
144
|
+
}
|
|
145
|
+
setState(newState) {
|
|
146
|
+
this.state = newState;
|
|
147
|
+
}
|
|
148
|
+
copyOnceSettled(other) {
|
|
149
|
+
this.updateFromResultPromise(other.toResultPromise());
|
|
150
|
+
}
|
|
151
|
+
update(newState) {
|
|
152
|
+
this.state = newState;
|
|
153
|
+
}
|
|
154
|
+
updateToValue(value) {
|
|
155
|
+
this.state = { status: "success", value };
|
|
156
|
+
}
|
|
157
|
+
updateToError(error) {
|
|
158
|
+
this.state = { status: "error", error };
|
|
159
|
+
}
|
|
160
|
+
updateFromResultPromise(promise) {
|
|
161
|
+
this.state = { status: "loading", promise };
|
|
162
|
+
promise.then((res) => {
|
|
163
|
+
this.state = res.state;
|
|
164
|
+
}).catch((error) => {
|
|
165
|
+
this.state = { status: "error", error };
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
static fromResultPromise(promise) {
|
|
169
|
+
const result = new _AsyncResult();
|
|
170
|
+
result.updateFromResultPromise(promise);
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
updateFromValuePromise(promise) {
|
|
174
|
+
const resultStatePromise = async () => {
|
|
175
|
+
try {
|
|
176
|
+
const value = await promise;
|
|
177
|
+
return Result.ok(value);
|
|
178
|
+
} catch (error) {
|
|
179
|
+
return Result.err(error);
|
|
180
|
+
}
|
|
181
|
+
};
|
|
182
|
+
this.updateFromResultPromise(resultStatePromise());
|
|
183
|
+
}
|
|
184
|
+
static fromValuePromise(promise) {
|
|
185
|
+
const result = new _AsyncResult();
|
|
186
|
+
result.updateFromValuePromise(promise);
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
async waitForSettled() {
|
|
190
|
+
if (this._state.status === "loading") {
|
|
191
|
+
try {
|
|
192
|
+
const value = await this._state.promise;
|
|
193
|
+
this._state = value.state;
|
|
194
|
+
} catch (error) {
|
|
195
|
+
this._state = { status: "error", error };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return this;
|
|
199
|
+
}
|
|
200
|
+
async waitForSettledResult() {
|
|
201
|
+
const settled = await this.waitForSettled();
|
|
202
|
+
if (settled.state.status === "idle" || settled.state.status === "loading") {
|
|
203
|
+
throw new Error("Cannot convert idle or loading AsyncResult to ResultState");
|
|
204
|
+
}
|
|
205
|
+
if (settled.state.status === "error") {
|
|
206
|
+
return Result.err(settled.state.error);
|
|
207
|
+
}
|
|
208
|
+
return Result.ok(settled.state.value);
|
|
209
|
+
}
|
|
210
|
+
async toResultPromise() {
|
|
211
|
+
if (this._state.status === "idle") {
|
|
212
|
+
throw new Error("Cannot convert idle AsyncResult to ResultState");
|
|
213
|
+
}
|
|
214
|
+
if (this._state.status === "loading") {
|
|
215
|
+
try {
|
|
216
|
+
const value = await this._state.promise;
|
|
217
|
+
this._state = value.state;
|
|
218
|
+
} catch (error) {
|
|
219
|
+
this._state = { status: "error", error };
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return new Result(this._state);
|
|
223
|
+
}
|
|
224
|
+
async toValuePromiseThrow() {
|
|
225
|
+
const settled = await this.waitForSettled();
|
|
226
|
+
return settled.unwrapOrThrow();
|
|
227
|
+
}
|
|
228
|
+
async toValueOrNullPromise() {
|
|
229
|
+
const settled = await this.waitForSettled();
|
|
230
|
+
return settled.unwrapOrNull();
|
|
231
|
+
}
|
|
232
|
+
unwrapOrNull() {
|
|
233
|
+
if (this._state.status === "success") {
|
|
234
|
+
return this._state.value;
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
async unwrapOrNullOnceSettled() {
|
|
239
|
+
return (await this.waitForSettled()).unwrapOrNull();
|
|
240
|
+
}
|
|
241
|
+
unwrapOrThrow() {
|
|
242
|
+
if (this._state.status === "success") {
|
|
243
|
+
return this._state.value;
|
|
244
|
+
}
|
|
245
|
+
throw new Error("Tried to unwrap an AsyncResult that is not successful");
|
|
246
|
+
}
|
|
247
|
+
async unwrapOrThrowOnceSettled() {
|
|
248
|
+
return (await this.waitForSettled()).unwrapOrThrow();
|
|
249
|
+
}
|
|
250
|
+
chain(fn) {
|
|
251
|
+
const newResultBuilder = async () => {
|
|
252
|
+
const settled = await this.waitForSettled();
|
|
253
|
+
if (settled.state.status === "loading" || settled.state.status === "idle") {
|
|
254
|
+
throw new Error("Unexpected state after waitForSettled");
|
|
255
|
+
}
|
|
256
|
+
if (settled.state.status === "error") {
|
|
257
|
+
return Result.err(settled.state.error);
|
|
258
|
+
}
|
|
259
|
+
return fn(settled.state.value);
|
|
260
|
+
};
|
|
261
|
+
return _AsyncResult.fromResultPromise(newResultBuilder());
|
|
262
|
+
}
|
|
263
|
+
flatChain(fn) {
|
|
264
|
+
const newResultBuilder = async () => {
|
|
265
|
+
const settled = await this.waitForSettledResult();
|
|
266
|
+
if (settled.state.status === "error") {
|
|
267
|
+
return Result.err(settled.state.error);
|
|
268
|
+
}
|
|
269
|
+
const nextAsyncResult = fn(settled.state.value);
|
|
270
|
+
const nextSettled = await nextAsyncResult.waitForSettledResult();
|
|
271
|
+
return nextSettled;
|
|
272
|
+
};
|
|
273
|
+
return _AsyncResult.fromResultPromise(newResultBuilder());
|
|
274
|
+
}
|
|
275
|
+
// pipeParallel PipeFunction[] -> AsyncResult<T, E>[]
|
|
276
|
+
// pipeParallelAndCollapse PipeFunction[] -> AsyncResult<T[], E>
|
|
277
|
+
mirror(other) {
|
|
278
|
+
return other.listen((newState) => {
|
|
279
|
+
this.setState(newState.state);
|
|
280
|
+
}, true);
|
|
281
|
+
}
|
|
282
|
+
mirrorUntilSettled(other) {
|
|
283
|
+
return other.listenUntilSettled((newState) => {
|
|
284
|
+
this.setState(newState.state);
|
|
285
|
+
}, true);
|
|
286
|
+
}
|
|
287
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
288
|
+
static ensureAvailable(results) {
|
|
289
|
+
if (results.length === 0) {
|
|
290
|
+
return _AsyncResult.ok(void 0);
|
|
291
|
+
}
|
|
292
|
+
const promise = Promise.all(results.map((r) => r.waitForSettled())).then(
|
|
293
|
+
(settledResults) => {
|
|
294
|
+
for (const res of settledResults) {
|
|
295
|
+
if (res.state.status === "error") {
|
|
296
|
+
return Result.err(res.state.error);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
const values = settledResults.map((r) => r.unwrapOrNull());
|
|
300
|
+
return Result.ok(values);
|
|
301
|
+
}
|
|
302
|
+
);
|
|
303
|
+
return _AsyncResult.fromResultPromise(promise);
|
|
304
|
+
}
|
|
305
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
306
|
+
*[Symbol.iterator]() {
|
|
307
|
+
yield this;
|
|
308
|
+
if (this._state.status === "success") {
|
|
309
|
+
return this._state.value;
|
|
310
|
+
}
|
|
311
|
+
return void 0;
|
|
312
|
+
}
|
|
313
|
+
static _runGeneratorProcessor(iterator) {
|
|
314
|
+
return async () => {
|
|
315
|
+
let result = iterator.next();
|
|
316
|
+
while (!result.done) {
|
|
317
|
+
const yielded = result.value;
|
|
318
|
+
const settled = await yielded.waitForSettledResult();
|
|
319
|
+
if (settled.state.status === "error") {
|
|
320
|
+
return Result.err(settled.state.error);
|
|
321
|
+
}
|
|
322
|
+
result = iterator.next(settled.state.value);
|
|
323
|
+
}
|
|
324
|
+
return Result.ok(result.value);
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
328
|
+
static run(generatorFunc) {
|
|
329
|
+
const iterator = generatorFunc();
|
|
330
|
+
return _AsyncResult.fromResultPromise(_AsyncResult._runGeneratorProcessor(iterator)());
|
|
331
|
+
}
|
|
332
|
+
runInPlace(generatorFunc) {
|
|
333
|
+
const iterator = generatorFunc();
|
|
334
|
+
this.updateFromResultPromise(_AsyncResult._runGeneratorProcessor(iterator)());
|
|
335
|
+
}
|
|
336
|
+
};
|
|
337
|
+
|
|
338
|
+
// src/core/cache.ts
|
|
339
|
+
var _defaultRefetchOptions = { policy: "no-refetch" };
|
|
340
|
+
function defaultParamsToKey(params) {
|
|
341
|
+
if (typeof params === "object") {
|
|
342
|
+
return JSON.stringify(params);
|
|
343
|
+
}
|
|
344
|
+
return String(params);
|
|
345
|
+
}
|
|
346
|
+
var KeyedAsyncCache = class {
|
|
347
|
+
_cache = /* @__PURE__ */ new Map();
|
|
348
|
+
_fetcher;
|
|
349
|
+
_paramsToKey;
|
|
350
|
+
constructor(fetcher, paramsToKey = defaultParamsToKey) {
|
|
351
|
+
this._fetcher = fetcher;
|
|
352
|
+
this._paramsToKey = paramsToKey;
|
|
353
|
+
}
|
|
354
|
+
makeCacheItem(result, fetcherParams) {
|
|
355
|
+
return { result, fetcherParams };
|
|
356
|
+
}
|
|
357
|
+
shouldRefetch(existingResult, refetch) {
|
|
358
|
+
if (refetch.policy === "refetch") {
|
|
359
|
+
return true;
|
|
360
|
+
}
|
|
361
|
+
if (refetch.policy === "if-error") {
|
|
362
|
+
return existingResult.result.state.status === "error";
|
|
363
|
+
}
|
|
364
|
+
return false;
|
|
365
|
+
}
|
|
366
|
+
get(params, refetch = _defaultRefetchOptions) {
|
|
367
|
+
const key = this._paramsToKey(params);
|
|
368
|
+
if (this._cache.has(key)) {
|
|
369
|
+
const cacheItem = this._cache.get(key);
|
|
370
|
+
if (!this.shouldRefetch(cacheItem, refetch)) {
|
|
371
|
+
return cacheItem.result;
|
|
372
|
+
} else {
|
|
373
|
+
cacheItem.result.updateFromResultPromise(Promise.resolve(this._fetcher(cacheItem.fetcherParams)));
|
|
374
|
+
return cacheItem.result;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
const asyncResult = AsyncResult.fromResultPromise(Promise.resolve(this._fetcher(params)));
|
|
378
|
+
this._cache.set(key, this.makeCacheItem(asyncResult, params));
|
|
379
|
+
return asyncResult;
|
|
380
|
+
}
|
|
381
|
+
async getSettledState(params, refetch = _defaultRefetchOptions) {
|
|
382
|
+
const asyncResult = this.get(params, refetch);
|
|
383
|
+
await asyncResult.waitForSettled();
|
|
384
|
+
return asyncResult.state;
|
|
385
|
+
}
|
|
386
|
+
anyLoading() {
|
|
387
|
+
for (const cacheItem of this._cache.values()) {
|
|
388
|
+
if (cacheItem.result.isLoading()) {
|
|
389
|
+
return true;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
clear() {
|
|
395
|
+
this._cache.clear();
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
export {
|
|
399
|
+
AsyncResult,
|
|
400
|
+
ErrorBase,
|
|
401
|
+
KeyedAsyncCache,
|
|
402
|
+
Result
|
|
403
|
+
};
|
|
404
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/error.ts","../../src/core/result.ts","../../src/core/asyncResult.ts","../../src/core/cache.ts"],"sourcesContent":["export class ErrorBase {\n code: string;\n message?: string | undefined;\n thrownError?: any;\n\n constructor(code: string, message?: string, thrownError?: any, log: boolean = true) {\n this.code = code;\n this.message = message;\n this.thrownError = thrownError;\n\n if (log) {\n this.logError();\n }\n }\n\n toString(): string {\n return `Error ${this.code}: ${this.message ?? ''}`;\n }\n\n logError(): void {\n console.error(this.toString(), this.thrownError);\n }\n}","import { ErrorBase } from \"./error\";\n\nexport type ResultState<T, E = ErrorBase> =\n | { status: 'success'; value: T }\n | { status: 'error'; error: E };\n\n\nexport class Result<T, E = ErrorBase> {\n private _state: ResultState<T, E>;\n\n constructor(state: ResultState<T, E>) {\n this._state = state;\n }\n\n get state() {\n return this._state;\n }\n\n static ok<T, E = ErrorBase>(value: T): Result<T, E> {\n return new Result({ status: 'success', value });\n }\n\n static err<E>(error: E): Result<never, E> {\n return new Result({ status: 'error', error });\n }\n\n static errTag(code: string, message?: string): Result<never, ErrorBase> {\n return Result.err(new ErrorBase(code, message));\n }\n\n unwrapOrNull(): T | null {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return null;\n }\n\n unwrapOrThrow(): T {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n throw new Error('Tried to unwrap a Result that is not successful');\n }\n\n unwrapOr<O>(defaultValue: O): T | O {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return defaultValue;\n }\n\n isSuccess(): boolean {\n return this._state.status === 'success';\n }\n\n isError(): boolean {\n return this._state.status === 'error';\n }\n\n static tryPromise<T, E>(promise: Promise<T>, errorMapper: (error: unknown) => E): Promise<Result<T, E>> {\n return promise\n .then((value) => Result.ok<T, E>(value))\n .catch((error) => Result.err(errorMapper(error)));\n }\n\n static tryFunction<T, E extends ErrorBase = ErrorBase>(fn: () => Promise<T>, errorMapper: (error: unknown) => E): Promise<Result<T, E>> {\n return Result.tryPromise(fn(), errorMapper);\n }\n\n chain<O, E2>(fn: (input: T) => ResultState<O, E | E2>): Result<O, E | E2> {\n if (this._state.status === 'success') {\n return new Result<O, E | E2>(fn(this._state.value));\n }\n return Result.err<E>(this._state.error);\n }\n\n *[Symbol.iterator](): Generator<Result<T, E>, T, any> {\n yield this;\n\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return undefined as T;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static run<T, E>(generator: () => Generator<Result<any, E>, T, any>): Result<T, E> {\n const iterator = generator();\n let result = iterator.next();\n\n while (!result.done) {\n const yielded = result.value;\n if (yielded._state.status === 'error') {\n return Result.err(yielded._state.error);\n }\n result = iterator.next(yielded._state.value);\n }\n\n return Result.ok(result.value);\n }\n}\n","import type { ErrorBase } from \"./error\";\nimport { Result, type ResultState } from \"./result\";\n\nexport type AsyncResultState<T, E> =\n | { status: 'idle' }\n | { status: 'loading'; promise: Promise<Result<T, E>> }\n | ResultState<T, E>;\n\nexport type ChainFunction<I, O, E> = (input: I) => Result<O, E> | Promise<Result<O, E>>;\nexport type FlatChainFunction<I, O, E> = (input: I) => AsyncResult<O, E>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AsyncResultListener<T, E> = (result: AsyncResult<T, E>) => any;\n\nexport class AsyncResult<T, E = ErrorBase> {\n private _state: AsyncResultState<T, E>;\n private _listeners: Set<AsyncResultListener<T, E>> = new Set();\n\n constructor(state?: AsyncResultState<T, E>) {\n this._state = state || { status: 'idle' };\n }\n\n get state() {\n return this._state;\n }\n\n private set state(newState: AsyncResultState<T, E>) {\n this._state = newState;\n this._listeners.forEach((listener) => listener(this));\n }\n\n static ok<T>(value: T): AsyncResult<T, never> {\n return new AsyncResult<T, never>({ status: 'success', value });\n }\n\n static err<E>(error: E): AsyncResult<never, E> {\n return new AsyncResult<never, E>({ status: 'error', error });\n }\n\n isSuccess() {\n return this._state.status === 'success';\n }\n\n isError() {\n return this._state.status === 'error';\n }\n\n isLoading() {\n return this._state.status === 'loading';\n }\n\n listen(listener: AsyncResultListener<T, E>, immediate = true) {\n this._listeners.add(listener);\n if (immediate) {\n listener(this);\n }\n\n return () => {\n this._listeners.delete(listener);\n };\n }\n\n listenUntilSettled(listener: AsyncResultListener<T, E>, immediate = true) {\n const unsub = this.listen((result) => {\n listener(result);\n if (result.state.status === 'success' || result.state.status === 'error') {\n unsub();\n }\n }, immediate);\n\n return unsub;\n }\n\n setState(newState: AsyncResultState<T, E>) {\n this.state = newState;\n }\n\n copyOnceSettled(other: AsyncResult<T, E>) {\n this.updateFromResultPromise(other.toResultPromise());\n }\n\n update(newState: AsyncResultState<T, E>) {\n this.state = newState;\n }\n\n updateToValue(value: T) {\n this.state = { status: 'success', value };\n }\n\n updateToError(error: E) {\n this.state = { status: 'error', error };\n }\n\n updateFromResultPromise(promise: Promise<Result<T, E>>) {\n this.state = { status: 'loading', promise };\n promise\n .then((res) => {\n this.state = res.state;\n })\n .catch((error) => {\n this.state = { status: 'error', error };\n });\n }\n\n static fromResultPromise<T, E>(promise: Promise<Result<T, E>>): AsyncResult<T, E> {\n const result = new AsyncResult<T, E>();\n result.updateFromResultPromise(promise);\n return result;\n }\n\n updateFromValuePromise(promise: Promise<T>) {\n const resultStatePromise = async (): Promise<Result<T, E>> => {\n try {\n const value = await promise;\n return Result.ok(value);\n } catch (error) {\n return Result.err(error as E);\n }\n };\n this.updateFromResultPromise(resultStatePromise());\n }\n\n static fromValuePromise<T, E>(promise: Promise<T>): AsyncResult<T, E> {\n const result = new AsyncResult<T, E>();\n result.updateFromValuePromise(promise);\n return result;\n }\n\n async waitForSettled(): Promise<AsyncResult<T, E>> {\n if (this._state.status === 'loading') {\n try {\n const value = await this._state.promise;\n this._state = value.state;\n } catch (error) {\n this._state = { status: 'error', error: error as E };\n }\n }\n return this;\n }\n\n async waitForSettledResult(): Promise<Result<T, E>> {\n const settled = await this.waitForSettled();\n if (settled.state.status === 'idle' || settled.state.status === 'loading') {\n throw new Error('Cannot convert idle or loading AsyncResult to ResultState');\n }\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n return Result.ok(settled.state.value);\n }\n\n async toResultPromise(): Promise<Result<T, E>> {\n if (this._state.status === 'idle') {\n throw new Error('Cannot convert idle AsyncResult to ResultState');\n }\n if (this._state.status === 'loading') {\n try {\n const value = await this._state.promise;\n this._state = value.state;\n } catch (error) {\n this._state = { status: 'error', error: error as E };\n }\n }\n return new Result(this._state);\n }\n\n async toValuePromiseThrow(): Promise<T> {\n const settled = await this.waitForSettled();\n return settled.unwrapOrThrow();\n }\n\n async toValueOrNullPromise(): Promise<T | null> {\n const settled = await this.waitForSettled();\n return settled.unwrapOrNull();\n }\n\n unwrapOrNull(): T | null {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return null;\n }\n\n async unwrapOrNullOnceSettled(): Promise<T | null> {\n return (await this.waitForSettled()).unwrapOrNull();\n }\n\n unwrapOrThrow(): T {\n if (this._state.status === 'success') {\n return this._state.value;\n }\n throw new Error('Tried to unwrap an AsyncResult that is not successful');\n }\n\n async unwrapOrThrowOnceSettled(): Promise<T> {\n return (await this.waitForSettled()).unwrapOrThrow();\n }\n\n chain<O, E2>(fn: ChainFunction<T, O, E | E2>): AsyncResult<O, E | E2> {\n const newResultBuilder = async (): Promise<Result<O, E | E2>> => {\n const settled = await this.waitForSettled();\n if (settled.state.status === 'loading' || settled.state.status === 'idle') {\n throw new Error('Unexpected state after waitForSettled'); // TODO handle this case properly\n }\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n\n return fn(settled.state.value);\n };\n\n return AsyncResult.fromResultPromise<O, E | E2>(newResultBuilder());\n }\n\n flatChain<O, E2>(fn: FlatChainFunction<T, O, E | E2>): AsyncResult<O, E | E2> {\n const newResultBuilder = async (): Promise<Result<O, E | E2>> => {\n const settled = await this.waitForSettledResult();\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n\n const nextAsyncResult = fn(settled.state.value);\n const nextSettled = await nextAsyncResult.waitForSettledResult();\n return nextSettled;\n }\n\n return AsyncResult.fromResultPromise<O, E | E2>(newResultBuilder());\n }\n\n // pipeParallel PipeFunction[] -> AsyncResult<T, E>[]\n // pipeParallelAndCollapse PipeFunction[] -> AsyncResult<T[], E>\n\n mirror(other: AsyncResult<T, E>) {\n return other.listen((newState) => {\n this.setState(newState.state);\n }, true);\n }\n\n mirrorUntilSettled(other: AsyncResult<T, E>) {\n return other.listenUntilSettled((newState) => {\n this.setState(newState.state);\n }, true);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static ensureAvailable<R extends readonly AsyncResult<any, any>[]>(results: R): AsyncResult<{ [K in keyof R]: R[K] extends AsyncResult<infer T, any> ? T : never }, R[number] extends AsyncResult<any, infer E> ? E : never> {\n if (results.length === 0) {\n // empty case — TS infers void tuple, so handle gracefully\n return AsyncResult.ok(undefined as never);\n }\n\n const promise = Promise.all(results.map((r) => r.waitForSettled())).then(\n (settledResults) => {\n for (const res of settledResults) {\n if (res.state.status === 'error') {\n return Result.err(res.state.error);\n }\n }\n\n const values = settledResults.map((r) => r.unwrapOrNull()!) as {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [K in keyof R]: R[K] extends AsyncResult<infer T, any>\n ? T\n : never;\n };\n\n return Result.ok(values);\n }\n );\n\n return AsyncResult.fromResultPromise(promise);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n *[Symbol.iterator](): Generator<AsyncResult<T, E>, T, any> {\n yield this;\n\n if (this._state.status === 'success') {\n return this._state.value;\n }\n return undefined as T;\n }\n\n private static _runGeneratorProcessor<T, E>(iterator: Generator<AsyncResult<any, any>, T, any>): () => Promise<Result<T, E>> {\n return async (): Promise<Result<T, E>> => {\n let result = iterator.next();\n\n while (!result.done) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const yielded = result.value as AsyncResult<any, E>;\n const settled = await yielded.waitForSettledResult();\n if (settled.state.status === 'error') {\n return Result.err(settled.state.error);\n }\n result = iterator.next(settled.state.value);\n }\n\n return Result.ok(result.value);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static run<T, E = ErrorBase>(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>): AsyncResult<T, E> {\n const iterator = generatorFunc();\n return AsyncResult.fromResultPromise<T, E>(AsyncResult._runGeneratorProcessor<T, E>(iterator)());\n }\n\n runInPlace(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>) {\n const iterator = generatorFunc();\n this.updateFromResultPromise(AsyncResult._runGeneratorProcessor<T, E>(iterator)());\n }\n}\n","import { AsyncResult, type AsyncResultState, type ChainFunction } from \"./asyncResult\";\nimport type { ErrorBase } from \"./error\";\n\ntype KeyedAsyncCacheRefetchOptions = {\n policy: 'refetch' | 'if-error' | 'no-refetch';\n};\n\ntype CacheItem<P, V, E> = {\n result: AsyncResult<V, E>;\n fetcherParams: P;\n};\n\nconst _defaultRefetchOptions: KeyedAsyncCacheRefetchOptions = { policy: 'no-refetch' };\n\nfunction defaultParamsToKey<P>(params: P): string {\n if (typeof params === 'object') {\n return JSON.stringify(params);\n }\n return String(params);\n}\n\nexport class KeyedAsyncCache<P, V, E = ErrorBase> {\n private _cache: Map<string, CacheItem<P, V, E>> = new Map();\n private _fetcher: ChainFunction<P, V, E>;\n private _paramsToKey: (params: P) => string;\n\n constructor(fetcher: ChainFunction<P, V, E>, paramsToKey: (params: P) => string = defaultParamsToKey) {\n this._fetcher = fetcher;\n this._paramsToKey = paramsToKey;\n }\n\n private makeCacheItem(result: AsyncResult<V, E>, fetcherParams: P): CacheItem<P, V, E> {\n return { result, fetcherParams };\n }\n\n private shouldRefetch(existingResult: CacheItem<P, V, E>, refetch: KeyedAsyncCacheRefetchOptions): boolean {\n if (refetch.policy === 'refetch') {\n return true;\n }\n if (refetch.policy === 'if-error') {\n return existingResult.result.state.status === 'error';\n }\n return false;\n }\n\n get(params: P, refetch: KeyedAsyncCacheRefetchOptions = _defaultRefetchOptions): AsyncResult<V, E> {\n const key = this._paramsToKey(params);\n if (this._cache.has(key)) {\n const cacheItem = this._cache.get(key)!;\n if (!this.shouldRefetch(cacheItem, refetch)) {\n return cacheItem.result;\n } else {\n cacheItem.result.updateFromResultPromise(Promise.resolve(this._fetcher(cacheItem.fetcherParams)));\n return cacheItem.result;\n }\n }\n\n const asyncResult = AsyncResult.fromResultPromise(Promise.resolve(this._fetcher(params)));\n this._cache.set(key, this.makeCacheItem(asyncResult, params));\n return asyncResult;\n }\n\n async getSettledState(params: P, refetch: KeyedAsyncCacheRefetchOptions = _defaultRefetchOptions): Promise<AsyncResultState<V, E>> {\n const asyncResult = this.get(params, refetch);\n await asyncResult.waitForSettled();\n return asyncResult.state;\n }\n\n anyLoading(): boolean {\n for (const cacheItem of this._cache.values()) {\n if (cacheItem.result.isLoading()) {\n return true;\n }\n }\n return false;\n }\n\n clear() {\n this._cache.clear();\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { Ref, WatchSource, VNode } from 'vue';
|
|
3
|
+
import { AsyncResult, FlatChainFunction, Result } from 'unwrapped/core';
|
|
4
|
+
|
|
5
|
+
declare function useAsyncResultRef<T, E>(asyncResult: AsyncResult<T, E>): Ref<AsyncResult<T, E>, AsyncResult<T, E>>;
|
|
6
|
+
declare function useReactiveResult<T, E, Inputs>(source: WatchSource<Inputs>, pipe: FlatChainFunction<Inputs, T, E>, options?: {
|
|
7
|
+
immediate: boolean;
|
|
8
|
+
}): Ref<AsyncResult<T, E>>;
|
|
9
|
+
declare function useAsyncResultRefFromPromise<T, E>(promise: Promise<Result<T, E>>): Ref<AsyncResult<T, E>, AsyncResult<T, E>>;
|
|
10
|
+
type Action<T, E> = () => Promise<Result<T, E>>;
|
|
11
|
+
declare function useImmediateAction<T, E>(action: Action<T, E>): Ref<AsyncResult<T, E>>;
|
|
12
|
+
interface LazyActionReturn<T, E> {
|
|
13
|
+
resultRef: Ref<AsyncResult<T, E>>;
|
|
14
|
+
trigger: () => void;
|
|
15
|
+
}
|
|
16
|
+
declare function useLazyAction<T, E>(action: Action<T, E>): LazyActionReturn<T, E>;
|
|
17
|
+
declare function useReactiveAction<I, O, E>(input: I | Ref<I> | (() => I), pipe: FlatChainFunction<I, O, E>, options?: {
|
|
18
|
+
immediate: boolean;
|
|
19
|
+
}): Ref<AsyncResult<O, E>>;
|
|
20
|
+
declare function useGenerator<T>(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>): Ref<AsyncResult<T, any>>;
|
|
21
|
+
declare function useLazyGenerator<T>(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>): {
|
|
22
|
+
resultRef: Ref<AsyncResult<T, any>>;
|
|
23
|
+
trigger: () => void;
|
|
24
|
+
};
|
|
25
|
+
declare function useReactiveGenerator<T, E, Inputs>(source: WatchSource<Inputs>, generatorFunc: (args: Inputs) => Generator<AsyncResult<any, any>, T, any>, options?: {
|
|
26
|
+
immediate: boolean;
|
|
27
|
+
}): Ref<AsyncResult<T, E>>;
|
|
28
|
+
|
|
29
|
+
declare const AsyncResultLoader: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
30
|
+
result: {
|
|
31
|
+
type: () => AsyncResult<unknown, unknown>;
|
|
32
|
+
required: true;
|
|
33
|
+
};
|
|
34
|
+
}>, () => VNode<vue.RendererNode, vue.RendererElement, {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}> | VNode<vue.RendererNode, vue.RendererElement, {
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}>[] | null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
39
|
+
result: {
|
|
40
|
+
type: () => AsyncResult<unknown, unknown>;
|
|
41
|
+
required: true;
|
|
42
|
+
};
|
|
43
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
44
|
+
interface CustomSlots<E> {
|
|
45
|
+
loading?: () => VNode;
|
|
46
|
+
error?: (props: {
|
|
47
|
+
error: E;
|
|
48
|
+
}) => VNode;
|
|
49
|
+
}
|
|
50
|
+
declare function buildCustomAsyncResultLoader<T, E>(slots: CustomSlots<E>): vue.DefineComponent<vue.ExtractPropTypes<{
|
|
51
|
+
result: {
|
|
52
|
+
type: () => AsyncResult<T, E>;
|
|
53
|
+
required: true;
|
|
54
|
+
};
|
|
55
|
+
}>, () => VNode<vue.RendererNode, vue.RendererElement, {
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
58
|
+
result: {
|
|
59
|
+
type: () => AsyncResult<T, E>;
|
|
60
|
+
required: true;
|
|
61
|
+
};
|
|
62
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
63
|
+
|
|
64
|
+
export { type Action, AsyncResultLoader, type LazyActionReturn, buildCustomAsyncResultLoader, useAsyncResultRef, useAsyncResultRefFromPromise, useGenerator, useImmediateAction, useLazyAction, useLazyGenerator, useReactiveAction, useReactiveGenerator, useReactiveResult };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as vue from 'vue';
|
|
2
|
+
import { Ref, WatchSource, VNode } from 'vue';
|
|
3
|
+
import { AsyncResult, FlatChainFunction, Result } from 'unwrapped/core';
|
|
4
|
+
|
|
5
|
+
declare function useAsyncResultRef<T, E>(asyncResult: AsyncResult<T, E>): Ref<AsyncResult<T, E>, AsyncResult<T, E>>;
|
|
6
|
+
declare function useReactiveResult<T, E, Inputs>(source: WatchSource<Inputs>, pipe: FlatChainFunction<Inputs, T, E>, options?: {
|
|
7
|
+
immediate: boolean;
|
|
8
|
+
}): Ref<AsyncResult<T, E>>;
|
|
9
|
+
declare function useAsyncResultRefFromPromise<T, E>(promise: Promise<Result<T, E>>): Ref<AsyncResult<T, E>, AsyncResult<T, E>>;
|
|
10
|
+
type Action<T, E> = () => Promise<Result<T, E>>;
|
|
11
|
+
declare function useImmediateAction<T, E>(action: Action<T, E>): Ref<AsyncResult<T, E>>;
|
|
12
|
+
interface LazyActionReturn<T, E> {
|
|
13
|
+
resultRef: Ref<AsyncResult<T, E>>;
|
|
14
|
+
trigger: () => void;
|
|
15
|
+
}
|
|
16
|
+
declare function useLazyAction<T, E>(action: Action<T, E>): LazyActionReturn<T, E>;
|
|
17
|
+
declare function useReactiveAction<I, O, E>(input: I | Ref<I> | (() => I), pipe: FlatChainFunction<I, O, E>, options?: {
|
|
18
|
+
immediate: boolean;
|
|
19
|
+
}): Ref<AsyncResult<O, E>>;
|
|
20
|
+
declare function useGenerator<T>(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>): Ref<AsyncResult<T, any>>;
|
|
21
|
+
declare function useLazyGenerator<T>(generatorFunc: () => Generator<AsyncResult<any, any>, T, any>): {
|
|
22
|
+
resultRef: Ref<AsyncResult<T, any>>;
|
|
23
|
+
trigger: () => void;
|
|
24
|
+
};
|
|
25
|
+
declare function useReactiveGenerator<T, E, Inputs>(source: WatchSource<Inputs>, generatorFunc: (args: Inputs) => Generator<AsyncResult<any, any>, T, any>, options?: {
|
|
26
|
+
immediate: boolean;
|
|
27
|
+
}): Ref<AsyncResult<T, E>>;
|
|
28
|
+
|
|
29
|
+
declare const AsyncResultLoader: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
30
|
+
result: {
|
|
31
|
+
type: () => AsyncResult<unknown, unknown>;
|
|
32
|
+
required: true;
|
|
33
|
+
};
|
|
34
|
+
}>, () => VNode<vue.RendererNode, vue.RendererElement, {
|
|
35
|
+
[key: string]: any;
|
|
36
|
+
}> | VNode<vue.RendererNode, vue.RendererElement, {
|
|
37
|
+
[key: string]: any;
|
|
38
|
+
}>[] | null, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
39
|
+
result: {
|
|
40
|
+
type: () => AsyncResult<unknown, unknown>;
|
|
41
|
+
required: true;
|
|
42
|
+
};
|
|
43
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
44
|
+
interface CustomSlots<E> {
|
|
45
|
+
loading?: () => VNode;
|
|
46
|
+
error?: (props: {
|
|
47
|
+
error: E;
|
|
48
|
+
}) => VNode;
|
|
49
|
+
}
|
|
50
|
+
declare function buildCustomAsyncResultLoader<T, E>(slots: CustomSlots<E>): vue.DefineComponent<vue.ExtractPropTypes<{
|
|
51
|
+
result: {
|
|
52
|
+
type: () => AsyncResult<T, E>;
|
|
53
|
+
required: true;
|
|
54
|
+
};
|
|
55
|
+
}>, () => VNode<vue.RendererNode, vue.RendererElement, {
|
|
56
|
+
[key: string]: any;
|
|
57
|
+
}>, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
58
|
+
result: {
|
|
59
|
+
type: () => AsyncResult<T, E>;
|
|
60
|
+
required: true;
|
|
61
|
+
};
|
|
62
|
+
}>> & Readonly<{}>, {}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
63
|
+
|
|
64
|
+
export { type Action, AsyncResultLoader, type LazyActionReturn, buildCustomAsyncResultLoader, useAsyncResultRef, useAsyncResultRefFromPromise, useGenerator, useImmediateAction, useLazyAction, useLazyGenerator, useReactiveAction, useReactiveGenerator, useReactiveResult };
|