UNPKG

@nx/storybook

Version:

The Nx Plugin for Storybook contains executors and generators for allowing your workspace to use the powerful Storybook integration testing & documenting capabilities.

131 lines (130 loc) 5.98 kB
"use strict"; 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;