ripple 0.2.80 → 0.2.82
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/package.json +1 -1
- package/src/compiler/phases/1-parse/index.js +0 -34
- package/src/compiler/phases/2-analyze/index.js +0 -12
- package/src/compiler/phases/3-transform/client/index.js +1 -61
- package/src/compiler/phases/3-transform/server/index.js +37 -1
- package/src/compiler/utils.js +16 -0
- package/src/runtime/internal/client/runtime.js +739 -711
- package/src/runtime/internal/client/types.d.ts +2 -0
- package/tests/client/basic.test.ripple +7 -2
- package/types/index.d.ts +2 -2
- package/tests/client/accessors-props.test.ripple +0 -146
|
@@ -2,29 +2,29 @@
|
|
|
2
2
|
/** @import { TrackOptions } from '#public' */
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
destroy_block,
|
|
6
|
+
destroy_non_branch_children,
|
|
7
|
+
effect,
|
|
8
|
+
is_destroyed,
|
|
9
|
+
render,
|
|
10
10
|
} from './blocks.js';
|
|
11
11
|
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
ASYNC_BLOCK,
|
|
13
|
+
BLOCK_HAS_RUN,
|
|
14
|
+
BRANCH_BLOCK,
|
|
15
|
+
DERIVED,
|
|
16
|
+
COMPUTED_PROPERTY,
|
|
17
|
+
CONTAINS_TEARDOWN,
|
|
18
|
+
CONTAINS_UPDATE,
|
|
19
|
+
DEFERRED,
|
|
20
|
+
DESTROYED,
|
|
21
|
+
EFFECT_BLOCK,
|
|
22
|
+
PAUSED,
|
|
23
|
+
ROOT_BLOCK,
|
|
24
|
+
TRACKED,
|
|
25
|
+
TRY_BLOCK,
|
|
26
|
+
UNINITIALIZED,
|
|
27
|
+
REF_PROP,
|
|
28
28
|
} from './constants.js';
|
|
29
29
|
import { capture, suspend } from './try.js';
|
|
30
30
|
import { define_property, get_descriptors, is_array, is_tracked_object } from './utils.js';
|
|
@@ -60,124 +60,124 @@ export let tracking = false;
|
|
|
60
60
|
export let teardown = false;
|
|
61
61
|
|
|
62
62
|
function increment_clock() {
|
|
63
|
-
|
|
63
|
+
return ++clock;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
/**
|
|
67
67
|
* @param {Block | null} block
|
|
68
68
|
*/
|
|
69
69
|
export function set_active_block(block) {
|
|
70
|
-
|
|
70
|
+
active_block = block;
|
|
71
71
|
}
|
|
72
72
|
|
|
73
73
|
/**
|
|
74
74
|
* @param {Block | Derived | null} reaction
|
|
75
75
|
*/
|
|
76
76
|
export function set_active_reaction(reaction) {
|
|
77
|
-
|
|
77
|
+
active_reaction = reaction;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
81
|
* @param {Component | null} component
|
|
82
82
|
*/
|
|
83
83
|
export function set_active_component(component) {
|
|
84
|
-
|
|
84
|
+
active_component = component;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
/**
|
|
88
88
|
* @param {boolean} value
|
|
89
89
|
*/
|
|
90
90
|
export function set_tracking(value) {
|
|
91
|
-
|
|
91
|
+
tracking = value;
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
/**
|
|
95
95
|
* @param {Block} block
|
|
96
96
|
*/
|
|
97
97
|
export function run_teardown(block) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
98
|
+
var fn = block.t;
|
|
99
|
+
if (fn !== null) {
|
|
100
|
+
var previous_block = active_block;
|
|
101
|
+
var previous_reaction = active_reaction;
|
|
102
|
+
var previous_tracking = tracking;
|
|
103
|
+
var previous_teardown = teardown;
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
active_block = null;
|
|
107
|
+
active_reaction = null;
|
|
108
|
+
tracking = false;
|
|
109
|
+
teardown = true;
|
|
110
|
+
fn.call(null);
|
|
111
|
+
} finally {
|
|
112
|
+
active_block = previous_block;
|
|
113
|
+
active_reaction = previous_reaction;
|
|
114
|
+
tracking = previous_tracking;
|
|
115
|
+
teardown = previous_teardown;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
120
|
/**
|
|
121
121
|
* @param {Derived} computed
|
|
122
122
|
*/
|
|
123
123
|
function update_derived(computed) {
|
|
124
|
-
|
|
124
|
+
var value = computed.v;
|
|
125
125
|
|
|
126
|
-
|
|
127
|
-
|
|
126
|
+
if (value === UNINITIALIZED || is_tracking_dirty(computed.d)) {
|
|
127
|
+
value = run_derived(computed);
|
|
128
128
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
129
|
+
if (value !== computed.v) {
|
|
130
|
+
computed.v = value;
|
|
131
|
+
computed.c = increment_clock();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
134
|
}
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
137
|
* @param {Derived} computed
|
|
138
138
|
*/
|
|
139
139
|
function destroy_computed_children(computed) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
140
|
+
var blocks = computed.blocks;
|
|
141
|
+
|
|
142
|
+
if (blocks !== null) {
|
|
143
|
+
computed.blocks = null;
|
|
144
|
+
for (var i = 0; i < blocks.length; i++) {
|
|
145
|
+
destroy_block(blocks[i]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
/**
|
|
151
151
|
* @param {Derived} computed
|
|
152
152
|
*/
|
|
153
153
|
function run_derived(computed) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
154
|
+
var previous_block = active_block;
|
|
155
|
+
var previous_reaction = active_reaction;
|
|
156
|
+
var previous_tracking = tracking;
|
|
157
|
+
var previous_dependency = active_dependency;
|
|
158
|
+
var previous_component = active_component;
|
|
159
|
+
|
|
160
|
+
try {
|
|
161
|
+
active_block = computed.b;
|
|
162
|
+
active_reaction = computed;
|
|
163
|
+
tracking = true;
|
|
164
|
+
active_dependency = null;
|
|
165
|
+
active_component = computed.co;
|
|
166
|
+
|
|
167
|
+
destroy_computed_children(computed);
|
|
168
|
+
|
|
169
|
+
var value = computed.fn();
|
|
170
|
+
|
|
171
|
+
computed.d = active_dependency;
|
|
172
|
+
|
|
173
|
+
return value;
|
|
174
|
+
} finally {
|
|
175
|
+
active_block = previous_block;
|
|
176
|
+
active_reaction = previous_reaction;
|
|
177
|
+
tracking = previous_tracking;
|
|
178
|
+
active_dependency = previous_dependency;
|
|
179
|
+
active_component = previous_component;
|
|
180
|
+
}
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
/**
|
|
@@ -185,157 +185,172 @@ function run_derived(computed) {
|
|
|
185
185
|
* @param {Block} block
|
|
186
186
|
*/
|
|
187
187
|
export function handle_error(error, block) {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
188
|
+
/** @type {Block | null} */
|
|
189
|
+
var current = block;
|
|
190
|
+
|
|
191
|
+
while (current !== null) {
|
|
192
|
+
var state = current.s;
|
|
193
|
+
if ((current.f & TRY_BLOCK) !== 0 && state.c !== null) {
|
|
194
|
+
state.c(error);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
current = current.p;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
throw error;
|
|
201
201
|
}
|
|
202
202
|
|
|
203
203
|
/**
|
|
204
204
|
* @param {Block} block
|
|
205
205
|
*/
|
|
206
206
|
export function run_block(block) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
207
|
+
var previous_block = active_block;
|
|
208
|
+
var previous_reaction = active_reaction;
|
|
209
|
+
var previous_tracking = tracking;
|
|
210
|
+
var previous_dependency = active_dependency;
|
|
211
|
+
var previous_component = active_component;
|
|
212
|
+
|
|
213
|
+
try {
|
|
214
|
+
active_block = block;
|
|
215
|
+
active_reaction = block;
|
|
216
|
+
active_component = block.co;
|
|
217
|
+
|
|
218
|
+
destroy_non_branch_children(block);
|
|
219
|
+
run_teardown(block);
|
|
220
|
+
|
|
221
|
+
tracking = (block.f & (ROOT_BLOCK | BRANCH_BLOCK)) === 0;
|
|
222
|
+
active_dependency = null;
|
|
223
|
+
var res = block.fn();
|
|
224
|
+
|
|
225
|
+
if (typeof res === 'function') {
|
|
226
|
+
block.t = res;
|
|
227
|
+
/** @type {Block | null} */
|
|
228
|
+
let current = block;
|
|
229
|
+
|
|
230
|
+
while (current !== null && (current.f & CONTAINS_TEARDOWN) === 0) {
|
|
231
|
+
current.f ^= CONTAINS_TEARDOWN;
|
|
232
|
+
current = current.p;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
block.d = active_dependency;
|
|
237
|
+
} catch (error) {
|
|
238
|
+
handle_error(error, block);
|
|
239
|
+
} finally {
|
|
240
|
+
active_block = previous_block;
|
|
241
|
+
active_reaction = previous_reaction;
|
|
242
|
+
tracking = previous_tracking;
|
|
243
|
+
active_dependency = previous_dependency;
|
|
244
|
+
active_component = previous_component;
|
|
245
|
+
}
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
+
var empty_get_set = { get: undefined, set: undefined };
|
|
249
|
+
|
|
248
250
|
/**
|
|
249
251
|
*
|
|
250
252
|
* @param {any} v
|
|
251
253
|
* @param {Block} b
|
|
254
|
+
* @param {Function} [get]
|
|
255
|
+
* @param {Function} [set]
|
|
252
256
|
* @returns {Tracked}
|
|
253
257
|
*/
|
|
254
|
-
export function tracked(v, b) {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
258
|
+
export function tracked(v, b, get, set) {
|
|
259
|
+
// TODO: now we expose tracked, we should likely block access in DEV somehow
|
|
260
|
+
return {
|
|
261
|
+
a: get || set ? { get, set } : empty_get_set,
|
|
262
|
+
b,
|
|
263
|
+
c: 0,
|
|
264
|
+
f: TRACKED,
|
|
265
|
+
v,
|
|
266
|
+
};
|
|
262
267
|
}
|
|
263
268
|
|
|
264
269
|
/**
|
|
265
270
|
* @param {any} fn
|
|
266
271
|
* @param {any} block
|
|
272
|
+
* @param {Function} [get]
|
|
273
|
+
* @param {Function} [set]
|
|
267
274
|
* @returns {Derived}
|
|
268
275
|
*/
|
|
269
|
-
export function derived(fn, block) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
276
|
+
export function derived(fn, block, get, set) {
|
|
277
|
+
return {
|
|
278
|
+
a: get || set ? { get, set } : empty_get_set,
|
|
279
|
+
b: block,
|
|
280
|
+
blocks: null,
|
|
281
|
+
c: 0,
|
|
282
|
+
co: active_component,
|
|
283
|
+
d: null,
|
|
284
|
+
f: TRACKED | DERIVED,
|
|
285
|
+
fn,
|
|
286
|
+
v: UNINITIALIZED,
|
|
287
|
+
};
|
|
280
288
|
}
|
|
281
289
|
|
|
282
290
|
/**
|
|
283
291
|
* @param {any} v
|
|
284
|
-
* @param {TrackOptions | undefined} o
|
|
292
|
+
* @param {TrackOptions<any> | undefined} o
|
|
285
293
|
* @param {Block} b
|
|
286
294
|
* @returns {Tracked | Derived | Tracked[]}
|
|
287
295
|
*/
|
|
288
296
|
export function track(v, o, b) {
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
297
|
+
var is_tracked = is_tracked_object(v);
|
|
298
|
+
var get;
|
|
299
|
+
var set;
|
|
300
|
+
|
|
301
|
+
if (o !== undefined) {
|
|
302
|
+
get = o.get;
|
|
303
|
+
set = o.set;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
if (o === undefined || get || set) {
|
|
307
|
+
if (is_tracked) {
|
|
308
|
+
return v;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (typeof v === 'function') {
|
|
312
|
+
return derived(v, b, get, set);
|
|
313
|
+
}
|
|
314
|
+
return tracked(v, b, get, set);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
if (is_tracked || typeof v !== 'object' || v === null || is_array(v)) {
|
|
318
|
+
throw new TypeError('Invalid value: expected a non-tracked object');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
var list = o.split ?? [];
|
|
322
|
+
/** @type {Tracked[]} */
|
|
323
|
+
var out = [];
|
|
324
|
+
/** @type {Record<string|symbol, any>} */
|
|
325
|
+
var rest = {};
|
|
326
|
+
/** @type {Record<PropertyKey, any | null>} */
|
|
327
|
+
var descriptors = get_descriptors(v);
|
|
328
|
+
|
|
329
|
+
for (let i = 0, key, t; i < list.length; i++) {
|
|
330
|
+
key = list[i];
|
|
331
|
+
|
|
332
|
+
if (is_tracked_object(v[key])) {
|
|
333
|
+
t = v[key];
|
|
334
|
+
} else {
|
|
335
|
+
t = define_property(tracked(undefined, b), 'v', descriptors[key]);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
out[i] = t;
|
|
339
|
+
descriptors[key] = null;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
var props = Reflect.ownKeys(descriptors);
|
|
343
|
+
for (let i = 0, key; i < props.length; i++) {
|
|
344
|
+
key = props[i];
|
|
345
|
+
if (descriptors[key] === null) {
|
|
346
|
+
continue;
|
|
347
|
+
}
|
|
348
|
+
define_property(rest, key, descriptors[key]);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
out.push(tracked(rest, b));
|
|
352
|
+
|
|
353
|
+
return out;
|
|
339
354
|
}
|
|
340
355
|
|
|
341
356
|
/**
|
|
@@ -343,412 +358,420 @@ export function track(v, o, b) {
|
|
|
343
358
|
* @returns {Dependency}
|
|
344
359
|
*/
|
|
345
360
|
function create_dependency(tracked) {
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
361
|
+
var reaction = /** @type {Derived | Block} **/ (active_reaction);
|
|
362
|
+
var existing = reaction.d;
|
|
363
|
+
|
|
364
|
+
// Recycle tracking entries
|
|
365
|
+
if (existing !== null) {
|
|
366
|
+
reaction.d = existing.n;
|
|
367
|
+
existing.c = tracked.c;
|
|
368
|
+
existing.t = tracked;
|
|
369
|
+
existing.n = null;
|
|
370
|
+
return existing;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
return {
|
|
374
|
+
c: tracked.c,
|
|
375
|
+
t: tracked,
|
|
376
|
+
n: null,
|
|
377
|
+
};
|
|
363
378
|
}
|
|
364
379
|
|
|
365
380
|
/**
|
|
366
381
|
* @param {Dependency | null} tracking
|
|
367
382
|
*/
|
|
368
383
|
function is_tracking_dirty(tracking) {
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
384
|
+
if (tracking === null) {
|
|
385
|
+
return false;
|
|
386
|
+
}
|
|
387
|
+
while (tracking !== null) {
|
|
388
|
+
var tracked = tracking.t;
|
|
389
|
+
|
|
390
|
+
if ((tracked.f & DERIVED) !== 0) {
|
|
391
|
+
update_derived(/** @type {Derived} **/ (tracked));
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
if (tracked.c > tracking.c) {
|
|
395
|
+
return true;
|
|
396
|
+
}
|
|
397
|
+
tracking = tracking.n;
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
return false;
|
|
386
401
|
}
|
|
387
402
|
|
|
388
403
|
/**
|
|
389
404
|
* @param {Block} block
|
|
390
405
|
*/
|
|
391
406
|
export function is_block_dirty(block) {
|
|
392
|
-
|
|
407
|
+
var flags = block.f;
|
|
393
408
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
409
|
+
if ((flags & (ROOT_BLOCK | BRANCH_BLOCK)) !== 0) {
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
if ((flags & BLOCK_HAS_RUN) === 0) {
|
|
413
|
+
block.f ^= BLOCK_HAS_RUN;
|
|
414
|
+
return true;
|
|
415
|
+
}
|
|
401
416
|
|
|
402
|
-
|
|
417
|
+
return is_tracking_dirty(block.d);
|
|
403
418
|
}
|
|
404
419
|
|
|
405
420
|
export function async_computed(fn, block) {
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
421
|
+
let parent = active_reaction;
|
|
422
|
+
var t = tracked(UNINITIALIZED, block);
|
|
423
|
+
var promise;
|
|
424
|
+
var new_values = new Map();
|
|
425
|
+
|
|
426
|
+
render(() => {
|
|
427
|
+
var [current, deferred] = capture_deferred(() => (promise = fn()));
|
|
428
|
+
|
|
429
|
+
var restore = capture();
|
|
430
|
+
var unuspend;
|
|
431
|
+
|
|
432
|
+
if (deferred === null) {
|
|
433
|
+
unuspend = suspend();
|
|
434
|
+
} else {
|
|
435
|
+
for (var i = 0; i < deferred.length; i++) {
|
|
436
|
+
var tracked = deferred[i];
|
|
437
|
+
new_values.set(tracked, { v: tracked.v, c: tracked.c });
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
promise.then((v) => {
|
|
442
|
+
if (is_destroyed(parent)) {
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
if (promise === current && t.v !== v) {
|
|
446
|
+
restore();
|
|
447
|
+
|
|
448
|
+
if (t.v === UNINITIALIZED) {
|
|
449
|
+
t.v = v;
|
|
450
|
+
} else {
|
|
451
|
+
set(t, v, block);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
if (deferred === null) {
|
|
456
|
+
unuspend();
|
|
457
|
+
} else if (promise === current) {
|
|
458
|
+
for (var i = 0; i < deferred.length; i++) {
|
|
459
|
+
var tracked = deferred[i];
|
|
460
|
+
var { v, c } = new_values.get(tracked);
|
|
461
|
+
tracked.v = v;
|
|
462
|
+
tracked.c = c;
|
|
463
|
+
schedule_update(tracked.b);
|
|
464
|
+
}
|
|
465
|
+
new_values.clear();
|
|
466
|
+
}
|
|
467
|
+
});
|
|
468
|
+
}, ASYNC_BLOCK);
|
|
469
|
+
|
|
470
|
+
return new Promise(async (resolve) => {
|
|
471
|
+
var p;
|
|
472
|
+
while (p !== (p = promise)) await p;
|
|
473
|
+
return resolve(t);
|
|
474
|
+
});
|
|
460
475
|
}
|
|
461
476
|
|
|
462
477
|
export function deferred(fn) {
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
478
|
+
// var parent = active_block;
|
|
479
|
+
// var block = active_scope;
|
|
480
|
+
// var res = [UNINITIALIZED];
|
|
481
|
+
// // TODO implement DEFERRED flag on tracked
|
|
482
|
+
// var t = tracked(UNINITIALIZED, block, DEFERRED);
|
|
483
|
+
// var tracked_properties = [t];
|
|
484
|
+
// var prev_value = UNINITIALIZED;
|
|
485
|
+
// define_property(res, TRACKED_OBJECT, {
|
|
486
|
+
// value: tracked_properties,
|
|
487
|
+
// enumerable: false,
|
|
488
|
+
// });
|
|
489
|
+
// render(() => {
|
|
490
|
+
// if (prev_value !== UNINITIALIZED) {
|
|
491
|
+
// t.v = prev_value;
|
|
492
|
+
// } else {
|
|
493
|
+
// prev_value = t.v;
|
|
494
|
+
// }
|
|
495
|
+
// var prev_version = t.c;
|
|
496
|
+
// var value = fn();
|
|
497
|
+
// res[0] = value;
|
|
498
|
+
// old_set_property(res, 0, value, block);
|
|
499
|
+
// if (prev_value !== UNINITIALIZED) {
|
|
500
|
+
// if ((t.f & DEFERRED) === 0) {
|
|
501
|
+
// t.f ^= DEFERRED;
|
|
502
|
+
// }
|
|
503
|
+
// var is_awaited = flush_deferred_upodates(parent);
|
|
504
|
+
// if ((t.f & DEFERRED) !== 0) {
|
|
505
|
+
// t.f ^= DEFERRED;
|
|
506
|
+
// }
|
|
507
|
+
// if (is_awaited) {
|
|
508
|
+
// t.c = prev_version;
|
|
509
|
+
// t.v = prev_value;
|
|
510
|
+
// prev_value = value;
|
|
511
|
+
// }
|
|
512
|
+
// }
|
|
513
|
+
// });
|
|
514
|
+
// return res;
|
|
500
515
|
}
|
|
501
516
|
|
|
502
517
|
function capture_deferred(fn) {
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
+
var value = fn();
|
|
519
|
+
var deferred = null;
|
|
520
|
+
var depedency = active_dependency;
|
|
521
|
+
|
|
522
|
+
while (depedency !== null) {
|
|
523
|
+
var tracked = depedency.t;
|
|
524
|
+
if ((tracked.f & DEFERRED) !== 0) {
|
|
525
|
+
deferred ??= [];
|
|
526
|
+
deferred.push(tracked);
|
|
527
|
+
break;
|
|
528
|
+
}
|
|
529
|
+
depedency = depedency.n;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
return [value, deferred];
|
|
518
533
|
}
|
|
519
534
|
|
|
520
535
|
/**
|
|
521
536
|
* @param {Block} block
|
|
522
537
|
*/
|
|
523
538
|
function flush_deferred_upodates(block) {
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
539
|
+
var current = block.first;
|
|
540
|
+
var is_awaited = false;
|
|
541
|
+
|
|
542
|
+
main_loop: while (current !== null) {
|
|
543
|
+
var flags = current.f;
|
|
544
|
+
|
|
545
|
+
if ((flags & ASYNC_BLOCK) !== 0 && is_block_dirty(current)) {
|
|
546
|
+
is_awaited = true;
|
|
547
|
+
run_block(current);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
var parent = current.p;
|
|
551
|
+
current = current.next;
|
|
552
|
+
|
|
553
|
+
while (current === null && parent !== null) {
|
|
554
|
+
if (parent === block) {
|
|
555
|
+
break main_loop;
|
|
556
|
+
}
|
|
557
|
+
current = parent.next;
|
|
558
|
+
parent = parent.p;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return is_awaited;
|
|
548
563
|
}
|
|
549
564
|
|
|
550
565
|
/**
|
|
551
566
|
* @param {Block} root_block
|
|
552
567
|
*/
|
|
553
568
|
function flush_updates(root_block) {
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
569
|
+
/** @type {Block | null} */
|
|
570
|
+
var current = root_block;
|
|
571
|
+
var containing_update = null;
|
|
572
|
+
var effects = [];
|
|
573
|
+
|
|
574
|
+
while (current !== null) {
|
|
575
|
+
var flags = current.f;
|
|
576
|
+
|
|
577
|
+
if ((flags & CONTAINS_UPDATE) !== 0) {
|
|
578
|
+
current.f ^= CONTAINS_UPDATE;
|
|
579
|
+
containing_update = current;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
if ((flags & PAUSED) === 0 && containing_update !== null) {
|
|
583
|
+
if ((flags & EFFECT_BLOCK) !== 0) {
|
|
584
|
+
effects.push(current);
|
|
585
|
+
} else {
|
|
586
|
+
try {
|
|
587
|
+
if (is_block_dirty(current)) {
|
|
588
|
+
run_block(current);
|
|
589
|
+
}
|
|
590
|
+
} catch (error) {
|
|
591
|
+
handle_error(error, current);
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
/** @type {Block | null} */
|
|
595
|
+
var child = current.first;
|
|
596
|
+
|
|
597
|
+
if (child !== null) {
|
|
598
|
+
current = child;
|
|
599
|
+
continue;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
/** @type {Block | null} */
|
|
604
|
+
var parent = current.p;
|
|
605
|
+
current = current.next;
|
|
606
|
+
|
|
607
|
+
while (current === null && parent !== null) {
|
|
608
|
+
if (parent === containing_update) {
|
|
609
|
+
containing_update = null;
|
|
610
|
+
}
|
|
611
|
+
current = parent.next;
|
|
612
|
+
parent = parent.p;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
var length = effects.length;
|
|
617
|
+
|
|
618
|
+
for (var i = 0; i < length; i++) {
|
|
619
|
+
var effect = effects[i];
|
|
620
|
+
var flags = effect.f;
|
|
621
|
+
|
|
622
|
+
try {
|
|
623
|
+
if ((flags & (PAUSED | DESTROYED)) === 0 && is_block_dirty(effect)) {
|
|
624
|
+
run_block(effect);
|
|
625
|
+
}
|
|
626
|
+
} catch (error) {
|
|
627
|
+
handle_error(error, effect);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
615
630
|
}
|
|
616
631
|
|
|
617
632
|
/**
|
|
618
633
|
* @param {Block[]} root_blocks
|
|
619
634
|
*/
|
|
620
635
|
function flush_queued_root_blocks(root_blocks) {
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
636
|
+
for (let i = 0; i < root_blocks.length; i++) {
|
|
637
|
+
flush_updates(root_blocks[i]);
|
|
638
|
+
}
|
|
624
639
|
}
|
|
625
640
|
|
|
626
641
|
function flush_microtasks() {
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
642
|
+
is_micro_task_queued = false;
|
|
643
|
+
|
|
644
|
+
if (queued_microtasks.length > 0) {
|
|
645
|
+
var microtasks = queued_microtasks;
|
|
646
|
+
queued_microtasks = [];
|
|
647
|
+
for (var i = 0; i < microtasks.length; i++) {
|
|
648
|
+
microtasks[i]();
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
if (flush_count > 1001) {
|
|
653
|
+
return;
|
|
654
|
+
}
|
|
655
|
+
var previous_queued_root_blocks = queued_root_blocks;
|
|
656
|
+
queued_root_blocks = [];
|
|
657
|
+
flush_queued_root_blocks(previous_queued_root_blocks);
|
|
658
|
+
|
|
659
|
+
if (!is_micro_task_queued) {
|
|
660
|
+
flush_count = 0;
|
|
661
|
+
}
|
|
662
|
+
old_values.clear();
|
|
648
663
|
}
|
|
649
664
|
|
|
650
665
|
/**
|
|
651
666
|
* @param { (() => void) } [fn]
|
|
652
667
|
*/
|
|
653
668
|
export function queue_microtask(fn) {
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
669
|
+
if (!is_micro_task_queued) {
|
|
670
|
+
is_micro_task_queued = true;
|
|
671
|
+
queueMicrotask(flush_microtasks);
|
|
672
|
+
}
|
|
673
|
+
if (fn !== undefined) {
|
|
674
|
+
queued_microtasks.push(fn);
|
|
675
|
+
}
|
|
661
676
|
}
|
|
662
677
|
|
|
663
678
|
/**
|
|
664
679
|
* @param {Block} block
|
|
665
680
|
*/
|
|
666
681
|
export function schedule_update(block) {
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
682
|
+
if (scheduler_mode === FLUSH_MICROTASK) {
|
|
683
|
+
queue_microtask();
|
|
684
|
+
}
|
|
685
|
+
let current = block;
|
|
686
|
+
|
|
687
|
+
while (current !== null) {
|
|
688
|
+
var flags = current.f;
|
|
689
|
+
if ((flags & CONTAINS_UPDATE) !== 0) return;
|
|
690
|
+
current.f ^= CONTAINS_UPDATE;
|
|
691
|
+
if ((flags & ROOT_BLOCK) !== 0) {
|
|
692
|
+
break;
|
|
693
|
+
}
|
|
694
|
+
current = /** @type {Block} */ (current.p);
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
queued_root_blocks.push(current);
|
|
683
698
|
}
|
|
684
699
|
|
|
685
700
|
/**
|
|
686
701
|
* @param {Tracked} tracked
|
|
687
702
|
*/
|
|
688
703
|
function register_dependency(tracked) {
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
704
|
+
var dependency = active_dependency;
|
|
705
|
+
|
|
706
|
+
if (dependency === null) {
|
|
707
|
+
dependency = create_dependency(tracked);
|
|
708
|
+
active_dependency = dependency;
|
|
709
|
+
} else {
|
|
710
|
+
var current = dependency;
|
|
711
|
+
|
|
712
|
+
while (current !== null) {
|
|
713
|
+
if (current.t === tracked) {
|
|
714
|
+
current.c = tracked.c;
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
var next = current.n;
|
|
718
|
+
if (next === null) {
|
|
719
|
+
break;
|
|
720
|
+
}
|
|
721
|
+
current = next;
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
dependency = create_dependency(tracked);
|
|
725
|
+
current.n = dependency;
|
|
726
|
+
}
|
|
712
727
|
}
|
|
713
728
|
|
|
714
729
|
/**
|
|
715
730
|
* @param {Derived} computed
|
|
716
731
|
*/
|
|
717
732
|
export function get_derived(computed) {
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
733
|
+
update_derived(computed);
|
|
734
|
+
if (tracking) {
|
|
735
|
+
register_dependency(computed);
|
|
736
|
+
}
|
|
737
|
+
var get = computed.a.get;
|
|
738
|
+
if (get) {
|
|
739
|
+
computed.v = get(computed.v);
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
return computed.v;
|
|
724
743
|
}
|
|
725
744
|
|
|
726
745
|
/**
|
|
727
746
|
* @param {Derived | Tracked} tracked
|
|
728
747
|
*/
|
|
729
748
|
export function get(tracked) {
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
749
|
+
// reflect back the value if it's not boxed
|
|
750
|
+
if (!is_tracked_object(tracked)) {
|
|
751
|
+
return tracked;
|
|
752
|
+
}
|
|
753
|
+
|
|
754
|
+
return (tracked.f & DERIVED) !== 0
|
|
755
|
+
? get_derived(/** @type {Derived} */ (tracked))
|
|
756
|
+
: get_tracked(tracked);
|
|
738
757
|
}
|
|
739
758
|
|
|
740
759
|
/**
|
|
741
760
|
* @param {Tracked} tracked
|
|
742
761
|
*/
|
|
743
762
|
export function get_tracked(tracked) {
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
763
|
+
var value = tracked.v;
|
|
764
|
+
if (tracking) {
|
|
765
|
+
register_dependency(tracked);
|
|
766
|
+
}
|
|
767
|
+
if (teardown && old_values.has(tracked)) {
|
|
768
|
+
value = old_values.get(tracked);
|
|
769
|
+
}
|
|
770
|
+
var get = tracked.a.get;
|
|
771
|
+
if (get) {
|
|
772
|
+
tracked.v = get(value);
|
|
773
|
+
}
|
|
774
|
+
return value;
|
|
752
775
|
}
|
|
753
776
|
|
|
754
777
|
/**
|
|
@@ -757,27 +780,32 @@ export function get_tracked(tracked) {
|
|
|
757
780
|
* @param {Block} block
|
|
758
781
|
*/
|
|
759
782
|
export function set(tracked, value, block) {
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
783
|
+
var old_value = tracked.v;
|
|
784
|
+
|
|
785
|
+
if (value !== old_value) {
|
|
786
|
+
var tracked_block = tracked.b;
|
|
787
|
+
|
|
788
|
+
if (!tracked_block) {
|
|
789
|
+
debugger;
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
if ((block.f & CONTAINS_TEARDOWN) !== 0) {
|
|
793
|
+
if (teardown) {
|
|
794
|
+
old_values.set(tracked, value);
|
|
795
|
+
} else {
|
|
796
|
+
old_values.set(tracked, old_value);
|
|
797
|
+
}
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
var set = tracked.a.set;
|
|
801
|
+
if (set) {
|
|
802
|
+
value = set(value);
|
|
803
|
+
}
|
|
804
|
+
|
|
805
|
+
tracked.v = value;
|
|
806
|
+
tracked.c = increment_clock();
|
|
807
|
+
schedule_update(tracked_block);
|
|
808
|
+
}
|
|
781
809
|
}
|
|
782
810
|
|
|
783
811
|
/**
|
|
@@ -786,16 +814,16 @@ export function set(tracked, value, block) {
|
|
|
786
814
|
* @returns {T}
|
|
787
815
|
*/
|
|
788
816
|
export function untrack(fn) {
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
817
|
+
var previous_tracking = tracking;
|
|
818
|
+
var previous_dependency = active_dependency;
|
|
819
|
+
tracking = false;
|
|
820
|
+
active_dependency = null;
|
|
821
|
+
try {
|
|
822
|
+
return fn();
|
|
823
|
+
} finally {
|
|
824
|
+
tracking = previous_tracking;
|
|
825
|
+
active_dependency = previous_dependency;
|
|
826
|
+
}
|
|
799
827
|
}
|
|
800
828
|
|
|
801
829
|
/**
|
|
@@ -804,32 +832,32 @@ export function untrack(fn) {
|
|
|
804
832
|
* @returns {T}
|
|
805
833
|
*/
|
|
806
834
|
export function flush_sync(fn) {
|
|
807
|
-
|
|
808
|
-
|
|
835
|
+
var previous_scheduler_mode = scheduler_mode;
|
|
836
|
+
var previous_queued_root_blocks = queued_root_blocks;
|
|
809
837
|
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
838
|
+
try {
|
|
839
|
+
/** @type {Block[]} */
|
|
840
|
+
var root_blocks = [];
|
|
813
841
|
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
842
|
+
scheduler_mode = FLUSH_SYNC;
|
|
843
|
+
queued_root_blocks = root_blocks;
|
|
844
|
+
is_micro_task_queued = false;
|
|
817
845
|
|
|
818
|
-
|
|
846
|
+
flush_queued_root_blocks(previous_queued_root_blocks);
|
|
819
847
|
|
|
820
|
-
|
|
848
|
+
var result = fn?.();
|
|
821
849
|
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
850
|
+
if (queued_root_blocks.length > 0 || root_blocks.length > 0) {
|
|
851
|
+
flush_sync();
|
|
852
|
+
}
|
|
825
853
|
|
|
826
|
-
|
|
854
|
+
flush_count = 0;
|
|
827
855
|
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
856
|
+
return /** @type {T} */ (result);
|
|
857
|
+
} finally {
|
|
858
|
+
scheduler_mode = previous_scheduler_mode;
|
|
859
|
+
queued_root_blocks = previous_queued_root_blocks;
|
|
860
|
+
}
|
|
833
861
|
}
|
|
834
862
|
|
|
835
863
|
/**
|
|
@@ -838,17 +866,17 @@ export function flush_sync(fn) {
|
|
|
838
866
|
* @returns {Object}
|
|
839
867
|
*/
|
|
840
868
|
export function spread_props(fn, block) {
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
869
|
+
let computed = derived(fn, block);
|
|
870
|
+
|
|
871
|
+
return new Proxy(
|
|
872
|
+
{},
|
|
873
|
+
{
|
|
874
|
+
get(target, property) {
|
|
875
|
+
const obj = get_derived(computed);
|
|
876
|
+
return obj[property];
|
|
877
|
+
},
|
|
878
|
+
},
|
|
879
|
+
);
|
|
852
880
|
}
|
|
853
881
|
|
|
854
882
|
/**
|
|
@@ -857,11 +885,11 @@ export function spread_props(fn, block) {
|
|
|
857
885
|
* @returns {() => T}
|
|
858
886
|
*/
|
|
859
887
|
export function computed_property(fn) {
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
888
|
+
define_property(fn, COMPUTED_PROPERTY, {
|
|
889
|
+
value: true,
|
|
890
|
+
enumerable: false,
|
|
891
|
+
});
|
|
892
|
+
return fn;
|
|
865
893
|
}
|
|
866
894
|
|
|
867
895
|
/**
|
|
@@ -873,17 +901,17 @@ export function computed_property(fn) {
|
|
|
873
901
|
* @returns {any}
|
|
874
902
|
*/
|
|
875
903
|
export function call_property(obj, property, chain_obj, chain_prop, ...args) {
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
904
|
+
// don't swallow errors if either the object or property is nullish,
|
|
905
|
+
// respect optional chaining as provided
|
|
906
|
+
if (!chain_obj && !chain_prop) {
|
|
907
|
+
return obj[property].call(obj, ...args);
|
|
908
|
+
} else if (chain_obj && chain_prop) {
|
|
909
|
+
return obj?.[property]?.call(obj, ...args);
|
|
910
|
+
} else if (chain_obj) {
|
|
911
|
+
return obj?.[property].call(obj, ...args);
|
|
912
|
+
} else if (chain_prop) {
|
|
913
|
+
return obj[property]?.call(obj, ...args);
|
|
914
|
+
}
|
|
887
915
|
}
|
|
888
916
|
|
|
889
917
|
/**
|
|
@@ -893,19 +921,19 @@ export function call_property(obj, property, chain_obj, chain_prop, ...args) {
|
|
|
893
921
|
* @returns {any}
|
|
894
922
|
*/
|
|
895
923
|
export function get_property(obj, property, chain = false) {
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
924
|
+
if (chain && obj == null) {
|
|
925
|
+
return undefined;
|
|
926
|
+
}
|
|
927
|
+
var tracked = obj[property];
|
|
928
|
+
if (tracked == null) {
|
|
929
|
+
return tracked;
|
|
930
|
+
}
|
|
931
|
+
return get(tracked);
|
|
904
932
|
}
|
|
905
933
|
|
|
906
934
|
export function set_property(obj, property, value, block) {
|
|
907
|
-
|
|
908
|
-
|
|
935
|
+
var tracked = obj[property];
|
|
936
|
+
set(tracked, value, block);
|
|
909
937
|
}
|
|
910
938
|
|
|
911
939
|
/**
|
|
@@ -915,10 +943,10 @@ export function set_property(obj, property, value, block) {
|
|
|
915
943
|
* @returns {number}
|
|
916
944
|
*/
|
|
917
945
|
export function update(tracked, block, d = 1) {
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
946
|
+
var value = get(tracked);
|
|
947
|
+
var result = d === 1 ? value++ : value--;
|
|
948
|
+
set(tracked, value, block);
|
|
949
|
+
return result;
|
|
922
950
|
}
|
|
923
951
|
|
|
924
952
|
/**
|
|
@@ -927,7 +955,7 @@ export function update(tracked, block, d = 1) {
|
|
|
927
955
|
* @returns {void}
|
|
928
956
|
*/
|
|
929
957
|
export function increment(tracked, block) {
|
|
930
|
-
|
|
958
|
+
set(tracked, tracked.v + 1, block);
|
|
931
959
|
}
|
|
932
960
|
|
|
933
961
|
/**
|
|
@@ -936,7 +964,7 @@ export function increment(tracked, block) {
|
|
|
936
964
|
* @returns {void}
|
|
937
965
|
*/
|
|
938
966
|
export function decrement(tracked, block) {
|
|
939
|
-
|
|
967
|
+
set(tracked, tracked.v - 1, block);
|
|
940
968
|
}
|
|
941
969
|
|
|
942
970
|
/**
|
|
@@ -946,26 +974,26 @@ export function decrement(tracked, block) {
|
|
|
946
974
|
* @returns {number}
|
|
947
975
|
*/
|
|
948
976
|
export function update_pre(tracked, block, d = 1) {
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
977
|
+
var value = get(tracked);
|
|
978
|
+
var new_value = d === 1 ? ++value : --value;
|
|
979
|
+
set(tracked, new_value, block);
|
|
980
|
+
return new_value;
|
|
953
981
|
}
|
|
954
982
|
|
|
955
983
|
export function update_property(obj, property, block, d = 1) {
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
984
|
+
var tracked = obj[property];
|
|
985
|
+
var value = get(tracked);
|
|
986
|
+
var new_value = d === 1 ? value++ : value--;
|
|
987
|
+
set(tracked, value, block);
|
|
988
|
+
return new_value;
|
|
961
989
|
}
|
|
962
990
|
|
|
963
991
|
export function update_pre_property(obj, property, block, d = 1) {
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
967
|
-
|
|
968
|
-
|
|
992
|
+
var tracked = obj[property];
|
|
993
|
+
var value = get(tracked);
|
|
994
|
+
var new_value = d === 1 ? ++value : --value;
|
|
995
|
+
set(tracked, new_value, block);
|
|
996
|
+
return new_value;
|
|
969
997
|
}
|
|
970
998
|
|
|
971
999
|
/**
|
|
@@ -975,20 +1003,20 @@ export function update_pre_property(obj, property, block, d = 1) {
|
|
|
975
1003
|
* @returns {T}
|
|
976
1004
|
*/
|
|
977
1005
|
export function with_scope(block, fn) {
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
1006
|
+
var previous_scope = active_scope;
|
|
1007
|
+
try {
|
|
1008
|
+
active_scope = block;
|
|
1009
|
+
return fn();
|
|
1010
|
+
} finally {
|
|
1011
|
+
active_scope = previous_scope;
|
|
1012
|
+
}
|
|
985
1013
|
}
|
|
986
1014
|
|
|
987
1015
|
/**
|
|
988
1016
|
* @returns {Block | null}
|
|
989
1017
|
*/
|
|
990
1018
|
export function scope() {
|
|
991
|
-
|
|
1019
|
+
return active_scope;
|
|
992
1020
|
}
|
|
993
1021
|
|
|
994
1022
|
/**
|
|
@@ -996,49 +1024,49 @@ export function scope() {
|
|
|
996
1024
|
* @returns {Block | never}
|
|
997
1025
|
*/
|
|
998
1026
|
export function safe_scope(err = 'Cannot access outside of a component context') {
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1027
|
+
if (active_scope === null) {
|
|
1028
|
+
throw new Error(err);
|
|
1029
|
+
}
|
|
1002
1030
|
|
|
1003
|
-
|
|
1031
|
+
return /** @type {Block} */ (active_scope);
|
|
1004
1032
|
}
|
|
1005
1033
|
|
|
1006
1034
|
export function push_component() {
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1035
|
+
var component = {
|
|
1036
|
+
c: null,
|
|
1037
|
+
e: null,
|
|
1038
|
+
m: false,
|
|
1039
|
+
p: active_component,
|
|
1040
|
+
};
|
|
1041
|
+
active_component = component;
|
|
1014
1042
|
}
|
|
1015
1043
|
|
|
1016
1044
|
export function pop_component() {
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1045
|
+
var component = /** @type {Component} */ (active_component);
|
|
1046
|
+
component.m = true;
|
|
1047
|
+
var effects = component.e;
|
|
1048
|
+
if (effects !== null) {
|
|
1049
|
+
var length = effects.length;
|
|
1050
|
+
for (var i = 0; i < length; i++) {
|
|
1051
|
+
var { b: block, fn, r: reaction } = effects[i];
|
|
1052
|
+
var previous_block = active_block;
|
|
1053
|
+
var previous_reaction = active_reaction;
|
|
1054
|
+
|
|
1055
|
+
try {
|
|
1056
|
+
active_block = block;
|
|
1057
|
+
active_reaction = reaction;
|
|
1058
|
+
effect(fn);
|
|
1059
|
+
} finally {
|
|
1060
|
+
active_block = previous_block;
|
|
1061
|
+
active_reaction = previous_reaction;
|
|
1062
|
+
}
|
|
1063
|
+
}
|
|
1064
|
+
}
|
|
1065
|
+
active_component = component.p;
|
|
1038
1066
|
}
|
|
1039
1067
|
|
|
1040
1068
|
export function ref_prop() {
|
|
1041
|
-
|
|
1069
|
+
return Symbol(REF_PROP);
|
|
1042
1070
|
}
|
|
1043
1071
|
|
|
1044
1072
|
/**
|
|
@@ -1048,7 +1076,7 @@ export function ref_prop() {
|
|
|
1048
1076
|
* @returns {T}
|
|
1049
1077
|
*/
|
|
1050
1078
|
export function fallback(value, fallback) {
|
|
1051
|
-
|
|
1079
|
+
return value === undefined ? fallback : value;
|
|
1052
1080
|
}
|
|
1053
1081
|
|
|
1054
1082
|
/**
|
|
@@ -1057,35 +1085,35 @@ export function fallback(value, fallback) {
|
|
|
1057
1085
|
* @returns {Record<string, unknown>}
|
|
1058
1086
|
*/
|
|
1059
1087
|
export function exclude_from_object(obj, keys) {
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1088
|
+
obj = { ...obj };
|
|
1089
|
+
let key;
|
|
1090
|
+
for (key of keys) {
|
|
1091
|
+
delete obj[key];
|
|
1092
|
+
}
|
|
1093
|
+
return obj;
|
|
1066
1094
|
}
|
|
1067
1095
|
|
|
1068
1096
|
/**
|
|
1069
1097
|
* @param {any} v
|
|
1070
1098
|
*/
|
|
1071
1099
|
export async function maybe_tracked(v) {
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1100
|
+
var restore = capture();
|
|
1101
|
+
let value;
|
|
1102
|
+
|
|
1103
|
+
if (is_tracked_object(v)) {
|
|
1104
|
+
if ((v.f & DERIVED) !== 0) {
|
|
1105
|
+
value = await async_computed(v.fn, v.b);
|
|
1106
|
+
} else {
|
|
1107
|
+
value = await async_computed(async () => {
|
|
1108
|
+
return await get_tracked(v);
|
|
1109
|
+
}, /** @type {Block} */ (active_block));
|
|
1110
|
+
}
|
|
1111
|
+
} else {
|
|
1112
|
+
value = await v;
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
return () => {
|
|
1116
|
+
restore();
|
|
1117
|
+
return value;
|
|
1118
|
+
};
|
|
1091
1119
|
}
|