ripple 0.3.68 → 0.3.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +57 -0
- package/package.json +3 -3
- package/src/jsx-runtime.d.ts +2 -2
- package/src/runtime/element.js +1 -1
- package/src/runtime/index-client.js +11 -11
- package/src/runtime/index-server.js +7 -4
- package/src/runtime/internal/client/bindings.js +1 -1
- package/src/runtime/internal/client/blocks.js +13 -4
- package/src/runtime/internal/client/component.js +55 -0
- package/src/runtime/internal/client/composite.js +4 -2
- package/src/runtime/internal/client/expression.js +65 -7
- package/src/runtime/internal/client/hmr.js +54 -43
- package/src/runtime/internal/client/index.js +5 -1
- package/src/runtime/internal/client/portal.js +70 -69
- package/src/runtime/internal/client/render.js +3 -0
- package/src/runtime/internal/server/index.js +92 -8
- package/tests/client/__snapshots__/html.test.tsrx.snap +3 -3
- package/tests/client/array/array.copy-within.test.tsrx +33 -31
- package/tests/client/array/array.derived.test.tsrx +186 -169
- package/tests/client/array/array.iteration.test.tsrx +40 -37
- package/tests/client/array/array.mutations.test.tsrx +113 -101
- package/tests/client/array/array.static.test.tsrx +119 -101
- package/tests/client/array/array.to-methods.test.tsrx +24 -21
- package/tests/client/async-suspend.test.tsrx +247 -246
- package/tests/client/basic/__snapshots__/basic.rendering.test.tsrx.snap +0 -1
- package/tests/client/basic/basic.attributes.test.tsrx +428 -423
- package/tests/client/basic/basic.collections.test.tsrx +109 -102
- package/tests/client/basic/basic.components.test.tsrx +323 -205
- package/tests/client/basic/basic.errors.test.tsrx +91 -91
- package/tests/client/basic/basic.events.test.tsrx +114 -115
- package/tests/client/basic/basic.get-set.test.tsrx +97 -87
- package/tests/client/basic/basic.hmr.test.tsrx +19 -16
- package/tests/client/basic/basic.reactivity.test.tsrx +199 -191
- package/tests/client/basic/basic.rendering.test.tsrx +272 -182
- package/tests/client/basic/basic.styling.test.tsrx +23 -22
- package/tests/client/basic/basic.utilities.test.tsrx +10 -8
- package/tests/client/boundaries.test.tsrx +26 -26
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.rsrx.snap +5 -5
- package/tests/client/compiler/__snapshots__/compiler.assignments.test.tsrx.snap +5 -5
- package/tests/client/compiler/compiler.assignments.test.tsrx +77 -81
- package/tests/client/compiler/compiler.attributes.test.tsrx +15 -15
- package/tests/client/compiler/compiler.basic.test.tsrx +322 -314
- package/tests/client/compiler/compiler.regex.test.tsrx +44 -47
- package/tests/client/compiler/compiler.tracked-access.test.tsrx +38 -38
- package/tests/client/compiler/compiler.try-in-function.test.tsrx +16 -16
- package/tests/client/compiler/compiler.typescript.test.tsrx +2 -2
- package/tests/client/composite/composite.dynamic-components.test.tsrx +47 -48
- package/tests/client/composite/composite.generics.test.tsrx +168 -192
- package/tests/client/composite/composite.props.test.tsrx +97 -81
- package/tests/client/composite/composite.reactivity.test.tsrx +177 -147
- package/tests/client/composite/composite.render.test.tsrx +122 -105
- package/tests/client/computed-properties.test.tsrx +28 -28
- package/tests/client/context.test.tsrx +21 -21
- package/tests/client/css/global-additional-cases.test.tsrx +58 -58
- package/tests/client/css/global-advanced-selectors.test.tsrx +16 -16
- package/tests/client/css/global-at-rules.test.tsrx +10 -10
- package/tests/client/css/global-basic.test.tsrx +14 -14
- package/tests/client/css/global-classes-ids.test.tsrx +14 -14
- package/tests/client/css/global-combinators.test.tsrx +10 -10
- package/tests/client/css/global-complex-nesting.test.tsrx +14 -14
- package/tests/client/css/global-edge-cases.test.tsrx +18 -18
- package/tests/client/css/global-keyframes.test.tsrx +12 -12
- package/tests/client/css/global-nested.test.tsrx +10 -10
- package/tests/client/css/global-pseudo.test.tsrx +12 -12
- package/tests/client/css/global-scoping.test.tsrx +20 -20
- package/tests/client/css/style-identifier.test.tsrx +126 -259
- package/tests/client/date.test.tsrx +146 -133
- package/tests/client/dynamic-elements.test.tsrx +398 -365
- package/tests/client/events.test.tsrx +292 -290
- package/tests/client/for.test.tsrx +156 -153
- package/tests/client/head.test.tsrx +105 -96
- package/tests/client/html.test.tsrx +122 -26
- package/tests/client/input-value.test.tsrx +1361 -1314
- package/tests/client/lazy-array.test.tsrx +16 -13
- package/tests/client/lazy-destructuring.test.tsrx +257 -213
- package/tests/client/map.test.tsrx +65 -60
- package/tests/client/media-query.test.tsrx +22 -20
- package/tests/client/object.test.tsrx +87 -81
- package/tests/client/portal.test.tsrx +57 -51
- package/tests/client/ref.test.tsrx +233 -202
- package/tests/client/return.test.tsrx +71 -2560
- package/tests/client/set.test.tsrx +54 -45
- package/tests/client/svg.test.tsrx +216 -186
- package/tests/client/switch.test.tsrx +194 -193
- package/tests/client/track-async-hydration.test.tsrx +18 -14
- package/tests/client/tracked-index-access.test.tsrx +28 -18
- package/tests/client/try.test.tsrx +675 -548
- package/tests/client/tsx.test.tsrx +373 -311
- package/tests/client/typescript-generics.test.tsrx +145 -145
- package/tests/client/url/url.derived.test.tsrx +33 -28
- package/tests/client/url/url.parsing.test.tsrx +61 -51
- package/tests/client/url/url.partial-removal.test.tsrx +56 -48
- package/tests/client/url/url.reactivity.test.tsrx +142 -125
- package/tests/client/url/url.serialization.test.tsrx +13 -11
- package/tests/client/url-search-params/url-search-params.derived.test.tsrx +34 -29
- package/tests/client/url-search-params/url-search-params.initialization.test.tsrx +25 -21
- package/tests/client/url-search-params/url-search-params.iteration.test.tsrx +50 -45
- package/tests/client/url-search-params/url-search-params.mutation.test.tsrx +111 -99
- package/tests/client/url-search-params/url-search-params.retrieval.test.tsrx +49 -43
- package/tests/client/url-search-params/url-search-params.serialization.test.tsrx +14 -12
- package/tests/client/url-search-params/url-search-params.tracked-url.test.tsrx +16 -14
- package/tests/hydration/basic.test.js +3 -3
- package/tests/hydration/compiled/client/basic.js +586 -651
- package/tests/hydration/compiled/client/composite.js +79 -104
- package/tests/hydration/compiled/client/events.js +140 -148
- package/tests/hydration/compiled/client/for.js +1005 -1018
- package/tests/hydration/compiled/client/head.js +124 -134
- package/tests/hydration/compiled/client/hmr.js +41 -48
- package/tests/hydration/compiled/client/html-in-template.js +38 -41
- package/tests/hydration/compiled/client/html.js +970 -1314
- package/tests/hydration/compiled/client/if-children.js +234 -249
- package/tests/hydration/compiled/client/if.js +182 -189
- package/tests/hydration/compiled/client/mixed-control-flow.js +347 -303
- package/tests/hydration/compiled/client/nested-control-flow.js +1084 -832
- package/tests/hydration/compiled/client/portal.js +65 -85
- package/tests/hydration/compiled/client/reactivity.js +84 -90
- package/tests/hydration/compiled/client/return.js +38 -1939
- package/tests/hydration/compiled/client/switch.js +218 -224
- package/tests/hydration/compiled/client/track-async-serialization.js +250 -259
- package/tests/hydration/compiled/client/try.js +123 -132
- package/tests/hydration/compiled/server/basic.js +773 -831
- package/tests/hydration/compiled/server/composite.js +166 -191
- package/tests/hydration/compiled/server/events.js +170 -184
- package/tests/hydration/compiled/server/for.js +851 -909
- package/tests/hydration/compiled/server/head.js +206 -216
- package/tests/hydration/compiled/server/hmr.js +64 -72
- package/tests/hydration/compiled/server/html-in-template.js +42 -76
- package/tests/hydration/compiled/server/html.js +1362 -1667
- package/tests/hydration/compiled/server/if-children.js +419 -445
- package/tests/hydration/compiled/server/if.js +194 -208
- package/tests/hydration/compiled/server/mixed-control-flow.js +249 -257
- package/tests/hydration/compiled/server/nested-control-flow.js +491 -515
- package/tests/hydration/compiled/server/portal.js +152 -160
- package/tests/hydration/compiled/server/reactivity.js +94 -106
- package/tests/hydration/compiled/server/return.js +28 -2172
- package/tests/hydration/compiled/server/switch.js +274 -286
- package/tests/hydration/compiled/server/track-async-serialization.js +340 -358
- package/tests/hydration/compiled/server/try.js +167 -185
- package/tests/hydration/components/basic.tsrx +320 -272
- package/tests/hydration/components/composite.tsrx +44 -32
- package/tests/hydration/components/events.tsrx +101 -91
- package/tests/hydration/components/for.tsrx +510 -452
- package/tests/hydration/components/head.tsrx +87 -80
- package/tests/hydration/components/hmr.tsrx +22 -17
- package/tests/hydration/components/html-in-template.tsrx +22 -17
- package/tests/hydration/components/html.tsrx +525 -443
- package/tests/hydration/components/if-children.tsrx +158 -148
- package/tests/hydration/components/if.tsrx +109 -95
- package/tests/hydration/components/mixed-control-flow.tsrx +100 -96
- package/tests/hydration/components/nested-control-flow.tsrx +215 -203
- package/tests/hydration/components/portal.tsrx +41 -34
- package/tests/hydration/components/reactivity.tsrx +37 -27
- package/tests/hydration/components/return.tsrx +12 -556
- package/tests/hydration/components/switch.tsrx +120 -114
- package/tests/hydration/components/track-async-serialization.tsrx +107 -91
- package/tests/hydration/components/try.tsrx +55 -40
- package/tests/hydration/html.test.js +4 -4
- package/tests/hydration/return.test.js +13 -532
- package/tests/server/await.test.tsrx +3 -3
- package/tests/server/basic.attributes.test.tsrx +264 -195
- package/tests/server/basic.components.test.tsrx +296 -169
- package/tests/server/basic.test.tsrx +300 -198
- package/tests/server/compiler.test.tsrx +62 -60
- package/tests/server/composite.props.test.tsrx +77 -63
- package/tests/server/composite.test.tsrx +168 -192
- package/tests/server/context.test.tsrx +18 -12
- package/tests/server/dynamic-elements.test.tsrx +197 -180
- package/tests/server/for.test.tsrx +85 -78
- package/tests/server/head.test.tsrx +50 -43
- package/tests/server/html-nesting-validation.test.tsrx +8 -8
- package/tests/server/if.test.tsrx +57 -51
- package/tests/server/lazy-destructuring.test.tsrx +366 -294
- package/tests/server/return.test.tsrx +76 -1355
- package/tests/server/streaming-ssr.test.tsrx +4 -75
- package/tests/server/style-identifier.test.tsrx +169 -131
- package/tests/server/switch.test.tsrx +91 -85
- package/tests/server/track-async-serialization.test.tsrx +105 -85
- package/tests/server/try.test.tsrx +374 -280
- package/tests/utils/compiler-compat-config.test.js +2 -2
- package/tests/utils/runtime-imports.test.js +10 -0
- package/types/index.d.ts +8 -0
- package/tests/client/__snapshots__/html.test.rsrx.snap +0 -40
|
@@ -6,86 +6,87 @@ import { handle_root_events } from './events.js';
|
|
|
6
6
|
import { create_text } from './operations.js';
|
|
7
7
|
import { active_block } from './runtime.js';
|
|
8
8
|
import { hydrating, hydrate_node, set_hydrating, set_hydrate_node } from './hydration.js';
|
|
9
|
-
import { is_tsrx_element } from '../../element.js';
|
|
9
|
+
import { is_tsrx_element, tsrx_element } from '../../element.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* @param {any} _
|
|
13
12
|
* @param {{ target: Element, children: import('../../element.js').TSRXElement }} props
|
|
14
|
-
* @returns {
|
|
13
|
+
* @returns {import('../../element.js').TSRXElement}
|
|
15
14
|
*/
|
|
16
|
-
export function Portal(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
try {
|
|
41
|
-
render(() => {
|
|
42
|
-
const next_target = props.target;
|
|
43
|
-
const next_children = props.children;
|
|
44
|
-
|
|
45
|
-
if (target === next_target && children === next_children) return;
|
|
46
|
-
|
|
47
|
-
target = next_target;
|
|
48
|
-
children = next_children;
|
|
49
|
-
|
|
50
|
-
if (b !== null) {
|
|
51
|
-
destroy_block(b);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
if (anchor !== null) {
|
|
55
|
-
anchor.remove();
|
|
56
|
-
}
|
|
15
|
+
export function Portal(props) {
|
|
16
|
+
return tsrx_element(function render_portal() {
|
|
17
|
+
// Portals are client-only and don't participate in hydration
|
|
18
|
+
// The compiler-generated code already handles getting the node via sibling()
|
|
19
|
+
var was_hydrating = hydrating;
|
|
20
|
+
var previous_hydrate_node = hydrate_node;
|
|
21
|
+
|
|
22
|
+
/** @type {Element | symbol} */
|
|
23
|
+
let target = UNINITIALIZED;
|
|
24
|
+
/** @type {import('../../element.js').TSRXElement | symbol} */
|
|
25
|
+
let children = UNINITIALIZED;
|
|
26
|
+
/** @type {Block | null} */
|
|
27
|
+
var b = null;
|
|
28
|
+
/** @type {Text | null} */
|
|
29
|
+
var anchor = null;
|
|
30
|
+
/** @type {Node | null} */
|
|
31
|
+
var dom_start = null;
|
|
32
|
+
/** @type {Node | null} */
|
|
33
|
+
var dom_end = null;
|
|
34
|
+
|
|
35
|
+
// Temporarily disable hydration for portal content
|
|
36
|
+
if (was_hydrating) {
|
|
37
|
+
set_hydrating(false);
|
|
38
|
+
}
|
|
57
39
|
|
|
58
|
-
|
|
40
|
+
try {
|
|
41
|
+
render(() => {
|
|
42
|
+
const next_target = props.target;
|
|
43
|
+
const next_children = props.children;
|
|
59
44
|
|
|
60
|
-
|
|
61
|
-
/** @type {Element} */ (target).append(anchor);
|
|
45
|
+
if (target === next_target && children === next_children) return;
|
|
62
46
|
|
|
63
|
-
|
|
47
|
+
target = next_target;
|
|
48
|
+
children = next_children;
|
|
64
49
|
|
|
65
|
-
|
|
50
|
+
if (b !== null) {
|
|
51
|
+
destroy_block(b);
|
|
52
|
+
}
|
|
66
53
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
children.render(/** @type {Text} */ (anchor), block);
|
|
54
|
+
if (anchor !== null) {
|
|
55
|
+
anchor.remove();
|
|
70
56
|
}
|
|
71
|
-
});
|
|
72
57
|
|
|
73
|
-
|
|
74
|
-
dom_end = b?.s?.end;
|
|
58
|
+
dom_start = dom_end = null;
|
|
75
59
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
60
|
+
anchor = create_text();
|
|
61
|
+
/** @type {Element} */ (target).append(anchor);
|
|
62
|
+
|
|
63
|
+
const cleanup_events = handle_root_events(/** @type {Element} */ (target));
|
|
64
|
+
|
|
65
|
+
var block = /** @type {Block} */ (active_block);
|
|
66
|
+
|
|
67
|
+
b = branch(() => {
|
|
68
|
+
if (is_tsrx_element(children)) {
|
|
69
|
+
children.render(/** @type {Text} */ (anchor), block);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
dom_start = b?.s?.start;
|
|
74
|
+
dom_end = b?.s?.end;
|
|
75
|
+
|
|
76
|
+
return () => {
|
|
77
|
+
cleanup_events();
|
|
78
|
+
/** @type {Text} */ (anchor).remove();
|
|
79
|
+
if (dom_start && dom_end) {
|
|
80
|
+
remove_block_dom(dom_start, dom_end);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
});
|
|
84
|
+
} finally {
|
|
85
|
+
// Restore hydration state
|
|
86
|
+
if (was_hydrating) {
|
|
87
|
+
set_hydrating(true);
|
|
88
|
+
set_hydrate_node(/** @type {any} */ (previous_hydrate_node));
|
|
89
|
+
}
|
|
89
90
|
}
|
|
90
|
-
}
|
|
91
|
+
});
|
|
91
92
|
}
|
|
@@ -134,6 +134,9 @@ function set_attribute_helper(element, key, value, remove_listeners, prev) {
|
|
|
134
134
|
if (key === 'class') {
|
|
135
135
|
const is_html = element.namespaceURI === 'http://www.w3.org/1999/xhtml';
|
|
136
136
|
set_class(/** @type {HTMLElement} */ (element), value, undefined, is_html);
|
|
137
|
+
} else if (key === 'innerHTML') {
|
|
138
|
+
element.removeAttribute('innerhtml');
|
|
139
|
+
/** @type {HTMLElement} */ (element).innerHTML = value == null ? '' : String(value);
|
|
137
140
|
} else if (key === 'style') {
|
|
138
141
|
set_style(element, value, prev.style);
|
|
139
142
|
} else if (key === '#class') {
|
|
@@ -64,7 +64,7 @@ export { simple_hash, strong_hash } from '@tsrx/core/runtime/hash';
|
|
|
64
64
|
export { context } from './context.js';
|
|
65
65
|
export { try_block, component_block, regular_block } from './blocks.js';
|
|
66
66
|
export { array_slice };
|
|
67
|
-
export { tsrx_element, normalize_children };
|
|
67
|
+
export { is_tsrx_element, tsrx_element, normalize_children };
|
|
68
68
|
export { create_ref_prop };
|
|
69
69
|
|
|
70
70
|
/** @extends Error */
|
|
@@ -96,7 +96,7 @@ function render_tsrx_collection(value) {
|
|
|
96
96
|
var item = value[i];
|
|
97
97
|
|
|
98
98
|
if (is_tsrx_element(item)) {
|
|
99
|
-
item
|
|
99
|
+
render_tsrx_element(item);
|
|
100
100
|
} else if (is_array(item)) {
|
|
101
101
|
render_tsrx_collection(item);
|
|
102
102
|
} else if (item != null) {
|
|
@@ -105,6 +105,22 @@ function render_tsrx_collection(value) {
|
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
/**
|
|
109
|
+
* @param {import('../../element.js').TSRXElement} value
|
|
110
|
+
* @returns {void}
|
|
111
|
+
*/
|
|
112
|
+
export function render_tsrx_element(value) {
|
|
113
|
+
const result = value.render({});
|
|
114
|
+
|
|
115
|
+
if (is_tsrx_element(result)) {
|
|
116
|
+
render_tsrx_element(result);
|
|
117
|
+
} else if (is_array(result)) {
|
|
118
|
+
render_tsrx_collection(result);
|
|
119
|
+
} else if (result != null) {
|
|
120
|
+
output_push(escape(result));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
108
124
|
/**
|
|
109
125
|
* @param {any} value
|
|
110
126
|
* @returns {void}
|
|
@@ -113,7 +129,7 @@ export function render_expression(value) {
|
|
|
113
129
|
output_push(BLOCK_OPEN);
|
|
114
130
|
|
|
115
131
|
if (is_tsrx_element(value)) {
|
|
116
|
-
value
|
|
132
|
+
render_tsrx_element(value);
|
|
117
133
|
} else if (is_array(value)) {
|
|
118
134
|
render_tsrx_collection(value);
|
|
119
135
|
} else {
|
|
@@ -123,6 +139,50 @@ export function render_expression(value) {
|
|
|
123
139
|
output_push(BLOCK_CLOSE);
|
|
124
140
|
}
|
|
125
141
|
|
|
142
|
+
/**
|
|
143
|
+
* @param {Function} fn
|
|
144
|
+
* @param {Props} props
|
|
145
|
+
* @returns {void}
|
|
146
|
+
*/
|
|
147
|
+
export function render_component(fn, props) {
|
|
148
|
+
if (typeof fn !== 'function' || is_tsrx_element(fn)) {
|
|
149
|
+
throw_invalid_component_type(fn);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
run_component(fn, props);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @param {Function} fn
|
|
157
|
+
* @param {Props} props
|
|
158
|
+
* @returns {void}
|
|
159
|
+
*/
|
|
160
|
+
function run_component(fn, props) {
|
|
161
|
+
push_component();
|
|
162
|
+
try {
|
|
163
|
+
const value = fn(props);
|
|
164
|
+
if (is_tsrx_element(value)) {
|
|
165
|
+
render_tsrx_element(value);
|
|
166
|
+
} else {
|
|
167
|
+
render_expression(value);
|
|
168
|
+
}
|
|
169
|
+
} finally {
|
|
170
|
+
pop_component();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* @param {any} value
|
|
176
|
+
* @returns {never}
|
|
177
|
+
*/
|
|
178
|
+
function throw_invalid_component_type(value) {
|
|
179
|
+
if (is_tsrx_element(value)) {
|
|
180
|
+
throw new TypeError('Invalid component type: received a TSRXElement value.');
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
throw new TypeError('Invalid component type: expected a component function.');
|
|
184
|
+
}
|
|
185
|
+
|
|
126
186
|
/**
|
|
127
187
|
* @returns {Stream}
|
|
128
188
|
*/
|
|
@@ -532,7 +592,7 @@ export class Output {
|
|
|
532
592
|
// and append them into the head immediately
|
|
533
593
|
return;
|
|
534
594
|
}
|
|
535
|
-
this.#css.add(hash);
|
|
595
|
+
this.#root.#css.add(hash);
|
|
536
596
|
}
|
|
537
597
|
|
|
538
598
|
/**
|
|
@@ -685,7 +745,7 @@ export async function render(component, passed_in_options = {}) {
|
|
|
685
745
|
if (options.stream) {
|
|
686
746
|
output._setStream(options.stream);
|
|
687
747
|
}
|
|
688
|
-
component
|
|
748
|
+
render_component(component, {});
|
|
689
749
|
output._decrementPending();
|
|
690
750
|
output._finishSyncRun();
|
|
691
751
|
|
|
@@ -711,14 +771,14 @@ export async function render(component, passed_in_options = {}) {
|
|
|
711
771
|
output._finishSyncRun();
|
|
712
772
|
}
|
|
713
773
|
if (options.rootBoundary?.catch) {
|
|
714
|
-
options.rootBoundary.catch
|
|
774
|
+
render_component(options.rootBoundary.catch, { error, reset: noop });
|
|
715
775
|
} else {
|
|
716
776
|
console.error(error);
|
|
717
777
|
}
|
|
718
778
|
},
|
|
719
779
|
() => {
|
|
720
780
|
if (options.rootBoundary?.pending) {
|
|
721
|
-
options.rootBoundary.pending
|
|
781
|
+
render_component(options.rootBoundary.pending, {});
|
|
722
782
|
}
|
|
723
783
|
},
|
|
724
784
|
);
|
|
@@ -1193,7 +1253,13 @@ export function spread_attrs(attrs, css_hash) {
|
|
|
1193
1253
|
for (name in attrs) {
|
|
1194
1254
|
var value = attrs[name];
|
|
1195
1255
|
|
|
1196
|
-
if (
|
|
1256
|
+
if (
|
|
1257
|
+
name === 'children' ||
|
|
1258
|
+
name === 'innerHTML' ||
|
|
1259
|
+
typeof value === 'function' ||
|
|
1260
|
+
is_tsrx_element(value)
|
|
1261
|
+
)
|
|
1262
|
+
continue;
|
|
1197
1263
|
|
|
1198
1264
|
if (is_ripple_object(value)) {
|
|
1199
1265
|
value = get(value);
|
|
@@ -1209,6 +1275,24 @@ export function spread_attrs(attrs, css_hash) {
|
|
|
1209
1275
|
return attr_str;
|
|
1210
1276
|
}
|
|
1211
1277
|
|
|
1278
|
+
/**
|
|
1279
|
+
* @param {Record<string, any>} attrs
|
|
1280
|
+
* @returns {string | undefined}
|
|
1281
|
+
*/
|
|
1282
|
+
export function spread_inner_html(attrs) {
|
|
1283
|
+
if (!Object.prototype.hasOwnProperty.call(attrs, 'innerHTML')) {
|
|
1284
|
+
return undefined;
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
var value = attrs.innerHTML;
|
|
1288
|
+
|
|
1289
|
+
if (is_ripple_object(value)) {
|
|
1290
|
+
value = get(value);
|
|
1291
|
+
}
|
|
1292
|
+
|
|
1293
|
+
return String(value ?? '');
|
|
1294
|
+
}
|
|
1295
|
+
|
|
1212
1296
|
var empty_get_set = { get: undefined, set: undefined };
|
|
1213
1297
|
|
|
1214
1298
|
class TrackedValue {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
|
-
exports[`
|
|
3
|
+
exports[`Fragment innerHTML > renders dynamic innerHTML fragments 1`] = `
|
|
4
4
|
<div>
|
|
5
5
|
<!---->
|
|
6
6
|
<div>
|
|
@@ -14,7 +14,7 @@ exports[`html directive > renders dynamic html 1`] = `
|
|
|
14
14
|
</div>
|
|
15
15
|
`;
|
|
16
16
|
|
|
17
|
-
exports[`
|
|
17
|
+
exports[`Fragment innerHTML > renders dynamic innerHTML fragments 2`] = `
|
|
18
18
|
<div>
|
|
19
19
|
<!---->
|
|
20
20
|
<div>
|
|
@@ -28,7 +28,7 @@ exports[`html directive > renders dynamic html 2`] = `
|
|
|
28
28
|
</div>
|
|
29
29
|
`;
|
|
30
30
|
|
|
31
|
-
exports[`
|
|
31
|
+
exports[`Fragment innerHTML > renders static innerHTML fragments 1`] = `
|
|
32
32
|
<div>
|
|
33
33
|
<!---->
|
|
34
34
|
<div>
|
|
@@ -2,18 +2,19 @@ import { RippleArray, flushSync, track } from 'ripple';
|
|
|
2
2
|
|
|
3
3
|
describe('RippleArray copyWithin', () => {
|
|
4
4
|
it('handles copyWithin operation with reactivity', () => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
function ArrayTest() {
|
|
6
|
+
return <>
|
|
7
|
+
let items = new RippleArray(1, 2, 3, 4, 5);
|
|
8
|
+
let &[firstItem] = track(() => items[0]);
|
|
9
|
+
let &[thirdItem] = track(() => items[2]);
|
|
10
|
+
let &[fourthItem] = track(() => items[3]);
|
|
11
|
+
<button onClick={() => items.copyWithin(0, 3)}>{'copy end to start'}</button>
|
|
12
|
+
<button onClick={() => items.copyWithin(2, 0, 2)}>{'copy start to middle'}</button>
|
|
13
|
+
<pre>{JSON.stringify(items)}</pre>
|
|
14
|
+
<pre>{firstItem}</pre>
|
|
15
|
+
<pre>{thirdItem}</pre>
|
|
16
|
+
<pre>{fourthItem}</pre>
|
|
17
|
+
</>;
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
render(ArrayTest);
|
|
@@ -47,15 +48,16 @@ describe('RippleArray copyWithin', () => {
|
|
|
47
48
|
});
|
|
48
49
|
|
|
49
50
|
it('handles copyWithin with negative indexes and reactivity', () => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
function ArrayTest() {
|
|
52
|
+
return <>
|
|
53
|
+
let items = new RippleArray(1, 2, 3, 4, 5);
|
|
54
|
+
let &[secondItem] = track(() => items[1]);
|
|
55
|
+
let &[thirdItem] = track(() => items[2]);
|
|
56
|
+
<button onClick={() => items.copyWithin(-4, -2)}>{'copy with negative indexes'}</button>
|
|
57
|
+
<pre>{JSON.stringify(items)}</pre>
|
|
58
|
+
<pre>{secondItem}</pre>
|
|
59
|
+
<pre>{thirdItem}</pre>
|
|
60
|
+
</>;
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
render(ArrayTest);
|
|
@@ -78,16 +80,16 @@ describe('RippleArray copyWithin', () => {
|
|
|
78
80
|
});
|
|
79
81
|
|
|
80
82
|
it('handles copyWithin with overlapping ranges', () => {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
83
|
+
function ArrayTest() {
|
|
84
|
+
return <>
|
|
85
|
+
let items = new RippleArray(1, 2, 3, 4, 5);
|
|
86
|
+
let &[entries] = track(() => Array.from(items.entries()));
|
|
87
|
+
<button onClick={() => items.copyWithin(2, 1, 4)}>{'copy with overlap'}</button>
|
|
88
|
+
<pre>{JSON.stringify(items)}</pre>
|
|
89
|
+
for (const [i, value] of entries) {
|
|
90
|
+
<pre>{`items[${i}]: ${value}`}</pre>
|
|
91
|
+
}
|
|
92
|
+
</>;
|
|
91
93
|
}
|
|
92
94
|
|
|
93
95
|
render(ArrayTest);
|