vitest-e2e
Version:
vitest e2e utils
252 lines (246 loc) • 7.75 kB
JavaScript
;
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;