ripple 0.2.140 → 0.2.142
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 +2 -2
- package/src/compiler/phases/1-parse/index.js +7 -3
- package/src/compiler/phases/2-analyze/index.js +11 -9
- package/src/compiler/phases/3-transform/client/index.js +25 -6
- package/src/compiler/utils.js +22 -11
- package/src/runtime/date.js +1 -1
- package/src/runtime/internal/client/index.js +3 -1
- package/src/runtime/internal/client/render.js +23 -23
- package/src/runtime/internal/client/runtime.js +44 -28
- package/src/runtime/map.js +182 -182
- package/src/runtime/media-query.js +1 -1
- package/src/runtime/proxy.js +279 -279
- package/src/runtime/set.js +168 -168
- package/src/runtime/url-search-params.js +5 -5
- package/src/runtime/url.js +18 -18
- package/tests/client/compiler/compiler.basic.test.ripple +17 -0
- package/tests/client/composite/composite.props.test.ripple +44 -2
- package/types/index.d.ts +1 -1
package/src/runtime/proxy.js
CHANGED
|
@@ -4,17 +4,17 @@
|
|
|
4
4
|
|
|
5
5
|
import { get, set, tracked } from './internal/client/runtime.js';
|
|
6
6
|
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
array_prototype,
|
|
8
|
+
get_descriptor,
|
|
9
|
+
get_prototype_of,
|
|
10
|
+
is_array,
|
|
11
|
+
object_prototype,
|
|
12
12
|
} from './internal/client/utils.js';
|
|
13
13
|
import {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
MAX_ARRAY_LENGTH,
|
|
15
|
+
TRACKED_ARRAY,
|
|
16
|
+
TRACKED_OBJECT,
|
|
17
|
+
UNINITIALIZED,
|
|
18
18
|
} from './internal/client/constants.js';
|
|
19
19
|
|
|
20
20
|
/**
|
|
@@ -24,111 +24,111 @@ import {
|
|
|
24
24
|
* @returns {TrackedArray<T> | TrackedObject<T>}
|
|
25
25
|
*/
|
|
26
26
|
export function proxy(value, block) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
27
|
+
// if non-proxyable, or is already a proxy, return `value`
|
|
28
|
+
if (
|
|
29
|
+
typeof value !== 'object'
|
|
30
|
+
|| value === null
|
|
31
|
+
|| TRACKED_ARRAY in value
|
|
32
|
+
|| TRACKED_OBJECT in value
|
|
33
|
+
) {
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const prototype = get_prototype_of(value);
|
|
38
|
+
|
|
39
|
+
if (prototype !== object_prototype && prototype !== array_prototype) {
|
|
40
|
+
return value;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** @type {Map<any,Tracked>} */
|
|
44
|
+
var tracked_elements = new Map();
|
|
45
|
+
var is_proxied_array = is_array(value);
|
|
46
|
+
/** @type {Tracked} */
|
|
47
|
+
var tracked_len;
|
|
48
|
+
|
|
49
|
+
if (is_proxied_array) {
|
|
50
|
+
tracked_len = tracked(value.length, block);
|
|
51
|
+
tracked_elements.set('length', tracked_len);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return new Proxy(value, {
|
|
55
|
+
/**
|
|
56
|
+
* @param {PropertyKey} prop
|
|
57
|
+
*/
|
|
58
|
+
get(target, prop, receiver) {
|
|
59
|
+
var t = tracked_elements.get(prop);
|
|
60
|
+
var exists = prop in target;
|
|
61
|
+
|
|
62
|
+
if (t === undefined && (!exists || get_descriptor(target, prop)?.writable)) {
|
|
63
|
+
t = tracked(exists ? /** @type {any} */ (target)[prop] : UNINITIALIZED, block);
|
|
64
|
+
tracked_elements.set(prop, t);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
if (t !== undefined) {
|
|
68
|
+
var v = get(t);
|
|
69
|
+
return v === UNINITIALIZED ? undefined : v;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
var result = Reflect.get(target, prop, receiver);
|
|
73
|
+
|
|
74
|
+
if (typeof result === 'function') {
|
|
75
|
+
if (methods_returning_arrays.has(prop)) {
|
|
76
|
+
/** @type {(this: any, ...args: any[]) => any} */
|
|
77
|
+
return function (...args) {
|
|
78
|
+
var output = Reflect.apply(result, receiver, args);
|
|
79
|
+
|
|
80
|
+
if (Array.isArray(output) && output !== target) {
|
|
81
|
+
return array_proxy({ elements: output, block, use_array: true });
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return output;
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// When generating an iterator, we need to ensure that length is tracked
|
|
89
|
+
if (is_proxied_array && (prop === 'entries' || prop === 'values' || prop === 'keys')) {
|
|
90
|
+
receiver.length;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return result;
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
set(target, prop, value, receiver) {
|
|
98
|
+
var t = tracked_elements.get(prop);
|
|
99
|
+
var exists = prop in target;
|
|
100
|
+
|
|
101
|
+
if (is_proxied_array && prop === 'length' && t !== undefined) {
|
|
102
|
+
for (var i = value; i < t.__v; i += 1) {
|
|
103
|
+
var other_t = tracked_elements.get(i + '');
|
|
104
|
+
if (other_t !== undefined) {
|
|
105
|
+
set(other_t, UNINITIALIZED);
|
|
106
|
+
} else if (i in target) {
|
|
107
|
+
// If the item exists in the original, we need to create a uninitialized tracked,
|
|
108
|
+
// else a later read of the property would result in a tracked being created with
|
|
109
|
+
// the value of the original item at that index.
|
|
110
|
+
other_t = tracked(UNINITIALIZED, block);
|
|
111
|
+
tracked_elements.set(i + '', other_t);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// If we haven't yet created a tracked for this property, we need to ensure
|
|
117
|
+
// we do so otherwise if we read it later, then the write won't be tracked and
|
|
118
|
+
// the heuristics of effects will be different vs if we had read the proxied
|
|
119
|
+
// object property before writing to that property.
|
|
120
|
+
if (t === undefined) {
|
|
121
|
+
if (!exists || get_descriptor(target, prop)?.writable) {
|
|
122
|
+
t = tracked(undefined, block);
|
|
123
|
+
set(t, value);
|
|
124
|
+
|
|
125
|
+
tracked_elements.set(prop, t);
|
|
126
|
+
}
|
|
127
|
+
} else {
|
|
128
|
+
exists = t.__v !== UNINITIALIZED;
|
|
129
|
+
|
|
130
|
+
set(t, value);
|
|
131
|
+
}
|
|
132
132
|
|
|
133
133
|
var descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
|
|
134
134
|
|
|
@@ -137,135 +137,135 @@ export function proxy(value, block) {
|
|
|
137
137
|
descriptor.set.call(receiver, value);
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
140
|
+
if (!exists && is_proxied_array && typeof prop === 'string') {
|
|
141
|
+
// If we have mutated an array directly, we might need to
|
|
142
|
+
// signal that length has also changed. Do it before updating metadata
|
|
143
|
+
// to ensure that iterating over the array as a result of a metadata update
|
|
144
|
+
// will not cause the length to be out of sync.
|
|
145
|
+
var n = Number(prop);
|
|
146
|
+
|
|
147
|
+
if (Number.isInteger(n) && n >= tracked_len.__v) {
|
|
148
|
+
set(tracked_len, n + 1);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
return true;
|
|
153
|
+
},
|
|
154
|
+
|
|
155
|
+
setPrototypeOf() {
|
|
156
|
+
throw new Error(`Cannot set prototype of ${is_proxied_array ? '\`TrackedArray\`' : '\`TrackedObject\`'}`);
|
|
157
|
+
},
|
|
158
|
+
|
|
159
|
+
deleteProperty(target, prop) {
|
|
160
|
+
var t = tracked_elements.get(prop);
|
|
161
|
+
|
|
162
|
+
if (t === undefined) {
|
|
163
|
+
if (prop in target) {
|
|
164
|
+
const t = tracked(UNINITIALIZED, block);
|
|
165
|
+
tracked_elements.set(prop, t);
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
set(t, UNINITIALIZED);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
return Reflect.deleteProperty(target, prop);
|
|
172
|
+
},
|
|
173
|
+
|
|
174
|
+
has(target, prop) {
|
|
175
|
+
if (is_proxied_array && prop === TRACKED_ARRAY) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (prop === TRACKED_OBJECT) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
var t = tracked_elements.get(prop);
|
|
184
|
+
var exists = (t !== undefined && t.__v !== UNINITIALIZED) || Reflect.has(target, prop);
|
|
185
|
+
|
|
186
|
+
if (t !== undefined || !exists || get_descriptor(target, prop)?.writable) {
|
|
187
|
+
if (t === undefined) {
|
|
188
|
+
t = tracked(exists ? /** @type {any} */ (target)[prop] : UNINITIALIZED, block);
|
|
189
|
+
|
|
190
|
+
tracked_elements.set(prop, t);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
var value = get(t);
|
|
194
|
+
if (value === UNINITIALIZED) {
|
|
195
|
+
return false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
return exists;
|
|
200
|
+
},
|
|
201
|
+
|
|
202
|
+
defineProperty(_, prop, descriptor) {
|
|
203
|
+
if (
|
|
204
|
+
!('value' in descriptor) ||
|
|
205
|
+
descriptor.configurable === false ||
|
|
206
|
+
descriptor.enumerable === false ||
|
|
207
|
+
descriptor.writable === false
|
|
208
|
+
) {
|
|
209
|
+
// we disallow non-basic descriptors, because unless they are applied to the
|
|
210
|
+
// target object — which we avoid, so that state can be forked — we will run
|
|
211
|
+
// afoul of the various invariants
|
|
212
|
+
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/Proxy/getOwnPropertyDescriptor#invariants
|
|
213
|
+
throw new Error(
|
|
214
|
+
'Only basic property descriptors are supported with value and configurable, enumerable, and writable set to true',
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
var t = tracked_elements.get(prop);
|
|
219
|
+
|
|
220
|
+
if (t === undefined) {
|
|
221
|
+
t = tracked(descriptor.value, block);
|
|
222
|
+
tracked_elements.set(prop, t);
|
|
223
|
+
} else {
|
|
224
|
+
set(t, descriptor.value);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return true;
|
|
228
|
+
},
|
|
229
|
+
|
|
230
|
+
ownKeys(target) {
|
|
231
|
+
var own_keys = Reflect.ownKeys(target).filter((key) => {
|
|
232
|
+
var t = tracked_elements.get(key);
|
|
233
|
+
return t === undefined || t.__v !== UNINITIALIZED;
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
for (var [key, t] of tracked_elements) {
|
|
237
|
+
if (t.__v !== UNINITIALIZED && !(key in target)) {
|
|
238
|
+
own_keys.push(key);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return own_keys;
|
|
243
|
+
},
|
|
244
|
+
|
|
245
|
+
getOwnPropertyDescriptor(target, prop) {
|
|
246
|
+
var descriptor = Reflect.getOwnPropertyDescriptor(target, prop);
|
|
247
|
+
|
|
248
|
+
if (descriptor && 'value' in descriptor) {
|
|
249
|
+
var t = tracked_elements.get(prop);
|
|
250
|
+
if (t) descriptor.value = get(t);
|
|
251
|
+
} else if (descriptor === undefined) {
|
|
252
|
+
var t = tracked_elements.get(prop);
|
|
253
|
+
var value = t?.__v;
|
|
254
|
+
|
|
255
|
+
if (t !== undefined && value !== UNINITIALIZED) {
|
|
256
|
+
return {
|
|
257
|
+
enumerable: true,
|
|
258
|
+
configurable: true,
|
|
259
|
+
value,
|
|
260
|
+
writable: true
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
return descriptor;
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
});
|
|
269
269
|
}
|
|
270
270
|
|
|
271
271
|
/**
|
|
@@ -279,22 +279,22 @@ export function proxy(value, block) {
|
|
|
279
279
|
* @returns {TrackedArray<T>}
|
|
280
280
|
*/
|
|
281
281
|
export function array_proxy({ elements, block, from_static = false, use_array = false }) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
282
|
+
var arr;
|
|
283
|
+
var first;
|
|
284
|
+
|
|
285
|
+
if (
|
|
286
|
+
from_static &&
|
|
287
|
+
(first = get_first_if_length(/** @type {Array<T>} */(elements))) !== undefined
|
|
288
|
+
) {
|
|
289
|
+
arr = new Array();
|
|
290
|
+
arr[0] = first;
|
|
291
|
+
} else if (use_array) {
|
|
292
|
+
arr = elements;
|
|
293
|
+
} else {
|
|
294
|
+
arr = new Array(...elements);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return proxy(arr, block);
|
|
298
298
|
}
|
|
299
299
|
|
|
300
300
|
/**
|
|
@@ -304,22 +304,22 @@ export function array_proxy({ elements, block, from_static = false, use_array =
|
|
|
304
304
|
* @returns {TrackedObject<T>}
|
|
305
305
|
*/
|
|
306
306
|
export function object_proxy(obj, block) {
|
|
307
|
-
|
|
307
|
+
return proxy(obj, block);
|
|
308
308
|
}
|
|
309
309
|
|
|
310
310
|
/** @type {Set<PropertyKey>} */
|
|
311
311
|
const methods_returning_arrays = new Set([
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
312
|
+
'concat',
|
|
313
|
+
'filter',
|
|
314
|
+
'flat',
|
|
315
|
+
'flatMap',
|
|
316
|
+
'map',
|
|
317
|
+
'slice',
|
|
318
|
+
'splice',
|
|
319
|
+
'toReversed',
|
|
320
|
+
'toSorted',
|
|
321
|
+
'toSpliced',
|
|
322
|
+
'with',
|
|
323
323
|
]);
|
|
324
324
|
|
|
325
325
|
/**
|
|
@@ -328,15 +328,15 @@ const methods_returning_arrays = new Set([
|
|
|
328
328
|
* @returns {number | void}
|
|
329
329
|
*/
|
|
330
330
|
function get_first_if_length(array) {
|
|
331
|
-
|
|
331
|
+
var first = array[0];
|
|
332
332
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
333
|
+
if (
|
|
334
|
+
array.length === 1 &&
|
|
335
|
+
0 in array &&
|
|
336
|
+
Number.isInteger(first) &&
|
|
337
337
|
/** @type {number} */ (first) >= 0 &&
|
|
338
338
|
/** @type {number} */ (first) <= MAX_ARRAY_LENGTH
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
339
|
+
) {
|
|
340
|
+
return /** @type {number} */ (first);
|
|
341
|
+
}
|
|
342
342
|
}
|