ripple
Version:
Ripple is an elegant TypeScript UI framework
99 lines (90 loc) • 3 kB
JavaScript
import { describe, it, expect, vi } from 'vitest';
import { ripple } from '@ripple-ts/vite-plugin';
describe('vite-plugin-ripple hotUpdate', () => {
it('invalidates SSR modules for non-self-accepting .tsrx files', async () => {
const [plugin] = ripple({ excludeRippleExternalModules: true });
await plugin.configResolved?.({ root: '/workspace', command: 'serve' });
const transform_request = vi.fn().mockResolvedValue(undefined);
const get_css_module = vi.fn().mockReturnValue(undefined);
const invalidate_css_module = vi.fn();
const send_hot_update = vi.fn();
const get_ssr_modules = vi.fn().mockReturnValue(new Set([{ id: 'ssr:a' }, { id: 'ssr:b' }]));
const invalidate_ssr_module = vi.fn();
const result = await plugin.hotUpdate.handler.call(
{
environment: {
name: 'client',
transformRequest: transform_request,
moduleGraph: {
getModuleById: get_css_module,
invalidateModule: invalidate_css_module,
},
hot: {
send: send_hot_update,
},
},
},
{
file: '/workspace/src/non-component.tsrx',
modules: [{ id: 'client:non-component', isSelfAccepting: false }],
server: {
environments: {
ssr: {
moduleGraph: {
getModulesByFile: get_ssr_modules,
invalidateModule: invalidate_ssr_module,
},
},
},
},
},
);
expect(transform_request).toHaveBeenCalledWith('/src/non-component.tsrx');
expect(get_ssr_modules).toHaveBeenCalledWith('/workspace/src/non-component.tsrx');
expect(invalidate_ssr_module).toHaveBeenCalledTimes(2);
expect(send_hot_update).toHaveBeenCalledWith({ type: 'full-reload' });
expect(result).toEqual([]);
});
it('keeps self-accepting .tsrx files on Vite HMR path', async () => {
const [plugin] = ripple({ excludeRippleExternalModules: true });
await plugin.configResolved?.({ root: '/workspace', command: 'serve' });
const transform_request = vi.fn().mockResolvedValue(undefined);
const get_ssr_modules = vi.fn();
const invalidate_ssr_module = vi.fn();
const send_hot_update = vi.fn();
const result = await plugin.hotUpdate.handler.call(
{
environment: {
name: 'client',
transformRequest: transform_request,
moduleGraph: {
getModuleById: vi.fn().mockReturnValue(undefined),
invalidateModule: vi.fn(),
},
hot: {
send: send_hot_update,
},
},
},
{
file: '/workspace/src/component.tsrx',
modules: [{ id: 'client:component', isSelfAccepting: true }],
server: {
environments: {
ssr: {
moduleGraph: {
getModulesByFile: get_ssr_modules,
invalidateModule: invalidate_ssr_module,
},
},
},
},
},
);
expect(transform_request).toHaveBeenCalledWith('/src/component.tsrx');
expect(get_ssr_modules).not.toHaveBeenCalled();
expect(invalidate_ssr_module).not.toHaveBeenCalled();
expect(send_hot_update).not.toHaveBeenCalled();
expect(result).toBeUndefined();
});
});