const fs = require('node:fs'); const vm = require('node:vm'); const base = require('node:path').join(process.cwd(), 'internal/webassets/static') + '/'; const listeners = new Map(); const componentFactories = {}; let releaseDetails; let refreshCalls = 0; const document = { readyState: 'complete', activeElement: null, addEventListener: (type, fn) => { const a = listeners.get(type) || []; a.push(fn); listeners.set(type, a); }, getElementById: id => id === 'installed-apps-list' ? {} : null, querySelector: () => null, }; const window = { addEventListener() {}, Alpine: {data(name, factory) {componentFactories[name] = factory;}}, MPVOutput: require(base+'output-tail.js'), showToast() {}, MPVUtils: {apiFetch: () => new Promise(resolve => {releaseDetails = resolve;})}, }; class FakeEventSource { constructor() {this.readyState = 1;} addEventListener() {} close() {} } FakeEventSource.CLOSED = 2; const context = vm.createContext({ document, window, EventSource: FakeEventSource, console, MPVUtils: window.MPVUtils, setTimeout, clearTimeout, htmx: {ajax: async () => {refreshCalls++;}}, }); vm.runInContext(fs.readFileSync(base+'jobs.js', 'utf8'), context); vm.runInContext(fs.readFileSync(base+'jobs-modal.js', 'utf8'), context); for (const fn of listeners.get('alpine:init') || []) fn(); const modal = componentFactories.jobsModal(); modal.init(); const manager = window.jobManager; (async () => { manager.handleJobCreated({job_id:'race-job',type:'fixture',methodId:'fixture',appName:'Fixture'}); const opening = window.showJobOutput('race-job'); manager.handleJobStatus({job_id:'race-job',status:'error',error:'Installer failed',type:'fixture',methodId:'fixture'}); releaseDetails({ok:true,data:{id:'race-job',type:'fixture',status:'running',progress:10,output:['stale line']}}); await opening; console.log('TERMINAL-GET-RACE',JSON.stringify({modalStatus:modal.status,modalRunning:modal.isRunning(),knownStatus:manager.activeJobs.get('race-job').status,modalError:modal.error})); await manager.refreshAppsListIfNeeded({id:'adopt-job',type:'adopt',status:'complete'}); console.log('ADOPTION-COMPLETION-REFRESH',JSON.stringify({refreshCalls})); await manager.refreshAppsListIfNeeded({id:'install-job',type:'install',status:'complete'}); console.log('INSTALL-CONTROL-REFRESH',JSON.stringify({refreshCalls})); modal.destroy(); manager.disconnect(); })().catch(error => {console.error(error);process.exitCode=1;});