@nx/react
Version:
77 lines (76 loc) • 3.55 kB
JavaScript
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;
;