UNPKG

testplane

Version:

Tests framework based on mocha and wdio

170 lines (169 loc) 7.88 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.plugin = void 0; const node_path_1 = __importDefault(require("node:path")); const node_url_1 = __importDefault(require("node:url")); const node_module_1 = require("node:module"); const lodash_1 = __importDefault(require("lodash")); const debug_1 = __importDefault(require("debug")); const constants_1 = require("../constants"); const utils_1 = require("../utils"); const polyfill_1 = require("../polyfill"); const logger = __importStar(require("../../../../utils/logger")); const debug = (0, debug_1.default)("vite:plugin:generateIndexHtml"); // modules that used only in NodeJS environment and don't need to be compiled const DEFAULT_MODULES_TO_STUB = ["puppeteer-core", "archiver", "@wdio/repl", "jszip"]; const POLYFILLS = [...node_module_1.builtinModules, ...node_module_1.builtinModules.map(m => `node:${m}`)]; const virtualDriverModuleId = "virtual:@testplane/driver"; const virtualModules = { driver: { id: virtualDriverModuleId, resolvedId: `\0${virtualDriverModuleId}`, }, }; const plugin = async () => { const require = (0, node_module_1.createRequire)((0, utils_1.getImportMetaUrl)(__filename)); const mochaMainPath = require.resolve("mocha"); const mochaModulePath = node_path_1.default.join(node_path_1.default.dirname(mochaMainPath), "mocha.js"); const dirname = node_url_1.default.fileURLToPath(new URL(".", (0, utils_1.getImportMetaUrl)(__filename))); const browserModulesPath = node_path_1.default.resolve(dirname, "..", "browser-modules"); const browserRunnerModulePath = node_path_1.default.resolve(browserModulesPath, "index.js"); const globalsModulePath = node_path_1.default.resolve(browserModulesPath, "globals.js"); const driverModulePath = node_path_1.default.resolve(browserModulesPath, "driver.js"); const mockModulePath = node_path_1.default.resolve(browserModulesPath, "mock.js"); const automationProtocolPath = node_path_1.default.posix.join("/@fs", driverModulePath.replaceAll(node_path_1.default.sep, node_path_1.default.posix.sep)); const stubDefaultModulePath = node_path_1.default.resolve(browserModulesPath, "stubs/default-module.js"); const stubImportMetaResolvePath = node_path_1.default.resolve(browserModulesPath, "stubs/import-meta-resolve.js"); const stubWdioLoggerPath = node_path_1.default.resolve(browserModulesPath, "stubs/@testplane-wdio-logger.js"); const modulesToStub = DEFAULT_MODULES_TO_STUB.reduce((acc, val) => lodash_1.default.set(acc, val, stubDefaultModulePath), { "@testplane/wdio-logger": stubWdioLoggerPath, "import-meta-resolve": stubImportMetaResolvePath, }); return [ { name: "testplane:generateIndexHtml", enforce: "pre", configureServer(server) { return () => { server.middlewares.use(async (req, res, next) => { debug(`Received request for: ${req.originalUrl}`); try { const testInfo = (0, utils_1.getTestInfoFromViteRequest)(req); if (!testInfo) { return next(); } const template = generateTemplate(testInfo.env, testInfo.runUuid); res.end(await server.transformIndexHtml(`${req.originalUrl}`, template)); } catch (err) { const template = generateErrorTemplate(err); logger.error(`Failed to render template: ${err}`); res.end(await server.transformIndexHtml(`${req.originalUrl}`, template)); } return next(); }); }; }, resolveId: async (id) => { if (id === virtualModules.driver.id) { return virtualModules.driver.resolvedId; } // fake module and load the implementation of the browser mock if (id === constants_1.MOCK_MODULE_NAME) { return mockModulePath; } if (id.endsWith(constants_1.MODULE_NAMES.browserRunner)) { return browserRunnerModulePath; } if (id.endsWith(constants_1.MODULE_NAMES.globals)) { return globalsModulePath; } if (id.endsWith(constants_1.MODULE_NAMES.mocha)) { return mochaModulePath; } if (POLYFILLS.includes(id)) { return (0, polyfill_1.polyfillPath)(id.replace("/promises", "")); } if (Object.keys(modulesToStub).includes(id)) { return modulesToStub[id]; } }, load: (id) => { if (id === virtualModules.driver.resolvedId) { return `export const automationProtocolPath = ${JSON.stringify(automationProtocolPath)};`; } }, transform(code, id) { if (id.includes(".vite/deps/expect.js")) { return { code: code.replace("var fs = _interopRequireWildcard(require_graceful_fs());", "var fs = {};"), }; } return { code }; }, }, ]; }; exports.plugin = plugin; function generateTemplate(env, runUuid) { return ` <!DOCTYPE html> <html> <head> <title>Testplane Browser Test</title> <link rel="icon" href="https://testplane.io/img/favicon.ico"> <script type="module"> window.__testplane__ = ${JSON.stringify({ runUuid, ...env })}; window.__testplane__.mockCache = new Map(); window.importWithMock = function(modName, mod) { if (window.__testplane__.mockCache.has(modName)) { return window.__testplane__.mockCache.get(modName); } return mod; } </script> <script type="module" src="${constants_1.MODULE_NAMES.globals}"></script> <script type="module" src="${constants_1.MODULE_NAMES.mocha}"></script> <script type="module" src="${constants_1.MODULE_NAMES.browserRunner}"></script> </head> <body></body> </html> `; } function generateErrorTemplate(error) { return ` <!DOCTYPE html> <html> <body> <pre>${error.stack}</pre> </body> </html> `; } //# sourceMappingURL=generate-index-html.js.map