@gnuechtel/nx-cucumber 2.0.0-beta.4 → 2.0.0

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.
@@ -7,12 +7,12 @@ const path = tslib_1.__importStar(require("path"));
7
7
  const fs_1 = require("fs");
8
8
  const test_run_options_1 = require("../../core/test-run-options");
9
9
  async function cucumberJsGenerator(tree, options) {
10
- if (!options.name)
11
- options.name = `${options.project}-e2e`;
12
- if (!options.directory)
13
- options.directory = options.name;
14
10
  if (!options.testRunner)
15
11
  options.testRunner = test_run_options_1.defaultTestRunner;
12
+ ensureProjectExists(tree, options.project);
13
+ options.name = normalizeGeneratedProjectName(options.project, options.name);
14
+ if (!options.directory)
15
+ options.directory = defaultProjectDirectory(options.name);
16
16
  const isPlaywright = options.testRunner === 'playwright';
17
17
  const baseUrl = isPlaywright ? 'http://localhost:4200' : undefined;
18
18
  const serveTarget = isPlaywright ? `${options.project}:serve` : undefined;
@@ -22,9 +22,7 @@ async function cucumberJsGenerator(tree, options) {
22
22
  const parentDir = workspaceLayout.appsDir && !skipAppsDir ? workspaceLayout.appsDir + '/' : '';
23
23
  const projectRoot = `${parentDir}${normalizedDirectory}`;
24
24
  const workspaceRootRelative = (0, devkit_1.offsetFromRoot)(projectRoot).replace(/\/$/, '');
25
- const playwrightTargets = isPlaywright && baseUrl && serveTarget
26
- ? buildPlaywrightTargets(tree, options.project, options.name, serveTarget, baseUrl, projectRoot)
27
- : {};
25
+ const playwrightTargets = isPlaywright && baseUrl && serveTarget ? buildPlaywrightTargets(options.name, projectRoot) : {};
28
26
  (0, devkit_1.addProjectConfiguration)(tree, options.name, {
29
27
  root: projectRoot,
30
28
  sourceRoot: `${projectRoot}/src`,
@@ -47,14 +45,22 @@ async function cucumberJsGenerator(tree, options) {
47
45
  'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js',
48
46
  ]
49
47
  : [];
48
+ const serveCommand = isPlaywright && baseUrl && serveTarget ? buildServeCommand(tree, options.project, serveTarget, baseUrl) : '';
49
+ const testCommand = `npx cucumber-js --config ${projectRoot}/cucumber.js`;
50
+ const templateProjectName = parseScopedProjectName(options.project).name;
50
51
  const substitutions = {
51
52
  ...options,
53
+ project: templateProjectName,
54
+ testedProject: options.project,
52
55
  workspaceRootRelative,
53
56
  projectRoot,
54
57
  playwrightRequires: JSON.stringify(playwrightRequires),
55
58
  isPlaywright,
56
59
  baseUrl: baseUrl || '',
57
60
  serveTarget: serveTarget || '',
61
+ port: baseUrl ? readPortFromUrl(baseUrl) : 0,
62
+ serveCommandJson: JSON.stringify(serveCommand),
63
+ testCommandJson: JSON.stringify(testCommand),
58
64
  };
59
65
  (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files', 'all'), projectRoot, substitutions);
60
66
  (0, devkit_1.generateFiles)(tree, path.join(__dirname, 'files', options.testRunner), projectRoot, substitutions);
@@ -62,53 +68,41 @@ async function cucumberJsGenerator(tree, options) {
62
68
  if (options.customWorld && (0, fs_1.existsSync)(customWorldFiles)) {
63
69
  (0, devkit_1.generateFiles)(tree, customWorldFiles, projectRoot, substitutions);
64
70
  }
71
+ registerPlugin(tree);
65
72
  await (0, devkit_1.formatFiles)(tree);
66
73
  const additionalDevDependencies = {
67
74
  'ts-node': '10.9.1',
68
75
  'tsconfig-paths': '4.2.0',
69
76
  };
70
- if (isPlaywright) {
71
- additionalDevDependencies['kill-port'] = '2.0.1';
72
- additionalDevDependencies['start-server-and-test'] = '3.0.0';
73
- }
74
77
  const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, additionalDevDependencies);
75
78
  return options.skipInstall ? () => undefined : installTask;
76
79
  }
77
- function buildPlaywrightTargets(tree, projectName, e2eProjectName, serveTarget, baseUrl, projectRoot) {
78
- const prepareCommand = buildPlaywrightPrepareCommand();
79
- const e2eCommand = buildPlaywrightE2eCommand(tree, projectName, serveTarget, baseUrl, projectRoot);
80
- const e2eCiCommand = `npx nx run ${e2eProjectName}:e2e-prepare && npx nx run ${e2eProjectName}:e2e`;
80
+ function buildPlaywrightTargets(e2eProjectName, projectRoot) {
81
81
  return {
82
82
  'e2e-prepare': {
83
- command: prepareCommand,
83
+ cache: false,
84
+ command: buildPlaywrightPrepareCommand(),
84
85
  },
85
86
  e2e: {
86
- command: e2eCommand,
87
+ command: `node ${projectRoot}/run-e2e.js`,
87
88
  },
88
89
  'e2e-ci': {
89
- command: e2eCiCommand,
90
+ command: `npx nx run ${e2eProjectName}:e2e-prepare && npx nx run ${e2eProjectName}:e2e`,
90
91
  },
91
92
  };
92
93
  }
93
94
  function buildPlaywrightPrepareCommand() {
94
95
  return `node -e "const { execSync } = require('node:child_process'); const installCommand = process.platform === 'linux' ? 'npx playwright install --with-deps chromium' : 'npx playwright install chromium'; execSync(installCommand, { stdio: 'inherit' });"`;
95
96
  }
96
- function buildPlaywrightE2eCommand(tree, projectName, serveTarget, baseUrl, projectRoot) {
97
+ function buildServeCommand(tree, projectName, serveTarget, baseUrl) {
97
98
  const port = readPortFromUrl(baseUrl);
98
- const serveExecutor = readServeExecutor(tree, projectName);
99
- const serveCommand = serveExecutor === '@nx/vite:dev-server'
99
+ const executor = readServeExecutor(tree, projectName);
100
+ return executor === '@nx/vite:dev-server'
100
101
  ? `npx nx run ${serveTarget} --port=${port} --strictPort`
101
102
  : `npx nx run ${serveTarget}`;
102
- const testCommand = `npx cucumber-js --config ${projectRoot}/cucumber.js`;
103
- return `npx kill-port ${port} && start-server-and-test "${serveCommand}" ${baseUrl} "${testCommand}"`;
104
103
  }
105
104
  function readServeExecutor(tree, projectName) {
106
- try {
107
- return (0, devkit_1.readProjectConfiguration)(tree, projectName).targets?.['serve']?.executor;
108
- }
109
- catch {
110
- return undefined;
111
- }
105
+ return (0, devkit_1.readProjectConfiguration)(tree, projectName).targets?.['serve']?.executor;
112
106
  }
113
107
  function readPortFromUrl(url) {
114
108
  const parsedUrl = new URL(url);
@@ -116,5 +110,54 @@ function readPortFromUrl(url) {
116
110
  return parsedUrl.port;
117
111
  return parsedUrl.protocol === 'https:' ? '443' : '80';
118
112
  }
113
+ function ensureProjectExists(tree, projectName) {
114
+ try {
115
+ (0, devkit_1.readProjectConfiguration)(tree, projectName);
116
+ }
117
+ catch {
118
+ throw new Error(`Project "${projectName}" does not exist in this workspace.`);
119
+ }
120
+ }
121
+ function normalizeGeneratedProjectName(projectName, requestedName) {
122
+ const sourceProject = parseScopedProjectName(projectName);
123
+ const requestedProject = parseScopedProjectName(requestedName?.trim() || '');
124
+ if (requestedProject.raw.length < 1) {
125
+ const inferredName = `${sourceProject.name}-e2e`;
126
+ return sourceProject.scope ? `${sourceProject.scope}/${inferredName}` : inferredName;
127
+ }
128
+ if (requestedProject.scope)
129
+ return requestedProject.raw;
130
+ return sourceProject.scope ? `${sourceProject.scope}/${requestedProject.name}` : requestedProject.name;
131
+ }
132
+ function defaultProjectDirectory(projectName) {
133
+ return parseScopedProjectName(projectName).name;
134
+ }
135
+ function parseScopedProjectName(value) {
136
+ const raw = value.trim();
137
+ if (!raw.startsWith('@')) {
138
+ return { raw, scope: '', name: raw };
139
+ }
140
+ const separatorIndex = raw.indexOf('/');
141
+ if (separatorIndex < 1 || separatorIndex >= raw.length - 1) {
142
+ return { raw, scope: '', name: raw };
143
+ }
144
+ return {
145
+ raw,
146
+ scope: raw.slice(0, separatorIndex),
147
+ name: raw.slice(separatorIndex + 1),
148
+ };
149
+ }
150
+ function registerPlugin(tree) {
151
+ if (!tree.exists('nx.json'))
152
+ return;
153
+ (0, devkit_1.updateJson)(tree, 'nx.json', (json) => {
154
+ if (!Array.isArray(json.plugins))
155
+ json.plugins = [];
156
+ if (!json.plugins.includes('@gnuechtel/nx-cucumber')) {
157
+ json.plugins.push('@gnuechtel/nx-cucumber');
158
+ }
159
+ return json;
160
+ });
161
+ }
119
162
  exports.default = cucumberJsGenerator;
120
163
  //# sourceMappingURL=project.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../../libs/nx-cucumber/src/generators/project/project.ts"],"names":[],"mappings":";;AAgBA,kDA2EC;;AA3FD,uCAUoB;AACpB,mDAA6B;AAE7B,2BAAgC;AAChC,kEAAgE;AAEzD,KAAK,UAAU,mBAAmB,CAAC,IAAU,EAAE,OAAkC;IACtF,IAAI,CAAC,OAAO,CAAC,IAAI;QAAE,OAAO,CAAC,IAAI,GAAG,GAAG,OAAO,CAAC,OAAO,MAAM,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,IAAI,CAAC,OAAO,CAAC,UAAU;QAAE,OAAO,CAAC,UAAU,GAAG,oCAAiB,CAAC;IAChE,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,KAAK,YAAY,CAAC;IACzD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,WAAW,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IAE1E,MAAM,mBAAmB,GAAG,IAAA,sBAAa,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7D,MAAM,eAAe,GAAG,IAAA,2BAAkB,EAAC,IAAI,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,eAAe,CAAC,OAAO,KAAK,GAAG,IAAI,OAAO,CAAC,qBAAqB,CAAC;IACrF,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/F,MAAM,WAAW,GAAG,GAAG,SAAS,GAAG,mBAAmB,EAAE,CAAC;IACzD,MAAM,qBAAqB,GAAG,IAAA,uBAAc,EAAC,WAAW,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC7E,MAAM,iBAAiB,GACrB,YAAY,IAAI,OAAO,IAAI,WAAW;QACpC,CAAC,CAAC,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC;QAChG,CAAC,CAAC,EAAE,CAAC;IAET,IAAA,gCAAuB,EAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;QAC1C,IAAI,EAAE,WAAW;QACjB,UAAU,EAAE,GAAG,WAAW,MAAM;QAChC,WAAW,EAAE,aAAa;QAC1B,OAAO,EAAE;YACP,IAAI,EAAE;gBACJ,QAAQ,EAAE,iBAAiB;gBAC3B,OAAO,EAAE,CAAC,sBAAsB,CAAC;gBACjC,OAAO,EAAE;oBACP,gBAAgB,EAAE,CAAC,GAAG,WAAW,UAAU,CAAC;iBAC7C;aACF;YACD,GAAG,iBAAiB;SACrB;QACD,oBAAoB,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;KACxC,CAAC,CAAC;IAEH,MAAM,kBAAkB,GACtB,OAAO,CAAC,UAAU,KAAK,YAAY;QACjC,CAAC,CAAC;YACE,gFAAgF;YAChF,wEAAwE;SACzE;QACH,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,aAAa,GAAG;QACpB,GAAG,OAAO;QACV,qBAAqB;QACrB,WAAW;QACX,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;QACtD,YAAY;QACZ,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,WAAW,EAAE,WAAW,IAAI,EAAE;KAC/B,CAAC;IAEF,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACtF,IAAA,sBAAa,EAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IAEnG,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,UAAU,eAAe,CAAC,CAAC;IAC7F,IAAI,OAAO,CAAC,WAAW,IAAI,IAAA,eAAU,EAAC,gBAAgB,CAAC,EAAE,CAAC;QACxD,IAAA,sBAAa,EAAC,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAExB,MAAM,yBAAyB,GAA2B;QACxD,SAAS,EAAE,QAAQ;QACnB,gBAAgB,EAAE,OAAO;KAC1B,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,yBAAyB,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC;QACjD,yBAAyB,CAAC,uBAAuB,CAAC,GAAG,OAAO,CAAC;IAC/D,CAAC;IAED,MAAM,WAAW,GAAG,IAAA,qCAA4B,EAAC,IAAI,EAAE,EAAE,EAAE,yBAAyB,CAAC,CAAC;IACtF,OAAO,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;AAC7D,CAAC;AAED,SAAS,sBAAsB,CAC7B,IAAU,EACV,WAAmB,EACnB,cAAsB,EACtB,WAAmB,EACnB,OAAe,EACf,WAAmB;IAEnB,MAAM,cAAc,GAAG,6BAA6B,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,yBAAyB,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IACnG,MAAM,YAAY,GAAG,cAAc,cAAc,8BAA8B,cAAc,MAAM,CAAC;IACpG,OAAO;QACL,aAAa,EAAE;YACb,OAAO,EAAE,cAAc;SACxB;QACD,GAAG,EAAE;YACH,OAAO,EAAE,UAAU;SACpB;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,YAAY;SACtB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B;IACpC,OAAO,wPAAwP,CAAC;AAClQ,CAAC;AAED,SAAS,yBAAyB,CAChC,IAAU,EACV,WAAmB,EACnB,WAAmB,EACnB,OAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC3D,MAAM,YAAY,GAChB,aAAa,KAAK,qBAAqB;QACrC,CAAC,CAAC,cAAc,WAAW,WAAW,IAAI,eAAe;QACzD,CAAC,CAAC,cAAc,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,4BAA4B,WAAW,cAAc,CAAC;IAC1E,OAAO,iBAAiB,IAAI,8BAA8B,YAAY,KAAK,OAAO,KAAK,WAAW,GAAG,CAAC;AACxG,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAU,EAAE,WAAmB;IACxD,IAAI,CAAC;QACH,OAAO,IAAA,iCAAwB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,SAAS,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC,IAAI,CAAC;IAC1C,OAAO,SAAS,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,kBAAe,mBAAmB,CAAC","sourcesContent":["import {\n addProjectConfiguration,\n formatFiles,\n generateFiles,\n Tree,\n addDependenciesToPackageJson,\n normalizePath,\n offsetFromRoot,\n getWorkspaceLayout,\n readProjectConfiguration,\n} from '@nx/devkit';\nimport * as path from 'path';\nimport { CucumberJsGeneratorSchema } from './schema';\nimport { existsSync } from 'fs';\nimport { defaultTestRunner } from '../../core/test-run-options';\n\nexport async function cucumberJsGenerator(tree: Tree, options: CucumberJsGeneratorSchema) {\n if (!options.name) options.name = `${options.project}-e2e`;\n if (!options.directory) options.directory = options.name;\n if (!options.testRunner) options.testRunner = defaultTestRunner;\n const isPlaywright = options.testRunner === 'playwright';\n const baseUrl = isPlaywright ? 'http://localhost:4200' : undefined;\n const serveTarget = isPlaywright ? `${options.project}:serve` : undefined;\n\n const normalizedDirectory = normalizePath(options.directory);\n const workspaceLayout = getWorkspaceLayout(tree);\n const skipAppsDir = workspaceLayout.appsDir === '.' || options.ignoreWorkspaceLayout;\n const parentDir = workspaceLayout.appsDir && !skipAppsDir ? workspaceLayout.appsDir + '/' : '';\n const projectRoot = `${parentDir}${normalizedDirectory}`;\n const workspaceRootRelative = offsetFromRoot(projectRoot).replace(/\\/$/, '');\n const playwrightTargets =\n isPlaywright && baseUrl && serveTarget\n ? buildPlaywrightTargets(tree, options.project, options.name, serveTarget, baseUrl, projectRoot)\n : {};\n\n addProjectConfiguration(tree, options.name, {\n root: projectRoot,\n sourceRoot: `${projectRoot}/src`,\n projectType: 'application',\n targets: {\n lint: {\n executor: '@nx/eslint:lint',\n outputs: ['{options.outputFile}'],\n options: {\n lintFilePatterns: [`${projectRoot}/**/*.ts`],\n },\n },\n ...playwrightTargets,\n },\n implicitDependencies: [options.project],\n });\n\n const playwrightRequires =\n options.testRunner === 'playwright'\n ? [\n 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js',\n 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js',\n ]\n : [];\n\n const substitutions = {\n ...options,\n workspaceRootRelative,\n projectRoot,\n playwrightRequires: JSON.stringify(playwrightRequires),\n isPlaywright,\n baseUrl: baseUrl || '',\n serveTarget: serveTarget || '',\n };\n\n generateFiles(tree, path.join(__dirname, 'files', 'all'), projectRoot, substitutions);\n generateFiles(tree, path.join(__dirname, 'files', options.testRunner), projectRoot, substitutions);\n\n const customWorldFiles = path.join(__dirname, 'files', `${options.testRunner}.custom-world`);\n if (options.customWorld && existsSync(customWorldFiles)) {\n generateFiles(tree, customWorldFiles, projectRoot, substitutions);\n }\n\n await formatFiles(tree);\n\n const additionalDevDependencies: Record<string, string> = {\n 'ts-node': '10.9.1',\n 'tsconfig-paths': '4.2.0',\n };\n if (isPlaywright) {\n additionalDevDependencies['kill-port'] = '2.0.1';\n additionalDevDependencies['start-server-and-test'] = '3.0.0';\n }\n\n const installTask = addDependenciesToPackageJson(tree, {}, additionalDevDependencies);\n return options.skipInstall ? () => undefined : installTask;\n}\n\nfunction buildPlaywrightTargets(\n tree: Tree,\n projectName: string,\n e2eProjectName: string,\n serveTarget: string,\n baseUrl: string,\n projectRoot: string\n) {\n const prepareCommand = buildPlaywrightPrepareCommand();\n const e2eCommand = buildPlaywrightE2eCommand(tree, projectName, serveTarget, baseUrl, projectRoot);\n const e2eCiCommand = `npx nx run ${e2eProjectName}:e2e-prepare && npx nx run ${e2eProjectName}:e2e`;\n return {\n 'e2e-prepare': {\n command: prepareCommand,\n },\n e2e: {\n command: e2eCommand,\n },\n 'e2e-ci': {\n command: e2eCiCommand,\n },\n };\n}\n\nfunction buildPlaywrightPrepareCommand() {\n return `node -e \"const { execSync } = require('node:child_process'); const installCommand = process.platform === 'linux' ? 'npx playwright install --with-deps chromium' : 'npx playwright install chromium'; execSync(installCommand, { stdio: 'inherit' });\"`;\n}\n\nfunction buildPlaywrightE2eCommand(\n tree: Tree,\n projectName: string,\n serveTarget: string,\n baseUrl: string,\n projectRoot: string\n) {\n const port = readPortFromUrl(baseUrl);\n const serveExecutor = readServeExecutor(tree, projectName);\n const serveCommand =\n serveExecutor === '@nx/vite:dev-server'\n ? `npx nx run ${serveTarget} --port=${port} --strictPort`\n : `npx nx run ${serveTarget}`;\n const testCommand = `npx cucumber-js --config ${projectRoot}/cucumber.js`;\n return `npx kill-port ${port} && start-server-and-test \"${serveCommand}\" ${baseUrl} \"${testCommand}\"`;\n}\n\nfunction readServeExecutor(tree: Tree, projectName: string) {\n try {\n return readProjectConfiguration(tree, projectName).targets?.['serve']?.executor;\n } catch {\n return undefined;\n }\n}\n\nfunction readPortFromUrl(url: string) {\n const parsedUrl = new URL(url);\n if (parsedUrl.port) return parsedUrl.port;\n return parsedUrl.protocol === 'https:' ? '443' : '80';\n}\n\nexport default cucumberJsGenerator;\n"]}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../../libs/nx-cucumber/src/generators/project/project.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n addProjectConfiguration,\n formatFiles,\n generateFiles,\n Tree,\n addDependenciesToPackageJson,\n normalizePath,\n offsetFromRoot,\n getWorkspaceLayout,\n readProjectConfiguration,\n updateJson,\n} from '@nx/devkit';\nimport * as path from 'path';\nimport { CucumberJsGeneratorSchema } from './schema';\nimport { existsSync } from 'fs';\nimport { defaultTestRunner } from '../../core/test-run-options';\n\nexport async function cucumberJsGenerator(tree: Tree, options: CucumberJsGeneratorSchema) {\n if (!options.testRunner) options.testRunner = defaultTestRunner;\n ensureProjectExists(tree, options.project);\n options.name = normalizeGeneratedProjectName(options.project, options.name);\n if (!options.directory) options.directory = defaultProjectDirectory(options.name);\n const isPlaywright = options.testRunner === 'playwright';\n const baseUrl = isPlaywright ? 'http://localhost:4200' : undefined;\n const serveTarget = isPlaywright ? `${options.project}:serve` : undefined;\n\n const normalizedDirectory = normalizePath(options.directory);\n const workspaceLayout = getWorkspaceLayout(tree);\n const skipAppsDir = workspaceLayout.appsDir === '.' || options.ignoreWorkspaceLayout;\n const parentDir = workspaceLayout.appsDir && !skipAppsDir ? workspaceLayout.appsDir + '/' : '';\n const projectRoot = `${parentDir}${normalizedDirectory}`;\n const workspaceRootRelative = offsetFromRoot(projectRoot).replace(/\\/$/, '');\n const playwrightTargets =\n isPlaywright && baseUrl && serveTarget ? buildPlaywrightTargets(options.name, projectRoot) : {};\n\n addProjectConfiguration(tree, options.name, {\n root: projectRoot,\n sourceRoot: `${projectRoot}/src`,\n projectType: 'application',\n targets: {\n lint: {\n executor: '@nx/eslint:lint',\n outputs: ['{options.outputFile}'],\n options: {\n lintFilePatterns: [`${projectRoot}/**/*.ts`],\n },\n },\n ...playwrightTargets,\n },\n implicitDependencies: [options.project],\n });\n\n const playwrightRequires =\n options.testRunner === 'playwright'\n ? [\n 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js',\n 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js',\n ]\n : [];\n\n const serveCommand =\n isPlaywright && baseUrl && serveTarget ? buildServeCommand(tree, options.project, serveTarget, baseUrl) : '';\n const testCommand = `npx cucumber-js --config ${projectRoot}/cucumber.js`;\n const templateProjectName = parseScopedProjectName(options.project).name;\n\n const substitutions = {\n ...options,\n project: templateProjectName,\n testedProject: options.project,\n workspaceRootRelative,\n projectRoot,\n playwrightRequires: JSON.stringify(playwrightRequires),\n isPlaywright,\n baseUrl: baseUrl || '',\n serveTarget: serveTarget || '',\n port: baseUrl ? readPortFromUrl(baseUrl) : 0,\n serveCommandJson: JSON.stringify(serveCommand),\n testCommandJson: JSON.stringify(testCommand),\n };\n\n generateFiles(tree, path.join(__dirname, 'files', 'all'), projectRoot, substitutions);\n generateFiles(tree, path.join(__dirname, 'files', options.testRunner), projectRoot, substitutions);\n\n const customWorldFiles = path.join(__dirname, 'files', `${options.testRunner}.custom-world`);\n if (options.customWorld && existsSync(customWorldFiles)) {\n generateFiles(tree, customWorldFiles, projectRoot, substitutions);\n }\n\n registerPlugin(tree);\n\n await formatFiles(tree);\n\n const additionalDevDependencies: Record<string, string> = {\n 'ts-node': '10.9.1',\n 'tsconfig-paths': '4.2.0',\n };\n\n const installTask = addDependenciesToPackageJson(tree, {}, additionalDevDependencies);\n return options.skipInstall ? () => undefined : installTask;\n}\n\nfunction buildPlaywrightTargets(e2eProjectName: string, projectRoot: string) {\n return {\n 'e2e-prepare': {\n cache: false,\n command: buildPlaywrightPrepareCommand(),\n },\n e2e: {\n command: `node ${projectRoot}/run-e2e.js`,\n },\n 'e2e-ci': {\n command: `npx nx run ${e2eProjectName}:e2e-prepare && npx nx run ${e2eProjectName}:e2e`,\n },\n };\n}\n\nfunction buildPlaywrightPrepareCommand() {\n return `node -e \"const { execSync } = require('node:child_process'); const installCommand = process.platform === 'linux' ? 'npx playwright install --with-deps chromium' : 'npx playwright install chromium'; execSync(installCommand, { stdio: 'inherit' });\"`;\n}\n\nfunction buildServeCommand(tree: Tree, projectName: string, serveTarget: string, baseUrl: string) {\n const port = readPortFromUrl(baseUrl);\n const executor = readServeExecutor(tree, projectName);\n return executor === '@nx/vite:dev-server'\n ? `npx nx run ${serveTarget} --port=${port} --strictPort`\n : `npx nx run ${serveTarget}`;\n}\n\nfunction readServeExecutor(tree: Tree, projectName: string) {\n return readProjectConfiguration(tree, projectName).targets?.['serve']?.executor;\n}\n\nfunction readPortFromUrl(url: string) {\n const parsedUrl = new URL(url);\n if (parsedUrl.port) return parsedUrl.port;\n return parsedUrl.protocol === 'https:' ? '443' : '80';\n}\n\nfunction ensureProjectExists(tree: Tree, projectName: string) {\n try {\n readProjectConfiguration(tree, projectName);\n } catch {\n throw new Error(`Project \"${projectName}\" does not exist in this workspace.`);\n }\n}\n\nfunction normalizeGeneratedProjectName(projectName: string, requestedName?: string) {\n const sourceProject = parseScopedProjectName(projectName);\n const requestedProject = parseScopedProjectName(requestedName?.trim() || '');\n if (requestedProject.raw.length < 1) {\n const inferredName = `${sourceProject.name}-e2e`;\n return sourceProject.scope ? `${sourceProject.scope}/${inferredName}` : inferredName;\n }\n if (requestedProject.scope) return requestedProject.raw;\n return sourceProject.scope ? `${sourceProject.scope}/${requestedProject.name}` : requestedProject.name;\n}\n\nfunction defaultProjectDirectory(projectName: string) {\n return parseScopedProjectName(projectName).name;\n}\n\nfunction parseScopedProjectName(value: string) {\n const raw = value.trim();\n if (!raw.startsWith('@')) {\n return { raw, scope: '', name: raw };\n }\n const separatorIndex = raw.indexOf('/');\n if (separatorIndex < 1 || separatorIndex >= raw.length - 1) {\n return { raw, scope: '', name: raw };\n }\n return {\n raw,\n scope: raw.slice(0, separatorIndex),\n name: raw.slice(separatorIndex + 1),\n };\n}\n\nfunction registerPlugin(tree: Tree) {\n if (!tree.exists('nx.json')) return;\n updateJson(tree, 'nx.json', (json) => {\n if (!Array.isArray(json.plugins)) json.plugins = [];\n if (!json.plugins.includes('@gnuechtel/nx-cucumber')) {\n json.plugins.push('@gnuechtel/nx-cucumber');\n }\n return json;\n });\n}\n\nexport default cucumberJsGenerator;\n"]}
package/src/index.d.ts CHANGED
@@ -1,9 +1,5 @@
1
1
  export * from './playwright/playwright-world';
2
2
  export * from './core/test-run-options';
3
- export { createBeautifulHtmlReport } from './core/cucumber-report-html';
4
- export { startWebServer, stopWebServer } from './core/web-server';
5
- export type { WebServerConfig } from './core/web-server';
6
- export type { BeautifulReportOptions } from './core/cucumber-report-html';
7
3
  export * from './adapters/contract';
8
4
  export * from './adapters/validation';
9
5
  export * from './adapters/registry';
package/src/index.js CHANGED
@@ -1,14 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.migrateCucumberApiToInferredTasks = exports.createNodesV2 = exports.stopWebServer = exports.startWebServer = exports.createBeautifulHtmlReport = void 0;
3
+ exports.migrateCucumberApiToInferredTasks = exports.createNodesV2 = void 0;
4
4
  const tslib_1 = require("tslib");
5
5
  tslib_1.__exportStar(require("./playwright/playwright-world"), exports);
6
6
  tslib_1.__exportStar(require("./core/test-run-options"), exports);
7
- var cucumber_report_html_1 = require("./core/cucumber-report-html");
8
- Object.defineProperty(exports, "createBeautifulHtmlReport", { enumerable: true, get: function () { return cucumber_report_html_1.createBeautifulHtmlReport; } });
9
- var web_server_1 = require("./core/web-server");
10
- Object.defineProperty(exports, "startWebServer", { enumerable: true, get: function () { return web_server_1.startWebServer; } });
11
- Object.defineProperty(exports, "stopWebServer", { enumerable: true, get: function () { return web_server_1.stopWebServer; } });
12
7
  tslib_1.__exportStar(require("./adapters/contract"), exports);
13
8
  tslib_1.__exportStar(require("./adapters/validation"), exports);
14
9
  tslib_1.__exportStar(require("./adapters/registry"), exports);
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/nx-cucumber/src/index.ts"],"names":[],"mappings":";;;;AAAA,wEAA8C;AAC9C,kEAAwC;AACxC,oEAAwE;AAA/D,iIAAA,yBAAyB,OAAA;AAClC,gDAAkE;AAAzD,4GAAA,cAAc,OAAA;AAAE,2GAAA,aAAa,OAAA;AAGtC,8DAAoC;AACpC,gEAAsC;AACtC,8DAAoC;AACpC,sDAAsD;AAA7C,6GAAA,aAAa,OAAA;AAEtB,2HAAqH;AAA5G,2JAAA,iCAAiC,OAAA","sourcesContent":["export * from './playwright/playwright-world';\nexport * from './core/test-run-options';\nexport { createBeautifulHtmlReport } from './core/cucumber-report-html';\nexport { startWebServer, stopWebServer } from './core/web-server';\nexport type { WebServerConfig } from './core/web-server';\nexport type { BeautifulReportOptions } from './core/cucumber-report-html';\nexport * from './adapters/contract';\nexport * from './adapters/validation';\nexport * from './adapters/registry';\nexport { createNodesV2 } from './plugin/create-nodes';\nexport type { NxCucumberPluginOptions } from './plugin/create-nodes';\nexport { migrateCucumberApiToInferredTasks } from './migrations/update-2-0-0/migrate-cucumber-api-to-inferred-tasks';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/nx-cucumber/src/index.ts"],"names":[],"mappings":";;;;AAAA,wEAA8C;AAC9C,kEAAwC;AACxC,8DAAoC;AACpC,gEAAsC;AACtC,8DAAoC;AACpC,sDAAsD;AAA7C,6GAAA,aAAa,OAAA;AAEtB,2HAAqH;AAA5G,2JAAA,iCAAiC,OAAA","sourcesContent":["export * from './playwright/playwright-world';\nexport * from './core/test-run-options';\nexport * from './adapters/contract';\nexport * from './adapters/validation';\nexport * from './adapters/registry';\nexport { createNodesV2 } from './plugin/create-nodes';\nexport type { NxCucumberPluginOptions } from './plugin/create-nodes';\nexport { migrateCucumberApiToInferredTasks } from './migrations/update-2-0-0/migrate-cucumber-api-to-inferred-tasks';\n"]}
@@ -64,6 +64,14 @@ function extractWorldParameters(options) {
64
64
  }
65
65
  return worldParameters;
66
66
  }
67
+ function createWorldParametersLiteral(worldParameters) {
68
+ const lines = ['{', ' outputDirectory: outputDir,'];
69
+ for (const [key, value] of Object.entries(worldParameters)) {
70
+ lines.push(` ${key}: ${JSON.stringify(value)},`);
71
+ }
72
+ lines.push('}');
73
+ return lines.join('\n');
74
+ }
67
75
  function createCucumberConfigContent(projectRoot, options) {
68
76
  const outputDir = `dist/e2e/${projectRoot}`;
69
77
  const featuresDirectory = normalizePath(options.featuresDirectory || `${projectRoot}/features`);
@@ -74,12 +82,13 @@ function createCucumberConfigContent(projectRoot, options) {
74
82
  requireEntries.push(`'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js'`);
75
83
  requireEntries.push(`'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js'`);
76
84
  }
77
- const worldParameters = {
78
- outputDirectory: outputDir,
79
- ...extractWorldParameters(options),
80
- };
85
+ const worldParametersLiteral = createWorldParametersLiteral(extractWorldParameters(options));
81
86
  const lines = [
82
87
  `process.env.TS_NODE_PROJECT = '${tsNodeProject}';`,
88
+ `const outputDir = 'dist/e2e/${projectRoot}';`,
89
+ `const { pathToFileURL } = require('url');`,
90
+ `const runMetadataFormatter = pathToFileURL(require.resolve('@gnuechtel/nx-cucumber/src/core/cucumber-run-metadata-formatter.js')).href;`,
91
+ `const worldParameters = ${worldParametersLiteral};`,
83
92
  'module.exports = {',
84
93
  ' default: {',
85
94
  ` paths: ['${featuresDirectory}/**/*.feature'],`,
@@ -89,11 +98,18 @@ function createCucumberConfigContent(projectRoot, options) {
89
98
  ' format: [',
90
99
  ` 'summary',`,
91
100
  ` 'progress-bar',`,
92
- ` 'json:dist/e2e/${projectRoot}/reports/cucumber-json/cucumber-test-report.json',`,
93
- ` 'html:dist/e2e/${projectRoot}/reports/html/cucumber-test-report-builtin.html',`,
94
- ` 'junit:dist/e2e/${projectRoot}/reports/test-results/cucumber-test-report.xml',`,
101
+ ` \`json:\${outputDir}/reports/cucumber-json/cucumber-test-report.json\`,`,
102
+ ` \`message:\${outputDir}/reports/cucumber-messages/cucumber-messages.ndjson\`,`,
103
+ ` \`html:\${outputDir}/reports/html/cucumber-test-report-builtin.html\`,`,
104
+ ` [runMetadataFormatter, \`\${outputDir}/reports/metadata/cucumber-run-metadata.json\`],`,
105
+ ` \`junit:\${outputDir}/reports/test-results/cucumber-test-report.xml\`,`,
95
106
  ' ],',
96
- ` worldParameters: ${JSON.stringify(worldParameters, null, 4).replace(/\n/g, '\n ')},`,
107
+ ' formatOptions: {',
108
+ ' nxCucumberRunMetadata: {',
109
+ ' worldParameters,',
110
+ ' },',
111
+ ' },',
112
+ ' worldParameters,',
97
113
  ...(typeof options.cucumberTimeout === 'number' ? [` timeout: ${options.cucumberTimeout},`] : []),
98
114
  ' publishQuiet: true,',
99
115
  ' },',
@@ -1 +1 @@
1
- {"version":3,"file":"migrate-cucumber-api-to-inferred-tasks.js","sourceRoot":"","sources":["../../../../../../libs/nx-cucumber/src/migrations/update-2-0-0/migrate-cucumber-api-to-inferred-tasks.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n logger,\n NxJsonConfiguration,\n ProjectConfiguration,\n readNxJson,\n Tree,\n updateNxJson,\n updateProjectConfiguration,\n getProjects,\n} from '@nx/devkit';\n\nconst LEGACY_EXECUTOR = '@gnuechtel/nx-cucumber:cucumber-api';\nconst REPORT_PATH = 'tmp/nx-cucumber-migration-report.json';\nconst PLUGIN_NAME = '@gnuechtel/nx-cucumber';\n\ninterface LegacyOptions {\n testRunner?: 'core' | 'playwright';\n featuresDirectory?: string;\n tags?: string;\n cucumberTimeout?: number;\n tsConfig?: string;\n baseUrl?: string;\n browser?: string;\n headed?: boolean;\n debug?: boolean;\n disableAnimations?: boolean;\n disableCoverage?: boolean;\n disableScreenshotAttachments?: boolean;\n disableScreenshotFiles?: boolean;\n enableSuccessfulScreenshotFiles?: boolean;\n disableVideoAttachments?: boolean;\n disableVideoFiles?: boolean;\n disableJavaScript?: boolean;\n additionalPlaywrightConfiguration?: Record<string, unknown>;\n viewport?: Record<string, unknown>;\n videoSize?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface MigratedProjectReport {\n project: string;\n projectRoot: string;\n removedTargets: string[];\n createdCucumberConfig: boolean;\n manualFollowUps: string[];\n}\n\ninterface MigrationReport {\n dryRun: boolean;\n pluginAdded: boolean;\n removedLegacyTargetDefaults: boolean;\n migratedProjects: MigratedProjectReport[];\n}\n\ninterface MigrationOptions {\n dryRun?: boolean;\n}\n\nfunction isDryRunRequested(): boolean {\n const arg = process.argv.some((v) => v === '--dry-run' || v === '--dryRun');\n const env = `${process.env['NX_CUCUMBER_MIGRATION_DRY_RUN'] || ''}`.toLowerCase();\n return arg || env === '1' || env === 'true' || env === 'yes';\n}\n\nfunction normalizePath(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\nfunction resolveTsNodeProject(projectRoot: string, tsConfig?: string): string {\n if (!tsConfig) return `${projectRoot}/tsconfig.json`;\n if (tsConfig.includes('/')) return normalizePath(tsConfig);\n return `${projectRoot}/${tsConfig}`;\n}\n\nfunction hasNxCucumberPlugin(nxJson: NxJsonConfiguration | null): boolean {\n if (!nxJson) return false;\n return (\n nxJson.plugins?.some((plugin) =>\n typeof plugin === 'string' ? plugin === PLUGIN_NAME : plugin?.plugin === PLUGIN_NAME\n ) ?? false\n );\n}\n\nfunction getLegacyTargetNames(project: ProjectConfiguration): string[] {\n return Object.entries(project.targets ?? {})\n .filter(([, target]) => target.executor === LEGACY_EXECUTOR)\n .map(([targetName]) => targetName);\n}\n\nfunction pickLegacyOptions(project: ProjectConfiguration): LegacyOptions {\n const targets = project.targets ?? {};\n const legacyTarget =\n targets['e2e-cucumber']?.executor === LEGACY_EXECUTOR\n ? targets['e2e-cucumber']\n : Object.values(targets).find((target) => target.executor === LEGACY_EXECUTOR);\n return (legacyTarget?.options ?? {}) as LegacyOptions;\n}\n\nfunction extractWorldParameters(options: LegacyOptions): Record<string, unknown> {\n const worldParameters: Record<string, unknown> = {};\n const allowedKeys = [\n 'baseUrl',\n 'browser',\n 'headed',\n 'debug',\n 'disableAnimations',\n 'disableCoverage',\n 'disableScreenshotAttachments',\n 'disableScreenshotFiles',\n 'enableSuccessfulScreenshotFiles',\n 'disableVideoAttachments',\n 'disableVideoFiles',\n 'disableJavaScript',\n 'additionalPlaywrightConfiguration',\n 'viewport',\n 'videoSize',\n ];\n\n for (const key of allowedKeys) {\n if (options[key] !== undefined) {\n worldParameters[key] = options[key];\n }\n }\n return worldParameters;\n}\n\nfunction createCucumberConfigContent(projectRoot: string, options: LegacyOptions): string {\n const outputDir = `dist/e2e/${projectRoot}`;\n const featuresDirectory = normalizePath(options.featuresDirectory || `${projectRoot}/features`);\n const testRunner = options.testRunner === 'playwright' ? 'playwright' : 'core';\n const tsNodeProject = resolveTsNodeProject(\n projectRoot,\n typeof options.tsConfig === 'string' ? options.tsConfig : undefined\n );\n\n const requireEntries: string[] = [`'${projectRoot}/src/**/*.ts'`];\n if (testRunner === 'playwright') {\n requireEntries.push(`'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js'`);\n requireEntries.push(`'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js'`);\n }\n\n const worldParameters = {\n outputDirectory: outputDir,\n ...extractWorldParameters(options),\n };\n\n const lines: string[] = [\n `process.env.TS_NODE_PROJECT = '${tsNodeProject}';`,\n 'module.exports = {',\n ' default: {',\n ` paths: ['${featuresDirectory}/**/*.feature'],`,\n ` requireModule: ['ts-node/register', 'tsconfig-paths/register'],`,\n ` require: [${requireEntries.join(', ')}],`,\n ` tags: '${typeof options.tags === 'string' ? options.tags : 'not @ignore'}',`,\n ' format: [',\n ` 'summary',`,\n ` 'progress-bar',`,\n ` 'json:dist/e2e/${projectRoot}/reports/cucumber-json/cucumber-test-report.json',`,\n ` 'html:dist/e2e/${projectRoot}/reports/html/cucumber-test-report-builtin.html',`,\n ` 'junit:dist/e2e/${projectRoot}/reports/test-results/cucumber-test-report.xml',`,\n ' ],',\n ` worldParameters: ${JSON.stringify(worldParameters, null, 4).replace(/\\n/g, '\\n ')},`,\n ...(typeof options.cucumberTimeout === 'number' ? [` timeout: ${options.cucumberTimeout},`] : []),\n ' publishQuiet: true,',\n ' },',\n '};',\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction shouldFlagWatchTarget(targets: ProjectConfiguration['targets']): boolean {\n const watchCommand = targets?.['e2e-watch']?.options?.['commands'];\n if (!Array.isArray(watchCommand)) return false;\n return watchCommand.some((cmd) => typeof cmd === 'string' && cmd.includes('watch-message'));\n}\n\nfunction shouldRemoveLegacyE2eRunCommand(targets: ProjectConfiguration['targets']): boolean {\n const e2e = targets?.['e2e'];\n if (!e2e || e2e.executor !== 'nx:run-commands') return false;\n const command = e2e.options?.['command'];\n return typeof command === 'string' && command.includes('e2e-cucumber');\n}\n\nexport async function migrateCucumberApiToInferredTasks(\n tree: Tree,\n options: MigrationOptions = {}\n): Promise<MigrationReport> {\n const dryRun = options.dryRun ?? isDryRunRequested();\n const nxJson = (readNxJson(tree) ?? {}) as NxJsonConfiguration;\n const report: MigrationReport = {\n dryRun,\n pluginAdded: false,\n removedLegacyTargetDefaults: false,\n migratedProjects: [],\n };\n\n const hadPlugin = hasNxCucumberPlugin(nxJson);\n if (!hadPlugin) {\n report.pluginAdded = true;\n if (!dryRun) {\n nxJson.plugins ??= [];\n nxJson.plugins.push(PLUGIN_NAME);\n updateNxJson(tree, nxJson);\n }\n }\n\n if (nxJson.targetDefaults?.[LEGACY_EXECUTOR]) {\n report.removedLegacyTargetDefaults = true;\n if (!dryRun) {\n delete nxJson.targetDefaults[LEGACY_EXECUTOR];\n updateNxJson(tree, nxJson);\n }\n }\n\n for (const [projectName, projectConfig] of getProjects(tree).entries()) {\n const legacyTargets = getLegacyTargetNames(projectConfig);\n const removeLegacyRunCommandTarget = shouldRemoveLegacyE2eRunCommand(projectConfig.targets);\n const removeLegacyWatchTarget = shouldFlagWatchTarget(projectConfig.targets);\n if (legacyTargets.length === 0 && !removeLegacyRunCommandTarget && !removeLegacyWatchTarget) continue;\n\n const manualFollowUps: string[] = [];\n const removedTargets = [...legacyTargets];\n if (removeLegacyRunCommandTarget && !removedTargets.includes('e2e')) {\n removedTargets.push('e2e');\n }\n if (removeLegacyWatchTarget && !removedTargets.includes('e2e-watch')) {\n removedTargets.push('e2e-watch');\n }\n\n const cucumberConfigPath = `${projectConfig.root}/cucumber.js`;\n const hasCucumberConfig = tree.exists(cucumberConfigPath);\n const legacyOptions = pickLegacyOptions(projectConfig);\n\n if (hasCucumberConfig) {\n manualFollowUps.push(\n `Existing ${cucumberConfigPath} was kept. Verify tags/paths/worldParameters still reflect prior executor options.`\n );\n }\n\n const updatedProject: ProjectConfiguration = {\n ...projectConfig,\n targets: {\n ...(projectConfig.targets ?? {}),\n },\n };\n\n for (const targetName of removedTargets) {\n delete updatedProject.targets?.[targetName];\n }\n\n if (!dryRun) {\n updateProjectConfiguration(tree, projectName, updatedProject);\n if (!hasCucumberConfig) {\n tree.write(cucumberConfigPath, createCucumberConfigContent(projectConfig.root, legacyOptions));\n }\n }\n\n report.migratedProjects.push({\n project: projectName,\n projectRoot: projectConfig.root,\n removedTargets,\n createdCucumberConfig: !hasCucumberConfig,\n manualFollowUps,\n });\n }\n\n if (!dryRun) {\n tree.write(REPORT_PATH, JSON.stringify(report, null, 2));\n }\n\n logger.info(\n `[nx-cucumber migration] migrated projects: ${report.migratedProjects.length}, pluginAdded: ${report.pluginAdded}, dryRun: ${report.dryRun}`\n );\n if (report.migratedProjects.length > 0) {\n for (const project of report.migratedProjects) {\n logger.info(\n `[nx-cucumber migration] ${project.project}: removed targets [${project.removedTargets.join(\n ', '\n )}], created cucumber.js: ${project.createdCucumberConfig}`\n );\n for (const followUp of project.manualFollowUps) {\n logger.warn(`[nx-cucumber migration] ${project.project}: ${followUp}`);\n }\n }\n }\n if (!dryRun) {\n logger.info(`[nx-cucumber migration] report written to ${REPORT_PATH}`);\n }\n\n return report;\n}\n\nexport default async function migrateCucumberApiToInferredTasksEntry(tree: Tree): Promise<void> {\n await migrateCucumberApiToInferredTasks(tree);\n}\n"]}
1
+ {"version":3,"file":"migrate-cucumber-api-to-inferred-tasks.js","sourceRoot":"","sources":["../../../../../../libs/nx-cucumber/src/migrations/update-2-0-0/migrate-cucumber-api-to-inferred-tasks.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n logger,\n NxJsonConfiguration,\n ProjectConfiguration,\n readNxJson,\n Tree,\n updateNxJson,\n updateProjectConfiguration,\n getProjects,\n} from '@nx/devkit';\n\nconst LEGACY_EXECUTOR = '@gnuechtel/nx-cucumber:cucumber-api';\nconst REPORT_PATH = 'tmp/nx-cucumber-migration-report.json';\nconst PLUGIN_NAME = '@gnuechtel/nx-cucumber';\n\ninterface LegacyOptions {\n testRunner?: 'core' | 'playwright';\n featuresDirectory?: string;\n tags?: string;\n cucumberTimeout?: number;\n tsConfig?: string;\n baseUrl?: string;\n browser?: string;\n headed?: boolean;\n debug?: boolean;\n disableAnimations?: boolean;\n disableCoverage?: boolean;\n disableScreenshotAttachments?: boolean;\n disableScreenshotFiles?: boolean;\n enableSuccessfulScreenshotFiles?: boolean;\n disableVideoAttachments?: boolean;\n disableVideoFiles?: boolean;\n disableJavaScript?: boolean;\n additionalPlaywrightConfiguration?: Record<string, unknown>;\n viewport?: Record<string, unknown>;\n videoSize?: Record<string, unknown>;\n [key: string]: unknown;\n}\n\ninterface MigratedProjectReport {\n project: string;\n projectRoot: string;\n removedTargets: string[];\n createdCucumberConfig: boolean;\n manualFollowUps: string[];\n}\n\ninterface MigrationReport {\n dryRun: boolean;\n pluginAdded: boolean;\n removedLegacyTargetDefaults: boolean;\n migratedProjects: MigratedProjectReport[];\n}\n\ninterface MigrationOptions {\n dryRun?: boolean;\n}\n\nfunction isDryRunRequested(): boolean {\n const arg = process.argv.some((v) => v === '--dry-run' || v === '--dryRun');\n const env = `${process.env['NX_CUCUMBER_MIGRATION_DRY_RUN'] || ''}`.toLowerCase();\n return arg || env === '1' || env === 'true' || env === 'yes';\n}\n\nfunction normalizePath(p: string): string {\n return p.replace(/\\\\/g, '/');\n}\n\nfunction resolveTsNodeProject(projectRoot: string, tsConfig?: string): string {\n if (!tsConfig) return `${projectRoot}/tsconfig.json`;\n if (tsConfig.includes('/')) return normalizePath(tsConfig);\n return `${projectRoot}/${tsConfig}`;\n}\n\nfunction hasNxCucumberPlugin(nxJson: NxJsonConfiguration | null): boolean {\n if (!nxJson) return false;\n return (\n nxJson.plugins?.some((plugin) =>\n typeof plugin === 'string' ? plugin === PLUGIN_NAME : plugin?.plugin === PLUGIN_NAME\n ) ?? false\n );\n}\n\nfunction getLegacyTargetNames(project: ProjectConfiguration): string[] {\n return Object.entries(project.targets ?? {})\n .filter(([, target]) => target.executor === LEGACY_EXECUTOR)\n .map(([targetName]) => targetName);\n}\n\nfunction pickLegacyOptions(project: ProjectConfiguration): LegacyOptions {\n const targets = project.targets ?? {};\n const legacyTarget =\n targets['e2e-cucumber']?.executor === LEGACY_EXECUTOR\n ? targets['e2e-cucumber']\n : Object.values(targets).find((target) => target.executor === LEGACY_EXECUTOR);\n return (legacyTarget?.options ?? {}) as LegacyOptions;\n}\n\nfunction extractWorldParameters(options: LegacyOptions): Record<string, unknown> {\n const worldParameters: Record<string, unknown> = {};\n const allowedKeys = [\n 'baseUrl',\n 'browser',\n 'headed',\n 'debug',\n 'disableAnimations',\n 'disableCoverage',\n 'disableScreenshotAttachments',\n 'disableScreenshotFiles',\n 'enableSuccessfulScreenshotFiles',\n 'disableVideoAttachments',\n 'disableVideoFiles',\n 'disableJavaScript',\n 'additionalPlaywrightConfiguration',\n 'viewport',\n 'videoSize',\n ];\n\n for (const key of allowedKeys) {\n if (options[key] !== undefined) {\n worldParameters[key] = options[key];\n }\n }\n return worldParameters;\n}\n\nfunction createWorldParametersLiteral(worldParameters: Record<string, unknown>): string {\n const lines = ['{', ' outputDirectory: outputDir,'];\n for (const [key, value] of Object.entries(worldParameters)) {\n lines.push(` ${key}: ${JSON.stringify(value)},`);\n }\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction createCucumberConfigContent(projectRoot: string, options: LegacyOptions): string {\n const outputDir = `dist/e2e/${projectRoot}`;\n const featuresDirectory = normalizePath(options.featuresDirectory || `${projectRoot}/features`);\n const testRunner = options.testRunner === 'playwright' ? 'playwright' : 'core';\n const tsNodeProject = resolveTsNodeProject(\n projectRoot,\n typeof options.tsConfig === 'string' ? options.tsConfig : undefined\n );\n\n const requireEntries: string[] = [`'${projectRoot}/src/**/*.ts'`];\n if (testRunner === 'playwright') {\n requireEntries.push(`'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js'`);\n requireEntries.push(`'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js'`);\n }\n\n const worldParametersLiteral = createWorldParametersLiteral(extractWorldParameters(options));\n\n const lines: string[] = [\n `process.env.TS_NODE_PROJECT = '${tsNodeProject}';`,\n `const outputDir = 'dist/e2e/${projectRoot}';`,\n `const { pathToFileURL } = require('url');`,\n `const runMetadataFormatter = pathToFileURL(require.resolve('@gnuechtel/nx-cucumber/src/core/cucumber-run-metadata-formatter.js')).href;`,\n `const worldParameters = ${worldParametersLiteral};`,\n 'module.exports = {',\n ' default: {',\n ` paths: ['${featuresDirectory}/**/*.feature'],`,\n ` requireModule: ['ts-node/register', 'tsconfig-paths/register'],`,\n ` require: [${requireEntries.join(', ')}],`,\n ` tags: '${typeof options.tags === 'string' ? options.tags : 'not @ignore'}',`,\n ' format: [',\n ` 'summary',`,\n ` 'progress-bar',`,\n ` \\`json:\\${outputDir}/reports/cucumber-json/cucumber-test-report.json\\`,`,\n ` \\`message:\\${outputDir}/reports/cucumber-messages/cucumber-messages.ndjson\\`,`,\n ` \\`html:\\${outputDir}/reports/html/cucumber-test-report-builtin.html\\`,`,\n ` [runMetadataFormatter, \\`\\${outputDir}/reports/metadata/cucumber-run-metadata.json\\`],`,\n ` \\`junit:\\${outputDir}/reports/test-results/cucumber-test-report.xml\\`,`,\n ' ],',\n ' formatOptions: {',\n ' nxCucumberRunMetadata: {',\n ' worldParameters,',\n ' },',\n ' },',\n ' worldParameters,',\n ...(typeof options.cucumberTimeout === 'number' ? [` timeout: ${options.cucumberTimeout},`] : []),\n ' publishQuiet: true,',\n ' },',\n '};',\n '',\n ];\n return lines.join('\\n');\n}\n\nfunction shouldFlagWatchTarget(targets: ProjectConfiguration['targets']): boolean {\n const watchCommand = targets?.['e2e-watch']?.options?.['commands'];\n if (!Array.isArray(watchCommand)) return false;\n return watchCommand.some((cmd) => typeof cmd === 'string' && cmd.includes('watch-message'));\n}\n\nfunction shouldRemoveLegacyE2eRunCommand(targets: ProjectConfiguration['targets']): boolean {\n const e2e = targets?.['e2e'];\n if (!e2e || e2e.executor !== 'nx:run-commands') return false;\n const command = e2e.options?.['command'];\n return typeof command === 'string' && command.includes('e2e-cucumber');\n}\n\nexport async function migrateCucumberApiToInferredTasks(\n tree: Tree,\n options: MigrationOptions = {}\n): Promise<MigrationReport> {\n const dryRun = options.dryRun ?? isDryRunRequested();\n const nxJson = (readNxJson(tree) ?? {}) as NxJsonConfiguration;\n const report: MigrationReport = {\n dryRun,\n pluginAdded: false,\n removedLegacyTargetDefaults: false,\n migratedProjects: [],\n };\n\n const hadPlugin = hasNxCucumberPlugin(nxJson);\n if (!hadPlugin) {\n report.pluginAdded = true;\n if (!dryRun) {\n nxJson.plugins ??= [];\n nxJson.plugins.push(PLUGIN_NAME);\n updateNxJson(tree, nxJson);\n }\n }\n\n if (nxJson.targetDefaults?.[LEGACY_EXECUTOR]) {\n report.removedLegacyTargetDefaults = true;\n if (!dryRun) {\n delete nxJson.targetDefaults[LEGACY_EXECUTOR];\n updateNxJson(tree, nxJson);\n }\n }\n\n for (const [projectName, projectConfig] of getProjects(tree).entries()) {\n const legacyTargets = getLegacyTargetNames(projectConfig);\n const removeLegacyRunCommandTarget = shouldRemoveLegacyE2eRunCommand(projectConfig.targets);\n const removeLegacyWatchTarget = shouldFlagWatchTarget(projectConfig.targets);\n if (legacyTargets.length === 0 && !removeLegacyRunCommandTarget && !removeLegacyWatchTarget) continue;\n\n const manualFollowUps: string[] = [];\n const removedTargets = [...legacyTargets];\n if (removeLegacyRunCommandTarget && !removedTargets.includes('e2e')) {\n removedTargets.push('e2e');\n }\n if (removeLegacyWatchTarget && !removedTargets.includes('e2e-watch')) {\n removedTargets.push('e2e-watch');\n }\n\n const cucumberConfigPath = `${projectConfig.root}/cucumber.js`;\n const hasCucumberConfig = tree.exists(cucumberConfigPath);\n const legacyOptions = pickLegacyOptions(projectConfig);\n\n if (hasCucumberConfig) {\n manualFollowUps.push(\n `Existing ${cucumberConfigPath} was kept. Verify tags/paths/worldParameters still reflect prior executor options.`\n );\n }\n\n const updatedProject: ProjectConfiguration = {\n ...projectConfig,\n targets: {\n ...(projectConfig.targets ?? {}),\n },\n };\n\n for (const targetName of removedTargets) {\n delete updatedProject.targets?.[targetName];\n }\n\n if (!dryRun) {\n updateProjectConfiguration(tree, projectName, updatedProject);\n if (!hasCucumberConfig) {\n tree.write(cucumberConfigPath, createCucumberConfigContent(projectConfig.root, legacyOptions));\n }\n }\n\n report.migratedProjects.push({\n project: projectName,\n projectRoot: projectConfig.root,\n removedTargets,\n createdCucumberConfig: !hasCucumberConfig,\n manualFollowUps,\n });\n }\n\n if (!dryRun) {\n tree.write(REPORT_PATH, JSON.stringify(report, null, 2));\n }\n\n logger.info(\n `[nx-cucumber migration] migrated projects: ${report.migratedProjects.length}, pluginAdded: ${report.pluginAdded}, dryRun: ${report.dryRun}`\n );\n if (report.migratedProjects.length > 0) {\n for (const project of report.migratedProjects) {\n logger.info(\n `[nx-cucumber migration] ${project.project}: removed targets [${project.removedTargets.join(\n ', '\n )}], created cucumber.js: ${project.createdCucumberConfig}`\n );\n for (const followUp of project.manualFollowUps) {\n logger.warn(`[nx-cucumber migration] ${project.project}: ${followUp}`);\n }\n }\n }\n if (!dryRun) {\n logger.info(`[nx-cucumber migration] report written to ${REPORT_PATH}`);\n }\n\n return report;\n}\n\nexport default async function migrateCucumberApiToInferredTasksEntry(tree: Tree): Promise<void> {\n await migrateCucumberApiToInferredTasks(tree);\n}\n"]}
@@ -8,6 +8,7 @@ export interface NxCucumberPluginOptions {
8
8
  /** Override the parallel target name (default: 'e2e-parallel') */
9
9
  e2eParallelTargetName?: string;
10
10
  }
11
+ export declare function readTargetsCache(cachePath: string): Record<string, TargetsResult>;
11
12
  interface TargetsResult {
12
13
  targets: Record<string, TargetConfiguration>;
13
14
  metadata: ProjectConfiguration['metadata'];
@@ -16,5 +17,18 @@ interface TargetsResult {
16
17
  * Builds Nx targets from an adapter definition for a specific project.
17
18
  */
18
19
  export declare function buildTargetsForAdapter(adapter: AdapterDefinition, projectRoot: string, configFilePath: string, namedInputs: Record<string, unknown[]>, options?: NxCucumberPluginOptions): TargetsResult;
20
+ /**
21
+ * Checks whether the given directory is a valid Nx project
22
+ * (contains project.json or package.json).
23
+ */
24
+ export declare function isProjectRoot(workspaceRoot: string, projectRoot: string): boolean;
25
+ /**
26
+ * Reads user-defined targets from project.json to avoid conflicts.
27
+ */
28
+ export declare function getUserDefinedTargets(workspaceRoot: string, projectRoot: string): Set<string>;
29
+ /**
30
+ * Removes targets that conflict with user-defined targets in project.json.
31
+ */
32
+ export declare function filterConflictingTargets(result: TargetsResult, userTargets: Set<string>): TargetsResult;
19
33
  export declare const createNodesV2: CreateNodesV2<NxCucumberPluginOptions>;
20
34
  export {};
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.createNodesV2 = void 0;
4
+ exports.readTargetsCache = readTargetsCache;
4
5
  exports.buildTargetsForAdapter = buildTargetsForAdapter;
6
+ exports.isProjectRoot = isProjectRoot;
7
+ exports.getUserDefinedTargets = getUserDefinedTargets;
8
+ exports.filterConflictingTargets = filterConflictingTargets;
5
9
  const devkit_1 = require("@nx/devkit");
6
10
  const calculate_hash_for_create_nodes_1 = require("@nx/devkit/src/utils/calculate-hash-for-create-nodes");
7
11
  const get_named_inputs_1 = require("@nx/devkit/src/utils/get-named-inputs");
@@ -1 +1 @@
1
- {"version":3,"file":"create-nodes.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/plugin/create-nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateNodesResultV2,\n CreateNodesV2,\n ProjectConfiguration,\n TargetConfiguration,\n createNodesFromFiles,\n readJsonFile,\n writeJsonFile,\n} from '@nx/devkit';\nimport { calculateHashForCreateNodes } from '@nx/devkit/src/utils/calculate-hash-for-create-nodes';\nimport { getNamedInputs } from '@nx/devkit/src/utils/get-named-inputs';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { hashObject } from 'nx/src/devkit-internals';\nimport { workspaceDataDirectory } from 'nx/src/utils/cache-directory';\nimport { AdapterDefinition, AdapterTargetConfig, AdapterTargetName, ADAPTER_TARGET_NAMES } from '../adapters/contract';\nimport { buildDiscoveryGlob, findAdapterForConfigFile, getBuiltinAdapters } from '../adapters/registry';\n\nexport interface NxCucumberPluginOptions {\n /** Override the primary e2e target name (default: 'e2e') */\n e2eTargetName?: string;\n /** Override the UI mode target name (default: 'e2e-ui') */\n e2eUiTargetName?: string;\n /** Override the parallel target name (default: 'e2e-parallel') */\n e2eParallelTargetName?: string;\n}\n\nconst DEFAULT_TARGET_NAMES: Record<AdapterTargetName, string> = {\n e2e: 'e2e',\n 'e2e-ui': 'e2e-ui',\n 'e2e-parallel': 'e2e-parallel',\n};\n\nfunction resolveTargetName(key: AdapterTargetName, options?: NxCucumberPluginOptions): string {\n if (key === 'e2e' && options?.e2eTargetName) return options.e2eTargetName;\n if (key === 'e2e-ui' && options?.e2eUiTargetName) return options.e2eUiTargetName;\n if (key === 'e2e-parallel' && options?.e2eParallelTargetName) return options.e2eParallelTargetName;\n return DEFAULT_TARGET_NAMES[key];\n}\n\nfunction readTargetsCache(cachePath: string): Record<string, TargetsResult> {\n return process.env['NX_CACHE_PROJECT_GRAPH'] !== 'false' && existsSync(cachePath) ? readJsonFile(cachePath) : {};\n}\n\nfunction writeTargetsToCache(cachePath: string, results: Record<string, TargetsResult>): void {\n writeJsonFile(cachePath, results);\n}\n\ninterface TargetsResult {\n targets: Record<string, TargetConfiguration>;\n metadata: ProjectConfiguration['metadata'];\n}\n\n/**\n * Builds Nx targets from an adapter definition for a specific project.\n */\nexport function buildTargetsForAdapter(\n adapter: AdapterDefinition,\n projectRoot: string,\n configFilePath: string,\n namedInputs: Record<string, unknown[]>,\n options?: NxCucumberPluginOptions\n): TargetsResult {\n const targets: Record<string, TargetConfiguration> = {};\n const targetGroup: string[] = [];\n\n const defaultInputs = 'production' in namedInputs ? ['production', '^production'] : ['default', '^default'];\n\n for (const key of ADAPTER_TARGET_NAMES) {\n const adapterTarget: AdapterTargetConfig | undefined = adapter.targets[key];\n if (!adapterTarget) continue;\n\n const targetName = resolveTargetName(key, options);\n const defaultOutputs = [`{workspaceRoot}/dist/e2e/${projectRoot}`];\n\n targets[targetName] = {\n command: `${adapterTarget.command} --config ${configFilePath}`,\n options: {\n ...(adapterTarget.defaultOptions ?? {}),\n },\n cache: adapterTarget.continuous ? false : true,\n inputs: adapterTarget.inputs ?? [...defaultInputs, { externalDependencies: adapter.technologies }],\n outputs: adapterTarget.outputs ?? defaultOutputs,\n ...(adapterTarget.dependsOn ? { dependsOn: adapterTarget.dependsOn } : {}),\n ...(adapterTarget.continuous ? { continuous: true } : {}),\n metadata: {\n technologies: adapter.technologies,\n description: `Run ${adapter.name} ${key} tests`,\n help: {\n command: `${adapterTarget.command} --help`,\n example: {},\n },\n },\n };\n\n targetGroup.push(targetName);\n }\n\n return {\n targets,\n metadata: {\n targetGroups: {\n [adapter.name]: targetGroup,\n },\n },\n };\n}\n\n/**\n * Checks whether the given directory is a valid Nx project\n * (contains project.json or package.json).\n */\nfunction isProjectRoot(workspaceRoot: string, projectRoot: string): boolean {\n const dir = join(workspaceRoot, projectRoot);\n if (!existsSync(dir)) return false;\n const files = readdirSync(dir);\n return files.includes('project.json') || files.includes('package.json');\n}\n\n/**\n * Reads user-defined targets from project.json to avoid conflicts.\n */\nfunction getUserDefinedTargets(workspaceRoot: string, projectRoot: string): Set<string> {\n const projectJsonPath = join(workspaceRoot, projectRoot, 'project.json');\n if (!existsSync(projectJsonPath)) return new Set();\n try {\n const config = readJsonFile<ProjectConfiguration>(projectJsonPath);\n return new Set(Object.keys(config.targets ?? {}));\n } catch {\n return new Set();\n }\n}\n\n/**\n * Removes targets that conflict with user-defined targets in project.json.\n */\nfunction filterConflictingTargets(result: TargetsResult, userTargets: Set<string>): TargetsResult {\n if (userTargets.size === 0) return result;\n\n const filtered: Record<string, TargetConfiguration> = {};\n const filteredGroup: string[] = [];\n\n for (const [name, target] of Object.entries(result.targets)) {\n if (!userTargets.has(name)) {\n filtered[name] = target;\n filteredGroup.push(name);\n }\n }\n\n const groupKey = Object.keys(result.metadata?.targetGroups ?? {})[0];\n\n return {\n targets: filtered,\n metadata: groupKey ? { targetGroups: { [groupKey]: filteredGroup } } : result.metadata,\n };\n}\n\nexport const createNodesV2: CreateNodesV2<NxCucumberPluginOptions> = [\n createDiscoveryGlob(),\n async (configFiles, options, context): Promise<CreateNodesResultV2> => {\n const adapters = getBuiltinAdapters();\n if (adapters.length === 0) return [];\n\n const optionsHash = hashObject(options ?? {});\n const cachePath = join(workspaceDataDirectory, `nx-cucumber-${optionsHash}.hash`);\n const targetsCache = readTargetsCache(cachePath);\n\n try {\n return await createNodesFromFiles(\n async (configFilePath, opts, ctx) => {\n const projectRoot = dirname(configFilePath);\n\n if (!isProjectRoot(ctx.workspaceRoot, projectRoot)) {\n return {};\n }\n\n const adapter = findAdapterForConfigFile(configFilePath, adapters);\n if (!adapter) return {};\n\n const hash = await calculateHashForCreateNodes(projectRoot, opts ?? {}, ctx);\n\n if (!targetsCache[hash]) {\n const namedInputs = getNamedInputs(projectRoot, ctx);\n const result = buildTargetsForAdapter(adapter, projectRoot, configFilePath, namedInputs, opts ?? undefined);\n const userTargets = getUserDefinedTargets(ctx.workspaceRoot, projectRoot);\n targetsCache[hash] = filterConflictingTargets(result, userTargets);\n }\n\n const { targets, metadata } = targetsCache[hash];\n\n return {\n projects: {\n [projectRoot]: {\n root: projectRoot,\n targets,\n metadata,\n },\n },\n };\n },\n configFiles,\n options,\n context\n );\n } finally {\n writeTargetsToCache(cachePath, targetsCache);\n }\n },\n];\n\n/**\n * Builds the glob at module load time from registered adapters.\n * Returns a no-match pattern if no adapters are registered yet.\n */\nfunction createDiscoveryGlob(): string {\n const adapters = getBuiltinAdapters();\n return buildDiscoveryGlob(adapters) ?? '**/__nx-cucumber-no-adapters__';\n}\n"]}
1
+ {"version":3,"file":"create-nodes.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/plugin/create-nodes.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CreateNodesResultV2,\n CreateNodesV2,\n ProjectConfiguration,\n TargetConfiguration,\n createNodesFromFiles,\n readJsonFile,\n writeJsonFile,\n} from '@nx/devkit';\nimport { calculateHashForCreateNodes } from '@nx/devkit/src/utils/calculate-hash-for-create-nodes';\nimport { getNamedInputs } from '@nx/devkit/src/utils/get-named-inputs';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { hashObject } from 'nx/src/devkit-internals';\nimport { workspaceDataDirectory } from 'nx/src/utils/cache-directory';\nimport { AdapterDefinition, AdapterTargetConfig, AdapterTargetName, ADAPTER_TARGET_NAMES } from '../adapters/contract';\nimport { buildDiscoveryGlob, findAdapterForConfigFile, getBuiltinAdapters } from '../adapters/registry';\n\nexport interface NxCucumberPluginOptions {\n /** Override the primary e2e target name (default: 'e2e') */\n e2eTargetName?: string;\n /** Override the UI mode target name (default: 'e2e-ui') */\n e2eUiTargetName?: string;\n /** Override the parallel target name (default: 'e2e-parallel') */\n e2eParallelTargetName?: string;\n}\n\nconst DEFAULT_TARGET_NAMES: Record<AdapterTargetName, string> = {\n e2e: 'e2e',\n 'e2e-ui': 'e2e-ui',\n 'e2e-parallel': 'e2e-parallel',\n};\n\nfunction resolveTargetName(key: AdapterTargetName, options?: NxCucumberPluginOptions): string {\n if (key === 'e2e' && options?.e2eTargetName) return options.e2eTargetName;\n if (key === 'e2e-ui' && options?.e2eUiTargetName) return options.e2eUiTargetName;\n if (key === 'e2e-parallel' && options?.e2eParallelTargetName) return options.e2eParallelTargetName;\n return DEFAULT_TARGET_NAMES[key];\n}\n\nexport function readTargetsCache(cachePath: string): Record<string, TargetsResult> {\n return process.env['NX_CACHE_PROJECT_GRAPH'] !== 'false' && existsSync(cachePath) ? readJsonFile(cachePath) : {};\n}\n\nfunction writeTargetsToCache(cachePath: string, results: Record<string, TargetsResult>): void {\n writeJsonFile(cachePath, results);\n}\n\ninterface TargetsResult {\n targets: Record<string, TargetConfiguration>;\n metadata: ProjectConfiguration['metadata'];\n}\n\n/**\n * Builds Nx targets from an adapter definition for a specific project.\n */\nexport function buildTargetsForAdapter(\n adapter: AdapterDefinition,\n projectRoot: string,\n configFilePath: string,\n namedInputs: Record<string, unknown[]>,\n options?: NxCucumberPluginOptions\n): TargetsResult {\n const targets: Record<string, TargetConfiguration> = {};\n const targetGroup: string[] = [];\n\n const defaultInputs = 'production' in namedInputs ? ['production', '^production'] : ['default', '^default'];\n\n for (const key of ADAPTER_TARGET_NAMES) {\n const adapterTarget: AdapterTargetConfig | undefined = adapter.targets[key];\n if (!adapterTarget) continue;\n\n const targetName = resolveTargetName(key, options);\n const defaultOutputs = [`{workspaceRoot}/dist/e2e/${projectRoot}`];\n\n targets[targetName] = {\n command: `${adapterTarget.command} --config ${configFilePath}`,\n options: {\n ...(adapterTarget.defaultOptions ?? {}),\n },\n cache: adapterTarget.continuous ? false : true,\n inputs: adapterTarget.inputs ?? [...defaultInputs, { externalDependencies: adapter.technologies }],\n outputs: adapterTarget.outputs ?? defaultOutputs,\n ...(adapterTarget.dependsOn ? { dependsOn: adapterTarget.dependsOn } : {}),\n ...(adapterTarget.continuous ? { continuous: true } : {}),\n metadata: {\n technologies: adapter.technologies,\n description: `Run ${adapter.name} ${key} tests`,\n help: {\n command: `${adapterTarget.command} --help`,\n example: {},\n },\n },\n };\n\n targetGroup.push(targetName);\n }\n\n return {\n targets,\n metadata: {\n targetGroups: {\n [adapter.name]: targetGroup,\n },\n },\n };\n}\n\n/**\n * Checks whether the given directory is a valid Nx project\n * (contains project.json or package.json).\n */\nexport function isProjectRoot(workspaceRoot: string, projectRoot: string): boolean {\n const dir = join(workspaceRoot, projectRoot);\n if (!existsSync(dir)) return false;\n const files = readdirSync(dir);\n return files.includes('project.json') || files.includes('package.json');\n}\n\n/**\n * Reads user-defined targets from project.json to avoid conflicts.\n */\nexport function getUserDefinedTargets(workspaceRoot: string, projectRoot: string): Set<string> {\n const projectJsonPath = join(workspaceRoot, projectRoot, 'project.json');\n if (!existsSync(projectJsonPath)) return new Set();\n try {\n const config = readJsonFile<ProjectConfiguration>(projectJsonPath);\n return new Set(Object.keys(config.targets ?? {}));\n } catch {\n return new Set();\n }\n}\n\n/**\n * Removes targets that conflict with user-defined targets in project.json.\n */\nexport function filterConflictingTargets(result: TargetsResult, userTargets: Set<string>): TargetsResult {\n if (userTargets.size === 0) return result;\n\n const filtered: Record<string, TargetConfiguration> = {};\n const filteredGroup: string[] = [];\n\n for (const [name, target] of Object.entries(result.targets)) {\n if (!userTargets.has(name)) {\n filtered[name] = target;\n filteredGroup.push(name);\n }\n }\n\n const groupKey = Object.keys(result.metadata?.targetGroups ?? {})[0];\n\n return {\n targets: filtered,\n metadata: groupKey ? { targetGroups: { [groupKey]: filteredGroup } } : result.metadata,\n };\n}\n\nexport const createNodesV2: CreateNodesV2<NxCucumberPluginOptions> = [\n createDiscoveryGlob(),\n async (configFiles, options, context): Promise<CreateNodesResultV2> => {\n const adapters = getBuiltinAdapters();\n if (adapters.length === 0) return [];\n\n const optionsHash = hashObject(options ?? {});\n const cachePath = join(workspaceDataDirectory, `nx-cucumber-${optionsHash}.hash`);\n const targetsCache = readTargetsCache(cachePath);\n\n try {\n return await createNodesFromFiles(\n async (configFilePath, opts, ctx) => {\n const projectRoot = dirname(configFilePath);\n\n if (!isProjectRoot(ctx.workspaceRoot, projectRoot)) {\n return {};\n }\n\n const adapter = findAdapterForConfigFile(configFilePath, adapters);\n if (!adapter) return {};\n\n const hash = await calculateHashForCreateNodes(projectRoot, opts ?? {}, ctx);\n\n if (!targetsCache[hash]) {\n const namedInputs = getNamedInputs(projectRoot, ctx);\n const result = buildTargetsForAdapter(adapter, projectRoot, configFilePath, namedInputs, opts ?? undefined);\n const userTargets = getUserDefinedTargets(ctx.workspaceRoot, projectRoot);\n targetsCache[hash] = filterConflictingTargets(result, userTargets);\n }\n\n const { targets, metadata } = targetsCache[hash];\n\n return {\n projects: {\n [projectRoot]: {\n root: projectRoot,\n targets,\n metadata,\n },\n },\n };\n },\n configFiles,\n options,\n context\n );\n } finally {\n writeTargetsToCache(cachePath, targetsCache);\n }\n },\n];\n\n/**\n * Builds the glob at module load time from registered adapters.\n * Returns a no-match pattern if no adapters are registered yet.\n */\nfunction createDiscoveryGlob(): string {\n const adapters = getBuiltinAdapters();\n return buildDiscoveryGlob(adapters) ?? '**/__nx-cucumber-no-adapters__';\n}\n"]}
@@ -1,11 +0,0 @@
1
- export interface BeautifulReportOptions {
2
- jsonDir: string;
3
- outputDir: string;
4
- reportTitle?: string;
5
- metadata?: Record<string, string>;
6
- }
7
- /**
8
- * Generates a beautiful HTML report from Cucumber JSON output.
9
- * Requires cucumber-html-reporter to be installed.
10
- */
11
- export declare function createBeautifulHtmlReport(options: BeautifulReportOptions): boolean;
@@ -1,58 +0,0 @@
1
- "use strict";
2
- /*
3
- * Utility to generate beautiful HTML report from Cucumber JSON results.
4
- * Requires optional peer dependency: cucumber-html-reporter
5
- */
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.createBeautifulHtmlReport = createBeautifulHtmlReport;
8
- const tslib_1 = require("tslib");
9
- const fs = tslib_1.__importStar(require("fs"));
10
- const shared_util_1 = require("@gnuechtel/shared-util");
11
- /**
12
- * Generates a beautiful HTML report from Cucumber JSON output.
13
- * Requires cucumber-html-reporter to be installed.
14
- */
15
- function createBeautifulHtmlReport(options) {
16
- const { jsonDir, outputDir, reportTitle, metadata } = options;
17
- if (!fs.existsSync(outputDir)) {
18
- fs.mkdirSync(outputDir, { recursive: true });
19
- }
20
- if (!fs.existsSync(jsonDir)) {
21
- console.error(`Cucumber JSON directory ${jsonDir} does not exist`);
22
- return false;
23
- }
24
- try {
25
- const reporter = loadCucumberHtmlReporter();
26
- reporter.generate({
27
- name: reportTitle || 'Cucumber Feature Report',
28
- brandTitle: ' ',
29
- theme: 'bootstrap',
30
- columnLayout: 1,
31
- jsonDir,
32
- output: `${outputDir}/cucumber-test-report.html`,
33
- reportSuiteAsScenarios: true,
34
- launchReport: false,
35
- ...(metadata ? { metadata } : {}),
36
- });
37
- }
38
- catch (e) {
39
- console.error(`Could not create cucumber HTML report: ${(0, shared_util_1.toErrorWithMessage)(e).message}`);
40
- return false;
41
- }
42
- return true;
43
- }
44
- function loadCucumberHtmlReporter() {
45
- try {
46
- // eslint-disable-next-line @typescript-eslint/no-var-requires
47
- return require('cucumber-html-reporter');
48
- }
49
- catch (error) {
50
- const requiresInstall = error instanceof Error &&
51
- (error.message.includes('Cannot find module') || error.message.includes('Cannot find package'));
52
- if (requiresInstall) {
53
- throw new Error('Beautiful HTML report generation requires "cucumber-html-reporter". Install it with: npm i -D cucumber-html-reporter');
54
- }
55
- throw error;
56
- }
57
- }
58
- //# sourceMappingURL=cucumber-report-html.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cucumber-report-html.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/core/cucumber-report-html.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAoBH,8DA+BC;;AAjDD,+CAAyB;AACzB,wDAA4D;AAa5D;;;GAGG;AACH,SAAgB,yBAAyB,CAAC,OAA+B;IACvE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE9D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,2BAA2B,OAAO,iBAAiB,CAAC,CAAC;QACnE,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,wBAAwB,EAAE,CAAC;QAC5C,QAAQ,CAAC,QAAQ,CAAC;YAChB,IAAI,EAAE,WAAW,IAAI,yBAAyB;YAC9C,UAAU,EAAE,GAAG;YACf,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,CAAC;YACf,OAAO;YACP,MAAM,EAAE,GAAG,SAAS,4BAA4B;YAChD,sBAAsB,EAAE,IAAI;YAC5B,YAAY,EAAE,KAAK;YACnB,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QACpB,OAAO,CAAC,KAAK,CAAC,0CAA0C,IAAA,gCAAkB,EAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,wBAAwB;IAC/B,IAAI,CAAC;QACH,8DAA8D;QAC9D,OAAO,OAAO,CAAC,wBAAwB,CAAyB,CAAC;IACnE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,eAAe,GACnB,KAAK,YAAY,KAAK;YACtB,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAElG,IAAI,eAAe,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CACb,sHAAsH,CACvH,CAAC;QACJ,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC","sourcesContent":["/*\n * Utility to generate beautiful HTML report from Cucumber JSON results.\n * Requires optional peer dependency: cucumber-html-reporter\n */\n\nimport * as fs from 'fs';\nimport { toErrorWithMessage } from '@gnuechtel/shared-util';\n\ntype CucumberHtmlReporter = {\n generate(options: Record<string, unknown>): void;\n};\n\nexport interface BeautifulReportOptions {\n jsonDir: string;\n outputDir: string;\n reportTitle?: string;\n metadata?: Record<string, string>;\n}\n\n/**\n * Generates a beautiful HTML report from Cucumber JSON output.\n * Requires cucumber-html-reporter to be installed.\n */\nexport function createBeautifulHtmlReport(options: BeautifulReportOptions): boolean {\n const { jsonDir, outputDir, reportTitle, metadata } = options;\n\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n\n if (!fs.existsSync(jsonDir)) {\n console.error(`Cucumber JSON directory ${jsonDir} does not exist`);\n return false;\n }\n\n try {\n const reporter = loadCucumberHtmlReporter();\n reporter.generate({\n name: reportTitle || 'Cucumber Feature Report',\n brandTitle: ' ',\n theme: 'bootstrap',\n columnLayout: 1,\n jsonDir,\n output: `${outputDir}/cucumber-test-report.html`,\n reportSuiteAsScenarios: true,\n launchReport: false,\n ...(metadata ? { metadata } : {}),\n });\n } catch (e: unknown) {\n console.error(`Could not create cucumber HTML report: ${toErrorWithMessage(e).message}`);\n return false;\n }\n\n return true;\n}\n\nfunction loadCucumberHtmlReporter(): CucumberHtmlReporter {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return require('cucumber-html-reporter') as CucumberHtmlReporter;\n } catch (error) {\n const requiresInstall =\n error instanceof Error &&\n (error.message.includes('Cannot find module') || error.message.includes('Cannot find package'));\n\n if (requiresInstall) {\n throw new Error(\n 'Beautiful HTML report generation requires \"cucumber-html-reporter\". Install it with: npm i -D cucumber-html-reporter'\n );\n }\n\n throw error;\n }\n}\n"]}