Skip to content

Commit 640fabd

Browse files
ajsldkfjalsdfkjasd
1 parent 3f3ad1a commit 640fabd

File tree

7 files changed

+77
-21
lines changed

7 files changed

+77
-21
lines changed

packages/svelte/src/internal/server/hydratable.js

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ export function hydratable(key, fn) {
2424
let entry = hydratable.lookup.get(key);
2525

2626
if (entry !== undefined) {
27-
if (DEV && entry.dev) {
27+
if (DEV) {
2828
const comparison = compare(key, entry, encode(key, fn(), []));
2929
comparison.catch(() => {});
3030
hydratable.comparisons.push(comparison);
@@ -52,11 +52,7 @@ function encode(key, value, values, unresolved) {
5252
const entry = { value, index: -1 };
5353

5454
if (DEV) {
55-
entry.dev = {
56-
serialized: undefined,
57-
serialize_work: [],
58-
stack: get_stack('hydratable')?.stack
59-
};
55+
entry.stack = get_stack('hydratable')?.stack;
6056
}
6157

6258
let needs_thunk = false;
@@ -82,12 +78,11 @@ function encode(key, value, values, unresolved) {
8278
// of a given hydratable are identical with a simple string comparison
8379
const result = DEV ? `d("${index}")` : `d(${index})`;
8480

85-
if (DEV && entry.dev) {
86-
const { dev } = entry;
87-
dev.serialize_work.push(
81+
if (DEV) {
82+
(entry.serialize_work ??= []).push(
8883
serialize_promise.then((s) => {
8984
serialized = serialized.replace(result, s);
90-
dev.serialized = serialized;
85+
entry.serialized = serialized;
9186
})
9287
);
9388
}
@@ -96,6 +91,7 @@ function encode(key, value, values, unresolved) {
9691
}
9792
});
9893

94+
entry.serialized = serialized;
9995
entry.index = values.push(needs_thunk ? `()=>(${serialized})` : serialized) - 1;
10096
needs_thunk = false;
10197

@@ -111,19 +107,19 @@ async function compare(key, a, b) {
111107
// note: these need to be loops (as opposed to Promise.all) because
112108
// additional promises can get pushed to them while we're awaiting
113109
// an earlier one
114-
for (const p of a.dev?.serialize_work ?? []) {
110+
for (const p of a?.serialize_work ?? []) {
115111
await p;
116112
}
117113

118-
for (const p of b.dev?.serialize_work ?? []) {
114+
for (const p of b?.serialize_work ?? []) {
119115
await p;
120116
}
121117

122-
if (a.dev?.serialized !== b.dev?.serialized) {
118+
if (a?.serialized !== b?.serialized) {
123119
e.hydratable_clobbering(
124120
key,
125-
a.dev?.stack ?? '<missing stack trace>',
126-
b.dev?.stack ?? '<missing stack trace>'
121+
a?.stack ?? '<missing stack trace>',
122+
b?.stack ?? '<missing stack trace>'
127123
);
128124
}
129125
}

packages/svelte/src/internal/server/renderer.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ export class Renderer {
580580
for (const [_, key] of ctx.unresolved_promises) {
581581
// this is a problem -- it means we've finished the render but we're still waiting on a promise to resolve so we can
582582
// serialize it, so we're blocking the response on useless content.
583-
w.unresolved_hydratable(key, ctx.lookup.get(key)?.dev?.stack ?? '<missing stack trace>');
583+
w.unresolved_hydratable(key, ctx.lookup.get(key)?.stack ?? '<missing stack trace>');
584584
}
585585

586586
for (const comparison of ctx.comparisons) {

packages/svelte/src/internal/server/types.d.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,12 @@ export interface SSRContext {
1818
export interface HydratableLookupEntry {
1919
value: unknown;
2020
index: number;
21-
dev?: {
22-
serialize_work: Array<Promise<void>>;
23-
serialized: string | undefined;
24-
stack: string | undefined;
25-
};
21+
/** dev-only */
22+
serialize_work?: Array<Promise<void>>;
23+
/** dev-only */
24+
serialized?: string;
25+
/** dev-only */
26+
stack?: string;
2627
}
2728

2829
export interface HydratableContext {
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import { tick } from 'svelte';
2+
import { ok, test } from '../../test';
3+
4+
export default test({
5+
skip_no_async: true,
6+
skip_mode: ['server'],
7+
8+
server_props: { environment: 'server' },
9+
ssrHtml: '<p>The current environment is: server</p>',
10+
11+
props: { environment: 'browser' },
12+
13+
async test({ assert, target, variant }) {
14+
// make sure hydration has a chance to finish
15+
await tick();
16+
const p = target.querySelector('p');
17+
ok(p);
18+
if (variant === 'hydrate') {
19+
assert.htmlEqual(p.outerHTML, '<p>The current environment is: server</p>');
20+
} else {
21+
assert.htmlEqual(p.outerHTML, '<p>The current environment is: browser</p>');
22+
}
23+
}
24+
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<script lang="ts">
2+
import { hydratable } from "svelte";
3+
4+
let { environment } = $props();
5+
6+
const value = hydratable("environment", () => Promise.resolve({
7+
nested: Promise.resolve({
8+
environment
9+
})
10+
}))
11+
</script>
12+
13+
<p>The current environment is: {await value.then(res => res.nested).then(res => res.environment)}</p>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
mode: ['async'],
5+
error: 'hydratable_clobbering'
6+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<script lang="ts">
2+
import { hydratable } from 'svelte';
3+
4+
hydratable('key', () => Promise.resolve({
5+
nested: Promise.resolve({
6+
one: Promise.resolve(1),
7+
}),
8+
two: Promise.resolve(2),
9+
}));
10+
hydratable('key', () => Promise.resolve({
11+
nested: Promise.resolve({
12+
one: Promise.resolve(2),
13+
}),
14+
two: Promise.resolve(2),
15+
}));
16+
</script>

0 commit comments

Comments
 (0)