soseki 0.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/.config/_is-debug-mode.ts +9 -0
- package/.config/dependency-cruiser.cjs +408 -0
- package/.config/env.d.ts +8 -0
- package/.config/mise.toml +28 -0
- package/.config/navigation-api.d.ts +18 -0
- package/.config/tsconfig.build.json +28 -0
- package/.config/tsconfig.config.json +21 -0
- package/.config/tsconfig.test.json +26 -0
- package/.config/tsconfig.web.json +26 -0
- package/.config/vitest.client.ts +30 -0
- package/package.json +45 -0
- package/src/components/action-id.tsx +35 -0
- package/src/components/browser-router.tsx +31 -0
- package/src/components/hidden-input.tsx +39 -0
- package/src/components/outlet.tsx +17 -0
- package/src/components/router.tsx +234 -0
- package/src/contexts/route-context.ts +21 -0
- package/src/contexts/router-context.ts +55 -0
- package/src/core/_action-id-registry.ts +11 -0
- package/src/core/_capture-stack-trace.ts +12 -0
- package/src/core/_compare-route-paths.ts +90 -0
- package/src/core/_create-html-form-element-form-form-data.ts +32 -0
- package/src/core/_encode-pathname.ts +17 -0
- package/src/core/_is-error.ts +16 -0
- package/src/core/_is-promise-like.ts +14 -0
- package/src/core/_match-route-path.ts +39 -0
- package/src/core/_process-routes.ts +56 -0
- package/src/core/_singleton.ts +45 -0
- package/src/core/_unreachable.ts +22 -0
- package/src/core/_use-singleton.ts +24 -0
- package/src/core/_valibot.ts +147 -0
- package/src/core/_weak-id-registry.ts +125 -0
- package/src/core/constants.ts +4 -0
- package/src/core/data-map.types.ts +28 -0
- package/src/core/data-store.types.ts +25 -0
- package/src/core/deferred-promise.ts +408 -0
- package/src/core/errors.ts +680 -0
- package/src/core/expect-history-entry.ts +95 -0
- package/src/core/history-entry-id-schema.ts +27 -0
- package/src/core/history-entry-url-schema.ts +35 -0
- package/src/core/init-loaders.ts +79 -0
- package/src/core/match-routes.ts +91 -0
- package/src/core/readonly-form-data.types.ts +63 -0
- package/src/core/readonly-url.types.ts +156 -0
- package/src/core/redirect-response.ts +36 -0
- package/src/core/route-request.ts +92 -0
- package/src/core/route.types.ts +351 -0
- package/src/core/start-actions.ts +274 -0
- package/src/core/start-loaders.ts +254 -0
- package/src/core.ts +43 -0
- package/src/engines/engine.types.ts +216 -0
- package/src/engines/navigation-api-engine.ts +406 -0
- package/src/hooks/_use-route-context.ts +19 -0
- package/src/hooks/_use-router-context.ts +25 -0
- package/src/hooks/use-action-data.ts +37 -0
- package/src/hooks/use-loader-data.ts +28 -0
- package/src/hooks/use-navigate.ts +64 -0
- package/src/hooks/use-params.ts +11 -0
- package/src/hooks/use-pathname.ts +10 -0
- package/src/hooks/use-submit.ts +111 -0
- package/src/soseki.ts +75 -0
- package/src/utils/get-action-id.ts +12 -0
- package/src/utils/href.ts +17 -0
- package/src/utils/redirect.ts +13 -0
- package/src/utils/route-index.ts +70 -0
- package/src/utils/route-route.ts +111 -0
- package/src/utils/set-action-id.ts +14 -0
- package/tests/core/_capture-stack-trace.test.ts +46 -0
- package/tests/core/_compare-route-paths.test.ts +134 -0
- package/tests/core/_encode-pathname.test.ts +77 -0
- package/tests/core/_is-error.test.ts +108 -0
- package/tests/core/_is-promise-like.test.ts +100 -0
- package/tests/core/_match-route-path.test.ts +74 -0
- package/tests/core/_process-routes.test.ts +146 -0
- package/tests/core/_singleton.test.ts +102 -0
- package/tests/core/_unreachable.test.ts +38 -0
- package/tests/core/_use-singleton.test.ts +47 -0
- package/tests/core/_weak-id-registry.test.ts +137 -0
- package/tests/core/deferred-promise.test.ts +218 -0
- package/tests/core/expect-history-entry.test.ts +112 -0
- package/tests/core/init-loaders.test.ts +172 -0
- package/tests/core/match-routes.test.ts +178 -0
- package/tests/core/redirect-response.test.ts +36 -0
- package/tests/core/route-request.test.ts +93 -0
- package/tests/core/start-actions.test.ts +319 -0
- package/tests/core/start-loaders.test.ts +276 -0
- package/tests/engines/navigation-api-engine.test.ts +162 -0
- package/tsconfig.json +7 -0
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
import isPromiseLike from "./_is-promise-like.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* DeferredPromise の基本型です。
|
|
5
|
+
*
|
|
6
|
+
* @template T 非同期処理の結果として返される値の型です。
|
|
7
|
+
*/
|
|
8
|
+
interface DeferredPromiseLike<T> {
|
|
9
|
+
/**
|
|
10
|
+
* Promise が解決または拒否された際のコールバックを登録します。
|
|
11
|
+
*
|
|
12
|
+
* @template TResult1 解決時コールバックの戻り値の型です。
|
|
13
|
+
* @template TResult2 拒否時コールバックの戻り値の型です。
|
|
14
|
+
* @param onfulfilled 解決時に実行されるコールバックです。
|
|
15
|
+
* @param onrejected 拒否時に実行されるコールバックです。
|
|
16
|
+
* @returns 新しい DeferredPromise インスタンスです。
|
|
17
|
+
*/
|
|
18
|
+
then<TResult1 = T, TResult2 = never>(
|
|
19
|
+
onfulfilled?:
|
|
20
|
+
| ((value: T) => TResult1 | PromiseLike<TResult1>)
|
|
21
|
+
| null
|
|
22
|
+
| undefined,
|
|
23
|
+
onrejected?:
|
|
24
|
+
| ((reason: unknown) => TResult2 | PromiseLike<TResult2>)
|
|
25
|
+
| null
|
|
26
|
+
| undefined,
|
|
27
|
+
): DeferredPromise<TResult1 | TResult2>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 待機状態(pending)にある DeferredPromise を表すインターフェースです。
|
|
32
|
+
*
|
|
33
|
+
* @template T 非同期処理の結果として返される値の型です。
|
|
34
|
+
*/
|
|
35
|
+
export interface PendingDeferredPromise<T> extends DeferredPromiseLike<T> {
|
|
36
|
+
/**
|
|
37
|
+
* 現在の状態を示します。
|
|
38
|
+
*/
|
|
39
|
+
status: "pending";
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* 完了状態(fulfilled)にある DeferredPromise を表すインターフェースです。
|
|
44
|
+
*
|
|
45
|
+
* @template T 非同期処理の結果として返される値の型です。
|
|
46
|
+
*/
|
|
47
|
+
export interface FulfilledDeferredPromise<T> extends DeferredPromiseLike<T> {
|
|
48
|
+
/**
|
|
49
|
+
* 現在の状態を示します。
|
|
50
|
+
*/
|
|
51
|
+
status: "fulfilled";
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* 解決された値です。
|
|
55
|
+
*/
|
|
56
|
+
value: T;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* 拒否状態(rejected)にある DeferredPromise を表すインターフェースです。
|
|
61
|
+
*
|
|
62
|
+
* @template T 非同期処理の結果として期待されていた値の型です。
|
|
63
|
+
*/
|
|
64
|
+
export interface RejectedDeferredPromise<T> extends DeferredPromiseLike<T> {
|
|
65
|
+
/**
|
|
66
|
+
* 現在の状態を示します。
|
|
67
|
+
*/
|
|
68
|
+
status: "rejected";
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* 拒否された理由(エラー内容)です。
|
|
72
|
+
*/
|
|
73
|
+
reason: unknown;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Promise の状態を外部から同期的に参照できるようにしたクラスです。
|
|
78
|
+
*
|
|
79
|
+
* PromiseLike を実装しています。このクラスは主に `React.use` で使うことを想定して実装されています。
|
|
80
|
+
*
|
|
81
|
+
* @template T 非同期処理の結果として返される値の型です。
|
|
82
|
+
*/
|
|
83
|
+
type DeferredPromise<T> =
|
|
84
|
+
| PendingDeferredPromise<T>
|
|
85
|
+
| FulfilledDeferredPromise<T>
|
|
86
|
+
| RejectedDeferredPromise<T>;
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* 外部から解決または拒否が可能な DeferredPromise のリゾルバー群を表すインターフェースです。
|
|
90
|
+
*
|
|
91
|
+
* @template T DeferredPromise が解決された際の値の型です。
|
|
92
|
+
*/
|
|
93
|
+
export interface DeferredPromiseWithResolvers<T> {
|
|
94
|
+
/**
|
|
95
|
+
* 現在のステータスを持つ DeferredPromise オブジェクトです。
|
|
96
|
+
*/
|
|
97
|
+
promise: DeferredPromise<T>;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* DeferredPromise を解決(resolve)させる関数です。
|
|
101
|
+
*
|
|
102
|
+
* @param value 解決に用いる値です。
|
|
103
|
+
*/
|
|
104
|
+
resolve(value: T | PromiseLike<T>): void;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* DeferredPromise を拒否(reject)させる関数です。
|
|
108
|
+
*
|
|
109
|
+
* @param reason 拒否の理由です。
|
|
110
|
+
*/
|
|
111
|
+
reject(reason?: unknown): void;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* DeferredPromise が取り得る状態のユニオン型です。
|
|
116
|
+
*/
|
|
117
|
+
type DeferredPromiseState = "pending" | "fulfilled" | "rejected";
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* then メソッドで登録されるコールバックと、それに関連する解決・拒否関数を保持する型です。
|
|
121
|
+
*
|
|
122
|
+
* @template T 元の Promise が解決された際の値の型です。
|
|
123
|
+
* @template TResult コールバックの実行結果として返される値の型です。
|
|
124
|
+
*/
|
|
125
|
+
type PromiseCallback<T, TResult> = {
|
|
126
|
+
/**
|
|
127
|
+
* 後続の Promise を拒否するための関数です。
|
|
128
|
+
*/
|
|
129
|
+
readonly reject: (reason?: unknown) => void;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* 後続の Promise を解決するための関数です。
|
|
133
|
+
*/
|
|
134
|
+
readonly resolve: (value: TResult) => void;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* 拒否時に実行されるユーザー定義のコールバックです。
|
|
138
|
+
*/
|
|
139
|
+
readonly onRejected:
|
|
140
|
+
| ((reason: unknown) => TResult | PromiseLike<TResult>)
|
|
141
|
+
| null
|
|
142
|
+
| undefined;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* 解決時に実行されるユーザー定義のコールバックです。
|
|
146
|
+
*/
|
|
147
|
+
readonly onFulfilled:
|
|
148
|
+
| ((value: T) => TResult | PromiseLike<TResult>)
|
|
149
|
+
| null
|
|
150
|
+
| undefined;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* 動的に解決された値や拒否理由を保持するためのベースクラスを生成する定数です。
|
|
155
|
+
*/
|
|
156
|
+
const Options = (class {}) as {
|
|
157
|
+
new<T>(): {
|
|
158
|
+
/**
|
|
159
|
+
* 解決された値です。
|
|
160
|
+
*/
|
|
161
|
+
value?: T;
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* 拒否された理由(エラー内容)です。
|
|
165
|
+
*/
|
|
166
|
+
reason?: unknown;
|
|
167
|
+
};
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
const DeferredPromise = class DeferredPromise_<T> extends Options<T> implements PromiseLike<T> {
|
|
171
|
+
/**
|
|
172
|
+
* 指定された関数を実行し、その結果を DeferredPromise として返します。
|
|
173
|
+
* 関数が同期的に例外を投げた場合、拒否状態の Promise を返します。
|
|
174
|
+
*
|
|
175
|
+
* @template T 関数の戻り値の型です。
|
|
176
|
+
* @template TArgs 関数に渡す引数の型配列です。
|
|
177
|
+
* @param callbackFn 実行するコールバック関数です。
|
|
178
|
+
* @param args 関数に渡す引数です。
|
|
179
|
+
* @returns 実行結果をラップした DeferredPromise です。
|
|
180
|
+
*/
|
|
181
|
+
public static try<T, TArgs extends unknown[]>(
|
|
182
|
+
callbackFn: (...args: TArgs) => T | PromiseLike<T>,
|
|
183
|
+
...args: TArgs
|
|
184
|
+
): DeferredPromise<Awaited<T>> {
|
|
185
|
+
let value;
|
|
186
|
+
try {
|
|
187
|
+
value = callbackFn(...args);
|
|
188
|
+
if (!isPromiseLike(value)) {
|
|
189
|
+
return this.resolve(value) as DeferredPromise<Awaited<T>>;
|
|
190
|
+
}
|
|
191
|
+
} catch (ex) {
|
|
192
|
+
return this.reject<T>(ex) as DeferredPromise<Awaited<T>>;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const {
|
|
196
|
+
reject,
|
|
197
|
+
resolve,
|
|
198
|
+
promise,
|
|
199
|
+
} = this.withResolvers<Awaited<T>>();
|
|
200
|
+
(async function runDeferredPromise() {
|
|
201
|
+
try {
|
|
202
|
+
resolve(await value);
|
|
203
|
+
} catch (ex) {
|
|
204
|
+
reject(ex);
|
|
205
|
+
}
|
|
206
|
+
})();
|
|
207
|
+
|
|
208
|
+
return promise as DeferredPromise<Awaited<T>>;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* 既に拒否状態となっている DeferredPromise インスタンスを生成します。
|
|
213
|
+
*
|
|
214
|
+
* @template T DeferredPromise が期待していた値の型です。
|
|
215
|
+
* @param reason 拒否の理由です。
|
|
216
|
+
* @returns 拒否状態の DeferredPromise です。
|
|
217
|
+
*/
|
|
218
|
+
public static reject<T = never>(reason?: unknown): RejectedDeferredPromise<T> {
|
|
219
|
+
const promise = new DeferredPromise_<T>();
|
|
220
|
+
promise.#reject(reason);
|
|
221
|
+
|
|
222
|
+
return promise as RejectedDeferredPromise<T>;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* 既に解決状態となっている DeferredPromise インスタンスを生成します。
|
|
227
|
+
*
|
|
228
|
+
* @template T 解決される値の型です。
|
|
229
|
+
* @param value 解決に用いる値です。
|
|
230
|
+
* @returns 解決状態の DeferredPromise です。
|
|
231
|
+
*/
|
|
232
|
+
public static resolve<T>(value: T): FulfilledDeferredPromise<T> {
|
|
233
|
+
const promise = new DeferredPromise_<T>();
|
|
234
|
+
promise.#resolve(value);
|
|
235
|
+
|
|
236
|
+
return promise as FulfilledDeferredPromise<T>;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* DeferredPromise と、それを外部から制御するためのリゾルバー(resolve/reject)を生成します。
|
|
241
|
+
*
|
|
242
|
+
* @template T DeferredPromise が解決された際の値の型です。
|
|
243
|
+
* @returns DeferredPromise とリゾルバーを含むオブジェクトです。
|
|
244
|
+
*/
|
|
245
|
+
public static withResolvers<T>(): DeferredPromiseWithResolvers<T> {
|
|
246
|
+
const promise = new DeferredPromise_<T>();
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
reject(reason) {
|
|
250
|
+
promise.#reject(reason);
|
|
251
|
+
},
|
|
252
|
+
resolve(value) {
|
|
253
|
+
promise.#resolve(value);
|
|
254
|
+
},
|
|
255
|
+
// @ts-expect-error
|
|
256
|
+
promise,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* 解決または拒否を待機しているコールバックのキューです。
|
|
262
|
+
*/
|
|
263
|
+
readonly #queue: PromiseCallback<T, any>[] = [];
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* 内部的に Promise を拒否状態に遷移させます。
|
|
267
|
+
*
|
|
268
|
+
* @param reason 拒否の理由です。
|
|
269
|
+
*/
|
|
270
|
+
#reject(reason?: unknown): void {
|
|
271
|
+
if (this.status !== "pending") {
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
this.status = "rejected";
|
|
276
|
+
this.reason = reason;
|
|
277
|
+
this.#processQueue();
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* 内部的に Promise を解決状態に遷移させます。
|
|
282
|
+
*
|
|
283
|
+
* 引数が PromiseLike の場合は、その状態を継承します。
|
|
284
|
+
*
|
|
285
|
+
* @param value 解決に用いる値、または PromiseLike オブジェクトです。
|
|
286
|
+
*/
|
|
287
|
+
#resolve(value: T | PromiseLike<T>): void {
|
|
288
|
+
if (this.status !== "pending") {
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
if (!isPromiseLike(value)) {
|
|
293
|
+
// 値による解決を行います。
|
|
294
|
+
this.status = "fulfilled";
|
|
295
|
+
this.value = value;
|
|
296
|
+
this.#processQueue();
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
// 受け取った値が PromiseLike だった場合、その状態を継承します。
|
|
301
|
+
try {
|
|
302
|
+
// 再帰的に待機します。
|
|
303
|
+
value.then.call(
|
|
304
|
+
value,
|
|
305
|
+
(y: T) => this.#resolve(y),
|
|
306
|
+
(r: unknown) => this.#reject(r),
|
|
307
|
+
);
|
|
308
|
+
} catch (ex) {
|
|
309
|
+
this.#reject(ex);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
/**
|
|
314
|
+
* キューに積まれたコールバックを順次実行します。
|
|
315
|
+
*
|
|
316
|
+
* ステータスが確定していない場合は何もしません。
|
|
317
|
+
*/
|
|
318
|
+
#processQueue(): void {
|
|
319
|
+
if (this.status === "pending") {
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Promise の仕様に従い、マイクロタスクに入れて非同期実行を保証します。
|
|
324
|
+
queueMicrotask(() => {
|
|
325
|
+
while (this.#queue.length > 0) {
|
|
326
|
+
const callback = this.#queue.shift();
|
|
327
|
+
if (!callback) {
|
|
328
|
+
continue;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const {
|
|
332
|
+
reject,
|
|
333
|
+
resolve,
|
|
334
|
+
onRejected,
|
|
335
|
+
onFulfilled,
|
|
336
|
+
} = callback;
|
|
337
|
+
try {
|
|
338
|
+
if (this.status === "fulfilled") {
|
|
339
|
+
if (typeof onFulfilled === "function") {
|
|
340
|
+
const result = onFulfilled(this.value!);
|
|
341
|
+
resolve(result);
|
|
342
|
+
} else {
|
|
343
|
+
// コールバックがない場合は値を透過させます。
|
|
344
|
+
resolve(this.value);
|
|
345
|
+
}
|
|
346
|
+
} else if (this.status === "rejected") {
|
|
347
|
+
if (typeof onRejected === "function") {
|
|
348
|
+
const result = onRejected(this.reason);
|
|
349
|
+
resolve(result); // エラーハンドリング成功時は次の Promise は resolve されます。
|
|
350
|
+
} else {
|
|
351
|
+
// コールバックがない場合はエラーを透過させます。
|
|
352
|
+
reject(this.reason);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
} catch (ex) {
|
|
356
|
+
// コールバック実行中にエラーが発生した場合は、後続の Promise を拒否します。
|
|
357
|
+
reject(ex);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
/**
|
|
364
|
+
* 現在の Promise の状態です。
|
|
365
|
+
*/
|
|
366
|
+
public status: DeferredPromiseState = "pending";
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Promise が解決または拒否された際のコールバックを登録します。
|
|
370
|
+
*
|
|
371
|
+
* @template TResult1 解決時コールバックの戻り値の型です。
|
|
372
|
+
* @template TResult2 拒否時コールバックの戻り値の型です。
|
|
373
|
+
* @param onfulfilled 解決時に実行されるコールバックです。
|
|
374
|
+
* @param onrejected 拒否時に実行されるコールバックです。
|
|
375
|
+
* @returns 新しい DeferredPromise インスタンスです。
|
|
376
|
+
*/
|
|
377
|
+
public then<TResult1 = T, TResult2 = never>(
|
|
378
|
+
onfulfilled?:
|
|
379
|
+
| ((value: T) => TResult1 | PromiseLike<TResult1>)
|
|
380
|
+
| null
|
|
381
|
+
| undefined,
|
|
382
|
+
onrejected?:
|
|
383
|
+
| ((reason: unknown) => TResult2 | PromiseLike<TResult2>)
|
|
384
|
+
| null
|
|
385
|
+
| undefined,
|
|
386
|
+
): DeferredPromise<TResult1 | TResult2> {
|
|
387
|
+
// 新しい DeferredPromise を作成してチェーンをつなぎます。
|
|
388
|
+
const nextPromise = new DeferredPromise_<TResult1 | TResult2>();
|
|
389
|
+
|
|
390
|
+
this.#queue.push({
|
|
391
|
+
reject(reason) {
|
|
392
|
+
nextPromise.#reject(reason);
|
|
393
|
+
},
|
|
394
|
+
resolve(value) {
|
|
395
|
+
nextPromise.#resolve(value);
|
|
396
|
+
},
|
|
397
|
+
onRejected: onrejected,
|
|
398
|
+
onFulfilled: onfulfilled,
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
// すでに解決/拒否済みかもしれないのでキュー処理を試行します。
|
|
402
|
+
this.#processQueue();
|
|
403
|
+
|
|
404
|
+
return nextPromise as DeferredPromise<TResult1 | TResult2>;
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
|
|
408
|
+
export default DeferredPromise;
|