const fs = require('fs'); const path = require('path'); const { JSDOM } = require('jsdom'); const dir = path.join(__dirname, '..'); const html = fs.readFileSync(path.join(dir, 'index.html'), 'utf8'); const moduleFiles = ['js/api.js', 'js/transitous.js', 'js/app.js', 'js/livemap.js', 'js/changelog.js', 'js/extras.js']; const cleanHtml = html .replace(/]*src=[^>]*><\/script>/g, '') .replace(/]*>/g, ''); const errors = []; const dom = new JSDOM(cleanHtml, { url: 'https://localhost:3000/', runScripts: 'outside-only', pretendToBeVisual: true }); const { window } = dom; window.addEventListener('error', (e) => errors.push('window.error: ' + e.message)); // --- Mocks --- let lastJourneyUrl = null; window.fetch = (url) => { const u = String(url); if (u.includes('/plan')) lastJourneyUrl = u; return Promise.resolve({ ok: true, json: () => Promise.resolve( u.includes('/geocode') ? [] : u.includes('/stoptimes') ? { stopTimes: [], place: {} } : u.includes('/plan') ? { itineraries: [] } : u.includes('/map/') ? [] : {} ), text: () => Promise.resolve('# Changelog\n## v35') }); }; window.navigator.vibrate = () => true; const mm = () => ({ matches: false, addEventListener(){}, removeEventListener(){}, addListener(){}, removeListener(){} }); window.matchMedia = mm; const fakeLayer = { addTo: () => fakeLayer, remove: () => {}, bindPopup: () => fakeLayer, on: () => fakeLayer, setLatLng: () => fakeLayer, setPopupContent: () => fakeLayer }; window.L = { polyline: () => fakeLayer, map: () => ({ setView(){ return this; }, on(){ return this; }, invalidateSize(){}, getZoom: () => 12, getBounds: () => ({ getNorth:()=>52.6, getSouth:()=>52.4, getEast:()=>13.6, getWest:()=>13.2 }) }), tileLayer: () => fakeLayer, marker: () => fakeLayer, divIcon: () => ({}) }; Object.defineProperty(window.navigator, 'serviceWorker', { value: { register: () => Promise.resolve({}) }, configurable: true }); // --- Module in Ladereihenfolge ausführen --- // Verkettet ausgeführt: entspricht dem gemeinsamen globalen Scope // klassischer