import { createServer } from 'vite' import assert from 'node:assert/strict' const vite = await createServer({ server: { middlewareMode: true }, appType: 'custom', logLevel: 'error' }) try { const { editableOutlinePages, confirmedCoursewareOutline, inspectConfirmedOutline } = await vite.ssrLoadModule('/src/utils/aiCoursewareOutline.ts') const outline = { title: '课堂', textbookResearch: { teachingObjectives: ['旧目标'] }, pages: Array.from({ length: 8 }, (_, i) => ({ pageNo: i + 1, type: i ? 'practice_check' : 'cover', title: `页面${i}`, durationMinutes: 5, bullets: ['旧内容'], imageKeywords: [], objectiveIds: ['1'] })) } const pages = editableOutlinePages(outline) pages[1].page.title = '老师修改的标题' pages[1].pointsText = ' 听辨强弱\n\n用拍手表现 ' pages.splice(2, 0, pages.splice(1, 1)[0]) const confirmed = confirmedCoursewareOutline(outline, ' 能分辨声音强弱\n能用拍手表现 ', pages) assert.deepEqual(inspectConfirmedOutline(confirmed, 40), []) assert.deepEqual(confirmed.textbookResearch.teachingObjectives, ['能分辨声音强弱', '能用拍手表现']) assert.equal(confirmed.pages[2].title, '老师修改的标题') assert.deepEqual(confirmed.pages.map(p => p.pageNo), [1,2,3,4,5,6,7,8]) assert.deepEqual(confirmed.pages[2].studentContent.points, ['听辨强弱','用拍手表现']) assert.deepEqual(confirmed.pages[2].objectiveIds, []) assert.equal(outline.pages[1].title, '页面1') const invalid = structuredClone(confirmed) invalid.pages[1].title = '' invalid.pages[2].durationMinutes = 0 invalid.textbookResearch.teachingObjectives = [] assert.ok(inspectConfirmedOutline(invalid, 40).some(s => s.includes('教学目标'))) assert.ok(inspectConfirmedOutline(invalid, 40).some(s => s.includes('第2页标题'))) assert.ok(inspectConfirmedOutline(invalid, 40).some(s => s.includes('第3页用时'))) const optional = structuredClone(confirmed) optional.pages.push({ ...optional.pages[1], pageNo: 9, durationMinutes: 4, optional: true }) assert.deepEqual(inspectConfirmedOutline(optional, 40), []) console.log('PASS: edited goals, 8-page outline, reordered pages, preserved content, invalid inputs, optional timing and source isolation') } finally { await vite.close() }