UNPKG

@mdfriday/foundry

Version:

The core engine of MDFriday. Convert Markdown and shortcodes into fully themed static sites – Hugo-style, powered by TypeScript.

174 lines 7.56 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); const fs = __importStar(require("fs/promises")); const path = __importStar(require("path")); const os = __importStar(require("os")); const http = __importStar(require("http")); const electron_livereload_server_1 = require("./electron-livereload-server"); describe('ElectronLiveReloadServer', () => { let server; let tempDir; let stateFilePath; beforeEach(async () => { // 创建临时目录 tempDir = await fs.mkdtemp(path.join(os.tmpdir(), 'electron-livereload-test-')); stateFilePath = path.join(tempDir, '.foundry-livereload-state.json'); server = new electron_livereload_server_1.ElectronLiveReloadServer({ port: 8092, host: 'localhost', publicDir: tempDir, enableLiveReload: true }); }); afterEach(async () => { if (server.isServerRunning()) { await server.stop(); } // 清理临时目录 try { await fs.rm(tempDir, { recursive: true, force: true }); } catch (error) { // 忽略清理错误 } }); test('should create state file on start', async () => { await server.start(); // 检查状态文件是否存在 const exists = await fs.access(stateFilePath).then(() => true).catch(() => false); expect(exists).toBe(true); // 检查状态文件内容 const content = await fs.readFile(stateFilePath, 'utf8'); const state = JSON.parse(content); expect(state.command).toBe('hello'); expect(state.timestamp).toBeGreaterThan(0); }); test('should serve state file via HTTP with absolute path', async () => { await server.start(); // 等待服务器启动和状态文件创建 await new Promise(resolve => setTimeout(resolve, 100)); // 通过 HTTP 请求状态文件 const response = await new Promise((resolve, reject) => { const req = http.request({ hostname: 'localhost', port: server.getUrl().split(':')[2], // 提取端口号 path: '/.foundry-livereload-state.json', method: 'GET' }, resolve); req.on('error', reject); req.end(); }); expect(response.statusCode).toBe(200); expect(response.headers['content-type']).toBe('application/json; charset=utf-8'); // 读取响应内容 let body = ''; response.on('data', chunk => body += chunk); await new Promise(resolve => response.on('end', resolve)); const state = JSON.parse(body); expect(state.command).toBe('hello'); expect(state.timestamp).toBeGreaterThan(0); }); test('should update state file on reload notification', async () => { await server.start(); // 等待初始状态文件创建 await new Promise(resolve => setTimeout(resolve, 100)); const initialContent = await fs.readFile(stateFilePath, 'utf8'); const initialState = JSON.parse(initialContent); // 触发重载通知 server.notifyReload(['test.css']); // 等待状态文件更新 await new Promise(resolve => setTimeout(resolve, 100)); const updatedContent = await fs.readFile(stateFilePath, 'utf8'); const updatedState = JSON.parse(updatedContent); expect(updatedState.command).toBe('reload'); expect(updatedState.timestamp).toBeGreaterThan(initialState.timestamp); expect(updatedState.liveCSS).toBe(true); expect(updatedState.changedFiles).toEqual(['test.css']); }); test('should clean up state file on stop', async () => { await server.start(); // 确认状态文件存在 let exists = await fs.access(stateFilePath).then(() => true).catch(() => false); expect(exists).toBe(true); await server.stop(); // 确认状态文件被删除 exists = await fs.access(stateFilePath).then(() => true).catch(() => false); expect(exists).toBe(false); }); test('should not trigger infinite reloads with same timestamp', async () => { await server.start(); // 等待初始状态文件创建 await new Promise(resolve => setTimeout(resolve, 100)); // 触发重载通知 server.notifyReload(['test.js']); // 等待状态文件更新 await new Promise(resolve => setTimeout(resolve, 100)); const content = await fs.readFile(stateFilePath, 'utf8'); const state = JSON.parse(content); expect(state.command).toBe('reload'); expect(state.timestamp).toBeGreaterThan(0); // 再次读取相同的状态文件,时间戳应该保持不变 const content2 = await fs.readFile(stateFilePath, 'utf8'); const state2 = JSON.parse(content2); expect(state2.timestamp).toBe(state.timestamp); expect(state2.command).toBe('reload'); }); test('should detect CSS and image files correctly', async () => { await server.start(); // 测试 CSS 文件 server.notifyReload(['styles.css']); await new Promise(resolve => setTimeout(resolve, 100)); let content = await fs.readFile(stateFilePath, 'utf8'); let state = JSON.parse(content); expect(state.liveCSS).toBe(true); expect(state.liveImg).toBe(false); // 测试图片文件 server.notifyReload(['image.png']); await new Promise(resolve => setTimeout(resolve, 100)); content = await fs.readFile(stateFilePath, 'utf8'); state = JSON.parse(content); expect(state.liveCSS).toBe(false); expect(state.liveImg).toBe(true); // 测试 JS 文件 server.notifyReload(['script.js']); await new Promise(resolve => setTimeout(resolve, 100)); content = await fs.readFile(stateFilePath, 'utf8'); state = JSON.parse(content); expect(state.liveCSS).toBe(false); expect(state.liveImg).toBe(false); }); }); //# sourceMappingURL=electron-livereload-server.test.js.map