import assert from 'node:assert/strict'; import { readFileSync } from 'node:fs'; import vm from 'node:vm'; const extension = new URL('../chrome-extension/ltjt-order-assistant/', import.meta.url); const background = readFileSync(new URL('background.js', extension), 'utf8'); const lists = background.slice(background.indexOf('const DEFAULT_PAGE_ACTION_FILES ='), background.indexOf('let storageMutationQueue =')); const selector = background.slice(background.indexOf('function pageActionFiles('), background.indexOf('function queueOperationTimingDetails(')); // The service worker and ERP MAIN world have separate globals. Read the real // dispatch list so adding a helper to importScripts alone cannot satisfy tests. export function loadPageActionRealm(window, globals, overrides = {}, omitFiles = []) { const worker = vm.createContext({}); vm.runInContext(`${lists}\n${selector}`, worker); const files = vm.runInContext("pageActionFiles('prepareLifecycleOperation')", worker); assert.ok(files.includes('inpage.js') && files.includes('lifecycle-adapters.js')); const realm = Object.assign(window, globals); realm.window = realm; realm.self = realm; const context = vm.createContext(realm); assert.equal(realm.LTJTOperationPlans, undefined, 'a fresh page must not inherit worker exports'); for (const file of files) { if (omitFiles.includes(file)) continue; vm.runInContext(overrides[file] ?? readFileSync(new URL(file, extension), 'utf8'), context, { filename: file }); } return realm; }