@nx/cypress 16.8.0-beta.3 → 16.8.0-beta.5
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/package.json +6 -6
- package/plugins/cypress-preset.js +15 -6
- package/src/executors/cypress/cypress.impl.js +179 -210
- package/src/generators/base-setup/base-setup.js +15 -5
- package/src/generators/component-configuration/component-configuration.js +42 -30
- package/src/generators/configuration/configuration.js +87 -70
- package/src/generators/convert-tslint-to-eslint/convert-tslint-to-eslint.js +75 -78
- package/src/generators/cypress-project/cypress-project.js +76 -63
- package/src/generators/init/init.js +16 -18
- package/src/generators/migrate-to-cypress-11/conversion.util.js +22 -16
- package/src/generators/migrate-to-cypress-11/migrate-to-cypress-11.js +38 -35
- package/src/migrations/update-12-8-0/remove-typescript-plugin.js +23 -26
- package/src/migrations/update-14-6-1/update-cypress-configs-presets.js +79 -68
- package/src/migrations/update-14-7-0/update-cypress-version-if-10.js +1 -2
- package/src/migrations/update-15-0-0/add-cypress-inputs.js +24 -29
- package/src/migrations/update-15-0-0/update-cy-mount-usage.js +25 -29
- package/src/migrations/update-15-1-0/cypress-11.js +34 -37
- package/src/migrations/update-15-5-0/update-to-cypress-12.js +3 -5
- package/src/migrations/update-16-0-0-add-nx-packages/update-16-0-0-add-nx-packages.js +3 -6
- package/src/migrations/update-16-2-0/update-cy-tsconfig.js +25 -24
- package/src/migrations/update-16-4-0/tsconfig-sourcemaps.js +52 -49
- package/src/plugins/preprocessor-vite.js +7 -5
- package/src/utils/add-linter.js +78 -81
- package/src/utils/config.js +54 -62
- package/src/utils/ct-helpers.js +6 -8
- package/src/utils/cypress-version.js +1 -1
- package/src/utils/find-target-options.js +37 -43
|
@@ -1,59 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.fixLegacyCypressTsconfig = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
4
|
const executor_options_utils_1 = require("@nx/devkit/src/generators/executor-options-utils");
|
|
6
5
|
const devkit_1 = require("@nx/devkit");
|
|
7
6
|
const path_1 = require("path");
|
|
8
|
-
function fixLegacyCypressTsconfig(tree) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
7
|
+
async function fixLegacyCypressTsconfig(tree) {
|
|
8
|
+
const projects = (0, devkit_1.getProjects)(tree);
|
|
9
|
+
(0, executor_options_utils_1.forEachExecutorOptions)(tree, '@nx/cypress:cypress', (options, projectName, targetName, configName) => {
|
|
10
|
+
const projectConfig = projects.get(projectName);
|
|
11
|
+
if (options.testingType !== 'e2e' &&
|
|
12
|
+
projectConfig.targets[targetName]?.options?.testingType !== 'e2e') {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const tsconfigToRemove = options.tsConfig ??
|
|
16
|
+
(0, devkit_1.joinPathFragments)(projectConfig.root, 'tsconfig.e2e.json');
|
|
17
|
+
const projectLevelConfigPath = (0, devkit_1.joinPathFragments)(projectConfig.root, 'tsconfig.json');
|
|
18
|
+
if (!tree.exists(projectLevelConfigPath) ||
|
|
19
|
+
!tree.exists(tsconfigToRemove)) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (tsconfigToRemove === projectLevelConfigPath) {
|
|
23
|
+
(0, devkit_1.updateJson)(tree, projectLevelConfigPath, (json) => {
|
|
24
|
+
json.compilerOptions = {
|
|
25
|
+
sourceMap: false,
|
|
26
|
+
...json.compilerOptions,
|
|
27
|
+
};
|
|
28
|
+
return json;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const e2eConfig = (0, devkit_1.readJson)(tree, tsconfigToRemove);
|
|
33
|
+
(0, devkit_1.updateJson)(tree, projectLevelConfigPath, (json) => {
|
|
34
|
+
json.compilerOptions = {
|
|
35
|
+
sourceMap: false,
|
|
36
|
+
...json.compilerOptions,
|
|
37
|
+
...e2eConfig.compilerOptions,
|
|
38
|
+
};
|
|
39
|
+
json.files = Array.from(new Set([...(json.files ?? []), ...(e2eConfig.files ?? [])]));
|
|
40
|
+
json.include = Array.from(new Set([...(json.include ?? []), ...(e2eConfig.include ?? [])]));
|
|
41
|
+
json.exclude = Array.from(new Set([...(json.exclude ?? []), ...(e2eConfig.exclude ?? [])]));
|
|
42
|
+
// these paths will always be 'unix style'
|
|
43
|
+
// and on windows relative will not work on these paths
|
|
44
|
+
const tsConfigFromProjRoot = path_1.posix.relative(projectConfig.root, tsconfigToRemove);
|
|
45
|
+
json.references = (json.references ?? []).filter(({ path }) => !path.includes(tsConfigFromProjRoot));
|
|
46
|
+
return json;
|
|
47
|
+
});
|
|
48
|
+
tree.delete(tsconfigToRemove);
|
|
49
|
+
}
|
|
50
|
+
if (configName) {
|
|
51
|
+
delete projectConfig.targets[targetName].configurations[configName]
|
|
52
|
+
.tsConfig;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
delete projectConfig.targets[targetName].options.tsConfig;
|
|
56
|
+
}
|
|
57
|
+
(0, devkit_1.updateProjectConfiguration)(tree, projectName, projectConfig);
|
|
56
58
|
});
|
|
59
|
+
await (0, devkit_1.formatFiles)(tree);
|
|
57
60
|
}
|
|
58
61
|
exports.fixLegacyCypressTsconfig = fixLegacyCypressTsconfig;
|
|
59
62
|
exports.default = fixLegacyCypressTsconfig;
|
|
@@ -24,7 +24,6 @@
|
|
|
24
24
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
25
25
|
**/
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
|
-
const tslib_1 = require("tslib");
|
|
28
27
|
const path_1 = require("path");
|
|
29
28
|
const cache = new Map();
|
|
30
29
|
/**
|
|
@@ -33,7 +32,7 @@ const cache = new Map();
|
|
|
33
32
|
* Instead, use the nxE2EPreset(__filename, { bundler: 'vite' }) function instead.
|
|
34
33
|
*/
|
|
35
34
|
function vitePreprocessor(userConfigPath) {
|
|
36
|
-
return (file) =>
|
|
35
|
+
return async (file) => {
|
|
37
36
|
const { outputPath, filePath, shouldWatch } = file;
|
|
38
37
|
if (cache.has(filePath)) {
|
|
39
38
|
return cache.get(filePath);
|
|
@@ -61,8 +60,11 @@ function vitePreprocessor(userConfigPath) {
|
|
|
61
60
|
},
|
|
62
61
|
};
|
|
63
62
|
cache.set(filePath, outputPath);
|
|
64
|
-
const { build } =
|
|
65
|
-
const watcher = (
|
|
63
|
+
const { build } = await Function('return import("vite")')();
|
|
64
|
+
const watcher = (await build({
|
|
65
|
+
configFile: userConfigPath,
|
|
66
|
+
...defaultConfig,
|
|
67
|
+
}));
|
|
66
68
|
return new Promise((resolve, reject) => {
|
|
67
69
|
if (shouldWatch && isWatcher(watcher)) {
|
|
68
70
|
watcher.on('event', (event) => {
|
|
@@ -84,7 +86,7 @@ function vitePreprocessor(userConfigPath) {
|
|
|
84
86
|
resolve(outputPath);
|
|
85
87
|
}
|
|
86
88
|
});
|
|
87
|
-
}
|
|
89
|
+
};
|
|
88
90
|
}
|
|
89
91
|
function isWatcher(maybeWatcher) {
|
|
90
92
|
return maybeWatcher.on !== undefined;
|
package/src/utils/add-linter.js
CHANGED
|
@@ -1,96 +1,93 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addLinterToCyProject = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
4
|
const devkit_1 = require("@nx/devkit");
|
|
6
5
|
const linter_1 = require("@nx/linter");
|
|
7
6
|
const cypress_version_1 = require("./cypress-version");
|
|
8
7
|
const versions_1 = require("./versions");
|
|
9
8
|
const eslint_file_1 = require("@nx/linter/src/generators/utils/eslint-file");
|
|
10
9
|
const global_eslint_config_1 = require("@nx/linter/src/generators/init/global-eslint-config");
|
|
11
|
-
function addLinterToCyProject(tree, options) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
10
|
+
async function addLinterToCyProject(tree, options) {
|
|
11
|
+
if (options.linter === linter_1.Linter.None) {
|
|
12
|
+
return () => { };
|
|
13
|
+
}
|
|
14
|
+
const tasks = [];
|
|
15
|
+
const projectConfig = (0, devkit_1.readProjectConfiguration)(tree, options.project);
|
|
16
|
+
const eslintFile = (0, eslint_file_1.findEslintFile)(tree, projectConfig.root);
|
|
17
|
+
if (!eslintFile) {
|
|
18
|
+
tasks.push(await (0, linter_1.lintProjectGenerator)(tree, {
|
|
19
|
+
project: options.project,
|
|
20
|
+
linter: options.linter,
|
|
21
|
+
skipFormat: true,
|
|
22
|
+
tsConfigPaths: [(0, devkit_1.joinPathFragments)(projectConfig.root, 'tsconfig.json')],
|
|
23
|
+
eslintFilePatterns: [
|
|
24
|
+
`${projectConfig.root}/**/*.${options.js ? 'js' : '{js,ts}'}`,
|
|
25
|
+
],
|
|
26
|
+
setParserOptionsProject: options.setParserOptionsProject,
|
|
27
|
+
skipPackageJson: options.skipPackageJson,
|
|
28
|
+
rootProject: options.rootProject,
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
if (!options.linter || options.linter !== linter_1.Linter.EsLint) {
|
|
32
|
+
return (0, devkit_1.runTasksInSerial)(...tasks);
|
|
33
|
+
}
|
|
34
|
+
tasks.push(!options.skipPackageJson
|
|
35
|
+
? (0, devkit_1.addDependenciesToPackageJson)(tree, {}, { 'eslint-plugin-cypress': versions_1.eslintPluginCypressVersion })
|
|
36
|
+
: () => { });
|
|
37
|
+
if ((0, eslint_file_1.isEslintConfigSupported)(tree)) {
|
|
38
|
+
const overrides = [];
|
|
39
|
+
if (options.rootProject) {
|
|
40
|
+
(0, eslint_file_1.addPluginsToLintConfig)(tree, projectConfig.root, '@nx');
|
|
41
|
+
overrides.push(global_eslint_config_1.javaScriptOverride);
|
|
35
42
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
(0, eslint_file_1.addExtendsToLintConfig)(tree, projectConfig.root, 'plugin:cypress/recommended');
|
|
44
|
+
const cyVersion = (0, cypress_version_1.installedCypressVersion)();
|
|
45
|
+
/**
|
|
46
|
+
* We need this override because we enabled allowJS in the tsconfig to allow for JS based Cypress tests.
|
|
47
|
+
* That however leads to issues with the CommonJS Cypress plugin file.
|
|
48
|
+
*/
|
|
49
|
+
const cy6Override = {
|
|
50
|
+
files: [`${options.cypressDir}/plugins/index.js`],
|
|
51
|
+
rules: {
|
|
52
|
+
'@typescript-eslint/no-var-requires': 'off',
|
|
53
|
+
'no-undef': 'off',
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const addCy6Override = cyVersion && cyVersion < 7;
|
|
57
|
+
if (options.overwriteExisting) {
|
|
58
|
+
overrides.push({
|
|
59
|
+
files: ['*.ts', '*.tsx', '*.js', '*.jsx'],
|
|
60
|
+
parserOptions: !options.setParserOptionsProject
|
|
61
|
+
? undefined
|
|
62
|
+
: {
|
|
63
|
+
project: `${projectConfig.root}/tsconfig.*?.json`,
|
|
64
|
+
},
|
|
65
|
+
rules: {},
|
|
66
|
+
});
|
|
67
|
+
if (addCy6Override) {
|
|
68
|
+
overrides.push(cy6Override);
|
|
44
69
|
}
|
|
45
|
-
(0, eslint_file_1.
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
parserOptions: !options.setParserOptionsProject
|
|
63
|
-
? undefined
|
|
64
|
-
: {
|
|
65
|
-
project: `${projectConfig.root}/tsconfig.*?.json`,
|
|
66
|
-
},
|
|
67
|
-
rules: {},
|
|
68
|
-
});
|
|
69
|
-
if (addCy6Override) {
|
|
70
|
-
overrides.push(cy6Override);
|
|
71
|
-
}
|
|
72
|
-
(0, eslint_file_1.replaceOverridesInLintConfig)(tree, projectConfig.root, overrides);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
overrides.unshift({
|
|
76
|
-
files: [
|
|
77
|
-
'*.cy.{ts,js,tsx,jsx}',
|
|
78
|
-
`${options.cypressDir}/**/*.{ts,js,tsx,jsx}`,
|
|
79
|
-
],
|
|
80
|
-
parserOptions: !options.setParserOptionsProject
|
|
81
|
-
? undefined
|
|
82
|
-
: {
|
|
83
|
-
project: `${projectConfig.root}/tsconfig.*?.json`,
|
|
84
|
-
},
|
|
85
|
-
rules: {},
|
|
86
|
-
});
|
|
87
|
-
if (addCy6Override) {
|
|
88
|
-
overrides.push(cy6Override);
|
|
89
|
-
}
|
|
90
|
-
overrides.forEach((override) => (0, eslint_file_1.addOverrideToLintConfig)(tree, projectConfig.root, override));
|
|
70
|
+
(0, eslint_file_1.replaceOverridesInLintConfig)(tree, projectConfig.root, overrides);
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
overrides.unshift({
|
|
74
|
+
files: [
|
|
75
|
+
'*.cy.{ts,js,tsx,jsx}',
|
|
76
|
+
`${options.cypressDir}/**/*.{ts,js,tsx,jsx}`,
|
|
77
|
+
],
|
|
78
|
+
parserOptions: !options.setParserOptionsProject
|
|
79
|
+
? undefined
|
|
80
|
+
: {
|
|
81
|
+
project: `${projectConfig.root}/tsconfig.*?.json`,
|
|
82
|
+
},
|
|
83
|
+
rules: {},
|
|
84
|
+
});
|
|
85
|
+
if (addCy6Override) {
|
|
86
|
+
overrides.push(cy6Override);
|
|
91
87
|
}
|
|
88
|
+
overrides.forEach((override) => (0, eslint_file_1.addOverrideToLintConfig)(tree, projectConfig.root, override));
|
|
92
89
|
}
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
}
|
|
91
|
+
return (0, devkit_1.runTasksInSerial)(...tasks);
|
|
95
92
|
}
|
|
96
93
|
exports.addLinterToCyProject = addLinterToCyProject;
|
package/src/utils/config.js
CHANGED
|
@@ -1,35 +1,32 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.addMountDefinition = exports.addDefaultCTConfig = exports.addDefaultE2EConfig = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
4
|
const TS_QUERY_EXPORT_CONFIG_PREFIX = ':matches(ExportAssignment, BinaryExpression:has(Identifier[name="module"]):has(Identifier[name="exports"]))';
|
|
6
|
-
function addDefaultE2EConfig(cyConfigContents, options) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
return `{
|
|
5
|
+
async function addDefaultE2EConfig(cyConfigContents, options) {
|
|
6
|
+
if (!cyConfigContents) {
|
|
7
|
+
throw new Error('The passed in cypress config file is empty!');
|
|
8
|
+
}
|
|
9
|
+
const { tsquery } = await Promise.resolve().then(() => require('@phenomnomnominal/tsquery'));
|
|
10
|
+
const testingTypeConfig = tsquery.query(cyConfigContents, `${TS_QUERY_EXPORT_CONFIG_PREFIX} PropertyAssignment:has(Identifier[name="e2e"])`);
|
|
11
|
+
let updatedConfigContents = cyConfigContents;
|
|
12
|
+
if (testingTypeConfig.length === 0) {
|
|
13
|
+
const configValue = options.bundler === 'vite'
|
|
14
|
+
? `nxE2EPreset(__filename, { cypressDir: '${options.directory}', bundler: 'vite' })`
|
|
15
|
+
: `nxE2EPreset(__filename, { cypressDir: '${options.directory}' })`;
|
|
16
|
+
updatedConfigContents = tsquery.replace(cyConfigContents, `${TS_QUERY_EXPORT_CONFIG_PREFIX} ObjectLiteralExpression:first-child`, (node) => {
|
|
17
|
+
if (node.properties.length > 0) {
|
|
18
|
+
return `{
|
|
21
19
|
${node.properties.map((p) => p.getText()).join(',\n')},
|
|
22
20
|
e2e: ${configValue}
|
|
23
21
|
}`;
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
}
|
|
23
|
+
return `{
|
|
26
24
|
e2e: ${configValue}
|
|
27
25
|
}`;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
26
|
+
});
|
|
27
|
+
updatedConfigContents = `import { nxE2EPreset } from '@nx/cypress/plugins/cypress-preset';\n${updatedConfigContents}`;
|
|
28
|
+
}
|
|
29
|
+
return updatedConfigContents;
|
|
33
30
|
}
|
|
34
31
|
exports.addDefaultE2EConfig = addDefaultE2EConfig;
|
|
35
32
|
/**
|
|
@@ -37,32 +34,30 @@ exports.addDefaultE2EConfig = addDefaultE2EConfig;
|
|
|
37
34
|
* Make sure after calling this the correct import statement is addeda
|
|
38
35
|
* to bring in the nxComponentTestingPreset function
|
|
39
36
|
**/
|
|
40
|
-
function addDefaultCTConfig(cyConfigContents, options = {}) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
return `{
|
|
37
|
+
async function addDefaultCTConfig(cyConfigContents, options = {}) {
|
|
38
|
+
if (!cyConfigContents) {
|
|
39
|
+
throw new Error('The passed in cypress config file is empty!');
|
|
40
|
+
}
|
|
41
|
+
const { tsquery } = await Promise.resolve().then(() => require('@phenomnomnominal/tsquery'));
|
|
42
|
+
const testingTypeConfig = tsquery.query(cyConfigContents, `${TS_QUERY_EXPORT_CONFIG_PREFIX} PropertyAssignment:has(Identifier[name="component"])`);
|
|
43
|
+
let updatedConfigContents = cyConfigContents;
|
|
44
|
+
if (testingTypeConfig.length === 0) {
|
|
45
|
+
const configValue = options?.bundler === 'vite'
|
|
46
|
+
? "nxComponentTestingPreset(__filename, { bundler: 'vite' })"
|
|
47
|
+
: 'nxComponentTestingPreset(__filename)';
|
|
48
|
+
updatedConfigContents = tsquery.replace(cyConfigContents, `${TS_QUERY_EXPORT_CONFIG_PREFIX} ObjectLiteralExpression:first-child`, (node) => {
|
|
49
|
+
if (node.properties.length > 0) {
|
|
50
|
+
return `{
|
|
55
51
|
${node.properties.map((p) => p.getText()).join(',\n')},
|
|
56
52
|
component: ${configValue}
|
|
57
53
|
}`;
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
}
|
|
55
|
+
return `{
|
|
60
56
|
component: ${configValue}
|
|
61
57
|
}`;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
return updatedConfigContents;
|
|
66
61
|
}
|
|
67
62
|
exports.addDefaultCTConfig = addDefaultCTConfig;
|
|
68
63
|
/**
|
|
@@ -70,27 +65,24 @@ exports.addDefaultCTConfig = addDefaultCTConfig;
|
|
|
70
65
|
* Make sure after calling this the correct import statement is added
|
|
71
66
|
* to bring in the correct mount from cypress.
|
|
72
67
|
**/
|
|
73
|
-
function addMountDefinition(cmpCommandFileContents) {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
? `<${node.typeParameters.map((p) => p.getText()).join(', ')}>`
|
|
88
|
-
: ''} {
|
|
68
|
+
async function addMountDefinition(cmpCommandFileContents) {
|
|
69
|
+
if (!cmpCommandFileContents) {
|
|
70
|
+
throw new Error('The passed in cypress component file is empty!');
|
|
71
|
+
}
|
|
72
|
+
const { tsquery } = await Promise.resolve().then(() => require('@phenomnomnominal/tsquery'));
|
|
73
|
+
const hasMountCommand = tsquery.query(cmpCommandFileContents, 'CallExpression StringLiteral[value="mount"]')?.length > 0;
|
|
74
|
+
if (hasMountCommand) {
|
|
75
|
+
return cmpCommandFileContents;
|
|
76
|
+
}
|
|
77
|
+
const mountCommand = `Cypress.Commands.add('mount', mount);`;
|
|
78
|
+
const updatedInterface = tsquery.replace(cmpCommandFileContents, 'InterfaceDeclaration', (node) => {
|
|
79
|
+
return `interface ${node.name.getText()}${node.typeParameters
|
|
80
|
+
? `<${node.typeParameters.map((p) => p.getText()).join(', ')}>`
|
|
81
|
+
: ''} {
|
|
89
82
|
${node.members.map((m) => m.getText()).join('\n ')}
|
|
90
83
|
mount: typeof mount;
|
|
91
84
|
}`;
|
|
92
|
-
});
|
|
93
|
-
return `${updatedInterface}\n${mountCommand}`;
|
|
94
85
|
});
|
|
86
|
+
return `${updatedInterface}\n${mountCommand}`;
|
|
95
87
|
}
|
|
96
88
|
exports.addMountDefinition = addMountDefinition;
|
package/src/utils/ct-helpers.js
CHANGED
|
@@ -14,15 +14,14 @@ exports.CY_FILE_MATCHER = new RegExp(/\.cy\.[tj]sx?$/);
|
|
|
14
14
|
* i.e. <context.root>/tmp/<project-root>/ct-styles.css
|
|
15
15
|
*/
|
|
16
16
|
function getTempTailwindPath(context) {
|
|
17
|
-
var _a;
|
|
18
17
|
if (!context.projectName) {
|
|
19
18
|
throw new Error('No project name found in context');
|
|
20
19
|
}
|
|
21
|
-
const project = context
|
|
20
|
+
const project = context?.projectGraph.nodes[context.projectName];
|
|
22
21
|
if (!project) {
|
|
23
22
|
throw new Error(`No project found in project graph for ${context.projectName}`);
|
|
24
23
|
}
|
|
25
|
-
if (
|
|
24
|
+
if (project?.data?.root) {
|
|
26
25
|
return (0, path_1.join)(context.root, 'tmp', project.data.root, 'ct-styles.css');
|
|
27
26
|
}
|
|
28
27
|
}
|
|
@@ -46,8 +45,6 @@ function isCtProjectUsingBuildProject(graph, parentProjectName, childProjectName
|
|
|
46
45
|
}
|
|
47
46
|
exports.isCtProjectUsingBuildProject = isCtProjectUsingBuildProject;
|
|
48
47
|
function getProjectConfigByPath(graph, configPath) {
|
|
49
|
-
var _a, _b, _c;
|
|
50
|
-
var _d;
|
|
51
48
|
const configFileFromWorkspaceRoot = (0, path_1.relative)(devkit_1.workspaceRoot, configPath);
|
|
52
49
|
const normalizedPathFromWorkspaceRoot = (0, devkit_1.normalizePath)((0, fs_1.lstatSync)(configPath).isFile()
|
|
53
50
|
? configFileFromWorkspaceRoot.replace((0, path_1.extname)(configPath), '')
|
|
@@ -55,13 +52,14 @@ function getProjectConfigByPath(graph, configPath) {
|
|
|
55
52
|
const projectRootMappings = (0, find_project_for_path_1.createProjectRootMappings)(graph.nodes);
|
|
56
53
|
const componentTestingProjectName = (0, find_project_for_path_1.findProjectForPath)(normalizedPathFromWorkspaceRoot, projectRootMappings);
|
|
57
54
|
if (!componentTestingProjectName ||
|
|
58
|
-
!
|
|
55
|
+
!graph.nodes[componentTestingProjectName]?.data) {
|
|
59
56
|
throw new Error((0, devkit_1.stripIndents) `Unable to find the project configuration that includes ${normalizedPathFromWorkspaceRoot}.
|
|
60
57
|
Found project name? ${componentTestingProjectName}.
|
|
61
|
-
Graph has data? ${!!
|
|
58
|
+
Graph has data? ${!!graph.nodes[componentTestingProjectName]?.data}`);
|
|
62
59
|
}
|
|
63
60
|
// make sure name is set since it can be undefined
|
|
64
|
-
|
|
61
|
+
graph.nodes[componentTestingProjectName].data.name ??=
|
|
62
|
+
componentTestingProjectName;
|
|
65
63
|
return graph.nodes[componentTestingProjectName].data;
|
|
66
64
|
}
|
|
67
65
|
exports.getProjectConfigByPath = getProjectConfigByPath;
|