chore: add ability to hydrate dom custom renderers samples

fix-interleaving
paoloricciuti 3 months ago committed by GitHub
parent d395fc15d1
commit 6d75398b47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -5,10 +5,12 @@ import { assert } from 'vitest';
import { compile_directory } from '../helpers.js'; import { compile_directory } from '../helpers.js';
import { suite_with_variants, type BaseTest } from '../suite.js'; import { suite_with_variants, type BaseTest } from '../suite.js';
import type { CompileOptions } from '#compiler'; import type { CompileOptions } from '#compiler';
import renderer, { create_root, serialize, dispatch_event, dom_elements } from './renderer.js'; import renderer, { create_root, serialize, dispatch_event, type ObjFragment } from './renderer.js';
import { mount, unmount } from '../../src/index-client.js'; import { mount, unmount } from '../../src/index-client.js';
import { writeFile } from 'node:fs/promises'; import { writeFile } from 'node:fs/promises';
import { globSync } from 'tinyglobby'; import { globSync } from 'tinyglobby';
import { hydrate, unmount } from 'svelte';
import { render } from 'svelte/server';
// `_config.js` test callbacks rely on inferred parameter types, which // `_config.js` test callbacks rely on inferred parameter types, which
// TypeScript treats as non-explicit and rejects for chai's assertion-function // TypeScript treats as non-explicit and rejects for chai's assertion-function
@ -30,7 +32,9 @@ export interface CustomRendererTest extends BaseTest {
html?: string; html?: string;
compileOptions?: Partial<CompileOptions>; compileOptions?: Partial<CompileOptions>;
props?: Record<string, any>; props?: Record<string, any>;
server_props?: Record<string, any>;
context?: Map<any, any>; context?: Map<any, any>;
hydrate?: true;
error?: string; error?: string;
compile_error?: string; compile_error?: string;
compile_warnings?: false; compile_warnings?: false;
@ -38,7 +42,7 @@ export interface CustomRendererTest extends BaseTest {
warnings?: string[]; warnings?: string[];
test?: (args: { test?: (args: {
assert: Assert; assert: Assert;
target: any; target: ObjFragment | HTMLElement;
component: Record<string, any>; component: Record<string, any>;
mod: any; mod: any;
logs: any[]; logs: any[];
@ -46,7 +50,6 @@ export interface CustomRendererTest extends BaseTest {
renderer: typeof renderer; renderer: typeof renderer;
serialize: typeof serialize; serialize: typeof serialize;
dispatch_event: typeof dispatch_event; dispatch_event: typeof dispatch_event;
dom_elements: Array<DocumentFragment | Node>;
}) => void | Promise<void>; }) => void | Promise<void>;
} }
@ -97,6 +100,10 @@ async function common_setup(
try { try {
await compile_directory(cwd, 'client', compile_options); await compile_directory(cwd, 'client', compile_options);
if (config.hydrate) {
await compile_directory(cwd, 'server', compile_options);
}
} catch (err) { } catch (err) {
if (config.compile_error) { if (config.compile_error) {
assert.include((err as Error).message, config.compile_error); assert.include((err as Error).message, config.compile_error);
@ -165,12 +172,17 @@ async function run_test(cwd: string, config: CustomRendererTest, compile_options
try { try {
const mod = await import(`${cwd}/_output/client/main.svelte.js`); const mod = await import(`${cwd}/_output/client/main.svelte.js`);
if (config.hydrate) {
await run_hydration_test(cwd, config, mod, logs, warnings);
return;
}
const target = create_root(); const target = create_root();
let component: Record<string, any> | undefined; let component: Record<string, any> | undefined;
try { try {
dom_elements.length = 0; const result = mount(mod.default, {
component = mount(mod.default, {
renderer, renderer,
target, target,
props: config.props ?? {}, props: config.props ?? {},
@ -217,8 +229,7 @@ async function run_test(cwd: string, config: CustomRendererTest, compile_options
warnings, warnings,
renderer: renderer, renderer: renderer,
serialize, serialize,
dispatch_event, dispatch_event
dom_elements
}); });
} }
@ -254,6 +265,48 @@ async function run_test(cwd: string, config: CustomRendererTest, compile_options
} }
} }
async function run_hydration_test(
cwd: string,
config: CustomRendererTest,
mod: any,
logs: any[],
warnings: any[]
) {
const target = document.createElement('main');
const rendered = await render((await import(`${cwd}/_output/server/main.svelte.js`)).default, {
props: config.server_props ?? config.props ?? {}
});
target.innerHTML = rendered.body;
const component = hydrate(mod.default, {
target,
props: config.props ?? {},
context: config.context
});
if (config.html) {
assert.equal(target.innerHTML, config.html);
}
try {
if (config.test) {
await config.test({
assert,
target,
component,
mod,
logs,
warnings,
renderer: renderer,
serialize,
dispatch_event
});
}
} finally {
unmount(component);
}
}
export function ok(value: any): asserts value { export function ok(value: any): asserts value {
if (!value) { if (!value) {
throw new Error(`Expected truthy value, got ${value}`); throw new Error(`Expected truthy value, got ${value}`);

Loading…
Cancel
Save