const test = require('node:test'); const assert = require('node:assert/strict'); const fs = require('node:fs'); const vm = require('node:vm'); const { render } = require('../src/web/public/js/shared/slide-preview-renderer'); const { buildThumbnailPreviewPayload } = require('../src/web/lib/media/slide-thumbnails'); const placeholderUtils = require('../src/web/public/js/shared/placeholder-utils'); const { resolveRegionContent } = require('../src/web/public/js/shared/region-content'); const { getRegionEditorScripts } = require('../src/web/lib/region-scripts'); function loadEditorTimeDateModule() { const source = fs.readFileSync(require.resolve('../src/web/public/js/regions/type/time-date.js'), 'utf8'); const modules = new Map(); const sandbox = { window: { pulseRegionTypes: { register(type, definition) { modules.set(type, definition); } }, pulseRegionUtils: { escapeHtml(value) { return String(value).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, '''); }, sanitizePreviewHtml(value) { return String(value); } }, placeholderUtils: placeholderUtils } }; vm.runInNewContext(source, sandbox, { filename: 'time-date.js' }); return modules.get('time-date'); } test('list preview loads a saved image with legacy fallback and clears it on close', () => { const source = fs.readFileSync(require.resolve('../src/web/views/signage/slides/list.hbs'), 'utf8'); assert.doesNotMatch(source, / slide-preview-modal}}/); const modalSource = fs.readFileSync(require.resolve('../src/web/views/shared/slide-preview-modal.hbs'), 'utf8'); const css = fs.readFileSync(require.resolve('../src/web/public/css/theme-custom.css'), 'utf8'); assert.match(css, /\.slide-list-preview-frame\[hidden\]\s*\{\s*display: none;/); const handlers = {}; const image = { addEventListener(name, handler) { handlers['image:' + name] = handler; }, getAttribute(name) { return this[name]; }, removeAttribute(name) { delete this[name]; } }; const empty = {}; const title = {}; const modal = { querySelector(selector) { return selector === '[data-slide-preview-image]' ? image : selector === '[data-slide-preview-empty]' ? empty : title; }, addEventListener(name, handler) { handlers[name] = handler; }, style: { setProperty() {} } }; vm.runInNewContext(modalSource.match(/