UNPKG

@nx/react

Version:

The React plugin for Nx contains executors and generators for managing React applications and libraries within an Nx workspace. It provides: - Integration with libraries such as Jest, Vitest, Playwright, Cypress, and Storybook. - Generators for applica

77 lines (76 loc) 3.55 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.componentTestGenerator = componentTestGenerator; const devkit_1 = require("@nx/devkit"); const path_1 = require("path"); const ast_utils_1 = require("../../utils/ast-utils"); const component_props_1 = require("../../utils/component-props"); const versions_1 = require("../../utils/versions"); const ensure_typescript_1 = require("@nx/js/src/utils/typescript/ensure-typescript"); let tsModule; async function componentTestGenerator(tree, options) { (0, devkit_1.ensurePackage)('@nx/cypress', versions_1.nxVersion); const { assertMinimumCypressVersion } = await Promise.resolve().then(() => require('@nx/cypress/src/utils/versions')); assertMinimumCypressVersion(10); // normalize any windows paths options.componentPath = options.componentPath.replace(/\\/g, '/'); const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.project); const normalizedPath = options.componentPath.startsWith(projectConfig.sourceRoot) ? (0, path_1.relative)(projectConfig.sourceRoot, options.componentPath) : options.componentPath; const componentPath = (0, devkit_1.joinPathFragments)(projectConfig.sourceRoot, normalizedPath); if (tree.exists(componentPath)) { generateSpecsForComponents(tree, componentPath); } } function generateSpecsForComponents(tree, filePath) { if (!tsModule) { tsModule = (0, ensure_typescript_1.ensureTypescript)(); } const sourceFile = tsModule.createSourceFile(filePath, tree.read(filePath, 'utf-8'), tsModule.ScriptTarget.Latest, true); const cmpNodes = (0, ast_utils_1.findExportDeclarationsForJsx)(sourceFile); const componentDir = (0, path_1.dirname)(filePath); const ext = (0, path_1.extname)(filePath); const fileName = (0, path_1.basename)(filePath, ext); if (tree.exists((0, devkit_1.joinPathFragments)(componentDir, `${fileName}.cy${ext}`))) { return; } const defaultExport = (0, ast_utils_1.getComponentNode)(sourceFile); if (cmpNodes?.length) { const components = cmpNodes.map((cmp) => { const defaults = (0, component_props_1.getComponentPropDefaults)(sourceFile, cmp); const isDefaultExport = defaultExport ? defaultExport.name.text === cmp.name.text : false; return { isDefaultExport, props: [...defaults.props, ...defaults.argTypes], name: cmp.name.text, typeName: defaults.propsTypeName, inlineTypeString: defaults.inlineTypeString, }; }); const namedImports = components .reduce((imports, cmp) => { if (cmp.typeName) { imports.push(cmp.typeName); } if (cmp.isDefaultExport) { return imports; } imports.push(cmp.name); return imports; }, []) .join(', '); const namedImportStatement = namedImports.length > 0 ? `, { ${namedImports} }` : ''; (0, devkit_1.generateFiles)(tree, (0, path_1.join)(__dirname, 'files'), componentDir, { fileName, components, importStatement: defaultExport ? `import ${defaultExport.name.text}${namedImportStatement} from './${fileName}'` : `import { ${namedImports} } from './${fileName}'`, ext, }); } } exports.default = componentTestGenerator;