@nx/storybook
Version:
131 lines (130 loc) • 5.98 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.cypressProjectGenerator = cypressProjectGenerator;
const devkit_1 = require("@nx/devkit");
const project_name_and_root_utils_1 = require("@nx/devkit/src/generators/project-name-and-root-utils");
const path_1 = require("path");
const utilities_1 = require("../../utils/utilities");
const versions_1 = require("../../utils/versions");
async function cypressProjectGenerator(tree, schema) {
devkit_1.logger.warn(`Use 'interactionTests' instead when running '@nx/storybook:configuration'. This generator will be removed in v21.`);
const { configurationGenerator } = (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion);
const e2eName = schema.name ? `${schema.name}-e2e` : undefined;
const { projectName, projectRoot } = await (0, project_name_and_root_utils_1.determineProjectNameAndRootOptions)(tree, {
name: e2eName,
projectType: 'application',
directory: schema.directory,
});
const libConfig = (0, devkit_1.readProjectConfiguration)(tree, schema.name);
const libRoot = libConfig.root;
(0, devkit_1.addProjectConfiguration)(tree, projectName, {
root: projectRoot,
projectType: 'application',
sourceRoot: (0, devkit_1.joinPathFragments)(projectRoot, 'src'),
targets: {},
implicitDependencies: [projectName],
});
const cypressTask = await configurationGenerator(tree, {
project: projectName,
js: schema.js,
linter: schema.linter,
devServerTarget: `${schema.name}:storybook`,
skipFormat: true,
});
const generatedCypressProjectName = projectName;
removeUnneededFiles(tree, generatedCypressProjectName, schema.js);
const project = (0, devkit_1.readProjectConfiguration)(tree, generatedCypressProjectName);
if (project.targets.e2e && project.targets.e2e.options) {
addBaseUrlToCypressConfig(tree, generatedCypressProjectName, project.root);
updateAngularJsonBuilder(tree, {
e2eProjectName: generatedCypressProjectName,
targetProjectName: schema.name,
ciTargetName: schema.ciTargetName,
});
}
else if (hasCypressPlugin(tree)) {
generateCypressConfigForInferredPlugin(tree, generatedCypressProjectName, project.root, schema.name, schema.ciTargetName);
}
else {
throw new Error(`Unable to generate Cypress Project for Storybook project. Please report this issue at https://github.com/nrwl/nx/issues/new/choose`);
}
if (!schema.skipFormat) {
await (0, devkit_1.formatFiles)(tree);
}
return cypressTask;
}
function hasCypressPlugin(tree) {
const nxJson = (0, devkit_1.readNxJson)(tree);
return nxJson.plugins?.some((p) => typeof p === 'string'
? p === '@nx/cypress/plugin'
: p.plugin === '@nx/cypress/plugin');
}
function removeUnneededFiles(tree, projectName, js) {
const { sourceRoot, root } = (0, devkit_1.readProjectConfiguration)(tree, projectName);
const fileType = js ? 'js' : 'ts';
if (tree.exists((0, devkit_1.joinPathFragments)(root, 'cypress.config.ts'))) {
(0, utilities_1.safeFileDelete)(tree, `${sourceRoot}/e2e/app.cy.${fileType}`);
(0, utilities_1.safeFileDelete)(tree, `${sourceRoot}/support/app.po.${fileType}`);
}
else {
(0, utilities_1.safeFileDelete)(tree, `${sourceRoot}/integration/app.spec.${fileType}`);
(0, utilities_1.safeFileDelete)(tree, `${sourceRoot}/support/app.po.${fileType}`);
}
}
function generateCypressConfigForInferredPlugin(tree, projectName, projectRoot, targetProjectName, ciTargetName) {
const cypressJson = (0, devkit_1.joinPathFragments)(projectRoot, 'cypress.json');
const cypressTs = (0, devkit_1.joinPathFragments)(projectRoot, 'cypress.config.ts');
if (tree.exists(cypressJson)) {
tree.delete(cypressJson);
}
if (tree.exists(cypressTs)) {
// cypress >= v10
tree.delete(cypressTs);
(0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files', 'inferred-target'), projectRoot, {
defaultWebServerCommand: `npx nx run ${targetProjectName}:storybook`,
ciWebServerCommand: ciTargetName
? `npx nx run ${targetProjectName}:${ciTargetName}:ci`
: `npx nx run ${targetProjectName}:storybook:ci`,
tpl: '',
});
}
}
function addBaseUrlToCypressConfig(tree, projectName, projectRoot) {
const cypressJson = (0, devkit_1.joinPathFragments)(projectRoot, 'cypress.json');
const cypressTs = (0, devkit_1.joinPathFragments)(projectRoot, 'cypress.config.ts');
// TODO(caleb): remove this when cypress < v10 is deprecated
if (tree.exists(cypressJson)) {
// cypress < v10
(0, devkit_1.updateJson)(tree, cypressJson, (json) => {
json.baseUrl = 'http://localhost:4400';
return json;
});
}
else if (tree.exists(cypressTs)) {
// cypress >= v10
tree.delete(cypressTs);
(0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files', 'explicit-target'), projectRoot, {
tpl: '',
});
}
}
function updateAngularJsonBuilder(tree, opts) {
const project = (0, devkit_1.readProjectConfiguration)(tree, opts.e2eProjectName);
const e2eTarget = project.targets.e2e ?? {};
project.targets.e2e = {
...e2eTarget,
options: {
...e2eTarget.options,
devServerTarget: `${opts.targetProjectName}:storybook`,
},
configurations: {
ci: {
devServerTarget: opts.ciTargetName
? `${opts.targetProjectName}:${opts.ciTargetName}:ci`
: `${opts.targetProjectName}:storybook:ci`,
},
},
};
(0, devkit_1.updateProjectConfiguration)(tree, opts.e2eProjectName, project);
}
exports.default = cypressProjectGenerator;