@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
JavaScript
;
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