@nx/cypress 17.2.0-beta.1 → 17.2.0-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/migrations.json +9 -5
- package/package.json +6 -5
- package/plugins/cypress-preset.d.ts +2 -2
- package/plugins/cypress-preset.js +30 -23
- package/src/executors/cypress/cypress.impl.js +0 -3
- package/src/generators/configuration/configuration.js +7 -7
- package/src/plugins/plugin.js +29 -40
- package/src/utils/versions.d.ts +1 -1
- package/src/utils/versions.js +1 -1
- package/src/migrations/update-17-2-0/add-nx-cypress-plugin.d.ts +0 -2
- package/src/migrations/update-17-2-0/add-nx-cypress-plugin.js +0 -16
package/migrations.json
CHANGED
|
@@ -52,11 +52,6 @@
|
|
|
52
52
|
"version": "17.2.0-beta.0",
|
|
53
53
|
"description": "Add devServerTargets into cypress.config.ts files for @nx/cypress/plugin",
|
|
54
54
|
"implementation": "./src/migrations/update-17-2-0/add-dev-server-targets-to-cypress-configs"
|
|
55
|
-
},
|
|
56
|
-
"add-nx-cypress-plugin": {
|
|
57
|
-
"version": "17.2.0-beta.0",
|
|
58
|
-
"description": "Add the @nx/cypress/plugin to nx.json plugins",
|
|
59
|
-
"implementation": "./src/migrations/update-17-2-0/add-nx-cypress-plugin"
|
|
60
55
|
}
|
|
61
56
|
},
|
|
62
57
|
"packageJsonUpdates": {
|
|
@@ -92,6 +87,15 @@
|
|
|
92
87
|
"alwaysAddToPackageJson": false
|
|
93
88
|
}
|
|
94
89
|
}
|
|
90
|
+
},
|
|
91
|
+
"17.2.0-beta.2": {
|
|
92
|
+
"version": "17.2.0-beta.2",
|
|
93
|
+
"packages": {
|
|
94
|
+
"vite": {
|
|
95
|
+
"version": "^5.0.0",
|
|
96
|
+
"alwaysAddToPackageJson": false
|
|
97
|
+
}
|
|
98
|
+
}
|
|
95
99
|
}
|
|
96
100
|
}
|
|
97
101
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nx/cypress",
|
|
3
|
-
"version": "17.2.0-beta.
|
|
3
|
+
"version": "17.2.0-beta.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "The Nx Plugin for Cypress contains executors and generators allowing your workspace to use the powerful Cypress integration testing capabilities.",
|
|
6
6
|
"repository": {
|
|
@@ -34,14 +34,15 @@
|
|
|
34
34
|
"migrations": "./migrations.json"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@nx/devkit": "17.2.0-beta.
|
|
38
|
-
"@nx/eslint": "17.2.0-beta.
|
|
39
|
-
"@nx/js": "17.2.0-beta.
|
|
37
|
+
"@nx/devkit": "17.2.0-beta.3",
|
|
38
|
+
"@nx/eslint": "17.2.0-beta.3",
|
|
39
|
+
"@nx/js": "17.2.0-beta.3",
|
|
40
40
|
"@phenomnomnominal/tsquery": "~5.0.1",
|
|
41
41
|
"detect-port": "^1.5.1",
|
|
42
|
+
"string-argv": "^0.3.2",
|
|
42
43
|
"semver": "7.5.3",
|
|
43
44
|
"tslib": "^2.3.0",
|
|
44
|
-
"@nrwl/cypress": "17.2.0-beta.
|
|
45
|
+
"@nrwl/cypress": "17.2.0-beta.3"
|
|
45
46
|
},
|
|
46
47
|
"peerDependencies": {
|
|
47
48
|
"cypress": ">= 3 < 14"
|
|
@@ -40,7 +40,7 @@ export type NxCypressE2EPresetOptions = {
|
|
|
40
40
|
* default is 'src'
|
|
41
41
|
**/
|
|
42
42
|
cypressDir?: string;
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
webServerCommands?: Record<string, string>;
|
|
44
|
+
ciWebServerCommand?: string;
|
|
45
45
|
};
|
|
46
46
|
export {};
|
|
@@ -5,8 +5,8 @@ const devkit_1 = require("@nx/devkit");
|
|
|
5
5
|
const path_1 = require("path");
|
|
6
6
|
const fs_1 = require("fs");
|
|
7
7
|
const preprocessor_vite_1 = require("../src/plugins/preprocessor-vite");
|
|
8
|
-
const
|
|
9
|
-
const
|
|
8
|
+
const string_argv_1 = require("string-argv");
|
|
9
|
+
const child_process_1 = require("child_process");
|
|
10
10
|
function nxBaseCypressPreset(pathToConfig, options) {
|
|
11
11
|
// used to set babel settings for react CT.
|
|
12
12
|
process.env.NX_CYPRESS_COMPONENT_TEST =
|
|
@@ -51,38 +51,45 @@ function nxE2EPreset(pathToConfig, options) {
|
|
|
51
51
|
specPattern: `${basePath}/**/*.cy.{js,jsx,ts,tsx}`,
|
|
52
52
|
fixturesFolder: `${basePath}/fixtures`,
|
|
53
53
|
env: {
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
ciDevServerTarget: options?.ciDevServerTarget,
|
|
54
|
+
webServerCommands: options?.webServerCommands,
|
|
55
|
+
ciWebServerCommand: options?.ciWebServerCommand,
|
|
57
56
|
},
|
|
58
57
|
async setupNodeEvents(on, config) {
|
|
59
58
|
if (options?.bundler === 'vite') {
|
|
60
59
|
on('file:preprocessor', (0, preprocessor_vite_1.default)());
|
|
61
60
|
}
|
|
62
|
-
if (!config.env.
|
|
61
|
+
if (!config.env.webServerCommands) {
|
|
63
62
|
return;
|
|
64
63
|
}
|
|
65
|
-
const
|
|
66
|
-
if (!
|
|
64
|
+
const webServerCommand = config.env.webServerCommand ?? config.env.webServerCommands.default;
|
|
65
|
+
if (!webServerCommand) {
|
|
67
66
|
return;
|
|
68
67
|
}
|
|
69
|
-
if (!config.baseUrl &&
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
68
|
+
if (!config.baseUrl && webServerCommand) {
|
|
69
|
+
return new Promise((resolve) => {
|
|
70
|
+
const [command, ...args] = (0, string_argv_1.default)(webServerCommand);
|
|
71
|
+
const serverProcess = (0, child_process_1.spawn)(command, args, {
|
|
72
|
+
stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
|
|
73
|
+
cwd: devkit_1.workspaceRoot,
|
|
74
|
+
// Shell is required for windows but cannot be true on linux because it interferes with terminating the process
|
|
75
|
+
shell: process.platform === 'win32',
|
|
76
|
+
windowsHide: true,
|
|
77
|
+
});
|
|
78
|
+
serverProcess.on('message', (message) => {
|
|
79
|
+
if (typeof message === 'object' &&
|
|
80
|
+
'type' in message &&
|
|
81
|
+
'baseUrl' in message &&
|
|
82
|
+
message.type === 'server') {
|
|
83
|
+
config.baseUrl = message.baseUrl;
|
|
84
|
+
resolve(config);
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
on('after:run', () => {
|
|
88
|
+
serverProcess.kill('SIGTERM');
|
|
89
|
+
});
|
|
79
90
|
});
|
|
80
|
-
const devServerValue = (await devServer.next()).value;
|
|
81
|
-
if (!devServerValue) {
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
return { ...config, baseUrl: devServerValue.baseUrl };
|
|
85
91
|
}
|
|
92
|
+
return config;
|
|
86
93
|
},
|
|
87
94
|
};
|
|
88
95
|
return baseConfig;
|
|
@@ -95,28 +95,28 @@ async function addFiles(tree, options, projectGraph, hasPlugin) {
|
|
|
95
95
|
jsx: options.jsx,
|
|
96
96
|
});
|
|
97
97
|
const cyFile = (0, devkit_1.joinPathFragments)(projectConfig.root, 'cypress.config.ts');
|
|
98
|
-
let
|
|
98
|
+
let webServerCommands;
|
|
99
99
|
let ciDevServerTarget;
|
|
100
100
|
if (hasPlugin && !options.baseUrl && options.devServerTarget) {
|
|
101
|
-
|
|
102
|
-
|
|
101
|
+
webServerCommands = {};
|
|
102
|
+
webServerCommands.default = 'nx run ' + options.devServerTarget;
|
|
103
103
|
const parsedTarget = (0, devkit_1.parseTargetString)(options.devServerTarget, projectGraph);
|
|
104
104
|
const devServerProjectConfig = (0, devkit_1.readProjectConfiguration)(tree, parsedTarget.project);
|
|
105
105
|
// Add production e2e target if serve target is found
|
|
106
106
|
if (parsedTarget.configuration !== 'production' &&
|
|
107
107
|
devServerProjectConfig.targets[parsedTarget.target]?.configurations?.['production']) {
|
|
108
|
-
|
|
108
|
+
webServerCommands.production = `nx run ${parsedTarget.project}:${parsedTarget.target}:production`;
|
|
109
109
|
}
|
|
110
110
|
// Add ci/static e2e target if serve target is found
|
|
111
111
|
if (devServerProjectConfig.targets?.['serve-static']) {
|
|
112
|
-
ciDevServerTarget =
|
|
112
|
+
ciDevServerTarget = `nx run ${parsedTarget.project}:serve-static`;
|
|
113
113
|
}
|
|
114
114
|
}
|
|
115
115
|
const updatedCyConfig = await (0, config_1.addDefaultE2EConfig)(tree.read(cyFile, 'utf-8'), {
|
|
116
116
|
cypressDir: options.directory,
|
|
117
117
|
bundler: options.bundler === 'vite' ? 'vite' : undefined,
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
webServerCommands,
|
|
119
|
+
ciWebServerCommand: ciDevServerTarget,
|
|
120
120
|
}, options.baseUrl);
|
|
121
121
|
tree.write(cyFile, updatedCyConfig);
|
|
122
122
|
}
|
package/src/plugins/plugin.js
CHANGED
|
@@ -61,7 +61,7 @@ function getOutputs(projectRoot, cypressConfig, testingType) {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
const { screenshotsFolder, videosFolder, e2e, component } = cypressConfig;
|
|
64
|
-
const outputs = [
|
|
64
|
+
const outputs = [];
|
|
65
65
|
if (videosFolder) {
|
|
66
66
|
outputs.push(getOutput(videosFolder));
|
|
67
67
|
}
|
|
@@ -92,50 +92,39 @@ function getOutputs(projectRoot, cypressConfig, testingType) {
|
|
|
92
92
|
}
|
|
93
93
|
function buildCypressTargets(configFilePath, projectRoot, options, context) {
|
|
94
94
|
const cypressConfig = getCypressConfig(configFilePath, context);
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
options: {
|
|
99
|
-
cypressConfig: configFilePath,
|
|
100
|
-
},
|
|
95
|
+
const cypressEnv = {
|
|
96
|
+
...cypressConfig.env,
|
|
97
|
+
...cypressConfig.e2e?.env,
|
|
101
98
|
};
|
|
99
|
+
const devServerTargets = cypressEnv?.devServerTargets;
|
|
100
|
+
const relativeConfigPath = (0, path_1.relative)(projectRoot, configFilePath);
|
|
101
|
+
const namedInputs = (0, get_named_inputs_1.getNamedInputs)(projectRoot, context);
|
|
102
102
|
const targets = {};
|
|
103
103
|
if ('e2e' in cypressConfig) {
|
|
104
|
-
const e2eTargetDefaults = (0, project_configuration_utils_1.readTargetDefaultsForTarget)(options.targetName, context.nxJsonConfiguration.targetDefaults, '@nx/cypress:cypress');
|
|
105
104
|
targets[options.targetName] = {
|
|
106
|
-
|
|
105
|
+
command: `cypress run --config-file ${relativeConfigPath} --e2e`,
|
|
107
106
|
options: {
|
|
108
|
-
|
|
109
|
-
testingType: 'e2e',
|
|
107
|
+
cwd: projectRoot,
|
|
110
108
|
},
|
|
111
109
|
};
|
|
110
|
+
const e2eTargetDefaults = (0, project_configuration_utils_1.readTargetDefaultsForTarget)(options.targetName, context.nxJsonConfiguration.targetDefaults, 'run-commands');
|
|
112
111
|
if (e2eTargetDefaults?.cache === undefined) {
|
|
113
112
|
targets[options.targetName].cache = true;
|
|
114
113
|
}
|
|
115
114
|
if (e2eTargetDefaults?.inputs === undefined) {
|
|
116
|
-
targets[options.targetName].inputs =
|
|
117
|
-
'production' in namedInputs
|
|
118
|
-
? ['default', '^production']
|
|
119
|
-
: ['default', '^default'];
|
|
115
|
+
targets[options.targetName].inputs = getInputs(namedInputs);
|
|
120
116
|
}
|
|
121
117
|
if (e2eTargetDefaults?.outputs === undefined) {
|
|
122
118
|
targets[options.targetName].outputs = getOutputs(projectRoot, cypressConfig, 'e2e');
|
|
123
119
|
}
|
|
124
|
-
const cypressEnv = {
|
|
125
|
-
...cypressConfig.env,
|
|
126
|
-
...cypressConfig.e2e?.env,
|
|
127
|
-
};
|
|
128
|
-
const devServerTargets = cypressEnv?.devServerTargets;
|
|
129
120
|
if (devServerTargets?.default) {
|
|
130
|
-
targets[options.targetName].options.devServerTarget =
|
|
131
|
-
devServerTargets.default;
|
|
132
121
|
delete devServerTargets.default;
|
|
133
122
|
}
|
|
134
123
|
if (Object.keys(devServerTargets ?? {}).length > 0) {
|
|
135
124
|
targets[options.targetName].configurations ??= {};
|
|
136
125
|
for (const [configuration, devServerTarget] of Object.entries(devServerTargets ?? {})) {
|
|
137
126
|
targets[options.targetName].configurations[configuration] = {
|
|
138
|
-
devServerTarget
|
|
127
|
+
command: `cypress run --config-file ${relativeConfigPath} --e2e --env.webServerCommand "nx run ${devServerTarget}"`,
|
|
139
128
|
};
|
|
140
129
|
}
|
|
141
130
|
}
|
|
@@ -153,22 +142,15 @@ function buildCypressTargets(configFilePath, projectRoot, options, context) {
|
|
|
153
142
|
const specFiles = (0, workspace_context_1.globWithWorkspaceContext)(context.workspaceRoot, specPatterns, excludeSpecPatterns);
|
|
154
143
|
const dependsOn = [];
|
|
155
144
|
const outputs = getOutputs(projectRoot, cypressConfig, 'e2e');
|
|
156
|
-
const inputs =
|
|
157
|
-
? ['default', '^production']
|
|
158
|
-
: ['default', '^default'];
|
|
145
|
+
const inputs = getInputs(namedInputs);
|
|
159
146
|
for (const file of specFiles) {
|
|
160
|
-
const
|
|
147
|
+
const relativeSpecFilePath = (0, path_1.relative)(projectRoot, file);
|
|
148
|
+
const targetName = options.ciTargetName + '--' + relativeSpecFilePath;
|
|
161
149
|
targets[targetName] = {
|
|
162
|
-
...targets[options.targetName],
|
|
163
150
|
outputs,
|
|
164
151
|
inputs,
|
|
165
152
|
cache: true,
|
|
166
|
-
|
|
167
|
-
options: {
|
|
168
|
-
...targets[options.targetName].options,
|
|
169
|
-
devServerTarget: ciDevServerTarget,
|
|
170
|
-
spec: file,
|
|
171
|
-
},
|
|
153
|
+
command: `cypress run --config-file ${relativeConfigPath} --e2e --env.webServerCommand "nx run ${ciDevServerTarget}" --spec ${relativeSpecFilePath}`,
|
|
172
154
|
};
|
|
173
155
|
dependsOn.push({
|
|
174
156
|
target: targetName,
|
|
@@ -190,10 +172,9 @@ function buildCypressTargets(configFilePath, projectRoot, options, context) {
|
|
|
190
172
|
const componentTestingTargetDefaults = (0, project_configuration_utils_1.readTargetDefaultsForTarget)(options.componentTestingTargetName, context.nxJsonConfiguration.targetDefaults, '@nx/cypress:cypress');
|
|
191
173
|
// This will not override the e2e target if it is the same
|
|
192
174
|
targets[options.componentTestingTargetName] ??= {
|
|
193
|
-
|
|
175
|
+
command: `cypress open --config-file ${relativeConfigPath} --component`,
|
|
194
176
|
options: {
|
|
195
|
-
|
|
196
|
-
testingType: 'component',
|
|
177
|
+
cwd: projectRoot,
|
|
197
178
|
},
|
|
198
179
|
};
|
|
199
180
|
if (componentTestingTargetDefaults?.cache === undefined) {
|
|
@@ -201,9 +182,7 @@ function buildCypressTargets(configFilePath, projectRoot, options, context) {
|
|
|
201
182
|
}
|
|
202
183
|
if (componentTestingTargetDefaults?.inputs === undefined) {
|
|
203
184
|
targets[options.componentTestingTargetName].inputs =
|
|
204
|
-
|
|
205
|
-
? ['default', '^production']
|
|
206
|
-
: ['default', '^default'];
|
|
185
|
+
getInputs(namedInputs);
|
|
207
186
|
}
|
|
208
187
|
if (componentTestingTargetDefaults?.outputs === undefined) {
|
|
209
188
|
targets[options.componentTestingTargetName].outputs = getOutputs(projectRoot, cypressConfig, 'component');
|
|
@@ -241,3 +220,13 @@ function normalizeOptions(options) {
|
|
|
241
220
|
options.ciTargetName ??= 'e2e-ci';
|
|
242
221
|
return options;
|
|
243
222
|
}
|
|
223
|
+
function getInputs(namedInputs) {
|
|
224
|
+
return [
|
|
225
|
+
...('production' in namedInputs
|
|
226
|
+
? ['default', '^production']
|
|
227
|
+
: ['default', '^default']),
|
|
228
|
+
{
|
|
229
|
+
externalDependencies: ['cypress'],
|
|
230
|
+
},
|
|
231
|
+
];
|
|
232
|
+
}
|
package/src/utils/versions.d.ts
CHANGED
|
@@ -5,5 +5,5 @@ export declare const cypressViteDevServerVersion = "^2.2.1";
|
|
|
5
5
|
export declare const cypressVersion = "^13.0.0";
|
|
6
6
|
export declare const cypressWebpackVersion = "^2.0.0";
|
|
7
7
|
export declare const webpackHttpPluginVersion = "^5.5.0";
|
|
8
|
-
export declare const viteVersion = "
|
|
8
|
+
export declare const viteVersion = "^5.0.0";
|
|
9
9
|
export declare const htmlWebpackPluginVersion = "^5.5.0";
|
package/src/utils/versions.js
CHANGED
|
@@ -8,5 +8,5 @@ exports.cypressViteDevServerVersion = '^2.2.1';
|
|
|
8
8
|
exports.cypressVersion = '^13.0.0';
|
|
9
9
|
exports.cypressWebpackVersion = '^2.0.0';
|
|
10
10
|
exports.webpackHttpPluginVersion = '^5.5.0';
|
|
11
|
-
exports.viteVersion = '
|
|
11
|
+
exports.viteVersion = '^5.0.0';
|
|
12
12
|
exports.htmlWebpackPluginVersion = '^5.5.0';
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const devkit_1 = require("@nx/devkit");
|
|
4
|
-
const plugin_1 = require("../../plugins/plugin");
|
|
5
|
-
const find_project_for_path_1 = require("nx/src/project-graph/utils/find-project-for-path");
|
|
6
|
-
const replace_project_configuration_with_plugin_1 = require("@nx/devkit/src/utils/replace-project-configuration-with-plugin");
|
|
7
|
-
async function update(tree) {
|
|
8
|
-
const proj = Object.fromEntries((0, devkit_1.getProjects)(tree).entries());
|
|
9
|
-
const rootMappings = (0, find_project_for_path_1.createProjectRootMappingsFromProjectConfigurations)(proj);
|
|
10
|
-
await (0, replace_project_configuration_with_plugin_1.replaceProjectConfigurationsWithPlugin)(tree, rootMappings, '@nx/cypress/plugin', plugin_1.createNodes, {
|
|
11
|
-
targetName: 'e2e',
|
|
12
|
-
componentTestingTargetName: 'component-test',
|
|
13
|
-
});
|
|
14
|
-
await (0, devkit_1.formatFiles)(tree);
|
|
15
|
-
}
|
|
16
|
-
exports.default = update;
|