@cypress/schematic
Version:
Official Cypress schematic for the Angular CLI
75 lines • 4.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.startDevServer = void 0;
const architect_1 = require("@angular-devkit/architect");
const core_1 = require("@angular-devkit/core");
const os = require("os");
const path_1 = require("path");
const cypress_1 = require("cypress");
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");
function runCypress(options, context) {
options.env = options.env || {};
if (options.tsConfig) {
options.env.tsConfig = (0, path_1.join)(context.workspaceRoot, options.tsConfig);
}
const projectName = context.target && context.target.project || '';
const workspace = context.getProjectMetadata(projectName);
return (0, rxjs_1.from)(workspace).pipe((0, operators_1.map)(() => os.platform() === 'win32'), (0, operators_1.map)((isWin) => (!isWin ? (0, core_1.normalize)(context.workspaceRoot) : (0, core_1.asWindowsPath)((0, core_1.normalize)(context.workspaceRoot)))), (0, operators_1.map)((workspaceRoot) => {
return Object.assign(Object.assign({}, options), { projectPath: `${workspaceRoot}/cypress` });
}), (0, operators_1.switchMap)((options) => {
return (options.devServerTarget
? startDevServer({ devServerTarget: options.devServerTarget, watch: options.watch, context }).pipe((0, operators_1.map)((devServerBaseUrl) => options.baseUrl || devServerBaseUrl))
: (0, rxjs_1.of)(options.baseUrl)).pipe((0, operators_1.concatMap)((devServerBaseUrl) => initCypress(Object.assign(Object.assign({}, options), { devServerBaseUrl }))), options.watch ? (0, operators_1.tap)(rxjs_1.noop) : (0, operators_1.first)(), (0, operators_1.catchError)((error) => {
return (0, rxjs_1.of)({ success: false }).pipe((0, operators_1.tap)(() => context.reportStatus(`Error: ${error.message}`)), (0, operators_1.tap)(() => context.logger.error(error.message)));
}));
}));
}
function initCypress(userOptions) {
const projectFolderPath = (0, path_1.dirname)(userOptions.projectPath);
const defaultOptions = {
project: projectFolderPath,
browser: 'electron',
headless: true,
record: false,
spec: '',
};
if (userOptions.component || userOptions.testingType === 'component') {
userOptions.e2e = false;
}
const options = Object.assign(Object.assign(Object.assign({}, defaultOptions), userOptions), {
//@ts-ignore
dev: process.env.CYPRESS_ENV === 'test' });
if (userOptions.configFile === undefined) {
options.config = { e2e: { baseUrl: userOptions.devServerBaseUrl } };
}
options.config = Object.assign({}, options.config);
const { watch, headless } = userOptions;
return (0, rxjs_1.from)(watch === false || headless ? (0, cypress_1.run)(options) : (0, cypress_1.open)(options)).pipe((0, operators_1.map)((result) => ({ success: !result.totalFailed && !result.failures })));
}
function startDevServer({ devServerTarget, watch, context }) {
const buildTarget = (0, architect_1.targetFromTargetString)(devServerTarget);
return (0, rxjs_1.from)(context.getBuilderNameForTarget(buildTarget)).pipe((0, operators_1.switchMap)((builderName) => {
let overrides = {};
// @NOTE: Do not forward watch option if not supported by the target dev server,
// this is relevant for running Cypress against dev server target that does not support this option,
// for instance @nguniversal/builders:ssr-dev-server.
// see https://github.com/nrwl/nx/blob/f930117ed6ab13dccc40725c7e9551be081cc83d/packages/cypress/src/executors/cypress/cypress.impl.ts
if (builderName !== '@nguniversal/builders:ssr-dev-server') {
// eslint-disable-next-line no-console
console.info(`Passing watch mode to DevServer - watch mode is ${watch}`);
overrides = {
watch,
};
}
return (0, architect_1.scheduleTargetAndForget)(context, (0, architect_1.targetFromTargetString)(devServerTarget), overrides).pipe((0, operators_1.map)((output) => {
if (!output.success && !watch) {
throw new Error('Could not compile application files');
}
return output.baseUrl;
}));
}));
}
exports.startDevServer = startDevServer;
exports.default = (0, architect_1.createBuilder)(runCypress);
//# sourceMappingURL=index.js.map