clovie
Version:
Vintage web dev tooling with modern quality of life
67 lines (54 loc) • 2.19 kB
JavaScript
import type from 'type-detect';
const render = async (views, compiler, fileNames = Object.keys(views), isDevMode = false, partials = {}, register = null, accumulator = {}) => {
if (!fileNames || fileNames.length === 0) return accumulator;
// Process partials if register function is provided
if (register && Object.keys(partials).length > 0) {
try {
for (const [name, template] of Object.entries(partials)) {
register(name, template);
}
} catch (err) {
console.warn('⚠️ Could not register partials:', err.message);
}
}
// Live reload script to inject in development mode
const liveReloadScript = `
<!-- Live Reload Script (Development Mode Only) -->
<script src="https://cdn.socket.io/4.7.4/socket.io.min.js"></script>
<script>
(function() {
const socket = io();
socket.on('reload', () => {
console.log('🔄 Live reload triggered');
window.location.reload();
});
socket.on('connect', () => {
console.log('🔌 Connected to live reload server');
});
socket.on('disconnect', () => {
console.log('🔌 Disconnected from live reload server');
});
socket.on('connect_error', (error) => {
console.error('🔌 Connection error:', error);
});
})();
</script>`;
for (const fileName of fileNames) {
const view = views[fileName];
if (!view || !view.template) continue;
const res = compiler(view.template, {...view.data, fileName, fileNames});
let renderedContent = type(res) === 'Promise' ? await res : res;
// Inject live reload script before the last </body> tag if in development mode
if (isDevMode && renderedContent.includes('</body>')) {
const lastBodyIndex = renderedContent.lastIndexOf('</body>');
if (lastBodyIndex !== -1) {
renderedContent = renderedContent.substring(0, lastBodyIndex) +
liveReloadScript + '\n' +
renderedContent.substring(lastBodyIndex);
}
}
accumulator[fileName] = renderedContent;
}
return accumulator;
}
export default render;