UNPKG

ripple

Version:

Ripple is an elegant TypeScript UI framework

79 lines (65 loc) 2.74 kB
/** * Script to compile hydration test components for both client and server. * Can be run standalone: node packages/ripple/tests/hydration/build-components.js * Or used as vitest globalSetup */ import { compile } from '@tsrx/ripple'; import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs'; import { join, basename } from 'path'; import { fileURLToPath } from 'url'; import { dirname } from 'path'; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); const componentsDir = join(__dirname, 'components'); const clientOutDir = join(__dirname, 'compiled', 'client'); const serverOutDir = join(__dirname, 'compiled', 'server'); /** * Transform server-compiled code to use server runtime imports. * This is necessary because vitest runs with browser conditions, but * server-compiled code needs server's track() and Portal which have different internals. * @param {string} code - The compiled server code * @returns {string} - Transformed code with server-compatible imports */ function transformServerImports(code) { // Replace `import { ... } from 'ripple'` with server version // Use 'ripple/server' which always points to the server runtime, // bypassing the browser/default condition resolution return code.replace( /import\s*\{([^}]+)\}\s*from\s*['"]ripple['"]/g, (match, specifiers) => `import {${specifiers}} from 'ripple/server'`, ); } function buildComponents() { // Ensure output directories exist mkdirSync(clientOutDir, { recursive: true }); mkdirSync(serverOutDir, { recursive: true }); // Get all supported component files in components directory const componentFiles = readdirSync(componentsDir).filter((f) => f.endsWith('.tsrx')); for (const file of componentFiles) { const filePath = join(componentsDir, file); const source = readFileSync(filePath, 'utf-8'); const outputName = basename(basename(file, '.tsrx'), '.tsrx').replace(/\.tsrx$/, '') + '.js'; // Compile for client const clientResult = compile(source, file, { mode: 'client', }); writeFileSync(join(clientOutDir, outputName), '// @ts-nocheck\n' + clientResult.code); // Compile for server const serverResult = compile(source, file, { mode: 'server', }); // Transform imports to use server runtime const serverCode = transformServerImports(serverResult.code); writeFileSync(join(serverOutDir, outputName), '// @ts-nocheck\n' + serverCode); console.log(`Compiled ${file} -> client & server`); } console.log('Hydration components compiled!'); } // Export setup function for vitest globalSetup export default function setup() { buildComponents(); } // Allow running standalone if (process.argv[1] === __filename) { buildComponents(); }