@fluixi/reactive 1.0.0-alpha.100
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/LICENSE +21 -0
- package/README.md +280 -0
- package/dist/cdn/reactive.cjs +2803 -0
- package/dist/cdn/reactive.d.ts +11 -0
- package/dist/cdn/reactive.d.ts.map +1 -0
- package/dist/cdn/reactive.global.js +2 -0
- package/dist/cdn/reactive.js +10 -0
- package/dist/cdn/reactive.mjs +2787 -0
- package/dist/cdn/signal.cjs +299 -0
- package/dist/cdn/signal.d.ts +19 -0
- package/dist/cdn/signal.d.ts.map +1 -0
- package/dist/cdn/signal.global.js +2 -0
- package/dist/cdn/signal.js +18 -0
- package/dist/cdn/signal.mjs +276 -0
- package/dist/index.cjs +2803 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.mjs +2787 -0
- package/dist/lib/index.cjs +2804 -0
- package/dist/lib/index.d.ts +8 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +11 -0
- package/dist/lib/index.mjs +2789 -0
- package/dist/lib/observable/index.cjs +386 -0
- package/dist/lib/observable/index.d.ts +4 -0
- package/dist/lib/observable/index.d.ts.map +1 -0
- package/dist/lib/observable/index.js +3 -0
- package/dist/lib/observable/index.mjs +364 -0
- package/dist/lib/observable/observable.cjs +384 -0
- package/dist/lib/observable/observable.d.ts +246 -0
- package/dist/lib/observable/observable.d.ts.map +1 -0
- package/dist/lib/observable/observable.js +268 -0
- package/dist/lib/observable/observable.mjs +361 -0
- package/dist/lib/observable/subscription.cjs +180 -0
- package/dist/lib/observable/subscription.d.ts +58 -0
- package/dist/lib/observable/subscription.d.ts.map +1 -0
- package/dist/lib/observable/subscription.js +177 -0
- package/dist/lib/observable/subscription.mjs +157 -0
- package/dist/lib/observable/types.cjs +18 -0
- package/dist/lib/observable/types.d.ts +44 -0
- package/dist/lib/observable/types.d.ts.map +1 -0
- package/dist/lib/observable/types.js +1 -0
- package/dist/lib/observable/types.mjs +0 -0
- package/dist/lib/predicates.cjs +44 -0
- package/dist/lib/predicates.d.ts +37 -0
- package/dist/lib/predicates.d.ts.map +1 -0
- package/dist/lib/predicates.js +62 -0
- package/dist/lib/predicates.mjs +23 -0
- package/dist/lib/signal/api.cjs +592 -0
- package/dist/lib/signal/api.d.ts +227 -0
- package/dist/lib/signal/api.d.ts.map +1 -0
- package/dist/lib/signal/api.js +228 -0
- package/dist/lib/signal/api.mjs +569 -0
- package/dist/lib/signal/cached-resource.cjs +726 -0
- package/dist/lib/signal/cached-resource.d.ts +86 -0
- package/dist/lib/signal/cached-resource.d.ts.map +1 -0
- package/dist/lib/signal/cached-resource.js +250 -0
- package/dist/lib/signal/cached-resource.mjs +704 -0
- package/dist/lib/signal/graph/children.cjs +326 -0
- package/dist/lib/signal/graph/children.d.ts +2 -0
- package/dist/lib/signal/graph/children.d.ts.map +1 -0
- package/dist/lib/signal/graph/children.js +30 -0
- package/dist/lib/signal/graph/children.mjs +303 -0
- package/dist/lib/signal/graph/compat.cjs +590 -0
- package/dist/lib/signal/graph/compat.d.ts +66 -0
- package/dist/lib/signal/graph/compat.d.ts.map +1 -0
- package/dist/lib/signal/graph/compat.js +197 -0
- package/dist/lib/signal/graph/compat.mjs +568 -0
- package/dist/lib/signal/graph/core.cjs +295 -0
- package/dist/lib/signal/graph/core.d.ts +99 -0
- package/dist/lib/signal/graph/core.d.ts.map +1 -0
- package/dist/lib/signal/graph/core.js +268 -0
- package/dist/lib/signal/graph/core.mjs +273 -0
- package/dist/lib/signal/graph/debounced.cjs +680 -0
- package/dist/lib/signal/graph/debounced.d.ts +67 -0
- package/dist/lib/signal/graph/debounced.d.ts.map +1 -0
- package/dist/lib/signal/graph/debounced.js +92 -0
- package/dist/lib/signal/graph/debounced.mjs +657 -0
- package/dist/lib/signal/graph/derived.cjs +508 -0
- package/dist/lib/signal/graph/derived.d.ts +14 -0
- package/dist/lib/signal/graph/derived.d.ts.map +1 -0
- package/dist/lib/signal/graph/derived.js +65 -0
- package/dist/lib/signal/graph/derived.mjs +485 -0
- package/dist/lib/signal/graph/detect.cjs +66 -0
- package/dist/lib/signal/graph/detect.d.ts +17 -0
- package/dist/lib/signal/graph/detect.d.ts.map +1 -0
- package/dist/lib/signal/graph/detect.js +39 -0
- package/dist/lib/signal/graph/detect.mjs +45 -0
- package/dist/lib/signal/graph/error-boundary.cjs +313 -0
- package/dist/lib/signal/graph/error-boundary.d.ts +16 -0
- package/dist/lib/signal/graph/error-boundary.d.ts.map +1 -0
- package/dist/lib/signal/graph/error-boundary.js +34 -0
- package/dist/lib/signal/graph/error-boundary.mjs +290 -0
- package/dist/lib/signal/graph/index.cjs +305 -0
- package/dist/lib/signal/graph/index.d.ts +22 -0
- package/dist/lib/signal/graph/index.d.ts.map +1 -0
- package/dist/lib/signal/graph/index.js +21 -0
- package/dist/lib/signal/graph/index.mjs +283 -0
- package/dist/lib/signal/graph/observe.cjs +198 -0
- package/dist/lib/signal/graph/observe.d.ts +185 -0
- package/dist/lib/signal/graph/observe.d.ts.map +1 -0
- package/dist/lib/signal/graph/observe.js +198 -0
- package/dist/lib/signal/graph/observe.mjs +175 -0
- package/dist/lib/signal/graph/resource.cjs +632 -0
- package/dist/lib/signal/graph/resource.d.ts +39 -0
- package/dist/lib/signal/graph/resource.d.ts.map +1 -0
- package/dist/lib/signal/graph/resource.js +165 -0
- package/dist/lib/signal/graph/resource.mjs +609 -0
- package/dist/lib/signal/graph/runtime.cjs +522 -0
- package/dist/lib/signal/graph/runtime.d.ts +80 -0
- package/dist/lib/signal/graph/runtime.d.ts.map +1 -0
- package/dist/lib/signal/graph/runtime.js +358 -0
- package/dist/lib/signal/graph/runtime.mjs +499 -0
- package/dist/lib/signal/graph/signal-next.cjs +1249 -0
- package/dist/lib/signal/graph/signal-next.d.ts +38 -0
- package/dist/lib/signal/graph/signal-next.d.ts.map +1 -0
- package/dist/lib/signal/graph/signal-next.js +44 -0
- package/dist/lib/signal/graph/signal-next.mjs +1227 -0
- package/dist/lib/signal/graph/ssr-hooks.cjs +89 -0
- package/dist/lib/signal/graph/ssr-hooks.d.ts +51 -0
- package/dist/lib/signal/graph/ssr-hooks.d.ts.map +1 -0
- package/dist/lib/signal/graph/ssr-hooks.js +80 -0
- package/dist/lib/signal/graph/ssr-hooks.mjs +68 -0
- package/dist/lib/signal/graph/state.cjs +72 -0
- package/dist/lib/signal/graph/state.d.ts +76 -0
- package/dist/lib/signal/graph/state.d.ts.map +1 -0
- package/dist/lib/signal/graph/state.js +99 -0
- package/dist/lib/signal/graph/state.mjs +49 -0
- package/dist/lib/signal/graph/suspense.cjs +313 -0
- package/dist/lib/signal/graph/suspense.d.ts +13 -0
- package/dist/lib/signal/graph/suspense.d.ts.map +1 -0
- package/dist/lib/signal/graph/suspense.js +36 -0
- package/dist/lib/signal/graph/suspense.mjs +290 -0
- package/dist/lib/signal/index-legacy.cjs +2582 -0
- package/dist/lib/signal/index-legacy.d.ts +12 -0
- package/dist/lib/signal/index-legacy.d.ts.map +1 -0
- package/dist/lib/signal/index-legacy.js +11 -0
- package/dist/lib/signal/index-legacy.mjs +2560 -0
- package/dist/lib/signal/index.cjs +1350 -0
- package/dist/lib/signal/index.d.ts +19 -0
- package/dist/lib/signal/index.d.ts.map +1 -0
- package/dist/lib/signal/index.js +19 -0
- package/dist/lib/signal/index.mjs +1328 -0
- package/dist/lib/signal/list.cjs +561 -0
- package/dist/lib/signal/list.d.ts +39 -0
- package/dist/lib/signal/list.d.ts.map +1 -0
- package/dist/lib/signal/list.js +172 -0
- package/dist/lib/signal/list.mjs +538 -0
- package/dist/lib/signal/resource-api.cjs +638 -0
- package/dist/lib/signal/resource-api.d.ts +19 -0
- package/dist/lib/signal/resource-api.d.ts.map +1 -0
- package/dist/lib/signal/resource-api.js +27 -0
- package/dist/lib/signal/resource-api.mjs +615 -0
- package/dist/lib/signal/signal.cjs +2035 -0
- package/dist/lib/signal/signal.d.ts +303 -0
- package/dist/lib/signal/signal.d.ts.map +1 -0
- package/dist/lib/signal/signal.js +1233 -0
- package/dist/lib/signal/signal.mjs +2012 -0
- package/dist/lib/signal/types.cjs +38 -0
- package/dist/lib/signal/types.d.ts +133 -0
- package/dist/lib/signal/types.d.ts.map +1 -0
- package/dist/lib/signal/types.js +38 -0
- package/dist/lib/signal/types.mjs +17 -0
- package/dist/lib/signal/utilities.cjs +1024 -0
- package/dist/lib/signal/utilities.d.ts +247 -0
- package/dist/lib/signal/utilities.d.ts.map +1 -0
- package/dist/lib/signal/utilities.js +346 -0
- package/dist/lib/signal/utilities.mjs +1002 -0
- package/dist/lib/store/api.cjs +662 -0
- package/dist/lib/store/api.d.ts +40 -0
- package/dist/lib/store/api.d.ts.map +1 -0
- package/dist/lib/store/api.js +63 -0
- package/dist/lib/store/api.mjs +646 -0
- package/dist/lib/store/index.cjs +741 -0
- package/dist/lib/store/index.d.ts +16 -0
- package/dist/lib/store/index.d.ts.map +1 -0
- package/dist/lib/store/index.js +13 -0
- package/dist/lib/store/index.mjs +726 -0
- package/dist/lib/store/setter.types.cjs +18 -0
- package/dist/lib/store/setter.types.d.ts +131 -0
- package/dist/lib/store/setter.types.d.ts.map +1 -0
- package/dist/lib/store/setter.types.js +65 -0
- package/dist/lib/store/setter.types.mjs +0 -0
- package/dist/lib/store/store.cjs +708 -0
- package/dist/lib/store/store.d.ts +142 -0
- package/dist/lib/store/store.d.ts.map +1 -0
- package/dist/lib/store/store.js +812 -0
- package/dist/lib/store/store.mjs +694 -0
- package/dist/lib/store/types.cjs +18 -0
- package/dist/lib/store/types.d.ts +57 -0
- package/dist/lib/store/types.d.ts.map +1 -0
- package/dist/lib/store/types.js +1 -0
- package/dist/lib/store/types.mjs +0 -0
- package/dist/lib/store/utils.cjs +43 -0
- package/dist/lib/store/utils.d.ts +13 -0
- package/dist/lib/store/utils.d.ts.map +1 -0
- package/dist/lib/store/utils.js +29 -0
- package/dist/lib/store/utils.mjs +22 -0
- package/dist/lib/subject.cjs +450 -0
- package/dist/lib/subject.d.ts +14 -0
- package/dist/lib/subject.d.ts.map +1 -0
- package/dist/lib/subject.js +81 -0
- package/dist/lib/subject.mjs +427 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/version.generated.cjs +27 -0
- package/dist/version.generated.d.ts +3 -0
- package/dist/version.generated.d.ts.map +1 -0
- package/dist/version.generated.js +3 -0
- package/dist/version.generated.mjs +7 -0
- package/package.json +115 -0
|
@@ -0,0 +1,2560 @@
|
|
|
1
|
+
/*! @fluixi/reactive v1.0.0-alpha.100 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
|
|
2
|
+
|
|
3
|
+
// src/lib/predicates.ts
|
|
4
|
+
function isFunction(value) {
|
|
5
|
+
return typeof value === "function" && !/^class\s/.test(Function.prototype.toString.call(value));
|
|
6
|
+
}
|
|
7
|
+
function isObject(value) {
|
|
8
|
+
if (value == null) return false;
|
|
9
|
+
if (Array.isArray(value)) return false;
|
|
10
|
+
if (typeof value === "function") return false;
|
|
11
|
+
if (value instanceof Date) return false;
|
|
12
|
+
if (value instanceof RegExp) return false;
|
|
13
|
+
if (value instanceof Map) return false;
|
|
14
|
+
if (value instanceof Set) return false;
|
|
15
|
+
if (value instanceof Error) return false;
|
|
16
|
+
return typeof value === "object";
|
|
17
|
+
}
|
|
18
|
+
function isPromise(value) {
|
|
19
|
+
return value instanceof Promise || !!value && (typeof value === "object" || typeof value === "function") && "then" in value;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// src/lib/observable/subscription.ts
|
|
23
|
+
var Subscription = class _Subscription {
|
|
24
|
+
/**
|
|
25
|
+
* Creates a new Subscription.
|
|
26
|
+
*/
|
|
27
|
+
constructor(unsubscribe) {
|
|
28
|
+
/** @private */
|
|
29
|
+
this._closed = false;
|
|
30
|
+
/** @private */
|
|
31
|
+
this._parentOrParents = null;
|
|
32
|
+
/** @private */
|
|
33
|
+
this._subscriptions = null;
|
|
34
|
+
if (unsubscribe) {
|
|
35
|
+
this._subscriptions = [unsubscribe];
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Whether the subscription is closed.
|
|
40
|
+
*/
|
|
41
|
+
get closed() {
|
|
42
|
+
return this._closed;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Disposes the resources held by the subscription.
|
|
46
|
+
* May be called multiple times (idempotent).
|
|
47
|
+
*/
|
|
48
|
+
unsubscribe() {
|
|
49
|
+
if (this._closed) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this._closed = true;
|
|
53
|
+
const { _parentOrParents, _subscriptions } = this;
|
|
54
|
+
if (_parentOrParents instanceof _Subscription) {
|
|
55
|
+
_parentOrParents.remove(this);
|
|
56
|
+
} else if (_parentOrParents !== null) {
|
|
57
|
+
for (const parent of _parentOrParents) {
|
|
58
|
+
parent.remove(this);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (_subscriptions) {
|
|
62
|
+
for (const sub of _subscriptions) {
|
|
63
|
+
if (isFunction(sub) && !(sub instanceof _Subscription)) {
|
|
64
|
+
try {
|
|
65
|
+
sub();
|
|
66
|
+
} catch (error) {
|
|
67
|
+
console.error("Error in unsubscribe function:", error);
|
|
68
|
+
}
|
|
69
|
+
} else if (isObject(sub) && typeof sub.unsubscribe === "function") {
|
|
70
|
+
try {
|
|
71
|
+
sub.unsubscribe();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error("Error unsubscribing child:", error);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
this._subscriptions = null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Adds a child subscription or cleanup function to this subscription.
|
|
82
|
+
* When this subscription is unsubscribed, all added subscriptions/functions will be unsubscribed/called.
|
|
83
|
+
*
|
|
84
|
+
* @throws {TypeError} If the argument is not a subscription-like object or function
|
|
85
|
+
*/
|
|
86
|
+
add(subscription) {
|
|
87
|
+
if (!subscription || subscription === this) {
|
|
88
|
+
return this;
|
|
89
|
+
}
|
|
90
|
+
if (subscription.closed) {
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
let { _closed, _subscriptions } = this;
|
|
94
|
+
if (_closed) {
|
|
95
|
+
if (isFunction(subscription)) {
|
|
96
|
+
try {
|
|
97
|
+
subscription();
|
|
98
|
+
} catch (error) {
|
|
99
|
+
console.error("Error in unsubscribe function:", error);
|
|
100
|
+
}
|
|
101
|
+
} else if (subscription.unsubscribe) {
|
|
102
|
+
try {
|
|
103
|
+
subscription.unsubscribe();
|
|
104
|
+
} catch (error) {
|
|
105
|
+
console.error("Error unsubscribing:", error);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return this;
|
|
109
|
+
}
|
|
110
|
+
if (!_subscriptions) {
|
|
111
|
+
this._subscriptions = [];
|
|
112
|
+
}
|
|
113
|
+
this._subscriptions.push(subscription);
|
|
114
|
+
if (subscription instanceof _Subscription) {
|
|
115
|
+
subscription._addParent(this);
|
|
116
|
+
}
|
|
117
|
+
return this;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Removes a child subscription from this subscription.
|
|
121
|
+
*/
|
|
122
|
+
remove(subscription) {
|
|
123
|
+
const { _subscriptions } = this;
|
|
124
|
+
if (!_subscriptions) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
const index = _subscriptions.indexOf(subscription);
|
|
128
|
+
if (index !== -1) {
|
|
129
|
+
_subscriptions.splice(index, 1);
|
|
130
|
+
subscription._removeParent(this);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/** @private */
|
|
134
|
+
_addParent(parent) {
|
|
135
|
+
const { _parentOrParents } = this;
|
|
136
|
+
if (!_parentOrParents) {
|
|
137
|
+
this._parentOrParents = parent;
|
|
138
|
+
} else if (Array.isArray(_parentOrParents)) {
|
|
139
|
+
_parentOrParents.push(parent);
|
|
140
|
+
} else {
|
|
141
|
+
this._parentOrParents = [_parentOrParents, parent];
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** @private */
|
|
145
|
+
_removeParent(parent) {
|
|
146
|
+
const { _parentOrParents } = this;
|
|
147
|
+
if (_parentOrParents === parent) {
|
|
148
|
+
this._parentOrParents = null;
|
|
149
|
+
} else if (Array.isArray(_parentOrParents)) {
|
|
150
|
+
const index = _parentOrParents.indexOf(parent);
|
|
151
|
+
if (index !== -1) {
|
|
152
|
+
_parentOrParents.splice(index, 1);
|
|
153
|
+
if (_parentOrParents.length === 1) {
|
|
154
|
+
this._parentOrParents = _parentOrParents[0];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
// src/lib/observable/observable.ts
|
|
162
|
+
var Subscriber = class extends Subscription {
|
|
163
|
+
/**
|
|
164
|
+
* Creates a new Subscriber.
|
|
165
|
+
*/
|
|
166
|
+
constructor(destinationOrNext, error, complete) {
|
|
167
|
+
super();
|
|
168
|
+
/** @private */
|
|
169
|
+
this.isStopped = false;
|
|
170
|
+
let observer;
|
|
171
|
+
if (!destinationOrNext) {
|
|
172
|
+
observer = {};
|
|
173
|
+
} else if (typeof destinationOrNext === "object") {
|
|
174
|
+
observer = destinationOrNext;
|
|
175
|
+
} else {
|
|
176
|
+
observer = {
|
|
177
|
+
next: destinationOrNext,
|
|
178
|
+
error,
|
|
179
|
+
complete
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
this.destination = observer;
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Sends the next value to the observer.
|
|
186
|
+
*/
|
|
187
|
+
next(value) {
|
|
188
|
+
if (!this.isStopped && this.destination.next) {
|
|
189
|
+
try {
|
|
190
|
+
this.destination.next(value);
|
|
191
|
+
} catch (error) {
|
|
192
|
+
this.error(error);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Sends an error notification to the observer.
|
|
198
|
+
*/
|
|
199
|
+
error(err) {
|
|
200
|
+
if (!this.isStopped) {
|
|
201
|
+
this.isStopped = true;
|
|
202
|
+
if (this.destination.error) {
|
|
203
|
+
try {
|
|
204
|
+
this.destination.error(err);
|
|
205
|
+
} catch (error) {
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
} else {
|
|
209
|
+
throw err;
|
|
210
|
+
}
|
|
211
|
+
this.unsubscribe();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Sends a complete notification to the observer.
|
|
216
|
+
*/
|
|
217
|
+
complete() {
|
|
218
|
+
if (!this.isStopped) {
|
|
219
|
+
this.isStopped = true;
|
|
220
|
+
if (this.destination.complete) {
|
|
221
|
+
try {
|
|
222
|
+
this.destination.complete();
|
|
223
|
+
} catch (error) {
|
|
224
|
+
this.error(error);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
this.unsubscribe();
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Unsubscribes the subscriber.
|
|
233
|
+
*/
|
|
234
|
+
unsubscribe() {
|
|
235
|
+
if (this.closed) {
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
this.isStopped = true;
|
|
239
|
+
super.unsubscribe();
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
var SafeSubscriber = class extends Subscriber {
|
|
243
|
+
constructor(observerOrNext, error, complete, parentSubscriber) {
|
|
244
|
+
super(observerOrNext, error, complete);
|
|
245
|
+
/** @private */
|
|
246
|
+
this._isUnsubscribing = false;
|
|
247
|
+
/** @private */
|
|
248
|
+
this._parentSubscriber = null;
|
|
249
|
+
this._parentSubscriber = parentSubscriber || null;
|
|
250
|
+
}
|
|
251
|
+
next(value) {
|
|
252
|
+
if (!this.isStopped && !this._isUnsubscribing) {
|
|
253
|
+
try {
|
|
254
|
+
super.next(value);
|
|
255
|
+
} catch (error) {
|
|
256
|
+
this.error(error);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
error(err) {
|
|
261
|
+
if (!this.isStopped && !this._isUnsubscribing) {
|
|
262
|
+
this._isUnsubscribing = true;
|
|
263
|
+
try {
|
|
264
|
+
super.error(err);
|
|
265
|
+
} finally {
|
|
266
|
+
this._isUnsubscribing = false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
complete() {
|
|
271
|
+
if (!this.isStopped && !this._isUnsubscribing) {
|
|
272
|
+
this._isUnsubscribing = true;
|
|
273
|
+
try {
|
|
274
|
+
super.complete();
|
|
275
|
+
} finally {
|
|
276
|
+
this._isUnsubscribing = false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
unsubscribe() {
|
|
281
|
+
if (this.closed) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
this._isUnsubscribing = true;
|
|
285
|
+
super.unsubscribe();
|
|
286
|
+
this._isUnsubscribing = false;
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
var Observable = class extends Subscription {
|
|
290
|
+
/**
|
|
291
|
+
* Creates a new Observable.
|
|
292
|
+
*/
|
|
293
|
+
constructor(subscribe) {
|
|
294
|
+
super();
|
|
295
|
+
if (subscribe) {
|
|
296
|
+
this._subscribe = subscribe;
|
|
297
|
+
} else {
|
|
298
|
+
throw new TypeError("Observable constructor requires a subscribe function");
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
subscribe(observerOrNext, error, complete) {
|
|
302
|
+
let subscriber;
|
|
303
|
+
if (observerOrNext instanceof Subscriber) {
|
|
304
|
+
subscriber = observerOrNext;
|
|
305
|
+
} else {
|
|
306
|
+
subscriber = new SafeSubscriber(observerOrNext, error, complete);
|
|
307
|
+
}
|
|
308
|
+
const { _subscribe } = this;
|
|
309
|
+
try {
|
|
310
|
+
const result = _subscribe.call(this, subscriber);
|
|
311
|
+
if (result) {
|
|
312
|
+
if (typeof result === "function") {
|
|
313
|
+
subscriber.add(result);
|
|
314
|
+
} else if (typeof result.unsubscribe === "function") {
|
|
315
|
+
subscriber.add(result);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
} catch (err) {
|
|
319
|
+
subscriber.error(err);
|
|
320
|
+
}
|
|
321
|
+
return subscriber;
|
|
322
|
+
}
|
|
323
|
+
pipe(...operations) {
|
|
324
|
+
if (operations.length === 0) {
|
|
325
|
+
return this;
|
|
326
|
+
}
|
|
327
|
+
return operations.reduce(
|
|
328
|
+
(prev, fn) => fn(prev),
|
|
329
|
+
this
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Converts the Observable to a Promise.
|
|
334
|
+
* The Promise resolves with the last emitted value when the Observable completes,
|
|
335
|
+
* or rejects if the Observable errors.
|
|
336
|
+
*
|
|
337
|
+
* @example
|
|
338
|
+
* // Convert Observable to Promise
|
|
339
|
+
* const value = await of(1, 2, 3).toPromise();
|
|
340
|
+
* console.log(value); // 3
|
|
341
|
+
*
|
|
342
|
+
* @example
|
|
343
|
+
* // Handle empty Observable
|
|
344
|
+
* const value = await EMPTY.toPromise();
|
|
345
|
+
* console.log(value); // undefined
|
|
346
|
+
*/
|
|
347
|
+
toPromise() {
|
|
348
|
+
return new Promise((resolve, reject) => {
|
|
349
|
+
let lastValue;
|
|
350
|
+
this.subscribe({
|
|
351
|
+
next: (value) => lastValue = value,
|
|
352
|
+
error: reject,
|
|
353
|
+
complete: () => resolve(lastValue)
|
|
354
|
+
});
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
};
|
|
358
|
+
|
|
359
|
+
// src/lib/signal/graph/detect.ts
|
|
360
|
+
var __BROWSER_PROD__ = typeof window === "undefined" ? false : window.__FLUIXI_PROD__ === true;
|
|
361
|
+
var __DEV__ = typeof process === "undefined" ? __BROWSER_PROD__ : false;
|
|
362
|
+
var $SIGNAL = /* @__PURE__ */ Symbol.for("signal");
|
|
363
|
+
var $MEMO = /* @__PURE__ */ Symbol.for("memo");
|
|
364
|
+
var $RESOURCE = /* @__PURE__ */ Symbol.for("resource");
|
|
365
|
+
function isSignal(value) {
|
|
366
|
+
return typeof value === "function" && value[$SIGNAL] === true;
|
|
367
|
+
}
|
|
368
|
+
function isMemo(value) {
|
|
369
|
+
return typeof value === "function" && value[$MEMO] === true;
|
|
370
|
+
}
|
|
371
|
+
function isResource(value) {
|
|
372
|
+
return typeof value === "function" && value[$RESOURCE] === true;
|
|
373
|
+
}
|
|
374
|
+
function isComponent(value) {
|
|
375
|
+
return typeof value === "function" && value[/* @__PURE__ */ Symbol.for("fluixi-component")] === true;
|
|
376
|
+
}
|
|
377
|
+
function isSuspense(value) {
|
|
378
|
+
return typeof value === "function" && value[/* @__PURE__ */ Symbol.for("fluixi-suspense")] === true;
|
|
379
|
+
}
|
|
380
|
+
function isProvider(value) {
|
|
381
|
+
return typeof value === "function" && value[/* @__PURE__ */ Symbol.for("fluixi-provider")] === true;
|
|
382
|
+
}
|
|
383
|
+
function makeArrayFlat(values) {
|
|
384
|
+
if (!Array.isArray(values)) return values;
|
|
385
|
+
if (values.length === 2 && values[1] === " ") {
|
|
386
|
+
if (Array.isArray(values[0])) return makeArrayFlat(values[0]);
|
|
387
|
+
if (typeof values[0] === "function") return values[0];
|
|
388
|
+
return values[0];
|
|
389
|
+
}
|
|
390
|
+
if (values.length === 1 && typeof values[0] === "function") return values[0];
|
|
391
|
+
return values;
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// src/version.generated.ts
|
|
395
|
+
var VERSION = "1.0.0-alpha.100";
|
|
396
|
+
|
|
397
|
+
// src/lib/signal/graph/state.ts
|
|
398
|
+
var MAJOR = VERSION.split(".")[0];
|
|
399
|
+
var KEY = `__fluixi_signal_state_v${MAJOR}__`;
|
|
400
|
+
var VERSIONS_KEY = `__fluixi_signal_builds_v${MAJOR}__`;
|
|
401
|
+
var defaultSchedule = (run) => {
|
|
402
|
+
if (typeof queueMicrotask === "function") queueMicrotask(run);
|
|
403
|
+
else void Promise.resolve().then(run);
|
|
404
|
+
};
|
|
405
|
+
function defaults() {
|
|
406
|
+
return {
|
|
407
|
+
consumer: null,
|
|
408
|
+
untracked: false,
|
|
409
|
+
owner: null,
|
|
410
|
+
queue: [],
|
|
411
|
+
scheduled: false,
|
|
412
|
+
flushing: false,
|
|
413
|
+
batchDepth: 0,
|
|
414
|
+
hostSchedule: defaultSchedule,
|
|
415
|
+
onSuspend: null,
|
|
416
|
+
onError: null,
|
|
417
|
+
observer: null
|
|
418
|
+
};
|
|
419
|
+
}
|
|
420
|
+
var realm = globalThis;
|
|
421
|
+
function backfillState(existing) {
|
|
422
|
+
const fresh = defaults();
|
|
423
|
+
const target = existing;
|
|
424
|
+
for (const field of Object.keys(fresh)) {
|
|
425
|
+
if (!(field in existing)) target[field] = fresh[field];
|
|
426
|
+
}
|
|
427
|
+
return existing;
|
|
428
|
+
}
|
|
429
|
+
function claim() {
|
|
430
|
+
const existing = realm[KEY];
|
|
431
|
+
return existing ? backfillState(existing) : realm[KEY] = defaults();
|
|
432
|
+
}
|
|
433
|
+
var G = claim();
|
|
434
|
+
(realm[VERSIONS_KEY] ??= []).push(VERSION);
|
|
435
|
+
|
|
436
|
+
// src/lib/signal/graph/observe.ts
|
|
437
|
+
function observeReactiveNodes(next) {
|
|
438
|
+
G.observer = next;
|
|
439
|
+
return () => {
|
|
440
|
+
if (G.observer === next) G.observer = null;
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
var running = [];
|
|
444
|
+
var origin;
|
|
445
|
+
var currentScope;
|
|
446
|
+
function reportReactiveNode(report) {
|
|
447
|
+
const observer = G.observer;
|
|
448
|
+
if (observer) {
|
|
449
|
+
observer.created(
|
|
450
|
+
report.parents === void 0 ? { ...report, parents: running, origin: report.origin ?? origin, scope: report.scope ?? currentScope } : { ...report, scope: report.scope ?? currentScope }
|
|
451
|
+
);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
function enterReactiveRun(node) {
|
|
455
|
+
if (!G.observer) return false;
|
|
456
|
+
running.push(node);
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
function exitReactiveRun() {
|
|
460
|
+
running.pop();
|
|
461
|
+
}
|
|
462
|
+
function reportReactiveRun(node) {
|
|
463
|
+
G.observer?.ran?.(node);
|
|
464
|
+
}
|
|
465
|
+
function reportReactiveWrite(node, by) {
|
|
466
|
+
G.observer?.wrote?.(node, by);
|
|
467
|
+
}
|
|
468
|
+
function reportReactiveDispose(node) {
|
|
469
|
+
G.observer?.disposed?.(node);
|
|
470
|
+
}
|
|
471
|
+
var HOOK = "__FLUIXI_DEVTOOLS_HOOK__";
|
|
472
|
+
var hook = globalThis[HOOK];
|
|
473
|
+
if (typeof hook?.inject === "function") {
|
|
474
|
+
try {
|
|
475
|
+
hook.inject({ observeReactiveNodes, version: VERSION });
|
|
476
|
+
} catch {
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
function isObserved() {
|
|
480
|
+
return G.observer != null;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
// src/lib/signal/graph/core.ts
|
|
484
|
+
var CLEAN = 0;
|
|
485
|
+
var CHECK = 1;
|
|
486
|
+
var DIRTY = 2;
|
|
487
|
+
var Source = class {
|
|
488
|
+
constructor() {
|
|
489
|
+
/** Computeds, and watched leaves, that read this node. */
|
|
490
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
491
|
+
this.observers = null;
|
|
492
|
+
/** Watchers eagerly observing this node, which is how `runtime.ts` schedules effects. */
|
|
493
|
+
this.watchers = null;
|
|
494
|
+
/** Bumped whenever this node's value actually changes (equality-gated). */
|
|
495
|
+
this.version = 0;
|
|
496
|
+
}
|
|
497
|
+
/** Settle this node so a reader sees a current value/version. Overridden by Computed. */
|
|
498
|
+
updateIfNecessary() {
|
|
499
|
+
}
|
|
500
|
+
/** Link the current consumer (if any) as an observer of this node. */
|
|
501
|
+
track() {
|
|
502
|
+
if (G.untracked) return;
|
|
503
|
+
const consumer = G.consumer;
|
|
504
|
+
if (!consumer) return;
|
|
505
|
+
(this.observers ??= /* @__PURE__ */ new Set()).add(consumer);
|
|
506
|
+
(consumer.sources ??= /* @__PURE__ */ new Set()).add(this);
|
|
507
|
+
}
|
|
508
|
+
};
|
|
509
|
+
var State = class extends Source {
|
|
510
|
+
constructor(value, options) {
|
|
511
|
+
super();
|
|
512
|
+
this._value = value;
|
|
513
|
+
this._equals = options?.equals === false ? () => false : options?.equals ?? Object.is;
|
|
514
|
+
}
|
|
515
|
+
get() {
|
|
516
|
+
this.track();
|
|
517
|
+
return this._value;
|
|
518
|
+
}
|
|
519
|
+
set(next) {
|
|
520
|
+
if (this._equals(this._value, next)) return;
|
|
521
|
+
this._value = next;
|
|
522
|
+
this.version++;
|
|
523
|
+
reportReactiveWrite(this, G.consumer);
|
|
524
|
+
if (this.observers) for (const o of [...this.observers]) o.markDirty(DIRTY);
|
|
525
|
+
notifyWatchers(this);
|
|
526
|
+
}
|
|
527
|
+
/** Read without subscribing (peek). */
|
|
528
|
+
peek() {
|
|
529
|
+
return this._value;
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
var Computed = class extends Source {
|
|
533
|
+
constructor(fn, options) {
|
|
534
|
+
super();
|
|
535
|
+
this._threw = false;
|
|
536
|
+
this._initialized = false;
|
|
537
|
+
this.state = DIRTY;
|
|
538
|
+
/** Nodes this computation read on its last run. Rebuilt on every run. */
|
|
539
|
+
this.sources = null;
|
|
540
|
+
this._fn = fn;
|
|
541
|
+
this._equals = options?.equals === false ? () => false : options?.equals ?? Object.is;
|
|
542
|
+
}
|
|
543
|
+
get() {
|
|
544
|
+
if (G.consumer === this) {
|
|
545
|
+
throw new Error("Signal.Computed cannot read itself");
|
|
546
|
+
}
|
|
547
|
+
this.track();
|
|
548
|
+
this.updateIfNecessary();
|
|
549
|
+
if (this._threw) throw this._error;
|
|
550
|
+
return this._value;
|
|
551
|
+
}
|
|
552
|
+
/** Settle, if CHECK, verify sources; if DIRTY (or never run), recompute. */
|
|
553
|
+
updateIfNecessary() {
|
|
554
|
+
if (this.state === CHECK) {
|
|
555
|
+
if (this.sources) {
|
|
556
|
+
for (const s of this.sources) {
|
|
557
|
+
s.updateIfNecessary();
|
|
558
|
+
if (this.state === DIRTY) break;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
if (this.state === DIRTY || !this._initialized) this.recompute();
|
|
563
|
+
this.state = CLEAN;
|
|
564
|
+
}
|
|
565
|
+
recompute() {
|
|
566
|
+
if (this.sources) {
|
|
567
|
+
for (const s of this.sources) s.observers?.delete(this);
|
|
568
|
+
this.sources.clear();
|
|
569
|
+
}
|
|
570
|
+
const prevConsumer = G.consumer;
|
|
571
|
+
const prevUntracked = G.untracked;
|
|
572
|
+
const watched = enterReactiveRun(this);
|
|
573
|
+
G.consumer = this;
|
|
574
|
+
G.untracked = false;
|
|
575
|
+
let next;
|
|
576
|
+
let threw = false;
|
|
577
|
+
let err;
|
|
578
|
+
try {
|
|
579
|
+
next = this._fn();
|
|
580
|
+
} catch (e) {
|
|
581
|
+
threw = true;
|
|
582
|
+
err = e;
|
|
583
|
+
next = this._value;
|
|
584
|
+
} finally {
|
|
585
|
+
G.consumer = prevConsumer;
|
|
586
|
+
G.untracked = prevUntracked;
|
|
587
|
+
if (watched) exitReactiveRun();
|
|
588
|
+
}
|
|
589
|
+
const changed = !this._initialized || this._threw !== threw || (threw ? err !== this._error : !this._equals(this._value, next));
|
|
590
|
+
this._initialized = true;
|
|
591
|
+
this._threw = threw;
|
|
592
|
+
this._error = err;
|
|
593
|
+
this._value = next;
|
|
594
|
+
reportReactiveRun(this);
|
|
595
|
+
if (changed) {
|
|
596
|
+
this.version++;
|
|
597
|
+
if (this.observers) for (const o of [...this.observers]) o.markDirty(DIRTY);
|
|
598
|
+
notifyWatchers(this);
|
|
599
|
+
}
|
|
600
|
+
}
|
|
601
|
+
/**
|
|
602
|
+
* Push a maybe-dirty mark. A direct observer of a changed node gets DIRTY; its
|
|
603
|
+
* own observers get CHECK (recurse), stopping where already marked, so the
|
|
604
|
+
* push is O(newly-dirtied) and never recomputes.
|
|
605
|
+
*/
|
|
606
|
+
markDirty(level) {
|
|
607
|
+
if (this.state >= level) return;
|
|
608
|
+
const wasClean = this.state === CLEAN;
|
|
609
|
+
this.state = level;
|
|
610
|
+
if (wasClean) {
|
|
611
|
+
if (this.observers) for (const o of [...this.observers]) o.markDirty(CHECK);
|
|
612
|
+
notifyWatchers(this);
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
peek() {
|
|
616
|
+
this.updateIfNecessary();
|
|
617
|
+
if (this._threw) throw this._error;
|
|
618
|
+
return this._value;
|
|
619
|
+
}
|
|
620
|
+
};
|
|
621
|
+
function notifyWatchers(node) {
|
|
622
|
+
if (!node.watchers) return;
|
|
623
|
+
for (const w of [...node.watchers]) w._notify(node);
|
|
624
|
+
}
|
|
625
|
+
var Watcher = class {
|
|
626
|
+
constructor(notify) {
|
|
627
|
+
this._watched = /* @__PURE__ */ new Set();
|
|
628
|
+
this._pending = /* @__PURE__ */ new Set();
|
|
629
|
+
this._notifyFn = notify;
|
|
630
|
+
}
|
|
631
|
+
watch(...nodes) {
|
|
632
|
+
for (const n of nodes) {
|
|
633
|
+
this._watched.add(n);
|
|
634
|
+
(n.watchers ??= /* @__PURE__ */ new Set()).add(this);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
unwatch(...nodes) {
|
|
638
|
+
for (const n of nodes) {
|
|
639
|
+
this._watched.delete(n);
|
|
640
|
+
n.watchers?.delete(this);
|
|
641
|
+
this._pending.delete(n);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
/** Watched nodes that may have changed since the last getPending(). */
|
|
645
|
+
getPending() {
|
|
646
|
+
const out = [...this._pending];
|
|
647
|
+
this._pending.clear();
|
|
648
|
+
return out;
|
|
649
|
+
}
|
|
650
|
+
/** @internal, a watched node became non-clean. Edge-triggered: notify once. */
|
|
651
|
+
_notify(node) {
|
|
652
|
+
if (!this._watched.has(node) || this._pending.has(node)) return;
|
|
653
|
+
const wasEmpty = this._pending.size === 0;
|
|
654
|
+
this._pending.add(node);
|
|
655
|
+
if (wasEmpty) this._notifyFn();
|
|
656
|
+
}
|
|
657
|
+
};
|
|
658
|
+
function untrack(fn) {
|
|
659
|
+
if (G.untracked) return fn();
|
|
660
|
+
G.untracked = true;
|
|
661
|
+
try {
|
|
662
|
+
return fn();
|
|
663
|
+
} finally {
|
|
664
|
+
G.untracked = false;
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
// src/lib/signal/graph/runtime.ts
|
|
669
|
+
function makeOwner(parent) {
|
|
670
|
+
return { cleanups: null, owned: null, parent, contexts: null };
|
|
671
|
+
}
|
|
672
|
+
function reportSuspend(promise) {
|
|
673
|
+
if (G.onSuspend) {
|
|
674
|
+
G.onSuspend(promise, G.owner);
|
|
675
|
+
return true;
|
|
676
|
+
}
|
|
677
|
+
return false;
|
|
678
|
+
}
|
|
679
|
+
function getOwner() {
|
|
680
|
+
return G.owner;
|
|
681
|
+
}
|
|
682
|
+
function runWithOwner(owner, fn) {
|
|
683
|
+
const prev = G.owner;
|
|
684
|
+
G.owner = owner;
|
|
685
|
+
try {
|
|
686
|
+
return fn();
|
|
687
|
+
} finally {
|
|
688
|
+
G.owner = prev;
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
function onCleanup(fn) {
|
|
692
|
+
if (!G.owner) return;
|
|
693
|
+
if (G.owner.disposed) {
|
|
694
|
+
fn();
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
(G.owner.cleanups ??= []).push(fn);
|
|
698
|
+
}
|
|
699
|
+
function disposeOwner(owner, final = true) {
|
|
700
|
+
if (owner.disposed) return;
|
|
701
|
+
if (owner.owned) {
|
|
702
|
+
for (let i = owner.owned.length - 1; i >= 0; i--) disposeOwner(owner.owned[i]);
|
|
703
|
+
owner.owned = null;
|
|
704
|
+
}
|
|
705
|
+
if (owner.cleanups) {
|
|
706
|
+
for (let i = owner.cleanups.length - 1; i >= 0; i--) owner.cleanups[i]();
|
|
707
|
+
owner.cleanups = null;
|
|
708
|
+
}
|
|
709
|
+
if (final) owner.disposed = true;
|
|
710
|
+
}
|
|
711
|
+
function createRoot(fn) {
|
|
712
|
+
const owner = makeOwner(G.owner);
|
|
713
|
+
if (G.owner) (G.owner.owned ??= []).push(owner);
|
|
714
|
+
const prev = G.owner;
|
|
715
|
+
G.owner = owner;
|
|
716
|
+
try {
|
|
717
|
+
return untrack(() => fn(() => disposeOwner(owner)));
|
|
718
|
+
} finally {
|
|
719
|
+
G.owner = prev;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
function setScheduler(fn) {
|
|
723
|
+
G.hostSchedule = fn ?? ((run) => void Promise.resolve().then(run));
|
|
724
|
+
}
|
|
725
|
+
function enqueue(e) {
|
|
726
|
+
if (e.queued) return;
|
|
727
|
+
e.queued = true;
|
|
728
|
+
G.queue.push(e);
|
|
729
|
+
if (!G.scheduled && G.batchDepth === 0) {
|
|
730
|
+
G.scheduled = true;
|
|
731
|
+
G.hostSchedule(flushSync);
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
function flushSync() {
|
|
735
|
+
G.scheduled = false;
|
|
736
|
+
if (G.flushing) return;
|
|
737
|
+
G.flushing = true;
|
|
738
|
+
let guard = 0;
|
|
739
|
+
let failed = false;
|
|
740
|
+
let first;
|
|
741
|
+
try {
|
|
742
|
+
while (G.queue.length) {
|
|
743
|
+
if (++guard > 1e5) throw new Error("[fluixi] effect flush did not settle (cycle?)");
|
|
744
|
+
const batchOf = G.queue;
|
|
745
|
+
G.queue = [];
|
|
746
|
+
for (const e of batchOf) {
|
|
747
|
+
e.queued = false;
|
|
748
|
+
if (e.disposed) continue;
|
|
749
|
+
try {
|
|
750
|
+
e.run();
|
|
751
|
+
} catch (error) {
|
|
752
|
+
if (!failed) {
|
|
753
|
+
failed = true;
|
|
754
|
+
first = error;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
} finally {
|
|
760
|
+
G.flushing = false;
|
|
761
|
+
}
|
|
762
|
+
if (failed) throw first;
|
|
763
|
+
}
|
|
764
|
+
function afterWrite() {
|
|
765
|
+
if (G.batchDepth === 0) flushSync();
|
|
766
|
+
}
|
|
767
|
+
function batch(fn) {
|
|
768
|
+
G.batchDepth++;
|
|
769
|
+
try {
|
|
770
|
+
return fn();
|
|
771
|
+
} finally {
|
|
772
|
+
if (--G.batchDepth === 0) flushSync();
|
|
773
|
+
}
|
|
774
|
+
}
|
|
775
|
+
var EffectNode = class {
|
|
776
|
+
constructor(fn, report = false, name) {
|
|
777
|
+
this.queued = false;
|
|
778
|
+
this.disposed = false;
|
|
779
|
+
this.owner = makeOwner(G.owner);
|
|
780
|
+
if (G.owner) (G.owner.cleanups ??= []).push(() => this.dispose());
|
|
781
|
+
this.computed = new Computed(() => {
|
|
782
|
+
disposeOwner(this.owner, false);
|
|
783
|
+
runWithOwner(this.owner, () => {
|
|
784
|
+
const r = fn();
|
|
785
|
+
if (typeof r === "function") (this.owner.cleanups ??= []).push(r);
|
|
786
|
+
});
|
|
787
|
+
});
|
|
788
|
+
reportReactiveNode({ kind: "effect", node: this.computed, handle: this, internal: !report, ...name ? { name } : {} });
|
|
789
|
+
this.watcher = new Watcher(() => enqueue(this));
|
|
790
|
+
this.run();
|
|
791
|
+
this.watcher.watch(this.computed);
|
|
792
|
+
}
|
|
793
|
+
run() {
|
|
794
|
+
if (this.disposed) return;
|
|
795
|
+
this.watcher.getPending();
|
|
796
|
+
try {
|
|
797
|
+
this.computed.get();
|
|
798
|
+
} catch (e) {
|
|
799
|
+
if (e && typeof e.then === "function" && G.onSuspend) {
|
|
800
|
+
G.onSuspend(e, this.owner);
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
if (G.onError && G.onError(e, this.owner)) return;
|
|
804
|
+
throw e;
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
dispose() {
|
|
808
|
+
if (this.disposed) return;
|
|
809
|
+
this.disposed = true;
|
|
810
|
+
reportReactiveDispose(this.computed);
|
|
811
|
+
this.watcher.unwatch(this.computed);
|
|
812
|
+
disposeOwner(this.owner);
|
|
813
|
+
}
|
|
814
|
+
};
|
|
815
|
+
function effect(fn, report = false, name) {
|
|
816
|
+
const node = new EffectNode(fn, report, name);
|
|
817
|
+
return () => node.dispose();
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
// src/lib/signal/graph/compat.ts
|
|
821
|
+
function isThenable(v) {
|
|
822
|
+
return !!v && typeof v.then === "function";
|
|
823
|
+
}
|
|
824
|
+
setScheduler(() => {
|
|
825
|
+
});
|
|
826
|
+
var $SIGNAL2 = /* @__PURE__ */ Symbol.for("signal");
|
|
827
|
+
var $MEMO2 = /* @__PURE__ */ Symbol.for("memo");
|
|
828
|
+
var $NODE = /* @__PURE__ */ Symbol.for("signal-node");
|
|
829
|
+
function createSignal(value, options) {
|
|
830
|
+
const state = new State(value, { equals: options?.equals });
|
|
831
|
+
const read = (() => state.get());
|
|
832
|
+
const write = ((next) => {
|
|
833
|
+
const v = typeof next === "function" ? next(state.peek()) : next;
|
|
834
|
+
state.set(v);
|
|
835
|
+
afterWrite();
|
|
836
|
+
return v;
|
|
837
|
+
});
|
|
838
|
+
Object.defineProperty(read, $SIGNAL2, { value: true, enumerable: true });
|
|
839
|
+
Object.defineProperty(read, $NODE, {
|
|
840
|
+
value: {
|
|
841
|
+
get value() {
|
|
842
|
+
return state.peek();
|
|
843
|
+
},
|
|
844
|
+
get version() {
|
|
845
|
+
return state.version;
|
|
846
|
+
}
|
|
847
|
+
},
|
|
848
|
+
enumerable: false
|
|
849
|
+
});
|
|
850
|
+
reportReactiveNode({
|
|
851
|
+
kind: "signal",
|
|
852
|
+
node: state,
|
|
853
|
+
handle: read,
|
|
854
|
+
name: options?.name,
|
|
855
|
+
set: write
|
|
856
|
+
});
|
|
857
|
+
if (isObserved()) onCleanup(() => reportReactiveDispose(state));
|
|
858
|
+
return [read, write];
|
|
859
|
+
}
|
|
860
|
+
function createMemo(fn, value, options) {
|
|
861
|
+
let prev = value;
|
|
862
|
+
const owner = getOwner();
|
|
863
|
+
const c = new Computed(
|
|
864
|
+
() => runWithOwner(owner, () => {
|
|
865
|
+
try {
|
|
866
|
+
return prev = fn(prev);
|
|
867
|
+
} catch (e) {
|
|
868
|
+
if (isThenable(e)) {
|
|
869
|
+
reportSuspend(e);
|
|
870
|
+
return prev;
|
|
871
|
+
}
|
|
872
|
+
throw e;
|
|
873
|
+
}
|
|
874
|
+
}),
|
|
875
|
+
{ equals: options?.equals }
|
|
876
|
+
);
|
|
877
|
+
const read = (() => c.get());
|
|
878
|
+
Object.defineProperty(read, $SIGNAL2, { value: true, enumerable: true });
|
|
879
|
+
Object.defineProperty(read, $MEMO2, { value: true, enumerable: true });
|
|
880
|
+
reportReactiveNode({ kind: "memo", node: c, handle: read, name: options?.name });
|
|
881
|
+
if (isObserved()) onCleanup(() => reportReactiveDispose(c));
|
|
882
|
+
return read;
|
|
883
|
+
}
|
|
884
|
+
function createEffect(fn, value, options) {
|
|
885
|
+
let prev = value;
|
|
886
|
+
return effect(() => {
|
|
887
|
+
const r = fn(prev);
|
|
888
|
+
prev = r;
|
|
889
|
+
}, true, options?.name);
|
|
890
|
+
}
|
|
891
|
+
function batch2(fn) {
|
|
892
|
+
return batch(fn);
|
|
893
|
+
}
|
|
894
|
+
function untrack2(fn) {
|
|
895
|
+
return untrack(fn);
|
|
896
|
+
}
|
|
897
|
+
|
|
898
|
+
// src/lib/signal/graph/derived.ts
|
|
899
|
+
function createSelector(source, fn = (k, v) => k === v) {
|
|
900
|
+
const map = /* @__PURE__ */ new Map();
|
|
901
|
+
createEffect(() => {
|
|
902
|
+
const value = source();
|
|
903
|
+
for (const [key, signal] of map) {
|
|
904
|
+
const [get, set] = signal;
|
|
905
|
+
const match = fn(key, value);
|
|
906
|
+
if (get() !== match) set(match);
|
|
907
|
+
}
|
|
908
|
+
});
|
|
909
|
+
return (key) => {
|
|
910
|
+
let signal = map.get(key);
|
|
911
|
+
if (!signal) {
|
|
912
|
+
const [get, set] = createSignal(false);
|
|
913
|
+
signal = [get, set];
|
|
914
|
+
map.set(key, signal);
|
|
915
|
+
const value = source();
|
|
916
|
+
set(fn(key, value));
|
|
917
|
+
}
|
|
918
|
+
return signal[0]();
|
|
919
|
+
};
|
|
920
|
+
}
|
|
921
|
+
function createDeferred(source, options) {
|
|
922
|
+
const [delayed, setDelayed] = createSignal(source(), options);
|
|
923
|
+
createEffect(() => {
|
|
924
|
+
const v = source();
|
|
925
|
+
if (options?.timeoutMs) setTimeout(() => setDelayed(() => v), options.timeoutMs);
|
|
926
|
+
else if (typeof requestIdleCallback === "function")
|
|
927
|
+
requestIdleCallback(() => setDelayed(() => v));
|
|
928
|
+
else Promise.resolve().then(() => setDelayed(() => v));
|
|
929
|
+
});
|
|
930
|
+
return delayed;
|
|
931
|
+
}
|
|
932
|
+
function createDebounce(fn, delay) {
|
|
933
|
+
let timer;
|
|
934
|
+
const debounced = (...args) => {
|
|
935
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
936
|
+
timer = setTimeout(() => {
|
|
937
|
+
timer = void 0;
|
|
938
|
+
fn(...args);
|
|
939
|
+
}, delay);
|
|
940
|
+
};
|
|
941
|
+
onCleanup(() => {
|
|
942
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
943
|
+
});
|
|
944
|
+
return debounced;
|
|
945
|
+
}
|
|
946
|
+
|
|
947
|
+
// src/lib/signal/graph/children.ts
|
|
948
|
+
function resolveChildrenValue(children) {
|
|
949
|
+
if (typeof children === "function" && !children.length) {
|
|
950
|
+
const result = children();
|
|
951
|
+
if (isSignal(result)) return result;
|
|
952
|
+
return resolveChildrenValue(result);
|
|
953
|
+
}
|
|
954
|
+
if (Array.isArray(children)) {
|
|
955
|
+
const results = [];
|
|
956
|
+
for (let i = 0; i < children.length; i++) {
|
|
957
|
+
const result = resolveChildrenValue(children[i]);
|
|
958
|
+
Array.isArray(result) ? results.push.apply(results, result) : results.push(result);
|
|
959
|
+
}
|
|
960
|
+
return results;
|
|
961
|
+
}
|
|
962
|
+
return children;
|
|
963
|
+
}
|
|
964
|
+
function readChildren(fn) {
|
|
965
|
+
const children = createMemo(fn);
|
|
966
|
+
return __DEV__ ? createMemo(() => resolveChildrenValue(children()), void 0, { name: "children" }) : createMemo(() => resolveChildrenValue(children()));
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
// src/lib/signal/graph/ssr-hooks.ts
|
|
970
|
+
var _resourceTracker = null;
|
|
971
|
+
function setResourceTracker(fn) {
|
|
972
|
+
_resourceTracker = fn;
|
|
973
|
+
}
|
|
974
|
+
function trackResourcePromise(p) {
|
|
975
|
+
if (_resourceTracker) _resourceTracker(p);
|
|
976
|
+
}
|
|
977
|
+
var _serverDataGetter = null;
|
|
978
|
+
function setServerDataGetter(fn) {
|
|
979
|
+
_serverDataGetter = fn;
|
|
980
|
+
}
|
|
981
|
+
function getServerData(id) {
|
|
982
|
+
return _serverDataGetter ? _serverDataGetter(id) : void 0;
|
|
983
|
+
}
|
|
984
|
+
var _resourceIdSource = null;
|
|
985
|
+
function setResourceIdSource(fn) {
|
|
986
|
+
_resourceIdSource = fn;
|
|
987
|
+
}
|
|
988
|
+
function nextResourceId() {
|
|
989
|
+
return _resourceIdSource ? _resourceIdSource() : void 0;
|
|
990
|
+
}
|
|
991
|
+
var _resourceDataSink = null;
|
|
992
|
+
function setResourceDataSink(fn) {
|
|
993
|
+
_resourceDataSink = fn;
|
|
994
|
+
}
|
|
995
|
+
function reportResourceData(id, value) {
|
|
996
|
+
if (_resourceDataSink) _resourceDataSink(id, value);
|
|
997
|
+
}
|
|
998
|
+
function createResourceCache() {
|
|
999
|
+
const entries = /* @__PURE__ */ new Map();
|
|
1000
|
+
const inflight = /* @__PURE__ */ new Map();
|
|
1001
|
+
return {
|
|
1002
|
+
get: (key) => entries.get(key),
|
|
1003
|
+
set: (key, entry) => void entries.set(key, entry),
|
|
1004
|
+
delete: (key) => void entries.delete(key),
|
|
1005
|
+
keys: () => entries.keys(),
|
|
1006
|
+
clear: () => {
|
|
1007
|
+
entries.clear();
|
|
1008
|
+
inflight.clear();
|
|
1009
|
+
},
|
|
1010
|
+
inflight
|
|
1011
|
+
};
|
|
1012
|
+
}
|
|
1013
|
+
var _cacheScope = null;
|
|
1014
|
+
var _pageCache;
|
|
1015
|
+
function currentResourceCache() {
|
|
1016
|
+
const scoped = _cacheScope?.();
|
|
1017
|
+
if (scoped) return scoped;
|
|
1018
|
+
if (typeof window === "undefined") return createResourceCache();
|
|
1019
|
+
return _pageCache ??= createResourceCache();
|
|
1020
|
+
}
|
|
1021
|
+
|
|
1022
|
+
// src/lib/signal/signal.ts
|
|
1023
|
+
var $SIGNAL3 = /* @__PURE__ */ Symbol.for("signal");
|
|
1024
|
+
var $MEMO3 = /* @__PURE__ */ Symbol.for("memo");
|
|
1025
|
+
var $RESOURCE2 = /* @__PURE__ */ Symbol.for("resource");
|
|
1026
|
+
var $PROXY = /* @__PURE__ */ Symbol("fluixi-proxy");
|
|
1027
|
+
var $NODE2 = /* @__PURE__ */ Symbol.for("signal-node");
|
|
1028
|
+
var CLEAN2 = 0;
|
|
1029
|
+
var STALE = 1;
|
|
1030
|
+
var DIRTY2 = 2;
|
|
1031
|
+
var RUNNING = 3;
|
|
1032
|
+
var Owner = null;
|
|
1033
|
+
var Listener = null;
|
|
1034
|
+
var Updates = null;
|
|
1035
|
+
var Effects = null;
|
|
1036
|
+
var ExecCount = 0;
|
|
1037
|
+
var _eagerStaleEffects = false;
|
|
1038
|
+
var Pending = false;
|
|
1039
|
+
var BatchDepth = 0;
|
|
1040
|
+
var MAX_ITERATIONS = 1e6;
|
|
1041
|
+
var signalObservers = /* @__PURE__ */ new WeakMap();
|
|
1042
|
+
var Transition = null;
|
|
1043
|
+
var Scheduler = null;
|
|
1044
|
+
var nodeRegistry = /* @__PURE__ */ new Map();
|
|
1045
|
+
var nodeIdCounter = 0;
|
|
1046
|
+
var sharedConfig = {
|
|
1047
|
+
context: null,
|
|
1048
|
+
owner: null,
|
|
1049
|
+
routeData: /* @__PURE__ */ new Map(),
|
|
1050
|
+
matchedRoute: /* @__PURE__ */ new Map()
|
|
1051
|
+
};
|
|
1052
|
+
function setOwner2(owner) {
|
|
1053
|
+
Owner = owner;
|
|
1054
|
+
sharedConfig.owner = owner;
|
|
1055
|
+
sharedConfig.context = owner;
|
|
1056
|
+
}
|
|
1057
|
+
function getSharedConfig() {
|
|
1058
|
+
return sharedConfig;
|
|
1059
|
+
}
|
|
1060
|
+
function createNodeId() {
|
|
1061
|
+
return `node_${++nodeIdCounter}_${Date.now()}`;
|
|
1062
|
+
}
|
|
1063
|
+
function registerNode(node) {
|
|
1064
|
+
if (__DEV__) nodeRegistry.set(node.id, new WeakRef(node));
|
|
1065
|
+
}
|
|
1066
|
+
function createReactiveNode(type, initialValue, options) {
|
|
1067
|
+
const node = {
|
|
1068
|
+
id: createNodeId(),
|
|
1069
|
+
type,
|
|
1070
|
+
value: initialValue,
|
|
1071
|
+
version: 0,
|
|
1072
|
+
equals: options?.equals,
|
|
1073
|
+
name: options?.name,
|
|
1074
|
+
created: Date.now(),
|
|
1075
|
+
updated: Date.now()
|
|
1076
|
+
};
|
|
1077
|
+
registerNode(node);
|
|
1078
|
+
return node;
|
|
1079
|
+
}
|
|
1080
|
+
function defaultEquals(a, b) {
|
|
1081
|
+
return a === b;
|
|
1082
|
+
}
|
|
1083
|
+
function handleError(err) {
|
|
1084
|
+
if (typeof console !== "undefined") console.error("Reactive error:", err);
|
|
1085
|
+
throw err;
|
|
1086
|
+
}
|
|
1087
|
+
var _transPending = null;
|
|
1088
|
+
var _setTransPending = null;
|
|
1089
|
+
function ensureTransPending() {
|
|
1090
|
+
if (!_transPending) {
|
|
1091
|
+
const [get, set] = createSignal2(false);
|
|
1092
|
+
_transPending = get;
|
|
1093
|
+
_setTransPending = set;
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
function scheduleComputation(c) {
|
|
1097
|
+
if (Updates) {
|
|
1098
|
+
if (Updates.indexOf(c) === -1) Updates.push(c);
|
|
1099
|
+
} else if (Transition && Transition.running && !c.pure) {
|
|
1100
|
+
if (Transition.effects.indexOf(c) === -1) Transition.effects.push(c);
|
|
1101
|
+
} else if (!c.pure || c.computed) {
|
|
1102
|
+
updateComputation(c);
|
|
1103
|
+
} else if (c.pure && !c.computed && c.accessor) {
|
|
1104
|
+
const prevListener = Listener;
|
|
1105
|
+
const prevUpdatesM = Updates;
|
|
1106
|
+
Listener = null;
|
|
1107
|
+
Updates = [];
|
|
1108
|
+
c.accessor();
|
|
1109
|
+
Listener = prevListener;
|
|
1110
|
+
const memoDeferred = Updates;
|
|
1111
|
+
Updates = prevUpdatesM;
|
|
1112
|
+
if (memoDeferred.length > 0) {
|
|
1113
|
+
const savedU = Updates;
|
|
1114
|
+
runCascadeAndEffects(memoDeferred);
|
|
1115
|
+
Updates = savedU;
|
|
1116
|
+
}
|
|
1117
|
+
}
|
|
1118
|
+
}
|
|
1119
|
+
function propagate(observerList, propagator) {
|
|
1120
|
+
for (let i = 0; i < observerList.length; i++) propagator(observerList[i]);
|
|
1121
|
+
}
|
|
1122
|
+
function createSignal2(_value, options) {
|
|
1123
|
+
let value = _value;
|
|
1124
|
+
if (typeof value === "object" && value && $PROXY in value)
|
|
1125
|
+
delete value[$PROXY];
|
|
1126
|
+
const node = createReactiveNode("signal", value, {
|
|
1127
|
+
equals: options?.equals === false ? void 0 : options?.equals,
|
|
1128
|
+
name: options?.name
|
|
1129
|
+
});
|
|
1130
|
+
const s = [read, write];
|
|
1131
|
+
signalObservers.set(s, /* @__PURE__ */ new Set());
|
|
1132
|
+
let lastObs;
|
|
1133
|
+
function read() {
|
|
1134
|
+
let observer = Listener;
|
|
1135
|
+
if (observer) {
|
|
1136
|
+
if (!observer.sources) observer.sources = [s];
|
|
1137
|
+
else if (observer.sources.indexOf(s) === -1) observer.sources.push(s);
|
|
1138
|
+
const observers = signalObservers.get(s);
|
|
1139
|
+
if (observers && !observers.has(observer)) observers.add(observer);
|
|
1140
|
+
}
|
|
1141
|
+
return value;
|
|
1142
|
+
}
|
|
1143
|
+
function write(nextValue) {
|
|
1144
|
+
const v = typeof nextValue === "function" ? nextValue(value) : nextValue;
|
|
1145
|
+
const equals = node.equals || defaultEquals;
|
|
1146
|
+
if (options?.equals === false || !equals(value, v)) {
|
|
1147
|
+
value = v;
|
|
1148
|
+
node.value = v;
|
|
1149
|
+
node.version++;
|
|
1150
|
+
node.updated = Date.now();
|
|
1151
|
+
const observers = signalObservers.get(s);
|
|
1152
|
+
if (observers && observers.size > 0) {
|
|
1153
|
+
let propagateDirty2 = function(comp, viaPureMemo = false) {
|
|
1154
|
+
const prevState = comp.state;
|
|
1155
|
+
if (prevState === RUNNING && comp === Listener) return;
|
|
1156
|
+
if (viaPureMemo && !comp.pure) {
|
|
1157
|
+
if (prevState === CLEAN2) {
|
|
1158
|
+
comp.state = STALE;
|
|
1159
|
+
if (_eagerStaleEffects) {
|
|
1160
|
+
if (Updates !== null && Updates.indexOf(comp) === -1)
|
|
1161
|
+
Updates.push(comp);
|
|
1162
|
+
else toUpdate.push(comp);
|
|
1163
|
+
}
|
|
1164
|
+
}
|
|
1165
|
+
return;
|
|
1166
|
+
}
|
|
1167
|
+
if (visited.has(comp)) return;
|
|
1168
|
+
visited.add(comp);
|
|
1169
|
+
comp.state = DIRTY2;
|
|
1170
|
+
if (prevState === CLEAN2 || prevState === STALE) toUpdate.push(comp);
|
|
1171
|
+
else if (!comp.pure && Updates !== null && Updates.indexOf(comp) === -1)
|
|
1172
|
+
Updates.push(comp);
|
|
1173
|
+
if (comp.pure && comp.accessor) {
|
|
1174
|
+
const memoObservers = signalObservers.get(comp.accessor);
|
|
1175
|
+
if (memoObservers)
|
|
1176
|
+
propagate(
|
|
1177
|
+
Array.from(memoObservers),
|
|
1178
|
+
(c) => propagateDirty2(c, true)
|
|
1179
|
+
);
|
|
1180
|
+
}
|
|
1181
|
+
};
|
|
1182
|
+
var propagateDirty = propagateDirty2;
|
|
1183
|
+
const observerList = Array.from(observers);
|
|
1184
|
+
const toUpdate = [];
|
|
1185
|
+
const visited = /* @__PURE__ */ new Set();
|
|
1186
|
+
propagate(observerList, propagateDirty2);
|
|
1187
|
+
for (const comp of toUpdate) scheduleComputation(comp);
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
read.toObservable = () => new Observable((observer) => {
|
|
1192
|
+
let first = true;
|
|
1193
|
+
const dispose2 = createEffect2(() => {
|
|
1194
|
+
const val = read();
|
|
1195
|
+
if (first) first = false;
|
|
1196
|
+
else observer.next(val);
|
|
1197
|
+
});
|
|
1198
|
+
return dispose2;
|
|
1199
|
+
});
|
|
1200
|
+
Object.defineProperty(read, $SIGNAL3, { value: true, enumerable: true });
|
|
1201
|
+
Object.defineProperty(read, $NODE2, { value: node, enumerable: false });
|
|
1202
|
+
return s;
|
|
1203
|
+
}
|
|
1204
|
+
function createEffect2(fn, value, options) {
|
|
1205
|
+
const c = {
|
|
1206
|
+
fn,
|
|
1207
|
+
state: DIRTY2,
|
|
1208
|
+
sources: null,
|
|
1209
|
+
sourceSlots: null,
|
|
1210
|
+
owned: null,
|
|
1211
|
+
cleanups: null,
|
|
1212
|
+
owner: Owner,
|
|
1213
|
+
contexts: null,
|
|
1214
|
+
pure: false,
|
|
1215
|
+
updatedAt: null
|
|
1216
|
+
};
|
|
1217
|
+
if (Owner) {
|
|
1218
|
+
if (!Owner.owned) Owner.owned = [c];
|
|
1219
|
+
else Owner.owned.push(c);
|
|
1220
|
+
}
|
|
1221
|
+
const SC = _SuspenseContext && useContext(_SuspenseContext);
|
|
1222
|
+
if (SC) c.suspense = SC;
|
|
1223
|
+
runComputation(c, value);
|
|
1224
|
+
return () => dispose(c);
|
|
1225
|
+
}
|
|
1226
|
+
function runComputation(c, value) {
|
|
1227
|
+
if (c.sources) {
|
|
1228
|
+
for (const source of c.sources) {
|
|
1229
|
+
const observers = signalObservers.get(source);
|
|
1230
|
+
if (observers) observers.delete(c);
|
|
1231
|
+
}
|
|
1232
|
+
c.sources = null;
|
|
1233
|
+
c.sourceSlots = null;
|
|
1234
|
+
}
|
|
1235
|
+
if (c.owned) {
|
|
1236
|
+
for (let i = 0; i < c.owned.length; i++) dispose(c.owned[i]);
|
|
1237
|
+
c.owned = null;
|
|
1238
|
+
}
|
|
1239
|
+
const prevListener = Listener;
|
|
1240
|
+
const prevOwner = Owner;
|
|
1241
|
+
Listener = c;
|
|
1242
|
+
Owner = c;
|
|
1243
|
+
ExecCount++;
|
|
1244
|
+
if (ExecCount > MAX_ITERATIONS) {
|
|
1245
|
+
ExecCount = 0;
|
|
1246
|
+
Listener = prevListener;
|
|
1247
|
+
Owner = prevOwner;
|
|
1248
|
+
throw new Error(
|
|
1249
|
+
"Potential infinite loop detected. Exceeded maximum iterations."
|
|
1250
|
+
);
|
|
1251
|
+
}
|
|
1252
|
+
try {
|
|
1253
|
+
c.state = RUNNING;
|
|
1254
|
+
const result = c.fn(value);
|
|
1255
|
+
if (typeof result === "function") {
|
|
1256
|
+
if (!c.cleanups) c.cleanups = [result];
|
|
1257
|
+
else c.cleanups.push(result);
|
|
1258
|
+
}
|
|
1259
|
+
if (c.state === RUNNING) c.state = CLEAN2;
|
|
1260
|
+
} catch (err) {
|
|
1261
|
+
if (isPromise(err)) {
|
|
1262
|
+
const ctx = _SuspenseContext && useContext(_SuspenseContext);
|
|
1263
|
+
if (ctx) {
|
|
1264
|
+
ctx.increment();
|
|
1265
|
+
err.finally(() => ctx.decrement());
|
|
1266
|
+
if (c.suspense) ctx.effects.push(c);
|
|
1267
|
+
}
|
|
1268
|
+
return;
|
|
1269
|
+
}
|
|
1270
|
+
handleError(err);
|
|
1271
|
+
} finally {
|
|
1272
|
+
Listener = prevListener;
|
|
1273
|
+
Owner = prevOwner;
|
|
1274
|
+
}
|
|
1275
|
+
}
|
|
1276
|
+
function updateComputation(c) {
|
|
1277
|
+
if (c.disposed || !c.fn || c.state === CLEAN2) return;
|
|
1278
|
+
if (c.state === DIRTY2 || c.state === STALE || c.state === RUNNING) {
|
|
1279
|
+
if (c.cleanups) {
|
|
1280
|
+
for (let i = 0; i < c.cleanups.length; i++) c.cleanups[i]();
|
|
1281
|
+
c.cleanups = null;
|
|
1282
|
+
}
|
|
1283
|
+
if (c.owned) {
|
|
1284
|
+
for (let i = 0; i < c.owned.length; i++) dispose(c.owned[i]);
|
|
1285
|
+
c.owned = null;
|
|
1286
|
+
}
|
|
1287
|
+
if (c.renderEffect) runRenderComputation(c);
|
|
1288
|
+
else runComputation(c, c.value);
|
|
1289
|
+
}
|
|
1290
|
+
}
|
|
1291
|
+
function dispose(c) {
|
|
1292
|
+
c.disposed = true;
|
|
1293
|
+
if (c.sources) {
|
|
1294
|
+
for (const source of c.sources) {
|
|
1295
|
+
const observers = signalObservers.get(source);
|
|
1296
|
+
if (observers) observers.delete(c);
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
if (c.cleanups) for (let i = 0; i < c.cleanups.length; i++) c.cleanups[i]();
|
|
1300
|
+
if (c.owned) for (let i = 0; i < c.owned.length; i++) dispose(c.owned[i]);
|
|
1301
|
+
if (c.owner && c.owner.owned) {
|
|
1302
|
+
const index = c.owner.owned.indexOf(c);
|
|
1303
|
+
if (index !== -1) c.owner.owned.splice(index, 1);
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1306
|
+
function createMemo2(fn, value, options) {
|
|
1307
|
+
const node = createReactiveNode("memo", value, {
|
|
1308
|
+
equals: options?.equals === false ? void 0 : options?.equals,
|
|
1309
|
+
name: options?.name
|
|
1310
|
+
});
|
|
1311
|
+
const c = {
|
|
1312
|
+
fn,
|
|
1313
|
+
state: DIRTY2,
|
|
1314
|
+
sources: null,
|
|
1315
|
+
sourceSlots: null,
|
|
1316
|
+
value,
|
|
1317
|
+
owned: null,
|
|
1318
|
+
cleanups: null,
|
|
1319
|
+
owner: Owner,
|
|
1320
|
+
contexts: null,
|
|
1321
|
+
pure: true,
|
|
1322
|
+
updatedAt: null,
|
|
1323
|
+
node,
|
|
1324
|
+
accessor: void 0
|
|
1325
|
+
};
|
|
1326
|
+
if (Owner) {
|
|
1327
|
+
if (!Owner.owned) Owner.owned = [c];
|
|
1328
|
+
else Owner.owned.push(c);
|
|
1329
|
+
}
|
|
1330
|
+
const read = () => {
|
|
1331
|
+
if (Listener && Listener !== c) {
|
|
1332
|
+
if (!Listener.sources) Listener.sources = [read];
|
|
1333
|
+
else if (Listener.sources.indexOf(read) === -1)
|
|
1334
|
+
Listener.sources.push(read);
|
|
1335
|
+
const memoAsSignal = read;
|
|
1336
|
+
if (!signalObservers.has(memoAsSignal))
|
|
1337
|
+
signalObservers.set(memoAsSignal, /* @__PURE__ */ new Set());
|
|
1338
|
+
const observers = signalObservers.get(memoAsSignal);
|
|
1339
|
+
if (observers) observers.add(Listener);
|
|
1340
|
+
}
|
|
1341
|
+
if (c.state !== CLEAN2) {
|
|
1342
|
+
if (c.sources) {
|
|
1343
|
+
for (const source of c.sources) {
|
|
1344
|
+
const observers = signalObservers.get(source);
|
|
1345
|
+
if (observers) observers.delete(c);
|
|
1346
|
+
}
|
|
1347
|
+
c.sources = null;
|
|
1348
|
+
c.sourceSlots = null;
|
|
1349
|
+
}
|
|
1350
|
+
if (c.cleanups) {
|
|
1351
|
+
for (let i = 0; i < c.cleanups.length; i++) c.cleanups[i]();
|
|
1352
|
+
c.cleanups = null;
|
|
1353
|
+
}
|
|
1354
|
+
if (c.owned) {
|
|
1355
|
+
for (let i = 0; i < c.owned.length; i++) dispose(c.owned[i]);
|
|
1356
|
+
c.owned = null;
|
|
1357
|
+
}
|
|
1358
|
+
const prevListener = Listener;
|
|
1359
|
+
const prevOwner = Owner;
|
|
1360
|
+
Listener = c;
|
|
1361
|
+
Owner = c;
|
|
1362
|
+
c.state = RUNNING;
|
|
1363
|
+
try {
|
|
1364
|
+
const nextValue = c.fn(c.value);
|
|
1365
|
+
const equals = node.equals || defaultEquals;
|
|
1366
|
+
const hasChanged = options?.equals === false || !equals(c.value, nextValue);
|
|
1367
|
+
if (hasChanged) {
|
|
1368
|
+
c.value = nextValue;
|
|
1369
|
+
node.value = nextValue;
|
|
1370
|
+
node.version++;
|
|
1371
|
+
node.updated = Date.now();
|
|
1372
|
+
const memoAsSignal = read;
|
|
1373
|
+
const observers = signalObservers.get(memoAsSignal);
|
|
1374
|
+
if (observers && observers.size > 0) {
|
|
1375
|
+
let propagateDirty2 = function(comp, viaPureMemo = false) {
|
|
1376
|
+
if (comp === c) return;
|
|
1377
|
+
const prevState = comp.state;
|
|
1378
|
+
if (prevState === RUNNING) return;
|
|
1379
|
+
if (viaPureMemo && !comp.pure) {
|
|
1380
|
+
if (prevState === CLEAN2) {
|
|
1381
|
+
comp.state = STALE;
|
|
1382
|
+
if (Updates !== null && Updates.indexOf(comp) === -1)
|
|
1383
|
+
Updates.push(comp);
|
|
1384
|
+
else toUpdate.push(comp);
|
|
1385
|
+
}
|
|
1386
|
+
return;
|
|
1387
|
+
}
|
|
1388
|
+
if (visited.has(comp)) return;
|
|
1389
|
+
visited.add(comp);
|
|
1390
|
+
comp.state = DIRTY2;
|
|
1391
|
+
if (prevState === CLEAN2 || prevState === STALE)
|
|
1392
|
+
toUpdate.push(comp);
|
|
1393
|
+
else if (!comp.pure && Updates !== null && Updates.indexOf(comp) === -1)
|
|
1394
|
+
Updates.push(comp);
|
|
1395
|
+
if (comp.pure && comp.accessor) {
|
|
1396
|
+
const memoObservers = signalObservers.get(comp.accessor);
|
|
1397
|
+
if (memoObservers && memoObservers.size > 0)
|
|
1398
|
+
for (const o of Array.from(memoObservers))
|
|
1399
|
+
propagateDirty2(o, true);
|
|
1400
|
+
}
|
|
1401
|
+
};
|
|
1402
|
+
var propagateDirty = propagateDirty2;
|
|
1403
|
+
const observerList = Array.from(observers);
|
|
1404
|
+
const toUpdate = [];
|
|
1405
|
+
const visited = /* @__PURE__ */ new Set();
|
|
1406
|
+
for (let i = 0; i < observerList.length; i++)
|
|
1407
|
+
propagateDirty2(observerList[i]);
|
|
1408
|
+
for (const comp of toUpdate) scheduleComputation(comp);
|
|
1409
|
+
}
|
|
1410
|
+
}
|
|
1411
|
+
if (c.state === RUNNING) c.state = CLEAN2;
|
|
1412
|
+
} catch (err) {
|
|
1413
|
+
if (isPromise(err)) {
|
|
1414
|
+
let ctx = _SuspenseContext && useContext(_SuspenseContext);
|
|
1415
|
+
if (!ctx && _SuspenseContext) {
|
|
1416
|
+
let owner = prevOwner;
|
|
1417
|
+
while (owner) {
|
|
1418
|
+
if (owner.contexts?.has(_SuspenseContext.id)) {
|
|
1419
|
+
ctx = owner.contexts.get(_SuspenseContext.id);
|
|
1420
|
+
break;
|
|
1421
|
+
}
|
|
1422
|
+
owner = owner.owner;
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
if (ctx) {
|
|
1426
|
+
ctx.increment();
|
|
1427
|
+
err.finally(() => ctx.decrement());
|
|
1428
|
+
}
|
|
1429
|
+
return c.value;
|
|
1430
|
+
}
|
|
1431
|
+
handleError(err);
|
|
1432
|
+
} finally {
|
|
1433
|
+
Listener = prevListener;
|
|
1434
|
+
Owner = prevOwner;
|
|
1435
|
+
}
|
|
1436
|
+
}
|
|
1437
|
+
return c.value;
|
|
1438
|
+
};
|
|
1439
|
+
c.accessor = read;
|
|
1440
|
+
signalObservers.set(read, /* @__PURE__ */ new Set());
|
|
1441
|
+
read.toObservable = () => new Observable((observer) => {
|
|
1442
|
+
let first = true;
|
|
1443
|
+
const dispose2 = createEffect2(() => {
|
|
1444
|
+
const val = read();
|
|
1445
|
+
if (first) first = false;
|
|
1446
|
+
else observer.next(val);
|
|
1447
|
+
});
|
|
1448
|
+
return dispose2;
|
|
1449
|
+
});
|
|
1450
|
+
Object.defineProperty(read, $SIGNAL3, { value: true, enumerable: true });
|
|
1451
|
+
Object.defineProperty(read, $MEMO3, { value: true, enumerable: true });
|
|
1452
|
+
Object.defineProperty(read, $NODE2, { value: node, enumerable: false });
|
|
1453
|
+
return read;
|
|
1454
|
+
}
|
|
1455
|
+
function runCascadeAndEffects(initial) {
|
|
1456
|
+
const cascadeQueue = [];
|
|
1457
|
+
const effectsToRun = [];
|
|
1458
|
+
for (const comp of initial) {
|
|
1459
|
+
if (comp.pure && !comp.computed && comp.accessor) {
|
|
1460
|
+
if (cascadeQueue.indexOf(comp) === -1) cascadeQueue.push(comp);
|
|
1461
|
+
} else if ((comp.computed || !comp.pure) && effectsToRun.indexOf(comp) === -1)
|
|
1462
|
+
effectsToRun.push(comp);
|
|
1463
|
+
}
|
|
1464
|
+
Updates = [];
|
|
1465
|
+
let ci = 0;
|
|
1466
|
+
while (ci < cascadeQueue.length) {
|
|
1467
|
+
const comp = cascadeQueue[ci++];
|
|
1468
|
+
const observers = signalObservers.get(comp.accessor);
|
|
1469
|
+
if (observers && observers.size > 0) {
|
|
1470
|
+
const prevListener = Listener;
|
|
1471
|
+
Listener = null;
|
|
1472
|
+
comp.accessor();
|
|
1473
|
+
Listener = prevListener;
|
|
1474
|
+
}
|
|
1475
|
+
const fresh = Updates.splice(0);
|
|
1476
|
+
for (const c of fresh) {
|
|
1477
|
+
if (c.pure && !c.computed && c.accessor) {
|
|
1478
|
+
if (cascadeQueue.indexOf(c) === -1) cascadeQueue.push(c);
|
|
1479
|
+
} else if ((c.computed || !c.pure) && effectsToRun.indexOf(c) === -1)
|
|
1480
|
+
effectsToRun.push(c);
|
|
1481
|
+
}
|
|
1482
|
+
}
|
|
1483
|
+
Updates = null;
|
|
1484
|
+
for (const comp of effectsToRun)
|
|
1485
|
+
if (comp.computed || !comp.pure) updateComputation(comp);
|
|
1486
|
+
}
|
|
1487
|
+
function batch3(fn) {
|
|
1488
|
+
if (Updates && BatchDepth > 0) return fn();
|
|
1489
|
+
if (Updates && BatchDepth === 0) {
|
|
1490
|
+
const prev = Updates;
|
|
1491
|
+
const nested = [];
|
|
1492
|
+
Updates = nested;
|
|
1493
|
+
BatchDepth++;
|
|
1494
|
+
let result;
|
|
1495
|
+
try {
|
|
1496
|
+
result = fn();
|
|
1497
|
+
} finally {
|
|
1498
|
+
BatchDepth--;
|
|
1499
|
+
Updates = prev;
|
|
1500
|
+
}
|
|
1501
|
+
const savedUpdates = Updates;
|
|
1502
|
+
runCascadeAndEffects(nested);
|
|
1503
|
+
Updates = savedUpdates;
|
|
1504
|
+
return result;
|
|
1505
|
+
}
|
|
1506
|
+
BatchDepth++;
|
|
1507
|
+
Updates = [];
|
|
1508
|
+
Effects = [];
|
|
1509
|
+
try {
|
|
1510
|
+
return fn();
|
|
1511
|
+
} finally {
|
|
1512
|
+
BatchDepth--;
|
|
1513
|
+
flushUpdates();
|
|
1514
|
+
}
|
|
1515
|
+
}
|
|
1516
|
+
function flushUpdates() {
|
|
1517
|
+
if (Pending) return;
|
|
1518
|
+
Pending = true;
|
|
1519
|
+
ExecCount = 0;
|
|
1520
|
+
try {
|
|
1521
|
+
while (Updates && Updates.length > 0) {
|
|
1522
|
+
const updates = Updates;
|
|
1523
|
+
Updates = null;
|
|
1524
|
+
runCascadeAndEffects(updates);
|
|
1525
|
+
}
|
|
1526
|
+
Updates = null;
|
|
1527
|
+
if (Effects) {
|
|
1528
|
+
const effects = Effects;
|
|
1529
|
+
Effects = null;
|
|
1530
|
+
for (let i = 0; i < effects.length; i++) updateComputation(effects[i]);
|
|
1531
|
+
}
|
|
1532
|
+
} finally {
|
|
1533
|
+
Pending = false;
|
|
1534
|
+
}
|
|
1535
|
+
}
|
|
1536
|
+
function createRoot2(fn) {
|
|
1537
|
+
const owner = {
|
|
1538
|
+
owned: null,
|
|
1539
|
+
cleanups: null,
|
|
1540
|
+
contexts: null,
|
|
1541
|
+
owner: Owner
|
|
1542
|
+
};
|
|
1543
|
+
const prevListener = Listener;
|
|
1544
|
+
Listener = null;
|
|
1545
|
+
const prevOwner = Owner;
|
|
1546
|
+
Owner = owner;
|
|
1547
|
+
try {
|
|
1548
|
+
return fn(() => {
|
|
1549
|
+
if (owner.owned)
|
|
1550
|
+
for (let i = 0; i < owner.owned.length; i++) dispose(owner.owned[i]);
|
|
1551
|
+
if (owner.cleanups)
|
|
1552
|
+
for (let i = 0; i < owner.cleanups.length; i++) owner.cleanups[i]();
|
|
1553
|
+
});
|
|
1554
|
+
} finally {
|
|
1555
|
+
Owner = prevOwner;
|
|
1556
|
+
Listener = prevListener;
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
function untrack3(fn) {
|
|
1560
|
+
const prevListener = Listener;
|
|
1561
|
+
Listener = null;
|
|
1562
|
+
try {
|
|
1563
|
+
return fn();
|
|
1564
|
+
} finally {
|
|
1565
|
+
Listener = prevListener;
|
|
1566
|
+
}
|
|
1567
|
+
}
|
|
1568
|
+
function onCleanup2(fn) {
|
|
1569
|
+
if (Owner) {
|
|
1570
|
+
if (!Owner.cleanups) Owner.cleanups = [fn];
|
|
1571
|
+
else Owner.cleanups.push(fn);
|
|
1572
|
+
}
|
|
1573
|
+
}
|
|
1574
|
+
function createResource(source, fetcherFn, options = {}) {
|
|
1575
|
+
let s;
|
|
1576
|
+
let fetcher;
|
|
1577
|
+
if (typeof fetcherFn === "function") {
|
|
1578
|
+
s = typeof source === "function" ? source : () => source;
|
|
1579
|
+
fetcher = fetcherFn;
|
|
1580
|
+
} else {
|
|
1581
|
+
s = () => true;
|
|
1582
|
+
fetcher = source;
|
|
1583
|
+
if (fetcherFn && typeof fetcherFn === "object") options = fetcherFn;
|
|
1584
|
+
}
|
|
1585
|
+
const { initialValue, name } = options;
|
|
1586
|
+
const __ssrId = options.transport === false ? void 0 : nextResourceId();
|
|
1587
|
+
const __seed = __ssrId !== void 0 ? getServerData(__ssrId) : void 0;
|
|
1588
|
+
let skipFirstFetch = __seed !== void 0;
|
|
1589
|
+
const [value, setValue] = createSignal2(
|
|
1590
|
+
__seed !== void 0 ? __seed.value : options.initialValue,
|
|
1591
|
+
{ equals: false }
|
|
1592
|
+
);
|
|
1593
|
+
const [error, setError] = createSignal2(void 0, { equals: false });
|
|
1594
|
+
const [state, setState] = createSignal2(
|
|
1595
|
+
__seed !== void 0 || options.initialValue !== void 0 ? "ready" : "unresolved",
|
|
1596
|
+
{ equals: false }
|
|
1597
|
+
);
|
|
1598
|
+
const [promise, setPromise] = createSignal2(
|
|
1599
|
+
void 0,
|
|
1600
|
+
{ equals: false }
|
|
1601
|
+
);
|
|
1602
|
+
const [track, trigger] = createSignal2(void 0, { equals: false });
|
|
1603
|
+
const UNSET = /* @__PURE__ */ Symbol();
|
|
1604
|
+
let prevKey = UNSET;
|
|
1605
|
+
let manualRefetch = false;
|
|
1606
|
+
const saveToCache = (data) => {
|
|
1607
|
+
if (typeof localStorage === "undefined") return;
|
|
1608
|
+
try {
|
|
1609
|
+
if (data)
|
|
1610
|
+
localStorage.setItem(
|
|
1611
|
+
"storage",
|
|
1612
|
+
JSON.stringify({ data, timestamp: Date.now() })
|
|
1613
|
+
);
|
|
1614
|
+
} catch (error2) {
|
|
1615
|
+
console.error(`Failed to save resource to cache (${name}):`, error2);
|
|
1616
|
+
}
|
|
1617
|
+
};
|
|
1618
|
+
const dispose2 = createEffect2(() => {
|
|
1619
|
+
const val = s ? s() : source;
|
|
1620
|
+
track();
|
|
1621
|
+
if (val === false || val === null || val === void 0) {
|
|
1622
|
+
prevKey = UNSET;
|
|
1623
|
+
batch3(() => {
|
|
1624
|
+
setState("unresolved");
|
|
1625
|
+
setPromise(void 0);
|
|
1626
|
+
setError(void 0);
|
|
1627
|
+
});
|
|
1628
|
+
return;
|
|
1629
|
+
}
|
|
1630
|
+
const isManual = manualRefetch;
|
|
1631
|
+
manualRefetch = false;
|
|
1632
|
+
if (prevKey !== UNSET && val === prevKey && !isManual) return;
|
|
1633
|
+
prevKey = val;
|
|
1634
|
+
if (skipFirstFetch) {
|
|
1635
|
+
skipFirstFetch = false;
|
|
1636
|
+
return;
|
|
1637
|
+
}
|
|
1638
|
+
let cancelled = false;
|
|
1639
|
+
onCleanup2(() => cancelled = true);
|
|
1640
|
+
const currentState = untrack3(state);
|
|
1641
|
+
const currentValue = untrack3(value);
|
|
1642
|
+
const isRefreshing = currentState === "ready" || currentState === "refreshing";
|
|
1643
|
+
batch3(() => {
|
|
1644
|
+
setState(isRefreshing ? "refreshing" : "pending");
|
|
1645
|
+
setError(void 0);
|
|
1646
|
+
});
|
|
1647
|
+
try {
|
|
1648
|
+
const res = fetcher(val, {
|
|
1649
|
+
value: currentValue,
|
|
1650
|
+
refetching: isRefreshing
|
|
1651
|
+
});
|
|
1652
|
+
if (isPromise(res)) {
|
|
1653
|
+
setPromise(res);
|
|
1654
|
+
trackResourcePromise(res);
|
|
1655
|
+
res.then(
|
|
1656
|
+
(v) => {
|
|
1657
|
+
if (cancelled) return;
|
|
1658
|
+
if (__ssrId !== void 0) reportResourceData(__ssrId, v);
|
|
1659
|
+
batch3(() => {
|
|
1660
|
+
setValue(() => v);
|
|
1661
|
+
saveToCache(v);
|
|
1662
|
+
setState("ready");
|
|
1663
|
+
setPromise(void 0);
|
|
1664
|
+
});
|
|
1665
|
+
},
|
|
1666
|
+
(e) => {
|
|
1667
|
+
if (cancelled) return;
|
|
1668
|
+
batch3(() => {
|
|
1669
|
+
setError(e);
|
|
1670
|
+
setState("errored");
|
|
1671
|
+
setPromise(void 0);
|
|
1672
|
+
});
|
|
1673
|
+
}
|
|
1674
|
+
).catch((e) => {
|
|
1675
|
+
if (cancelled) return;
|
|
1676
|
+
batch3(() => {
|
|
1677
|
+
setError(e);
|
|
1678
|
+
setState("errored");
|
|
1679
|
+
setPromise(void 0);
|
|
1680
|
+
});
|
|
1681
|
+
});
|
|
1682
|
+
const suspenseCtx = _SuspenseContext && useContext(_SuspenseContext);
|
|
1683
|
+
if (suspenseCtx) {
|
|
1684
|
+
suspenseCtx.increment();
|
|
1685
|
+
res.finally(() => suspenseCtx.decrement());
|
|
1686
|
+
}
|
|
1687
|
+
} else {
|
|
1688
|
+
if (cancelled) return;
|
|
1689
|
+
batch3(() => {
|
|
1690
|
+
setValue(() => res);
|
|
1691
|
+
setState("ready");
|
|
1692
|
+
setPromise(void 0);
|
|
1693
|
+
});
|
|
1694
|
+
}
|
|
1695
|
+
} catch (e) {
|
|
1696
|
+
if (cancelled) return;
|
|
1697
|
+
batch3(() => {
|
|
1698
|
+
setError(e);
|
|
1699
|
+
setState("errored");
|
|
1700
|
+
setPromise(void 0);
|
|
1701
|
+
});
|
|
1702
|
+
}
|
|
1703
|
+
});
|
|
1704
|
+
onCleanup2(dispose2);
|
|
1705
|
+
const loading = () => {
|
|
1706
|
+
const s2 = state();
|
|
1707
|
+
return s2 === "pending" || s2 === "refreshing";
|
|
1708
|
+
};
|
|
1709
|
+
const resource = (() => {
|
|
1710
|
+
const e = error();
|
|
1711
|
+
if (e) throw e;
|
|
1712
|
+
if (loading()) {
|
|
1713
|
+
const p = promise();
|
|
1714
|
+
if (p) throw p;
|
|
1715
|
+
}
|
|
1716
|
+
return value();
|
|
1717
|
+
});
|
|
1718
|
+
Object.defineProperty(resource, $RESOURCE2, { value: true, enumerable: true });
|
|
1719
|
+
Object.defineProperty(resource, $SIGNAL3, { value: true, enumerable: true });
|
|
1720
|
+
Object.defineProperties(resource, {
|
|
1721
|
+
state: { get: state },
|
|
1722
|
+
loading: { get: () => loading() },
|
|
1723
|
+
error: { get: error },
|
|
1724
|
+
latest: { get: value }
|
|
1725
|
+
});
|
|
1726
|
+
return [
|
|
1727
|
+
resource,
|
|
1728
|
+
{
|
|
1729
|
+
mutate: setValue,
|
|
1730
|
+
refetch: () => {
|
|
1731
|
+
manualRefetch = true;
|
|
1732
|
+
trigger(void 0);
|
|
1733
|
+
}
|
|
1734
|
+
}
|
|
1735
|
+
];
|
|
1736
|
+
}
|
|
1737
|
+
function getOwner2() {
|
|
1738
|
+
return Owner;
|
|
1739
|
+
}
|
|
1740
|
+
function runWithOwner2(owner, fn) {
|
|
1741
|
+
const prevOwner = Owner;
|
|
1742
|
+
const prevListener = Listener;
|
|
1743
|
+
Owner = owner;
|
|
1744
|
+
Listener = null;
|
|
1745
|
+
try {
|
|
1746
|
+
return fn();
|
|
1747
|
+
} finally {
|
|
1748
|
+
Owner = prevOwner;
|
|
1749
|
+
Listener = prevListener;
|
|
1750
|
+
}
|
|
1751
|
+
}
|
|
1752
|
+
function createContext(defaultValue) {
|
|
1753
|
+
const id = /* @__PURE__ */ Symbol("context");
|
|
1754
|
+
const Provider = createProvider(id);
|
|
1755
|
+
return { id, Provider, defaultValue };
|
|
1756
|
+
}
|
|
1757
|
+
function createProvider(id) {
|
|
1758
|
+
return (props) => {
|
|
1759
|
+
let _node = Owner;
|
|
1760
|
+
while (_node) {
|
|
1761
|
+
if (!_node.contexts) _node.contexts = /* @__PURE__ */ new Map();
|
|
1762
|
+
if (!_node.contexts.has(id)) _node.contexts.set(id, props.value);
|
|
1763
|
+
_node = _node.owner;
|
|
1764
|
+
}
|
|
1765
|
+
let provider;
|
|
1766
|
+
createRenderEffect(() => {
|
|
1767
|
+
provider = untrack3(() => {
|
|
1768
|
+
const owner = Owner;
|
|
1769
|
+
if (owner) {
|
|
1770
|
+
if (!owner.contexts) owner.contexts = /* @__PURE__ */ new Map();
|
|
1771
|
+
owner.contexts.set(id, props.value);
|
|
1772
|
+
}
|
|
1773
|
+
return readChildren(() => props.children);
|
|
1774
|
+
});
|
|
1775
|
+
});
|
|
1776
|
+
return provider;
|
|
1777
|
+
};
|
|
1778
|
+
}
|
|
1779
|
+
function useContext(context) {
|
|
1780
|
+
let owner = Owner;
|
|
1781
|
+
while (owner) {
|
|
1782
|
+
if (owner.contexts && owner.contexts.has(context.id))
|
|
1783
|
+
return owner.contexts.get(context.id);
|
|
1784
|
+
owner = owner.owner;
|
|
1785
|
+
}
|
|
1786
|
+
if (!context) return;
|
|
1787
|
+
return context.defaultValue;
|
|
1788
|
+
}
|
|
1789
|
+
function flush() {
|
|
1790
|
+
return new Promise((resolve) => {
|
|
1791
|
+
queueMicrotask(() => {
|
|
1792
|
+
flushUpdates();
|
|
1793
|
+
resolve();
|
|
1794
|
+
});
|
|
1795
|
+
});
|
|
1796
|
+
}
|
|
1797
|
+
function startTransition(fn) {
|
|
1798
|
+
if (Transition && Transition.running) {
|
|
1799
|
+
fn();
|
|
1800
|
+
return Transition.done;
|
|
1801
|
+
}
|
|
1802
|
+
ensureTransPending();
|
|
1803
|
+
let resolve;
|
|
1804
|
+
const done = new Promise((res) => resolve = res);
|
|
1805
|
+
const t = { running: true, effects: [], resolve, done };
|
|
1806
|
+
Transition = t;
|
|
1807
|
+
try {
|
|
1808
|
+
fn();
|
|
1809
|
+
} finally {
|
|
1810
|
+
t.running = false;
|
|
1811
|
+
}
|
|
1812
|
+
if (!t.effects.length) {
|
|
1813
|
+
Transition = null;
|
|
1814
|
+
resolve();
|
|
1815
|
+
return done;
|
|
1816
|
+
}
|
|
1817
|
+
_setTransPending(true);
|
|
1818
|
+
Promise.resolve().then(() => {
|
|
1819
|
+
const effects = t.effects.splice(0);
|
|
1820
|
+
Transition = null;
|
|
1821
|
+
_setTransPending(false);
|
|
1822
|
+
if (effects.length)
|
|
1823
|
+
batch3(() => {
|
|
1824
|
+
for (const e of effects) {
|
|
1825
|
+
e.state = DIRTY2;
|
|
1826
|
+
updateComputation(e);
|
|
1827
|
+
}
|
|
1828
|
+
});
|
|
1829
|
+
resolve();
|
|
1830
|
+
});
|
|
1831
|
+
return done;
|
|
1832
|
+
}
|
|
1833
|
+
function useTransition() {
|
|
1834
|
+
ensureTransPending();
|
|
1835
|
+
return [_transPending, startTransition];
|
|
1836
|
+
}
|
|
1837
|
+
function on(deps, fn, options) {
|
|
1838
|
+
const defer = options?.defer ?? false;
|
|
1839
|
+
let isFirst = true;
|
|
1840
|
+
return (prev) => {
|
|
1841
|
+
const values = deps();
|
|
1842
|
+
if (defer && isFirst) {
|
|
1843
|
+
isFirst = false;
|
|
1844
|
+
return prev;
|
|
1845
|
+
}
|
|
1846
|
+
return untrack3(() => fn(values, prev));
|
|
1847
|
+
};
|
|
1848
|
+
}
|
|
1849
|
+
function createRenderEffect(fn, value, options) {
|
|
1850
|
+
const c = {
|
|
1851
|
+
fn,
|
|
1852
|
+
state: DIRTY2,
|
|
1853
|
+
sources: null,
|
|
1854
|
+
sourceSlots: null,
|
|
1855
|
+
value,
|
|
1856
|
+
owned: null,
|
|
1857
|
+
cleanups: null,
|
|
1858
|
+
owner: Owner,
|
|
1859
|
+
contexts: null,
|
|
1860
|
+
pure: false,
|
|
1861
|
+
updatedAt: null,
|
|
1862
|
+
renderEffect: true
|
|
1863
|
+
};
|
|
1864
|
+
if (Owner) {
|
|
1865
|
+
if (!Owner.owned) Owner.owned = [c];
|
|
1866
|
+
else Owner.owned.push(c);
|
|
1867
|
+
}
|
|
1868
|
+
const SC = _SuspenseContext && useContext(_SuspenseContext);
|
|
1869
|
+
if (SC) c.suspense = SC;
|
|
1870
|
+
runRenderComputation(c);
|
|
1871
|
+
return () => dispose(c);
|
|
1872
|
+
}
|
|
1873
|
+
function runRenderComputation(c) {
|
|
1874
|
+
if (c.sources) {
|
|
1875
|
+
for (const source of c.sources) {
|
|
1876
|
+
const observers = signalObservers.get(source);
|
|
1877
|
+
if (observers) observers.delete(c);
|
|
1878
|
+
}
|
|
1879
|
+
c.sources = null;
|
|
1880
|
+
c.sourceSlots = null;
|
|
1881
|
+
}
|
|
1882
|
+
if (c.cleanups) {
|
|
1883
|
+
for (let i = 0; i < c.cleanups.length; i++) c.cleanups[i]();
|
|
1884
|
+
c.cleanups = null;
|
|
1885
|
+
}
|
|
1886
|
+
if (c.owned) {
|
|
1887
|
+
for (let i = 0; i < c.owned.length; i++) dispose(c.owned[i]);
|
|
1888
|
+
c.owned = null;
|
|
1889
|
+
}
|
|
1890
|
+
const prevListener = Listener;
|
|
1891
|
+
const prevOwner = Owner;
|
|
1892
|
+
const prevUpdates = Updates;
|
|
1893
|
+
Listener = c;
|
|
1894
|
+
Owner = c;
|
|
1895
|
+
if (Updates === null) Updates = [];
|
|
1896
|
+
c.state = RUNNING;
|
|
1897
|
+
try {
|
|
1898
|
+
const result = c.fn(c.value);
|
|
1899
|
+
if (typeof result === "function") {
|
|
1900
|
+
if (!c.cleanups) c.cleanups = [];
|
|
1901
|
+
c.cleanups.push(result);
|
|
1902
|
+
}
|
|
1903
|
+
c.value = result;
|
|
1904
|
+
if (c.state === RUNNING) c.state = CLEAN2;
|
|
1905
|
+
} catch (err) {
|
|
1906
|
+
if (isPromise(err)) {
|
|
1907
|
+
const ctx = _SuspenseContext && useContext(_SuspenseContext);
|
|
1908
|
+
if (ctx) {
|
|
1909
|
+
ctx.increment();
|
|
1910
|
+
err.finally(() => ctx.decrement());
|
|
1911
|
+
if (c.suspense) ctx.effects.push(c);
|
|
1912
|
+
}
|
|
1913
|
+
return;
|
|
1914
|
+
}
|
|
1915
|
+
handleError(err);
|
|
1916
|
+
} finally {
|
|
1917
|
+
Listener = prevListener;
|
|
1918
|
+
Owner = prevOwner;
|
|
1919
|
+
const deferred = Updates;
|
|
1920
|
+
Updates = prevUpdates;
|
|
1921
|
+
if (deferred !== prevUpdates && deferred && deferred.length > 0) {
|
|
1922
|
+
const saved = Updates;
|
|
1923
|
+
runCascadeAndEffects(deferred);
|
|
1924
|
+
Updates = saved;
|
|
1925
|
+
}
|
|
1926
|
+
}
|
|
1927
|
+
}
|
|
1928
|
+
function createComputed(fn, value, options) {
|
|
1929
|
+
const c = {
|
|
1930
|
+
fn,
|
|
1931
|
+
state: DIRTY2,
|
|
1932
|
+
sources: null,
|
|
1933
|
+
sourceSlots: null,
|
|
1934
|
+
value,
|
|
1935
|
+
owned: null,
|
|
1936
|
+
cleanups: null,
|
|
1937
|
+
owner: Owner,
|
|
1938
|
+
contexts: null,
|
|
1939
|
+
pure: true,
|
|
1940
|
+
computed: true,
|
|
1941
|
+
updatedAt: null
|
|
1942
|
+
};
|
|
1943
|
+
if (Owner) {
|
|
1944
|
+
if (!Owner.owned) Owner.owned = [c];
|
|
1945
|
+
else Owner.owned.push(c);
|
|
1946
|
+
}
|
|
1947
|
+
if (Transition && Transition.running) {
|
|
1948
|
+
if (!Updates) Updates = [];
|
|
1949
|
+
if (Updates.indexOf(c) === -1) Updates.push(c);
|
|
1950
|
+
} else if (Updates) {
|
|
1951
|
+
if (Updates.indexOf(c) === -1) Updates.push(c);
|
|
1952
|
+
} else runComputation(c, value);
|
|
1953
|
+
}
|
|
1954
|
+
var _SuspenseContext;
|
|
1955
|
+
function getSuspenseContext() {
|
|
1956
|
+
return _SuspenseContext || (_SuspenseContext = createContext());
|
|
1957
|
+
}
|
|
1958
|
+
var _SuspenseListContext;
|
|
1959
|
+
function getSuspenseListContext() {
|
|
1960
|
+
return _SuspenseListContext || (_SuspenseListContext = createContext());
|
|
1961
|
+
}
|
|
1962
|
+
function resumeEffects(effects) {
|
|
1963
|
+
if (!effects.length) return;
|
|
1964
|
+
const queued = effects.slice();
|
|
1965
|
+
effects.length = 0;
|
|
1966
|
+
for (const c of queued) {
|
|
1967
|
+
c.state = DIRTY2;
|
|
1968
|
+
updateComputation(c);
|
|
1969
|
+
}
|
|
1970
|
+
}
|
|
1971
|
+
function onResolve(fn) {
|
|
1972
|
+
const ctx = _SuspenseContext && useContext(_SuspenseContext);
|
|
1973
|
+
if (ctx && ctx.inFallback())
|
|
1974
|
+
createEffect2(() => {
|
|
1975
|
+
if (!ctx.inFallback()) fn();
|
|
1976
|
+
});
|
|
1977
|
+
else fn();
|
|
1978
|
+
}
|
|
1979
|
+
function setScheduler2(scheduler) {
|
|
1980
|
+
Scheduler = scheduler;
|
|
1981
|
+
}
|
|
1982
|
+
function trackPromise(promise) {
|
|
1983
|
+
const ctx = _SuspenseContext && useContext(_SuspenseContext);
|
|
1984
|
+
if (!ctx) return promise;
|
|
1985
|
+
ctx.increment();
|
|
1986
|
+
promise.finally(() => ctx.decrement());
|
|
1987
|
+
return promise;
|
|
1988
|
+
}
|
|
1989
|
+
|
|
1990
|
+
// src/lib/signal/utilities.ts
|
|
1991
|
+
function mapSignal(signal, fn, options) {
|
|
1992
|
+
return createMemo(() => fn(signal()), void 0, options);
|
|
1993
|
+
}
|
|
1994
|
+
function filterSignal(signal, predicate, options) {
|
|
1995
|
+
return createMemo(() => signal().filter(predicate), void 0, options);
|
|
1996
|
+
}
|
|
1997
|
+
function reduceSignal(signal, reducer, initialValue, options) {
|
|
1998
|
+
return createMemo(
|
|
1999
|
+
() => signal().reduce(reducer, initialValue),
|
|
2000
|
+
void 0,
|
|
2001
|
+
options
|
|
2002
|
+
);
|
|
2003
|
+
}
|
|
2004
|
+
function findSignal(signal, predicate, options) {
|
|
2005
|
+
return createMemo(() => signal().find(predicate), void 0, options);
|
|
2006
|
+
}
|
|
2007
|
+
function someSignal(signal, predicate, options) {
|
|
2008
|
+
return createMemo(() => signal().some(predicate), void 0, options);
|
|
2009
|
+
}
|
|
2010
|
+
function everySignal(signal, predicate, options) {
|
|
2011
|
+
return createMemo(() => signal().every(predicate), void 0, options);
|
|
2012
|
+
}
|
|
2013
|
+
function sortSignal(signal, compareFn, options) {
|
|
2014
|
+
return createMemo(() => [...signal()].sort(compareFn), void 0, options);
|
|
2015
|
+
}
|
|
2016
|
+
function distinctSignal(signal, options) {
|
|
2017
|
+
return createMemo(() => [...new Set(signal())], void 0, options);
|
|
2018
|
+
}
|
|
2019
|
+
function combineSignal(signals, combiner, options) {
|
|
2020
|
+
return createMemo(
|
|
2021
|
+
() => {
|
|
2022
|
+
const values = signals.map((s) => s());
|
|
2023
|
+
return combiner(values);
|
|
2024
|
+
},
|
|
2025
|
+
void 0,
|
|
2026
|
+
options
|
|
2027
|
+
);
|
|
2028
|
+
}
|
|
2029
|
+
function combineSignals(...signals) {
|
|
2030
|
+
return new Observable((observer) => {
|
|
2031
|
+
const getValues = () => signals.map((s) => typeof s === "function" ? s() : s.get());
|
|
2032
|
+
const disposers = signals.map((signal) => {
|
|
2033
|
+
if (typeof signal === "function" && signal.subscribe) {
|
|
2034
|
+
return signal.subscribe(() => {
|
|
2035
|
+
observer.next(getValues());
|
|
2036
|
+
});
|
|
2037
|
+
} else if (typeof signal !== "function") {
|
|
2038
|
+
return signal.subscribe(() => {
|
|
2039
|
+
observer.next(getValues());
|
|
2040
|
+
});
|
|
2041
|
+
}
|
|
2042
|
+
return createEffect(() => {
|
|
2043
|
+
observer.next(getValues());
|
|
2044
|
+
});
|
|
2045
|
+
});
|
|
2046
|
+
return () => {
|
|
2047
|
+
disposers.forEach((dispose2) => {
|
|
2048
|
+
if (typeof dispose2 === "function") dispose2();
|
|
2049
|
+
else if (dispose2 && typeof dispose2.unsubscribe === "function") {
|
|
2050
|
+
dispose2.unsubscribe();
|
|
2051
|
+
}
|
|
2052
|
+
});
|
|
2053
|
+
};
|
|
2054
|
+
});
|
|
2055
|
+
}
|
|
2056
|
+
function mergeSignal(primary, fallback, options) {
|
|
2057
|
+
return createMemo(() => primary() || fallback(), void 0, options);
|
|
2058
|
+
}
|
|
2059
|
+
function zipSignal(a, b, operator, options) {
|
|
2060
|
+
return createMemo(() => operator(a(), b()), void 0, options);
|
|
2061
|
+
}
|
|
2062
|
+
function selectSignal(signal, selector, equals) {
|
|
2063
|
+
return createMemo(() => selector(signal()), void 0, {
|
|
2064
|
+
equals,
|
|
2065
|
+
internal: true
|
|
2066
|
+
});
|
|
2067
|
+
}
|
|
2068
|
+
function pickSignal(signal, keys, options) {
|
|
2069
|
+
return createMemo(
|
|
2070
|
+
() => {
|
|
2071
|
+
const obj = signal();
|
|
2072
|
+
const result = {};
|
|
2073
|
+
for (const key of keys) {
|
|
2074
|
+
result[key] = obj[key];
|
|
2075
|
+
}
|
|
2076
|
+
return result;
|
|
2077
|
+
},
|
|
2078
|
+
void 0,
|
|
2079
|
+
options
|
|
2080
|
+
);
|
|
2081
|
+
}
|
|
2082
|
+
function omitSignal(signal, keys, options) {
|
|
2083
|
+
return createMemo(
|
|
2084
|
+
() => {
|
|
2085
|
+
const obj = signal();
|
|
2086
|
+
const result = { ...obj };
|
|
2087
|
+
for (const key of keys) {
|
|
2088
|
+
delete result[key];
|
|
2089
|
+
}
|
|
2090
|
+
return result;
|
|
2091
|
+
},
|
|
2092
|
+
void 0,
|
|
2093
|
+
options
|
|
2094
|
+
);
|
|
2095
|
+
}
|
|
2096
|
+
function whenSignal(condition, whenTrue, whenFalse, options) {
|
|
2097
|
+
return createMemo(
|
|
2098
|
+
() => condition() ? whenTrue() : whenFalse(),
|
|
2099
|
+
void 0,
|
|
2100
|
+
options
|
|
2101
|
+
);
|
|
2102
|
+
}
|
|
2103
|
+
function guardSignal(condition, accessor, options) {
|
|
2104
|
+
return createMemo(
|
|
2105
|
+
() => condition() ? accessor() : void 0,
|
|
2106
|
+
void 0,
|
|
2107
|
+
options
|
|
2108
|
+
);
|
|
2109
|
+
}
|
|
2110
|
+
function debounceSignal(signal, delay, options) {
|
|
2111
|
+
const [debounced, setDebounced] = createSignal(signal());
|
|
2112
|
+
let timeoutId;
|
|
2113
|
+
createMemo(() => {
|
|
2114
|
+
const value = signal();
|
|
2115
|
+
clearTimeout(timeoutId);
|
|
2116
|
+
timeoutId = setTimeout(() => setDebounced(() => value), delay);
|
|
2117
|
+
});
|
|
2118
|
+
return debounced;
|
|
2119
|
+
}
|
|
2120
|
+
function throttleSignal(signal, delay, options) {
|
|
2121
|
+
const [throttled, setThrottled] = createSignal(signal());
|
|
2122
|
+
let lastUpdate = 0;
|
|
2123
|
+
let timeoutId;
|
|
2124
|
+
createMemo(() => {
|
|
2125
|
+
const value = signal();
|
|
2126
|
+
const now = Date.now();
|
|
2127
|
+
if (now - lastUpdate >= delay) {
|
|
2128
|
+
lastUpdate = now;
|
|
2129
|
+
setThrottled(() => value);
|
|
2130
|
+
} else {
|
|
2131
|
+
clearTimeout(timeoutId);
|
|
2132
|
+
timeoutId = setTimeout(() => {
|
|
2133
|
+
lastUpdate = Date.now();
|
|
2134
|
+
setThrottled(() => value);
|
|
2135
|
+
}, delay - (now - lastUpdate));
|
|
2136
|
+
}
|
|
2137
|
+
});
|
|
2138
|
+
return throttled;
|
|
2139
|
+
}
|
|
2140
|
+
function readSignal(signal) {
|
|
2141
|
+
let value = signal;
|
|
2142
|
+
while (typeof value === "function") value = value();
|
|
2143
|
+
return value;
|
|
2144
|
+
}
|
|
2145
|
+
|
|
2146
|
+
// src/lib/signal/cached-resource.ts
|
|
2147
|
+
var _autoId = 0;
|
|
2148
|
+
var $SIGNAL4 = /* @__PURE__ */ Symbol.for("signal");
|
|
2149
|
+
var $RESOURCE3 = /* @__PURE__ */ Symbol.for("resource");
|
|
2150
|
+
function cachedResource(sourceOrFetcher, fetcherOrOptions, opts = {}) {
|
|
2151
|
+
let sourceFn;
|
|
2152
|
+
let fetchFn;
|
|
2153
|
+
let options;
|
|
2154
|
+
if (typeof fetcherOrOptions === "function") {
|
|
2155
|
+
sourceFn = sourceOrFetcher;
|
|
2156
|
+
fetchFn = fetcherOrOptions;
|
|
2157
|
+
options = opts;
|
|
2158
|
+
} else {
|
|
2159
|
+
sourceFn = () => true;
|
|
2160
|
+
fetchFn = sourceOrFetcher;
|
|
2161
|
+
options = fetcherOrOptions ?? opts;
|
|
2162
|
+
}
|
|
2163
|
+
const {
|
|
2164
|
+
ttl = Infinity,
|
|
2165
|
+
name = `_auto_${_autoId++}`,
|
|
2166
|
+
staleWhileRevalidate = true
|
|
2167
|
+
} = options;
|
|
2168
|
+
const ns = name;
|
|
2169
|
+
const cache = options.cache ?? currentResourceCache();
|
|
2170
|
+
const inflight = cache.inflight;
|
|
2171
|
+
const ssrId = options.transport === false ? void 0 : nextResourceId();
|
|
2172
|
+
const seed = ssrId !== void 0 ? getServerData(ssrId) : void 0;
|
|
2173
|
+
const deps = options.deps ?? [];
|
|
2174
|
+
const depValues = () => deps.map((dep) => dep());
|
|
2175
|
+
const buildKey = (key, values = untrack2(depValues)) => `${ns}:${JSON.stringify(key)}` + (deps.length ? `:${JSON.stringify(values)}` : "");
|
|
2176
|
+
const isFresh = (entry) => ttl === Infinity || Date.now() - entry.timestamp <= ttl;
|
|
2177
|
+
const [value, setValue] = createSignal(void 0, { equals: false });
|
|
2178
|
+
const [resourceState, setResourceState] = createSignal("unresolved", { equals: false });
|
|
2179
|
+
const [resourceError, setResourceError] = createSignal(void 0, { equals: false });
|
|
2180
|
+
const [pendingP, setPendingP] = createSignal(void 0, { equals: false });
|
|
2181
|
+
const [isStale, setIsStale] = createSignal(false);
|
|
2182
|
+
const [tick, setTick] = createSignal(0, { equals: false });
|
|
2183
|
+
const UNSET = /* @__PURE__ */ Symbol("unset");
|
|
2184
|
+
let prevKey = UNSET;
|
|
2185
|
+
let flagRefetch = false;
|
|
2186
|
+
let flagInvalidate = false;
|
|
2187
|
+
function doFetch(key, ck, background, isCancelled) {
|
|
2188
|
+
const running2 = inflight.get(ck);
|
|
2189
|
+
if (running2) {
|
|
2190
|
+
running2.then(
|
|
2191
|
+
(v) => {
|
|
2192
|
+
if (!isCancelled()) settle(v, background);
|
|
2193
|
+
},
|
|
2194
|
+
(e) => {
|
|
2195
|
+
if (!isCancelled() && !background) fail(e);
|
|
2196
|
+
}
|
|
2197
|
+
);
|
|
2198
|
+
if (!background) {
|
|
2199
|
+
trackResourcePromise(running2);
|
|
2200
|
+
setPendingP(running2);
|
|
2201
|
+
}
|
|
2202
|
+
return;
|
|
2203
|
+
}
|
|
2204
|
+
const promise = Promise.resolve(fetchFn(key)).then(
|
|
2205
|
+
(v) => {
|
|
2206
|
+
cache.set(ck, { value: v, timestamp: Date.now() });
|
|
2207
|
+
inflight.delete(ck);
|
|
2208
|
+
return v;
|
|
2209
|
+
},
|
|
2210
|
+
(e) => {
|
|
2211
|
+
inflight.delete(ck);
|
|
2212
|
+
throw e;
|
|
2213
|
+
}
|
|
2214
|
+
);
|
|
2215
|
+
inflight.set(ck, promise);
|
|
2216
|
+
if (!background) {
|
|
2217
|
+
trackResourcePromise(promise);
|
|
2218
|
+
setPendingP(promise);
|
|
2219
|
+
}
|
|
2220
|
+
promise.then(
|
|
2221
|
+
(v) => {
|
|
2222
|
+
if (!isCancelled()) settle(v, background);
|
|
2223
|
+
},
|
|
2224
|
+
(e) => {
|
|
2225
|
+
if (!isCancelled() && !background) fail(e);
|
|
2226
|
+
}
|
|
2227
|
+
);
|
|
2228
|
+
}
|
|
2229
|
+
function settle(v, _background) {
|
|
2230
|
+
if (ssrId !== void 0) reportResourceData(ssrId, v);
|
|
2231
|
+
batch2(() => {
|
|
2232
|
+
setValue(() => v);
|
|
2233
|
+
setResourceState("ready");
|
|
2234
|
+
setIsStale(false);
|
|
2235
|
+
setPendingP(void 0);
|
|
2236
|
+
setResourceError(void 0);
|
|
2237
|
+
});
|
|
2238
|
+
}
|
|
2239
|
+
function fail(e) {
|
|
2240
|
+
batch2(() => {
|
|
2241
|
+
setResourceError(e);
|
|
2242
|
+
setResourceState("errored");
|
|
2243
|
+
setPendingP(void 0);
|
|
2244
|
+
});
|
|
2245
|
+
}
|
|
2246
|
+
createEffect(() => {
|
|
2247
|
+
const key = sourceFn();
|
|
2248
|
+
const values = depValues();
|
|
2249
|
+
tick();
|
|
2250
|
+
if (key === false || key === null || key === void 0) {
|
|
2251
|
+
prevKey = UNSET;
|
|
2252
|
+
batch2(() => {
|
|
2253
|
+
setResourceState("unresolved");
|
|
2254
|
+
setPendingP(void 0);
|
|
2255
|
+
setResourceError(void 0);
|
|
2256
|
+
});
|
|
2257
|
+
return;
|
|
2258
|
+
}
|
|
2259
|
+
const doRefetch = flagRefetch;
|
|
2260
|
+
const doInvalidate = flagInvalidate;
|
|
2261
|
+
flagRefetch = false;
|
|
2262
|
+
flagInvalidate = false;
|
|
2263
|
+
const ck = buildKey(key, values);
|
|
2264
|
+
if (seed && prevKey === UNSET && !cache.get(ck)) cache.set(ck, { value: seed.value, timestamp: Date.now() });
|
|
2265
|
+
if (doInvalidate) cache.delete(ck);
|
|
2266
|
+
const keyChanged = prevKey === UNSET || key !== prevKey;
|
|
2267
|
+
prevKey = key;
|
|
2268
|
+
let cancelled = false;
|
|
2269
|
+
onCleanup(() => {
|
|
2270
|
+
cancelled = true;
|
|
2271
|
+
});
|
|
2272
|
+
const cached = cache.get(ck);
|
|
2273
|
+
if (cached && isFresh(cached) && !doRefetch && !doInvalidate) {
|
|
2274
|
+
if (ssrId !== void 0) reportResourceData(ssrId, cached.value);
|
|
2275
|
+
const cur2 = untrack2(resourceState);
|
|
2276
|
+
if (cur2 !== "ready" || untrack2(value) !== cached.value) {
|
|
2277
|
+
batch2(() => {
|
|
2278
|
+
setValue(() => cached.value);
|
|
2279
|
+
setResourceState("ready");
|
|
2280
|
+
setIsStale(false);
|
|
2281
|
+
setResourceError(void 0);
|
|
2282
|
+
});
|
|
2283
|
+
}
|
|
2284
|
+
return;
|
|
2285
|
+
}
|
|
2286
|
+
if (cached && staleWhileRevalidate && !doInvalidate) {
|
|
2287
|
+
batch2(() => {
|
|
2288
|
+
setValue(() => cached.value);
|
|
2289
|
+
setResourceState("ready");
|
|
2290
|
+
setIsStale(true);
|
|
2291
|
+
setResourceError(void 0);
|
|
2292
|
+
setPendingP(void 0);
|
|
2293
|
+
});
|
|
2294
|
+
doFetch(key, ck, true, () => cancelled);
|
|
2295
|
+
return;
|
|
2296
|
+
}
|
|
2297
|
+
const cur = untrack2(resourceState);
|
|
2298
|
+
const isReload = cur === "ready" || cur === "refreshing";
|
|
2299
|
+
batch2(() => {
|
|
2300
|
+
setResourceState(isReload ? "refreshing" : "pending");
|
|
2301
|
+
setResourceError(void 0);
|
|
2302
|
+
setIsStale(false);
|
|
2303
|
+
});
|
|
2304
|
+
doFetch(key, ck, false, () => cancelled);
|
|
2305
|
+
});
|
|
2306
|
+
const resource = (() => {
|
|
2307
|
+
const e = resourceError();
|
|
2308
|
+
if (e) throw e;
|
|
2309
|
+
const s = resourceState();
|
|
2310
|
+
if (s === "pending") {
|
|
2311
|
+
const p = pendingP();
|
|
2312
|
+
if (p) throw p;
|
|
2313
|
+
}
|
|
2314
|
+
return value();
|
|
2315
|
+
});
|
|
2316
|
+
Object.defineProperty(resource, $RESOURCE3, { value: true, enumerable: true });
|
|
2317
|
+
Object.defineProperty(resource, $SIGNAL4, { value: true, enumerable: true });
|
|
2318
|
+
Object.defineProperties(resource, {
|
|
2319
|
+
state: { get: resourceState },
|
|
2320
|
+
loading: { get: () => {
|
|
2321
|
+
const s = resourceState();
|
|
2322
|
+
return s === "pending" || s === "refreshing";
|
|
2323
|
+
} },
|
|
2324
|
+
error: { get: resourceError },
|
|
2325
|
+
latest: { get: value },
|
|
2326
|
+
stale: { get: isStale }
|
|
2327
|
+
});
|
|
2328
|
+
const refetch = () => {
|
|
2329
|
+
flagRefetch = true;
|
|
2330
|
+
setTick((v) => v + 1);
|
|
2331
|
+
};
|
|
2332
|
+
const invalidate = () => {
|
|
2333
|
+
const key = untrack2(sourceFn);
|
|
2334
|
+
if (key !== null && key !== void 0 && key !== false) {
|
|
2335
|
+
cache.delete(buildKey(key));
|
|
2336
|
+
}
|
|
2337
|
+
flagInvalidate = true;
|
|
2338
|
+
setTick((v) => v + 1);
|
|
2339
|
+
};
|
|
2340
|
+
return Object.assign(resource, { mutate: setValue, refetch, invalidate });
|
|
2341
|
+
}
|
|
2342
|
+
function clearCachedResources(name, cache = currentResourceCache()) {
|
|
2343
|
+
if (name === void 0) return cache.clear();
|
|
2344
|
+
const prefix = `${name}:`;
|
|
2345
|
+
for (const key of [...cache.keys()]) if (key.startsWith(prefix)) cache.delete(key);
|
|
2346
|
+
}
|
|
2347
|
+
|
|
2348
|
+
// src/lib/signal/list.ts
|
|
2349
|
+
function mapArray(list, mapFn, options) {
|
|
2350
|
+
let items = [];
|
|
2351
|
+
onCleanup(() => {
|
|
2352
|
+
for (const e of items) e.dispose();
|
|
2353
|
+
items = [];
|
|
2354
|
+
});
|
|
2355
|
+
return createMemo(() => {
|
|
2356
|
+
const next = list() || [];
|
|
2357
|
+
return untrack2(() => {
|
|
2358
|
+
if (next.length === 0) {
|
|
2359
|
+
for (const e of items) e.dispose();
|
|
2360
|
+
items = [];
|
|
2361
|
+
return options?.fallback ? options.fallback() : [];
|
|
2362
|
+
}
|
|
2363
|
+
const prevByItem = /* @__PURE__ */ new Map();
|
|
2364
|
+
for (const e of items) if (!prevByItem.has(e.item)) prevByItem.set(e.item, e);
|
|
2365
|
+
const result = [];
|
|
2366
|
+
const used = /* @__PURE__ */ new Set();
|
|
2367
|
+
for (let i = 0; i < next.length; i++) {
|
|
2368
|
+
const value = next[i];
|
|
2369
|
+
const reuse = prevByItem.get(value);
|
|
2370
|
+
if (reuse && !used.has(reuse)) {
|
|
2371
|
+
reuse.setIndex(i);
|
|
2372
|
+
result.push(reuse);
|
|
2373
|
+
used.add(reuse);
|
|
2374
|
+
} else {
|
|
2375
|
+
let rendered, setIndex, dispose2;
|
|
2376
|
+
createRoot((d) => {
|
|
2377
|
+
dispose2 = d;
|
|
2378
|
+
const [index, setIdx] = createSignal(i, { name: "row index" });
|
|
2379
|
+
setIndex = setIdx;
|
|
2380
|
+
rendered = mapFn(value, index);
|
|
2381
|
+
});
|
|
2382
|
+
const entry = { item: value, rendered, dispose: dispose2, setIndex };
|
|
2383
|
+
result.push(entry);
|
|
2384
|
+
used.add(entry);
|
|
2385
|
+
}
|
|
2386
|
+
}
|
|
2387
|
+
for (const e of items) if (!used.has(e)) e.dispose();
|
|
2388
|
+
items = result;
|
|
2389
|
+
return result.map((e) => e.rendered);
|
|
2390
|
+
});
|
|
2391
|
+
}, void 0, { name: "mapArray" });
|
|
2392
|
+
}
|
|
2393
|
+
function keyArray(list, keyFn, mapFn, options) {
|
|
2394
|
+
let keys = [];
|
|
2395
|
+
let entries = [];
|
|
2396
|
+
onCleanup(() => {
|
|
2397
|
+
for (const e of entries) e.dispose();
|
|
2398
|
+
keys = [];
|
|
2399
|
+
entries = [];
|
|
2400
|
+
});
|
|
2401
|
+
return createMemo(() => {
|
|
2402
|
+
const next = list() || [];
|
|
2403
|
+
return untrack2(() => {
|
|
2404
|
+
if (next.length === 0) {
|
|
2405
|
+
for (const e of entries) e.dispose();
|
|
2406
|
+
keys = [];
|
|
2407
|
+
entries = [];
|
|
2408
|
+
return options?.fallback ? options.fallback() : [];
|
|
2409
|
+
}
|
|
2410
|
+
const prevByKey = /* @__PURE__ */ new Map();
|
|
2411
|
+
for (let i = 0; i < keys.length; i++) prevByKey.set(keys[i], entries[i]);
|
|
2412
|
+
const resultEntries = [];
|
|
2413
|
+
const resultKeys = [];
|
|
2414
|
+
const usedKeys = /* @__PURE__ */ new Set();
|
|
2415
|
+
for (let i = 0; i < next.length; i++) {
|
|
2416
|
+
const key = keyFn(next[i]);
|
|
2417
|
+
const reuse = prevByKey.get(key);
|
|
2418
|
+
if (reuse && !usedKeys.has(key)) {
|
|
2419
|
+
reuse.setIndex(i);
|
|
2420
|
+
resultEntries.push(reuse);
|
|
2421
|
+
} else {
|
|
2422
|
+
let rendered, setIndex, dispose2;
|
|
2423
|
+
createRoot((d) => {
|
|
2424
|
+
dispose2 = d;
|
|
2425
|
+
const [index, setIdx] = createSignal(i, { name: "row index" });
|
|
2426
|
+
setIndex = setIdx;
|
|
2427
|
+
const item = createMemo((prev) => {
|
|
2428
|
+
const cur = list() || [];
|
|
2429
|
+
const v = cur[index()];
|
|
2430
|
+
return v !== void 0 && v !== null ? v : prev;
|
|
2431
|
+
}, next[i]);
|
|
2432
|
+
rendered = mapFn(item, index);
|
|
2433
|
+
});
|
|
2434
|
+
resultEntries.push({ rendered, dispose: dispose2, setIndex });
|
|
2435
|
+
}
|
|
2436
|
+
resultKeys.push(key);
|
|
2437
|
+
usedKeys.add(key);
|
|
2438
|
+
}
|
|
2439
|
+
for (const [key, e] of prevByKey) if (!usedKeys.has(key)) e.dispose();
|
|
2440
|
+
keys = resultKeys;
|
|
2441
|
+
entries = resultEntries;
|
|
2442
|
+
return resultEntries.map((e) => e.rendered);
|
|
2443
|
+
});
|
|
2444
|
+
}, void 0, { name: "keyArray" });
|
|
2445
|
+
}
|
|
2446
|
+
function indexArray(list, mapFn, options) {
|
|
2447
|
+
let slots = [];
|
|
2448
|
+
onCleanup(() => {
|
|
2449
|
+
for (const s of slots) s.dispose();
|
|
2450
|
+
slots = [];
|
|
2451
|
+
});
|
|
2452
|
+
return createMemo(() => {
|
|
2453
|
+
const next = list() || [];
|
|
2454
|
+
return untrack2(() => {
|
|
2455
|
+
if (next.length === 0) {
|
|
2456
|
+
for (const s of slots) s.dispose();
|
|
2457
|
+
slots = [];
|
|
2458
|
+
return options?.fallback ? options.fallback() : [];
|
|
2459
|
+
}
|
|
2460
|
+
const prevLen = slots.length;
|
|
2461
|
+
const nextLen = next.length;
|
|
2462
|
+
for (let i = prevLen; i < nextLen; i++) {
|
|
2463
|
+
let rendered, setItem, dispose2;
|
|
2464
|
+
const value = next[i];
|
|
2465
|
+
createRoot((d) => {
|
|
2466
|
+
dispose2 = d;
|
|
2467
|
+
const [item, setVal] = createSignal(value);
|
|
2468
|
+
setItem = setVal;
|
|
2469
|
+
rendered = mapFn(item, i);
|
|
2470
|
+
});
|
|
2471
|
+
slots.push({ rendered, setItem, dispose: dispose2 });
|
|
2472
|
+
}
|
|
2473
|
+
for (let i = nextLen; i < prevLen; i++) slots[i].dispose();
|
|
2474
|
+
if (nextLen < prevLen) slots = slots.slice(0, nextLen);
|
|
2475
|
+
const survive = Math.min(prevLen, nextLen);
|
|
2476
|
+
for (let i = 0; i < survive; i++) slots[i].setItem(next[i]);
|
|
2477
|
+
return slots.map((s) => s.rendered);
|
|
2478
|
+
});
|
|
2479
|
+
}, void 0, { name: "indexArray" });
|
|
2480
|
+
}
|
|
2481
|
+
export {
|
|
2482
|
+
$MEMO3 as $MEMO,
|
|
2483
|
+
$PROXY,
|
|
2484
|
+
$RESOURCE2 as $RESOURCE,
|
|
2485
|
+
$SIGNAL3 as $SIGNAL,
|
|
2486
|
+
__DEV__,
|
|
2487
|
+
batch3 as batch,
|
|
2488
|
+
cachedResource,
|
|
2489
|
+
clearCachedResources,
|
|
2490
|
+
combineSignal,
|
|
2491
|
+
combineSignals,
|
|
2492
|
+
createComputed,
|
|
2493
|
+
createContext,
|
|
2494
|
+
createDebounce,
|
|
2495
|
+
createDeferred,
|
|
2496
|
+
createEffect2 as createEffect,
|
|
2497
|
+
createMemo2 as createMemo,
|
|
2498
|
+
createProvider,
|
|
2499
|
+
createRenderEffect,
|
|
2500
|
+
createResource,
|
|
2501
|
+
createResourceCache,
|
|
2502
|
+
createRoot2 as createRoot,
|
|
2503
|
+
createSelector,
|
|
2504
|
+
createSignal2 as createSignal,
|
|
2505
|
+
debounceSignal,
|
|
2506
|
+
distinctSignal,
|
|
2507
|
+
everySignal,
|
|
2508
|
+
filterSignal,
|
|
2509
|
+
findSignal,
|
|
2510
|
+
flush,
|
|
2511
|
+
getOwner2 as getOwner,
|
|
2512
|
+
getServerData,
|
|
2513
|
+
getSharedConfig,
|
|
2514
|
+
getSuspenseContext,
|
|
2515
|
+
getSuspenseListContext,
|
|
2516
|
+
guardSignal,
|
|
2517
|
+
indexArray,
|
|
2518
|
+
isComponent,
|
|
2519
|
+
isMemo,
|
|
2520
|
+
isProvider,
|
|
2521
|
+
isResource,
|
|
2522
|
+
isSignal,
|
|
2523
|
+
isSuspense,
|
|
2524
|
+
keyArray,
|
|
2525
|
+
makeArrayFlat,
|
|
2526
|
+
mapArray,
|
|
2527
|
+
mapSignal,
|
|
2528
|
+
mergeSignal,
|
|
2529
|
+
nextResourceId,
|
|
2530
|
+
omitSignal,
|
|
2531
|
+
on,
|
|
2532
|
+
onCleanup2 as onCleanup,
|
|
2533
|
+
onResolve,
|
|
2534
|
+
pickSignal,
|
|
2535
|
+
readChildren,
|
|
2536
|
+
readSignal,
|
|
2537
|
+
reduceSignal,
|
|
2538
|
+
reportResourceData,
|
|
2539
|
+
resumeEffects,
|
|
2540
|
+
runWithOwner2 as runWithOwner,
|
|
2541
|
+
selectSignal,
|
|
2542
|
+
setOwner2 as setOwner,
|
|
2543
|
+
setResourceDataSink,
|
|
2544
|
+
setResourceIdSource,
|
|
2545
|
+
setResourceTracker,
|
|
2546
|
+
setScheduler2 as setScheduler,
|
|
2547
|
+
setServerDataGetter,
|
|
2548
|
+
sharedConfig,
|
|
2549
|
+
someSignal,
|
|
2550
|
+
sortSignal,
|
|
2551
|
+
startTransition,
|
|
2552
|
+
throttleSignal,
|
|
2553
|
+
trackPromise,
|
|
2554
|
+
trackResourcePromise,
|
|
2555
|
+
untrack3 as untrack,
|
|
2556
|
+
useContext,
|
|
2557
|
+
useTransition,
|
|
2558
|
+
whenSignal,
|
|
2559
|
+
zipSignal
|
|
2560
|
+
};
|