import { readFileSync } from 'node:fs' import { fileURLToPath } from 'node:url' import { dirname, resolve } from 'node:path' const root = resolve(dirname(fileURLToPath(import.meta.url)), '..') const srcRoot = resolve(root, 'src') const failures = [] const expectIncludes = (content, expected, label) => { if (!content.includes(expected)) failures.push(`${label} is missing: ${expected}`) } const expectExcludes = (content, unexpected, label) => { if (content.includes(unexpected)) failures.push(`${label} should not contain: ${unexpected}`) } const courseApi = readFileSync(resolve(srcRoot, 'modules/comprehensive/api/course.js'), 'utf8') const bookingApi = readFileSync(resolve(srcRoot, 'modules/comprehensive/api/booking.js'), 'utf8') const comprehensiveHome = readFileSync(resolve(srcRoot, 'pages/comprehensive/home/index.vue'), 'utf8') const comprehensiveContentApi = readFileSync(resolve(srcRoot, 'modules/comprehensive/api/content.js'), 'utf8') const iceHome = readFileSync(resolve(srcRoot, 'pages/ice/home/index.vue'), 'utf8') const iceHomeApi = readFileSync(resolve(srcRoot, 'modules/ice/api/home.js'), 'utf8') expectIncludes(courseApi, "url: '/api/sessions'", 'session list endpoint') expectIncludes(courseApi, 'url: `/api/sessions/${id}`', 'session detail endpoint') expectIncludes(courseApi, 'data: { session_id: sessionId }', 'booking payload') expectExcludes(courseApi, "url: '/api/courses'", 'legacy course endpoint') expectIncludes(bookingApi, 'session_id: backendBooking.session_id', 'booking session id') expectIncludes(bookingApi, 'session: toBookingSession(backendBooking.session)', 'booking session mapper') expectExcludes(bookingApi, 'course: toBookingCourse(backendBooking.course)', 'legacy booking course') expectExcludes(comprehensiveHome, '近期课程', 'comprehensive recent courses section') expectExcludes(comprehensiveHome, 'upcomingCourses', 'comprehensive recent course state') expectExcludes(comprehensiveContentApi, 'upcoming_courses', 'legacy comprehensive home mapping') expectExcludes(comprehensiveContentApi, 'upcoming_sessions', 'unused comprehensive home mapping') expectExcludes(iceHome, '近期课程', 'ice recent courses section') expectExcludes(iceHome, 'upcomingCourses', 'ice recent course state') expectExcludes(iceHomeApi, 'course_limit', 'ice recent course request') expectExcludes(iceHomeApi, 'upcoming_courses', 'ice recent course mapping') if (failures.length) { console.error(`Comprehensive session contract verification failed with ${failures.length} issue(s):`) for (const failure of failures) console.error(`- ${failure}`) process.exit(1) } console.log('Comprehensive session contract verification passed.')