diff --git a/packages/svelte/src/internal/server/hydratable.js b/packages/svelte/src/internal/server/hydratable.js index ba081972e7..8bdb6ca15d 100644 --- a/packages/svelte/src/internal/server/hydratable.js +++ b/packages/svelte/src/internal/server/hydratable.js @@ -59,7 +59,12 @@ function encode(key, value, values, unresolved) { serialize_promise.finally(() => unresolved?.delete(serialize_promise)); const index = values.push(serialize_promise) - 1; - const result = `d(${index})`; + + // in dev, we serialize promises as `d("1")` instead of `d(1)`, because it's + // impossible for that string to occur 'naturally' (since the quote marks + // would have to be escaped). this allows us to check that repeat occurrences + // of a given hydratable are identical with a simple string comparison + const result = DEV ? `d("${index}")` : `d(${index})`; if (DEV) { (entry.promises ??= []).push( diff --git a/packages/svelte/src/internal/server/renderer.js b/packages/svelte/src/internal/server/renderer.js index 761b1415b0..601494aa47 100644 --- a/packages/svelte/src/internal/server/renderer.js +++ b/packages/svelte/src/internal/server/renderer.js @@ -654,7 +654,12 @@ export class Renderer { return null; } - const values = await Promise.all(ctx.values); + let values = await Promise.all(ctx.values); + + if (DEV) { + // turn `d("1")` into `d(1)` — see `hydratable.js` for an explanation + values = values.map((v) => v.replace(/d\("(\d+)"\)/g, (_, i) => `d(${i})`)); + } // TODO csp -- have discussed but not implemented return `