* feat(testing): add generator to aid in the migration to cypress 10 cypress 10 introduces a new configuration format and new layout that requires update settings and files for e2e projects * feat(testing): cypress component tests for react/next initial work for cypress component tests for react and next * feat(testing): add support for v10 e2e cypress projects create the correct files for cypress projects >v10 and reorganize tests based on version to allow easier parsing of tests * feat(testing): add utils for modifying cypress v10 config provide ts transformers to take in an existing cypress config and update/add properties within the given configuration * fix(testing): fix tests affected by the cypress v10 changes update tests to assert the correct files/folders/file contents due to the cypress changes in v10 * cleanup(testing): move cypress component testing plugins into the respective packages move the plugins into out of cypress plugins into the specific vertical plugin to prevent issues with circular refs * cleanup(testing): bump cypress version bump to latest cypress v10 release * docs(testing): update docs for cypress 10 update cypress docs to include info about component testing and migration to cypress v10 * fix(repo): revert cypress version bump keep v9 of cypress installed for nx repo until v10 release * fix(testing): update cypress gen tsconfig and infer targets with converter * fix(testing): make sure tests use the cypress v10 (for the intermediate) * fix(testing): update target name after feedback * fix(testing): support multiple target w/custom configs for cypress v10 migration * fix(testing): refactor cy component tests into seperate verticals * feat(testing): create storybook cypress preset * fix(testing): clean up cy v10 migration * fix(testing): don't branch for cypress executor testingType * fix(testing): move cy comp test generator to next * fix(testing): bump cypress deps * fix(testing): clean up cy component testing generators * fix(testing): update cy component testing docs * fix(testign): dep check. runtime plugin pulls from @nrwl/react * fix(testing): move e2e into verticals * fix(testing): address PR feedback * fix(testing): clean up unit tests * feat(angular): support migrating angular cli workspaces using cypress v10 * chore(testing): update e2e tests * fix(testing): address pr feedback * chore(testing): remove cypress component testing for next.js * fix(testing): address pr feedback Co-authored-by: Leosvel Pérez Espinosa <leosvel.perez.espinosa@gmail.com>
180 lines
4.1 KiB
TypeScript
180 lines
4.1 KiB
TypeScript
import { nxBaseCypressPreset } from '@nrwl/cypress/plugins/cypress-preset';
|
|
import { getCSSModuleLocalIdent } from '@nrwl/web/src/utils/web.config';
|
|
import { TsconfigPathsPlugin } from 'tsconfig-paths-webpack-plugin';
|
|
import type { Configuration } from 'webpack';
|
|
|
|
/**
|
|
* React nx preset for Cypress Component Testing
|
|
*
|
|
* This preset contains the base configuration
|
|
* for your component tests that nx recommends.
|
|
* including a devServer that supports nx workspaces.
|
|
* you can easily extend this within your cypress config via spreading the preset
|
|
* @example
|
|
* export default defineConfig({
|
|
* component: {
|
|
* ...nxComponentTestingPreset(__dirname)
|
|
* // add your own config here
|
|
* }
|
|
* })
|
|
*
|
|
* @param pathToConfig will be used to construct the output paths for videos and screenshots
|
|
*/
|
|
export function nxComponentTestingPreset(pathToConfig: string) {
|
|
return {
|
|
...nxBaseCypressPreset(pathToConfig),
|
|
devServer: {
|
|
// cypress uses string union type,
|
|
// need to use const to prevent typing to string
|
|
framework: 'react',
|
|
bundler: 'webpack',
|
|
webpackConfig: buildBaseWebpackConfig({
|
|
tsConfigPath: 'tsconfig.cy.json',
|
|
compiler: 'babel',
|
|
}),
|
|
} as const,
|
|
};
|
|
}
|
|
|
|
// TODO(caleb): use the webpack utils to build the config
|
|
// can't seem to get css modules to play nice when using it 🤔
|
|
function buildBaseWebpackConfig({
|
|
tsConfigPath = 'tsconfig.cy.json',
|
|
compiler = 'babel',
|
|
}: {
|
|
tsConfigPath: string;
|
|
compiler: 'swc' | 'babel';
|
|
}): Configuration {
|
|
const extensions = ['.ts', '.tsx', '.mjs', '.js', '.jsx'];
|
|
const config: Configuration = {
|
|
target: 'web',
|
|
resolve: {
|
|
extensions,
|
|
plugins: [
|
|
new TsconfigPathsPlugin({
|
|
configFile: tsConfigPath,
|
|
extensions,
|
|
}) as never,
|
|
],
|
|
},
|
|
mode: 'development',
|
|
devtool: false,
|
|
output: {
|
|
publicPath: '/',
|
|
chunkFilename: '[name].bundle.js',
|
|
},
|
|
module: {
|
|
rules: [
|
|
{
|
|
test: /\.(bmp|png|jpe?g|gif|webp|avif)$/,
|
|
type: 'asset',
|
|
parser: {
|
|
dataUrlCondition: {
|
|
maxSize: 10_000, // 10 kB
|
|
},
|
|
},
|
|
},
|
|
CSS_MODULES_LOADER,
|
|
],
|
|
},
|
|
};
|
|
|
|
if (compiler === 'swc') {
|
|
config.module.rules.push({
|
|
test: /\.([jt])sx?$/,
|
|
loader: require.resolve('swc-loader'),
|
|
exclude: /node_modules/,
|
|
options: {
|
|
jsc: {
|
|
parser: {
|
|
syntax: 'typescript',
|
|
decorators: true,
|
|
tsx: true,
|
|
},
|
|
transform: {
|
|
react: {
|
|
runtime: 'automatic',
|
|
},
|
|
},
|
|
loose: true,
|
|
},
|
|
},
|
|
});
|
|
}
|
|
|
|
if (compiler === 'babel') {
|
|
config.module.rules.push({
|
|
test: /\.(js|jsx|mjs|ts|tsx)$/,
|
|
loader: require.resolve('babel-loader'),
|
|
options: {
|
|
presets: [`@nrwl/react/babel`],
|
|
rootMode: 'upward',
|
|
babelrc: true,
|
|
},
|
|
});
|
|
}
|
|
return config;
|
|
}
|
|
|
|
const loaderModulesOptions = {
|
|
modules: {
|
|
mode: 'local',
|
|
getLocalIdent: getCSSModuleLocalIdent,
|
|
},
|
|
importLoaders: 1,
|
|
};
|
|
|
|
const commonLoaders = [
|
|
{
|
|
loader: require.resolve('style-loader'),
|
|
},
|
|
{
|
|
loader: require.resolve('css-loader'),
|
|
options: loaderModulesOptions,
|
|
},
|
|
];
|
|
|
|
const CSS_MODULES_LOADER = {
|
|
test: /\.css$|\.scss$|\.sass$|\.less$|\.styl$/,
|
|
oneOf: [
|
|
{
|
|
test: /\.module\.css$/,
|
|
use: commonLoaders,
|
|
},
|
|
{
|
|
test: /\.module\.(scss|sass)$/,
|
|
use: [
|
|
...commonLoaders,
|
|
{
|
|
loader: require.resolve('sass-loader'),
|
|
options: {
|
|
implementation: require('sass'),
|
|
sassOptions: {
|
|
fiber: false,
|
|
precision: 8,
|
|
},
|
|
},
|
|
},
|
|
],
|
|
},
|
|
{
|
|
test: /\.module\.less$/,
|
|
use: [
|
|
...commonLoaders,
|
|
{
|
|
loader: require.resolve('less-loader'),
|
|
},
|
|
],
|
|
},
|
|
{
|
|
test: /\.module\.styl$/,
|
|
use: [
|
|
...commonLoaders,
|
|
{
|
|
loader: require.resolve('stylus-loader'),
|
|
},
|
|
],
|
|
},
|
|
],
|
|
};
|