UNPKG

vitest-e2e

Version:
252 lines (246 loc) 7.75 kB
'use strict'; var chunkPJYHJVIT_cjs = require('./chunk-PJYHJVIT.cjs'); var fs = require('fs-extra'); var os = require('os'); var path = require('path'); var playwrightChromium = require('playwright-chromium'); var vite = require('vite'); var vitest = require('vitest'); function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } var fs__default = /*#__PURE__*/_interopDefault(fs); var os__default = /*#__PURE__*/_interopDefault(os); var server; exports.viteServer = void 0; exports.rootDir = void 0; exports.testPath = void 0; exports.testDir = void 0; exports.testName = void 0; exports.viteConfig = void 0; exports.serverLogs = []; exports.browserLogs = []; exports.browserErrors = []; exports.resolvedConfig = void 0; exports.page = void 0; exports.browser = void 0; exports.viteTestUrl = ""; exports.watcher = void 0; function setViteUrl(url) { exports.viteTestUrl = url; } var DIR = path.join(os__default.default.tmpdir(), "vitest_playwright_global_setup"); vitest.beforeAll(async (s) => { const suite = s; if (!suite.filepath.includes("playground")) { return; } const wsEndpoint = fs__default.default.readFileSync(path.join(DIR, "wsEndpoint"), "utf-8"); if (!wsEndpoint) { throw new Error("wsEndpoint not found"); } exports.browser = await playwrightChromium.chromium.connect(wsEndpoint); exports.page = await exports.browser.newPage(); const globalConsole = global.console; const warn = globalConsole.warn; globalConsole.warn = (msg, ...args) => { if (msg.includes("Generated an empty chunk")) return; warn.call(globalConsole, msg, ...args); }; try { exports.page.on("console", (msg) => { if (process.env.VITE_DEBUG_SERVE && msg.text().includes("Failed to load resource:") && msg.location().url.includes("favicon.ico")) { return; } if (msg.text().includes("React DevTools")) return; exports.browserLogs.push(msg.text()); }); exports.page.on("pageerror", (error) => { exports.browserErrors.push(error); }); exports.testPath = suite.filepath; exports.testName = slash(exports.testPath).match(/playground\/([\w-]+)\//)?.[1]; exports.testDir = path.dirname(exports.testPath); if (exports.testName) { exports.testDir = path.resolve(chunkPJYHJVIT_cjs.workspaceRoot, "playground-temp", exports.testName); const testCustomRoot = path.resolve(exports.testDir, "root"); exports.rootDir = fs__default.default.existsSync(testCustomRoot) ? testCustomRoot : exports.testDir; const testCustomServe = [path.resolve(path.dirname(exports.testPath), "serve.ts"), path.resolve(path.dirname(exports.testPath), "serve.js")].find( (i) => fs__default.default.existsSync(i) ); if (testCustomServe) { const mod = await import(testCustomServe); const serve = mod.serve || mod.default?.serve; const preServe = mod.preServe || mod.default?.preServe; if (preServe) { await preServe(); } if (serve) { server = await serve(); exports.viteServer = mod.viteServer; return; } } else { await startDefaultServe(); } } } catch (e) { await exports.page.close(); await server?.close(); throw e; } return async () => { exports.serverLogs = []; await exports.page?.close(); await server?.close(); await exports.watcher?.close(); if (exports.browser) { await exports.browser.close(); } }; }); vitest.afterEach(() => { exports.browserLogs = []; exports.browserErrors = []; }); function loadConfigFromDir(dir) { return vite.loadConfigFromFile( { command: chunkPJYHJVIT_cjs.isBuild ? "build" : "serve", mode: chunkPJYHJVIT_cjs.isBuild ? "production" : "development" }, void 0, dir ); } async function startDefaultServe() { let config = null; const res = await loadConfigFromDir(path.dirname(exports.testPath)); if (res) { config = res.config; } if (!config) { const res2 = await loadConfigFromDir(exports.rootDir); if (res2) { config = res2.config; } } const options = { root: exports.rootDir, logLevel: "silent", configFile: false, server: { watch: { // During tests we edit the files too fast and sometimes chokidar // misses change events, so enforce polling for consistency usePolling: true, interval: 100 }, host: true, fs: { strict: !chunkPJYHJVIT_cjs.isBuild } }, build: { // esbuild do not minify ES lib output since that would remove pure annotations and break tree-shaking // skip transpilation during tests to make it faster target: "esnext", // tests are flaky when `emptyOutDir` is `true` emptyOutDir: false }, customLogger: createInMemoryLogger(exports.serverLogs) }; setupConsoleWarnCollector(); if (!chunkPJYHJVIT_cjs.isBuild) { process.env.VITE_INLINE = "inline-serve"; const testConfig = vite.mergeConfig(options, config || {}); exports.viteConfig = testConfig; exports.viteServer = server = await (await vite.createServer(testConfig)).listen(); const devBase = server.config.base; exports.viteTestUrl = `http://localhost:${server.config.server.port}${devBase === "/" ? "" : devBase}`; await exports.page.goto(exports.viteTestUrl); } else { process.env.VITE_INLINE = "inline-build"; const resolvedPlugin = () => ({ name: "vite-plugin-watcher", configResolved(config2) { exports.resolvedConfig = config2; } }); options.plugins = [resolvedPlugin()]; const testConfig = vite.mergeConfig(options, config || {}); exports.viteConfig = testConfig; const rollupOutput = await vite.build(testConfig); const isWatch = !!exports.resolvedConfig.build.watch; if (isWatch) { exports.watcher = rollupOutput; await notifyRebuildComplete(exports.watcher); } if (config && config.__test__) { config.__test__(); } const _nodeEnv = process.env.NODE_ENV; const previewServer = await vite.preview(testConfig); process.env.NODE_ENV = _nodeEnv; exports.viteTestUrl = previewServer.resolvedUrls.local[0]; await exports.page.goto(exports.viteTestUrl); } } async function notifyRebuildComplete(watcher2) { let resolveFn; const callback = (event) => { if (event.code === "END") { resolveFn?.(); } }; watcher2.on("event", callback); await new Promise((resolve2) => { resolveFn = resolve2; }); return watcher2.off("event", callback); } function createInMemoryLogger(logs) { const loggedErrors = /* @__PURE__ */ new WeakSet(); const warnedMessages = /* @__PURE__ */ new Set(); const logger = { hasWarned: false, hasErrorLogged: (err) => loggedErrors.has(err), clearScreen: () => { }, info(msg) { logs.push(msg); }, warn(msg) { logs.push(msg); logger.hasWarned = true; }, warnOnce(msg) { if (warnedMessages.has(msg)) return; logs.push(msg); logger.hasWarned = true; warnedMessages.add(msg); }, error(msg, opts) { logs.push(msg); if (opts?.error) { loggedErrors.add(opts.error); } } }; return logger; } function setupConsoleWarnCollector(_logs) { const warn = console.warn; console.warn = (...args) => { exports.serverLogs.push(args.join(" ")); return warn.call(console, ...args); }; } function slash(p) { return p.replace(/\\/g, "/"); } exports.notifyRebuildComplete = notifyRebuildComplete; exports.setViteUrl = setViteUrl; exports.slash = slash; exports.startDefaultServe = startDefaultServe;