@gnuechtel/nx-cucumber 23.0.0-rc.1 → 23.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.
package/README.md CHANGED
@@ -2,8 +2,6 @@
2
2
 
3
3
  Plugin to use Cucumber within Nx workspaces
4
4
 
5
- > **Known upstream dependency issue:** we accepted a scoped release exception. Existing users can apply the tested root override described in the [dependency security notice](#dependency-security-notice).
6
-
7
5
  <!-- TOC -->
8
6
 
9
7
  - [Introduction](#introduction)
@@ -69,7 +67,7 @@ own changes. For example, a plugin-only fix can be released as 23.0.1 while the
69
67
  supported Nx baseline stays the same. The exact compatibility ranges are defined
70
68
  in the package's dependencies and peer dependencies.
71
69
 
72
- The 23.0.0-rc.1 candidate updates the existing integration for Nx 23.3.1 or later within major 23, retaining Node 22, Cucumber 12.6 and Playwright 1.60. General tool upgrades follow before stable 23.0.0. It uses the canonical `createNodes` entrypoint, generates flat ESLint configuration, and updates dependency versions. Existing worlds, hooks and test metadata remain part of the integration. See the [23.0.0 release notes](../../docs/release-23.md), including the reviewed upstream security exception, before upgrading.
70
+ This release updates the existing integration for Nx 23, Cucumber 13 and Playwright 1.64. It uses the canonical `createNodes` entrypoint, generates flat ESLint configuration, and updates dependency versions. Existing worlds, hooks and test metadata remain part of the integration. See the [23.0.0 release notes](../../docs/release-23.md), including the reviewed upstream security exception, before upgrading.
73
71
 
74
72
  ## Dependency security notice
75
73
 
@@ -119,7 +117,7 @@ Version 2.x is a deliberate breaking release that simplifies the plugin architec
119
117
 
120
118
  ## Prerequisites
121
119
 
122
- This plugin requires [Node.js](https://nodejs.org/), [Nx](https://nx.dev/) and [Cucumber](https://github.com/cucumber/cucumber-js). The 23.0.0-rc.1 candidate targets Nx `>=23.3.1 <24` and Node.js 22; published 2.x packages remain the Nx-22 path. The jump follows the supported Nx major and does not promise future major releases. Browser automation uses the [Playwright library](https://playwright.dev/docs/library) when selected by the generator. Consult `package.json` for all dependency requirements and `.gitlab-ci.yml` for the pinned CI versions. Minor and patch versions follow this plugin's changes independently of Nx.
120
+ This plugin requires [Node.js](https://nodejs.org/), [Nx](https://nx.dev/) and [Cucumber](https://github.com/cucumber/cucumber-js). Version 23.0.0 targets Nx `>=23 <24` and Node.js 24; published 2.x packages remain the Nx-22 path. The jump follows the supported Nx major and does not promise future major releases. Browser automation uses the [Playwright library](https://playwright.dev/docs/library) when selected by the generator. Consult `package.json` for all dependency requirements and `.gitlab-ci.yml` for the pinned CI versions. Minor and patch versions follow this plugin's changes independently of Nx.
123
121
 
124
122
  ## Quick start
125
123
 
@@ -135,10 +133,10 @@ npx create-nx-workspace@23.3.1 gnu-repo --preset=react-monorepo --e2eTestRunner=
135
133
  cd gnu-repo
136
134
 
137
135
  # install cucumber and playwright-test
138
- npm i -D @cucumber/cucumber@12.6.0 @playwright/test@1.60.0
136
+ npm i -D @cucumber/cucumber@13.3.0 @playwright/test@1.64.1
139
137
 
140
138
  # install this plugin
141
- npm i -D @gnuechtel/nx-cucumber@23.0.0-rc.1
139
+ npm i -D @gnuechtel/nx-cucumber@23.0.0
142
140
 
143
141
  # register the plugin in nx.json (enables inferred tasks)
144
142
  # add "@gnuechtel/nx-cucumber" to the "plugins" array in nx.json
@@ -163,7 +161,7 @@ There are two feasible options to [install Nx](https://nx.dev/getting-started/in
163
161
  It is never recommended to install all those Nx [dependencies](https://www.npmjs.com/org/nx) manually.
164
162
  It would just cause too much unnecessary work.
165
163
 
166
- Before installing this plugin, verify the installed Nx version with `npx nx --version`: it must be `>=23.3.1 <24`. The workspace CLI can download a template with a newer Nx version independently of its own version. In that case, start from a template pinned to Nx 23 or use an existing Nx-23 workspace; do not bypass the peer requirements.
164
+ Before installing this plugin, verify the installed Nx version with `npx nx --version`: it must be `>=23 <24`. The workspace CLI can download a template with a newer Nx version independently of its own version. In that case, start from a template pinned to Nx 23 or use an existing Nx-23 workspace; do not bypass the peer requirements.
167
165
 
168
166
  ## Install dependencies
169
167
 
@@ -286,10 +284,7 @@ The generator scaffolds a cucumber-js configuration file for each project. It is
286
284
  By default the generator creates a `cucumber.js`. Because the code formats are evaluated when loaded, options can be computed at runtime — for example, deriving the tag filter from an environment variable:
287
285
 
288
286
  ```javascript
289
- const tagsFilter =
290
- process.env['CI_STAGE'] !== 'qa'
291
- ? 'and not @qa-stage-only'
292
- : 'and (@qa-stage or @qa-stage-only)';
287
+ const tagsFilter = process.env['CI_STAGE'] !== 'qa' ? 'and not @qa-stage-only' : 'and (@qa-stage or @qa-stage-only)';
293
288
 
294
289
  module.exports = {
295
290
  default: {
@@ -321,10 +316,7 @@ The same configuration expressed in the remaining formats:
321
316
  **ES module** — `cucumber.mjs`
322
317
 
323
318
  ```javascript
324
- const tagsFilter =
325
- process.env['CI_STAGE'] !== 'qa'
326
- ? 'and not @qa-stage-only'
327
- : 'and (@qa-stage or @qa-stage-only)';
319
+ const tagsFilter = process.env['CI_STAGE'] !== 'qa' ? 'and not @qa-stage-only' : 'and (@qa-stage or @qa-stage-only)';
328
320
 
329
321
  export default {
330
322
  default: {
@@ -338,10 +330,7 @@ export default {
338
330
  ```typescript
339
331
  import type { IConfiguration } from '@cucumber/cucumber';
340
332
 
341
- const tagsFilter =
342
- process.env['CI_STAGE'] !== 'qa'
343
- ? 'and not @qa-stage-only'
344
- : 'and (@qa-stage or @qa-stage-only)';
333
+ const tagsFilter = process.env['CI_STAGE'] !== 'qa' ? 'and not @qa-stage-only' : 'and (@qa-stage or @qa-stage-only)';
345
334
 
346
335
  const config: { default: Partial<IConfiguration> } = {
347
336
  default: {
@@ -863,20 +852,9 @@ module.exports = {
863
852
  default: {
864
853
  paths: ['apps/my-project-e2e/features/**/*.feature'],
865
854
  requireModule: ['ts-node/register'],
866
- require: [
867
- 'apps/my-project-e2e/src/**/*.ts',
868
- 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js',
869
- 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js',
870
- ],
855
+ require: ['apps/my-project-e2e/src/**/*.ts', 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-world-default.js', 'node_modules/@gnuechtel/nx-cucumber/src/playwright/playwright-hooks.js'],
871
856
  tags: 'not @ignore',
872
- format: [
873
- 'summary',
874
- 'progress-bar',
875
- `json:${outputDir}/reports/cucumber-json/cucumber-test-report.json`,
876
- `message:${outputDir}/reports/cucumber-messages/cucumber-messages.ndjson`,
877
- `html:${outputDir}/reports/html/cucumber-test-report-builtin.html`,
878
- `junit:${outputDir}/reports/test-results/cucumber-test-report.xml`,
879
- ],
857
+ format: ['summary', 'progress-bar', `json:${outputDir}/reports/cucumber-json/cucumber-test-report.json`, `message:${outputDir}/reports/cucumber-messages/cucumber-messages.ndjson`, `html:${outputDir}/reports/html/cucumber-test-report-builtin.html`, `junit:${outputDir}/reports/test-results/cucumber-test-report.xml`],
880
858
  publishQuiet: true,
881
859
  },
882
860
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gnuechtel/nx-cucumber",
3
- "version": "23.0.0-rc.1",
3
+ "version": "23.0.0",
4
4
  "description": "Plugin to use Cucumber within Nx workspaces",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -9,20 +9,20 @@
9
9
  "directory": "libs/nx-cucumber"
10
10
  },
11
11
  "dependencies": {
12
- "@nx/devkit": ">=23.3.1 <24",
12
+ "@nx/devkit": ">=23 <24",
13
13
  "minimatch": "^10.0.0",
14
- "tslib": "^2.3.0",
15
- "@gnuechtel/shared-coverage": "23.0.0-rc.1",
16
- "@gnuechtel/shared-util": "23.0.0-rc.1"
14
+ "tslib": "^2.8.1",
15
+ "@gnuechtel/shared-coverage": "23.0.0",
16
+ "@gnuechtel/shared-util": "23.0.0"
17
17
  },
18
18
  "peerDependencies": {
19
- "@cucumber/cucumber": ">=9 <13",
20
- "@cucumber/messages": ">=22 <32",
21
- "debug": "^4.3.4",
22
- "playwright-core": ">=1.38.0-0 <2",
23
- "playwright": ">=1.38.0-0 <2",
24
- "@playwright/test": ">=1.38.0-0 <2",
25
- "nx": ">=23.3.1 <24"
19
+ "@cucumber/cucumber": ">=13 <14",
20
+ "@cucumber/messages": ">=34 <35",
21
+ "debug": "^4.4.3",
22
+ "playwright-core": ">=1.64 <2",
23
+ "playwright": ">=1.64 <2",
24
+ "@playwright/test": ">=1.64 <2",
25
+ "nx": ">=23 <24"
26
26
  },
27
27
  "type": "commonjs",
28
28
  "main": "./src/index.js",
@@ -32,5 +32,8 @@
32
32
  },
33
33
  "executors": "./executors.json",
34
34
  "typings": "./src/index.d.ts",
35
+ "engines": {
36
+ "node": ">=24 <25"
37
+ },
35
38
  "types": "./src/index.d.ts"
36
39
  }
@@ -81,7 +81,7 @@ async function cucumberJsGenerator(tree, options) {
81
81
  registerPlugin(tree);
82
82
  await (0, devkit_1.formatFiles)(tree);
83
83
  const additionalDevDependencies = {
84
- 'ts-node': '10.9.1',
84
+ 'ts-node': '10.9.2',
85
85
  'tsconfig-paths': '4.2.0',
86
86
  };
87
87
  const installTask = (0, devkit_1.addDependenciesToPackageJson)(tree, {}, additionalDevDependencies);
@@ -1 +1 @@
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 { ConfigFormat, 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 if (!options.configFormat) options.configFormat = 'js';\n assertConfigFormatSupported(tree, options.configFormat);\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 command: `npx eslint ${projectRoot}`,\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 configFormat = options.configFormat!;\n const configFileName = `cucumber.${configFormat}`;\n const configShapeDir = resolveConfigShapeDir(configFormat);\n const isTypeScript = ['ts', 'mts', 'cts'].includes(configFormat);\n const isEsmModule = ['mjs', 'mts'].includes(configFormat);\n\n const serveCommand =\n isPlaywright && baseUrl && serveTarget ? buildServeCommand(tree, options.project, serveTarget, baseUrl) : '';\n const testCommand = `npx cucumber-js --config ${projectRoot}/${configFileName}`;\n const templateProjectName = parseScopedProjectName(options.project).name;\n\n const substitutions = {\n ...options,\n project: templateProjectName,\n testedProject: options.project,\n workspaceRootRelative,\n rootEslintConfig:\n ['eslint.config.mjs', 'eslint.config.js', 'eslint.config.cjs'].find((file) => tree.exists(file)) ??\n 'eslint.config.mjs',\n projectRoot,\n playwrightRequires: JSON.stringify(playwrightRequires),\n playwrightRequiresArray: playwrightRequires,\n isPlaywright,\n isTypeScript,\n isEsmModule,\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', 'config', configShapeDir), 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 root = readProjectConfiguration(tree, projectName).root;\n const usesVite = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'].some((extension) =>\n tree.exists(`${root}/vite.config.${extension}`)\n );\n return usesVite ? `npx nx run ${serveTarget} --port=${port} --strictPort` : `npx nx run ${serveTarget}`;\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\nconst TYPESCRIPT_CONFIG_FORMATS: ConfigFormat[] = ['ts', 'mts', 'cts'];\nconst MINIMUM_CUCUMBER_VERSION_FOR_TS_CONFIG = '12.4.0';\n\n// cucumber-js only loads TypeScript config files (.ts/.mts/.cts) from 12.4.0 onwards\n// (versions 10.0-12.3 reject them with \"Unsupported configuration file extension\").\n// Fail fast with an actionable error instead of letting the user hit that at run time.\nfunction assertConfigFormatSupported(tree: Tree, configFormat: ConfigFormat) {\n if (!TYPESCRIPT_CONFIG_FORMATS.includes(configFormat)) return;\n const cucumberVersion = readInstalledCucumberVersion(tree);\n if (cucumberVersion && isBelowVersion(cucumberVersion, MINIMUM_CUCUMBER_VERSION_FOR_TS_CONFIG)) {\n throw new Error(\n `Cucumber configuration format \"${configFormat}\" requires @cucumber/cucumber >=${MINIMUM_CUCUMBER_VERSION_FOR_TS_CONFIG}, ` +\n `but found ${cucumberVersion}. Choose a different --config-format (js, cjs, mjs, json, yaml) ` +\n `or upgrade @cucumber/cucumber.`\n );\n }\n}\n\nfunction readInstalledCucumberVersion(tree: Tree): string | undefined {\n const packageJsonPath = 'node_modules/@cucumber/cucumber/package.json';\n if (!tree.exists(packageJsonPath)) return undefined;\n try {\n const content = tree.read(packageJsonPath, 'utf-8');\n const version = content ? JSON.parse(content).version : undefined;\n return typeof version === 'string' ? version : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isBelowVersion(version: string, minimum: string): boolean {\n const toParts = (value: string) =>\n value\n .split('-')[0]\n .split('.')\n .map((part) => parseInt(part, 10) || 0);\n const [vMajor, vMinor, vPatch] = toParts(version);\n const [mMajor, mMinor, mPatch] = toParts(minimum);\n if (vMajor !== mMajor) return vMajor < mMajor;\n if (vMinor !== mMinor) return vMinor < mMinor;\n return vPatch < mPatch;\n}\n\nfunction resolveConfigShapeDir(configFormat: ConfigFormat): string {\n if (configFormat === 'json') return 'json';\n if (configFormat === 'yaml' || configFormat === 'yml') return 'yaml';\n // cucumber-js loads .mjs/.mts/.ts via dynamic import (ESM), so they need the\n // import.meta-based shape; .cjs/.cts/.js are require-loaded and stay CommonJS.\n if (configFormat === 'mjs' || configFormat === 'mts' || configFormat === 'ts') return 'esm';\n return 'cjs';\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"]}
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../../../../../libs/nx-cucumber/src/generators/project/project.ts"],"names":[],"mappings":";;AAiBA,kDA6FC;;AA9GD,uCAWoB;AACpB,mDAA6B;AAE7B,2BAAgC;AAChC,kEAAgE;AAEzD,KAAK,UAAU,mBAAmB,CAAC,IAAU,EAAE,OAAkC;IACtF,IAAI,CAAC,OAAO,CAAC,UAAU;QAAE,OAAO,CAAC,UAAU,GAAG,oCAAiB,CAAC;IAChE,IAAI,CAAC,OAAO,CAAC,YAAY;QAAE,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IACvD,2BAA2B,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACxD,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO,CAAC,IAAI,GAAG,6BAA6B,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,IAAI,CAAC,OAAO,CAAC,SAAS;QAAE,OAAO,CAAC,SAAS,GAAG,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAClF,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,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAElG,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,OAAO,EAAE,cAAc,WAAW,EAAE;aACrC;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,YAAY,GAAG,OAAO,CAAC,YAAa,CAAC;IAC3C,MAAM,cAAc,GAAG,YAAY,YAAY,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjE,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAE1D,MAAM,YAAY,GAChB,YAAY,IAAI,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/G,MAAM,WAAW,GAAG,4BAA4B,WAAW,IAAI,cAAc,EAAE,CAAC;IAChF,MAAM,mBAAmB,GAAG,sBAAsB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;IAEzE,MAAM,aAAa,GAAG;QACpB,GAAG,OAAO;QACV,OAAO,EAAE,mBAAmB;QAC5B,aAAa,EAAE,OAAO,CAAC,OAAO;QAC9B,qBAAqB;QACrB,gBAAgB,EACd,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,mBAAmB,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAChG,mBAAmB;QACrB,WAAW;QACX,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;QACtD,uBAAuB,EAAE,kBAAkB;QAC3C,YAAY;QACZ,YAAY;QACZ,WAAW;QACX,OAAO,EAAE,OAAO,IAAI,EAAE;QACtB,WAAW,EAAE,WAAW,IAAI,EAAE;QAC9B,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,gBAAgB,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;QAC9C,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;KAC7C,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,QAAQ,EAAE,cAAc,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACzG,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,cAAc,CAAC,IAAI,CAAC,CAAC;IAErB,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAExB,MAAM,yBAAyB,GAA2B;QACxD,SAAS,EAAE,QAAQ;QACnB,gBAAgB,EAAE,OAAO;KAC1B,CAAC;IAEF,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,CAAC,cAAsB,EAAE,WAAmB;IACzE,OAAO;QACL,aAAa,EAAE;YACb,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,6BAA6B,EAAE;SACzC;QACD,GAAG,EAAE;YACH,OAAO,EAAE,QAAQ,WAAW,aAAa;SAC1C;QACD,QAAQ,EAAE;YACR,OAAO,EAAE,cAAc,cAAc,8BAA8B,cAAc,MAAM;SACxF;KACF,CAAC;AACJ,CAAC;AAED,SAAS,6BAA6B;IACpC,OAAO,wPAAwP,CAAC;AAClQ,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAU,EAAE,WAAmB,EAAE,WAAmB,EAAE,OAAe;IAC9F,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,IAAA,iCAAwB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAC3E,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,gBAAgB,SAAS,EAAE,CAAC,CAChD,CAAC;IACF,OAAO,QAAQ,CAAC,CAAC,CAAC,cAAc,WAAW,WAAW,IAAI,eAAe,CAAC,CAAC,CAAC,cAAc,WAAW,EAAE,CAAC;AAC1G,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,SAAS,mBAAmB,CAAC,IAAU,EAAE,WAAmB;IAC1D,IAAI,CAAC;QACH,IAAA,iCAAwB,EAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,qCAAqC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,SAAS,6BAA6B,CAAC,WAAmB,EAAE,aAAsB;IAChF,MAAM,aAAa,GAAG,sBAAsB,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,gBAAgB,GAAG,sBAAsB,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,IAAI,gBAAgB,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,YAAY,GAAG,GAAG,aAAa,CAAC,IAAI,MAAM,CAAC;QACjD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IACvF,CAAC;IACD,IAAI,gBAAgB,CAAC,KAAK;QAAE,OAAO,gBAAgB,CAAC,GAAG,CAAC;IACxD,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,KAAK,IAAI,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC;AACzG,CAAC;AAED,SAAS,uBAAuB,CAAC,WAAmB;IAClD,OAAO,sBAAsB,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC;AAClD,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAa;IAC3C,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACzB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvC,CAAC;IACD,MAAM,cAAc,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,cAAc,GAAG,CAAC,IAAI,cAAc,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;IACvC,CAAC;IACD,OAAO;QACL,GAAG;QACH,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC;QACnC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,cAAc,GAAG,CAAC,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,MAAM,yBAAyB,GAAmB,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACvE,MAAM,sCAAsC,GAAG,QAAQ,CAAC;AAExD,qFAAqF;AACrF,oFAAoF;AACpF,uFAAuF;AACvF,SAAS,2BAA2B,CAAC,IAAU,EAAE,YAA0B;IACzE,IAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,OAAO;IAC9D,MAAM,eAAe,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAC3D,IAAI,eAAe,IAAI,cAAc,CAAC,eAAe,EAAE,sCAAsC,CAAC,EAAE,CAAC;QAC/F,MAAM,IAAI,KAAK,CACb,kCAAkC,YAAY,mCAAmC,sCAAsC,IAAI;YACzH,aAAa,eAAe,kEAAkE;YAC9F,gCAAgC,CACnC,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,4BAA4B,CAAC,IAAU;IAC9C,MAAM,eAAe,GAAG,8CAA8C,CAAC;IACvE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;QAClE,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAAe,EAAE,OAAe;IACtD,MAAM,OAAO,GAAG,CAAC,KAAa,EAAE,EAAE,CAChC,KAAK;SACF,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;SACb,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC9C,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,MAAM,GAAG,MAAM,CAAC;IAC9C,OAAO,MAAM,GAAG,MAAM,CAAC;AACzB,CAAC;AAED,SAAS,qBAAqB,CAAC,YAA0B;IACvD,IAAI,YAAY,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAC3C,IAAI,YAAY,KAAK,MAAM,IAAI,YAAY,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACrE,6EAA6E;IAC7E,+EAA+E;IAC/E,IAAI,YAAY,KAAK,KAAK,IAAI,YAAY,KAAK,KAAK,IAAI,YAAY,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5F,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,IAAU;IAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,OAAO;IACpC,IAAA,mBAAU,EAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE;QACnC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,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 updateJson,\n} from '@nx/devkit';\nimport * as path from 'path';\nimport { ConfigFormat, 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 if (!options.configFormat) options.configFormat = 'js';\n assertConfigFormatSupported(tree, options.configFormat);\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 command: `npx eslint ${projectRoot}`,\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 configFormat = options.configFormat!;\n const configFileName = `cucumber.${configFormat}`;\n const configShapeDir = resolveConfigShapeDir(configFormat);\n const isTypeScript = ['ts', 'mts', 'cts'].includes(configFormat);\n const isEsmModule = ['mjs', 'mts'].includes(configFormat);\n\n const serveCommand =\n isPlaywright && baseUrl && serveTarget ? buildServeCommand(tree, options.project, serveTarget, baseUrl) : '';\n const testCommand = `npx cucumber-js --config ${projectRoot}/${configFileName}`;\n const templateProjectName = parseScopedProjectName(options.project).name;\n\n const substitutions = {\n ...options,\n project: templateProjectName,\n testedProject: options.project,\n workspaceRootRelative,\n rootEslintConfig:\n ['eslint.config.mjs', 'eslint.config.js', 'eslint.config.cjs'].find((file) => tree.exists(file)) ??\n 'eslint.config.mjs',\n projectRoot,\n playwrightRequires: JSON.stringify(playwrightRequires),\n playwrightRequiresArray: playwrightRequires,\n isPlaywright,\n isTypeScript,\n isEsmModule,\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', 'config', configShapeDir), 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.2',\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 root = readProjectConfiguration(tree, projectName).root;\n const usesVite = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'].some((extension) =>\n tree.exists(`${root}/vite.config.${extension}`),\n );\n return usesVite ? `npx nx run ${serveTarget} --port=${port} --strictPort` : `npx nx run ${serveTarget}`;\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\nconst TYPESCRIPT_CONFIG_FORMATS: ConfigFormat[] = ['ts', 'mts', 'cts'];\nconst MINIMUM_CUCUMBER_VERSION_FOR_TS_CONFIG = '12.4.0';\n\n// cucumber-js only loads TypeScript config files (.ts/.mts/.cts) from 12.4.0 onwards\n// (versions 10.0-12.3 reject them with \"Unsupported configuration file extension\").\n// Fail fast with an actionable error instead of letting the user hit that at run time.\nfunction assertConfigFormatSupported(tree: Tree, configFormat: ConfigFormat) {\n if (!TYPESCRIPT_CONFIG_FORMATS.includes(configFormat)) return;\n const cucumberVersion = readInstalledCucumberVersion(tree);\n if (cucumberVersion && isBelowVersion(cucumberVersion, MINIMUM_CUCUMBER_VERSION_FOR_TS_CONFIG)) {\n throw new Error(\n `Cucumber configuration format \"${configFormat}\" requires @cucumber/cucumber >=${MINIMUM_CUCUMBER_VERSION_FOR_TS_CONFIG}, ` +\n `but found ${cucumberVersion}. Choose a different --config-format (js, cjs, mjs, json, yaml) ` +\n `or upgrade @cucumber/cucumber.`,\n );\n }\n}\n\nfunction readInstalledCucumberVersion(tree: Tree): string | undefined {\n const packageJsonPath = 'node_modules/@cucumber/cucumber/package.json';\n if (!tree.exists(packageJsonPath)) return undefined;\n try {\n const content = tree.read(packageJsonPath, 'utf-8');\n const version = content ? JSON.parse(content).version : undefined;\n return typeof version === 'string' ? version : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction isBelowVersion(version: string, minimum: string): boolean {\n const toParts = (value: string) =>\n value\n .split('-')[0]\n .split('.')\n .map((part) => parseInt(part, 10) || 0);\n const [vMajor, vMinor, vPatch] = toParts(version);\n const [mMajor, mMinor, mPatch] = toParts(minimum);\n if (vMajor !== mMajor) return vMajor < mMajor;\n if (vMinor !== mMinor) return vMinor < mMinor;\n return vPatch < mPatch;\n}\n\nfunction resolveConfigShapeDir(configFormat: ConfigFormat): string {\n if (configFormat === 'json') return 'json';\n if (configFormat === 'yaml' || configFormat === 'yml') return 'yaml';\n // cucumber-js loads .mjs/.mts/.ts via dynamic import (ESM), so they need the\n // import.meta-based shape; .cjs/.cts/.js are require-loaded and stay CommonJS.\n if (configFormat === 'mjs' || configFormat === 'mts' || configFormat === 'ts') return 'esm';\n return 'cjs';\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-hooks.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/playwright/playwright-hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import { After, AfterAll, AfterStep, Before, BeforeAll, BeforeStep, setDefaultTimeout } from '@cucumber/cucumber';\nimport { ITestCaseHookParameter } from '@cucumber/cucumber';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { createIstanbulCoverageReports } from '@gnuechtel/shared-coverage';\nimport { PlaywrightWorld, scenarioName } from './playwright-world';\nimport { deleteExistingPlaywrightCoverageFiles } from '@gnuechtel/shared-coverage';\nimport { rootDirectory } from '@gnuechtel/shared-util';\nimport { resolvePlaywrightBrowser } from '../core/playwright-browser';\nimport { createPlaywrightLaunchOptions, resolvePlaywrightBrowserType } from './playwright-browser';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst debug = require('debug')('e2e:hooks');\n\n// Initialize global configuration with defaults if not set (2.x: no executor injects this)\nif (!global.nxCucumber) {\n global.nxCucumber = { disableCoverage: false };\n}\n\nconst defaultCucumberTimeout = global.nxCucumber.timeout || 30_000;\nconst browserLaunchHookTimeout = Math.max(defaultCucumberTimeout, 60_000);\n\n// Use an explicit timeout so hooks are not bound to Cucumber's 5s default on slower Windows runners.\nif (process.env['PWDEBUG']) {\n setDefaultTimeout(-1);\n} else {\n setDefaultTimeout(defaultCucumberTimeout);\n}\n\n// We ignore all SSL errors, because we have self signed developer certificates\nprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';\n\nfunction configuredBrowser() {\n return resolvePlaywrightBrowser(global.nxCucumber.browser);\n}\n\nlet browserLaunchPromise: Promise<void> | undefined;\n\nasync function launchBrowser(label: string, headless: boolean) {\n if (global.browserState.isStarted) return;\n\n if (!browserLaunchPromise) {\n browserLaunchPromise = (async () => {\n const browser = configuredBrowser();\n debug(`${label} - Creating new ${headless ? 'headless' : 'headed'} ${browser} instance`);\n const launchedBrowser = await resolvePlaywrightBrowserType(browser).launch(\n createPlaywrightLaunchOptions(browser, headless)\n );\n\n if (global.browserState.isStarted) {\n // A concurrent launch already produced a running browser (e.g. after a hook timeout).\n // Close this duplicate instance so it cannot keep the process alive.\n debug(`${label} - Closing duplicate ${browser} instance`);\n try {\n await launchedBrowser.close();\n } catch (e) {\n debug(`${label} - Could not close duplicate browser: %O`, e);\n }\n return;\n }\n\n global.browser = launchedBrowser;\n global.browserState.isHeadless = headless;\n global.browserState.isStarted = true;\n debug(`${label} - ${browser} instance created`);\n })().finally(() => {\n browserLaunchPromise = undefined;\n });\n } else {\n debug(`${label} - Waiting for ongoing browser launch`);\n }\n\n await browserLaunchPromise;\n}\n\nasync function closeBrowser(label: string) {\n if (browserLaunchPromise) {\n debug(`${label} - Waiting for ongoing browser launch before close`);\n await browserLaunchPromise;\n }\n\n if (global.browserState.isStarted) {\n debug(`${label} - Closing ${configuredBrowser()} instance`);\n try {\n await global.browser.close();\n debug(`${label} - ${configuredBrowser()} instance closed`);\n } catch (e) {\n debug(`${label} - Could not close browser: %O`, e);\n } finally {\n global.browserState.isStarted = false;\n }\n }\n}\n\n/**\n * Launches the browser if it is not yet started or if the running headless state is different from `launchHeadless`.\n * Closes any existing browser before. This function has no effect, if a browser is currently running and has the same\n * headless state like `launchHeadless`.\n *\n * In other words, a new browser is launched\n * - headed, if running browser is headless\n * - headless, if running browser is headed\n * - headless/headed, if browser is not yet started.\n *\n * @param label the label for debugging\n * @param launchHeadless true, if browser should be launched headless, false otherwise\n */\nasync function launchBrowserIfRequired(label: string, launchHeadless: boolean) {\n if (global.browserState.isHeadless != launchHeadless || !global.browserState.isStarted) {\n // The closeBrowser invocation has only an effect, if browser is already running\n await closeBrowser(label);\n await launchBrowser(label, launchHeadless);\n }\n}\n\nBeforeAll(async function () {\n browserLaunchPromise = undefined;\n global.browserState = {\n isStarted: false,\n isHeadless: true,\n };\n if (!global.nxCucumber.disableCoverage) {\n debug('BeforeAll - Deleting existing coverage files');\n deleteExistingPlaywrightCoverageFiles();\n debug('BeforeAll - Existing coverage files deleted');\n }\n});\n\nAfterAll(async function () {\n if (!global.nxCucumber.disableCoverage) {\n const nycOutputDir = path.join(rootDirectory(), '.nyc_output');\n const hasCoverageFiles =\n fs.existsSync(nycOutputDir) &&\n fs.readdirSync(nycOutputDir).some((f) => f.startsWith('playwright_coverage_') && f.endsWith('.json'));\n if (hasCoverageFiles) {\n debug('AfterAll - Creating Istanbul coverage report');\n try {\n const projectDirectory = path.resolve(global.nxCucumber.cwd || process.cwd());\n await createIstanbulCoverageReports(rootDirectory(), projectDirectory);\n debug('AfterAll - Istanbul coverage report created');\n } catch (e) {\n debug('AfterAll - Could not create Istanbul coverage report: %O', e);\n }\n } else {\n debug('AfterAll - No coverage files found, skipping Istanbul coverage report');\n }\n }\n await closeBrowser('AfterAll');\n});\n\nBefore({ name: 'prepare' }, async function (this: PlaywrightWorld, testCase: ITestCaseHookParameter) {\n debug('Before - Cleaning up');\n // Always clean-up any running stuff\n await this.cleanUp();\n this.setItem(scenarioName, testCase.pickle.name); // save scenario name for screenshots or video files\n debug('Before - Cleaned up');\n});\n\nBefore({ name: 'enable javascript', tags: '@javascript' }, async function (this: PlaywrightWorld) {\n // When javascript is disabled by default, we enable it only for scenarios which are tagged by @javascript\n this.parameters.disableJavaScript = false;\n});\n\nBefore({ name: 'disable javascript', tags: '@noscript' }, async function (this: PlaywrightWorld) {\n // When javascript is enabled by default, we disable it only for scenarios which are tagged by @noscript\n this.parameters.disableJavaScript = true;\n});\n\nBefore({ name: 'ensure headed browser', tags: '@headed', timeout: browserLaunchHookTimeout }, async function () {\n await launchBrowserIfRequired('Before @headed', false);\n});\n\nBefore(\n { name: 'ensure headless browser', tags: 'not @headed', timeout: browserLaunchHookTimeout },\n async function (this: PlaywrightWorld) {\n await launchBrowserIfRequired('Before not @headed', !this.parameters.headed);\n }\n);\n\nBeforeStep(async function (this: PlaywrightWorld) {\n debug('BeforeStep');\n this.prepareStep();\n});\n\nAfterStep(async function (this: PlaywrightWorld, { result }) {\n if (!this.parameters.disableScreenshotAttachments || !this.parameters.disableScreenshotFiles) {\n try {\n debug('AfterStep - Creating screenshots');\n await this.createScreenshots(result);\n debug('AfterStep - Screenshots created');\n } catch (e) {\n debug('AfterStep - Could not create screenshots: %O', e);\n }\n }\n});\n\nAfter({ name: 'clean up' }, async function (this: PlaywrightWorld) {\n if (!this.parameters.disableCoverage) {\n // Wait for any pending network activity (e.g. lazy-loaded components) to settle before collecting coverage.\n try {\n for (const page of this.pages) {\n await page.waitForLoadState('networkidle', { timeout: 5000 });\n }\n } catch (_) {\n // best-effort — ignore timeouts\n }\n try {\n debug('After - Collecting coverage');\n await this.collectIstanbulCoverage();\n debug('After - Coverage collected');\n } catch (e) {\n debug('After - Could not create coverage: %O', e);\n }\n }\n try {\n debug('After - Cleaning up');\n await this.cleanUp();\n debug('After - Cleaned up');\n } catch (e) {\n debug('After - Could not clean up properly: %O', e);\n }\n});\n"]}
1
+ {"version":3,"file":"playwright-hooks.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/playwright/playwright-hooks.ts"],"names":[],"mappings":"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","sourcesContent":["import type {} from '../global';\nimport { After, AfterAll, AfterStep, Before, BeforeAll, BeforeStep, setDefaultTimeout } from '@cucumber/cucumber';\nimport { ITestCaseHookParameter } from '@cucumber/cucumber';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { createIstanbulCoverageReports } from '@gnuechtel/shared-coverage';\nimport { PlaywrightWorld, scenarioName } from './playwright-world';\nimport { deleteExistingPlaywrightCoverageFiles } from '@gnuechtel/shared-coverage';\nimport { rootDirectory } from '@gnuechtel/shared-util';\nimport { resolvePlaywrightBrowser } from '../core/playwright-browser';\nimport { createPlaywrightLaunchOptions, resolvePlaywrightBrowserType } from './playwright-browser';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst debug = require('debug')('e2e:hooks');\n\n// Initialize global configuration with defaults if not set (2.x: no executor injects this)\nif (!global.nxCucumber) {\n global.nxCucumber = { disableCoverage: false };\n}\n\nconst defaultCucumberTimeout = global.nxCucumber.timeout || 30_000;\nconst browserLaunchHookTimeout = Math.max(defaultCucumberTimeout, 60_000);\n\n// Use an explicit timeout so hooks are not bound to Cucumber's 5s default on slower Windows runners.\nif (process.env['PWDEBUG']) {\n setDefaultTimeout(-1);\n} else {\n setDefaultTimeout(defaultCucumberTimeout);\n}\n\n// We ignore all SSL errors, because we have self signed developer certificates\nprocess.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0';\n\nfunction configuredBrowser() {\n return resolvePlaywrightBrowser(global.nxCucumber.browser);\n}\n\nlet browserLaunchPromise: Promise<void> | undefined;\n\nasync function launchBrowser(label: string, headless: boolean) {\n if (global.browserState.isStarted) return;\n\n if (!browserLaunchPromise) {\n browserLaunchPromise = (async () => {\n const browser = configuredBrowser();\n debug(`${label} - Creating new ${headless ? 'headless' : 'headed'} ${browser} instance`);\n const launchedBrowser = await resolvePlaywrightBrowserType(browser).launch(\n createPlaywrightLaunchOptions(browser, headless),\n );\n\n if (global.browserState.isStarted) {\n // A concurrent launch already produced a running browser (e.g. after a hook timeout).\n // Close this duplicate instance so it cannot keep the process alive.\n debug(`${label} - Closing duplicate ${browser} instance`);\n try {\n await launchedBrowser.close();\n } catch (e) {\n debug(`${label} - Could not close duplicate browser: %O`, e);\n }\n return;\n }\n\n global.browser = launchedBrowser;\n global.browserState.isHeadless = headless;\n global.browserState.isStarted = true;\n debug(`${label} - ${browser} instance created`);\n })().finally(() => {\n browserLaunchPromise = undefined;\n });\n } else {\n debug(`${label} - Waiting for ongoing browser launch`);\n }\n\n await browserLaunchPromise;\n}\n\nasync function closeBrowser(label: string) {\n if (browserLaunchPromise) {\n debug(`${label} - Waiting for ongoing browser launch before close`);\n await browserLaunchPromise;\n }\n\n if (global.browserState.isStarted) {\n debug(`${label} - Closing ${configuredBrowser()} instance`);\n try {\n await global.browser.close();\n debug(`${label} - ${configuredBrowser()} instance closed`);\n } catch (e) {\n debug(`${label} - Could not close browser: %O`, e);\n } finally {\n global.browserState.isStarted = false;\n }\n }\n}\n\n/**\n * Launches the browser if it is not yet started or if the running headless state is different from `launchHeadless`.\n * Closes any existing browser before. This function has no effect, if a browser is currently running and has the same\n * headless state like `launchHeadless`.\n *\n * In other words, a new browser is launched\n * - headed, if running browser is headless\n * - headless, if running browser is headed\n * - headless/headed, if browser is not yet started.\n *\n * @param label the label for debugging\n * @param launchHeadless true, if browser should be launched headless, false otherwise\n */\nasync function launchBrowserIfRequired(label: string, launchHeadless: boolean) {\n if (global.browserState.isHeadless != launchHeadless || !global.browserState.isStarted) {\n // The closeBrowser invocation has only an effect, if browser is already running\n await closeBrowser(label);\n await launchBrowser(label, launchHeadless);\n }\n}\n\nBeforeAll(async function () {\n browserLaunchPromise = undefined;\n global.browserState = {\n isStarted: false,\n isHeadless: true,\n };\n if (!global.nxCucumber.disableCoverage) {\n debug('BeforeAll - Deleting existing coverage files');\n deleteExistingPlaywrightCoverageFiles();\n debug('BeforeAll - Existing coverage files deleted');\n }\n});\n\nAfterAll(async function () {\n if (!global.nxCucumber.disableCoverage) {\n const nycOutputDir = path.join(rootDirectory(), '.nyc_output');\n const hasCoverageFiles =\n fs.existsSync(nycOutputDir) &&\n fs.readdirSync(nycOutputDir).some((f) => f.startsWith('playwright_coverage_') && f.endsWith('.json'));\n if (hasCoverageFiles) {\n debug('AfterAll - Creating Istanbul coverage report');\n try {\n const projectDirectory = path.resolve(global.nxCucumber.cwd || process.cwd());\n await createIstanbulCoverageReports(rootDirectory(), projectDirectory);\n debug('AfterAll - Istanbul coverage report created');\n } catch (e) {\n debug('AfterAll - Could not create Istanbul coverage report: %O', e);\n }\n } else {\n debug('AfterAll - No coverage files found, skipping Istanbul coverage report');\n }\n }\n await closeBrowser('AfterAll');\n});\n\nBefore({ name: 'prepare' }, async function (this: PlaywrightWorld, testCase: ITestCaseHookParameter) {\n debug('Before - Cleaning up');\n // Always clean-up any running stuff\n await this.cleanUp();\n this.setItem(scenarioName, testCase.pickle.name); // save scenario name for screenshots or video files\n debug('Before - Cleaned up');\n});\n\nBefore({ name: 'enable javascript', tags: '@javascript' }, async function (this: PlaywrightWorld) {\n // When javascript is disabled by default, we enable it only for scenarios which are tagged by @javascript\n this.parameters.disableJavaScript = false;\n});\n\nBefore({ name: 'disable javascript', tags: '@noscript' }, async function (this: PlaywrightWorld) {\n // When javascript is enabled by default, we disable it only for scenarios which are tagged by @noscript\n this.parameters.disableJavaScript = true;\n});\n\nBefore({ name: 'ensure headed browser', tags: '@headed', timeout: browserLaunchHookTimeout }, async function () {\n await launchBrowserIfRequired('Before @headed', false);\n});\n\nBefore(\n { name: 'ensure headless browser', tags: 'not @headed', timeout: browserLaunchHookTimeout },\n async function (this: PlaywrightWorld) {\n await launchBrowserIfRequired('Before not @headed', !this.parameters.headed);\n },\n);\n\nBeforeStep(async function (this: PlaywrightWorld) {\n debug('BeforeStep');\n this.prepareStep();\n});\n\nAfterStep(async function (this: PlaywrightWorld, { result }) {\n if (!this.parameters.disableScreenshotAttachments || !this.parameters.disableScreenshotFiles) {\n try {\n debug('AfterStep - Creating screenshots');\n await this.createScreenshots(result);\n debug('AfterStep - Screenshots created');\n } catch (e) {\n debug('AfterStep - Could not create screenshots: %O', e);\n }\n }\n});\n\nAfter({ name: 'clean up' }, async function (this: PlaywrightWorld) {\n if (!this.parameters.disableCoverage) {\n // Wait for any pending network activity (e.g. lazy-loaded components) to settle before collecting coverage.\n try {\n for (const page of this.pages) {\n await page.waitForLoadState('networkidle', { timeout: 5000 });\n }\n } catch (_) {\n // best-effort — ignore timeouts\n }\n try {\n debug('After - Collecting coverage');\n await this.collectIstanbulCoverage();\n debug('After - Coverage collected');\n } catch (e) {\n debug('After - Could not create coverage: %O', e);\n }\n }\n try {\n debug('After - Cleaning up');\n await this.cleanUp();\n debug('After - Cleaned up');\n } catch (e) {\n debug('After - Could not clean up properly: %O', e);\n }\n});\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"playwright-world.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/playwright/playwright-world.ts"],"names":[],"mappings":"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","sourcesContent":["import { World, IWorldOptions, Status } from '@cucumber/cucumber';\nimport { BrowserContext, BrowserContextOptions, Page, PageScreenshotOptions } from 'playwright';\nimport { collectIstanbulCoverageForContext, prepareContextForIstanbulCoverage } from '@gnuechtel/shared-coverage';\nimport { getOutputDirectories } from '../core/output-directories';\nimport { TestRunOptions } from '../core/test-run-options';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { TestStepResult } from '@cucumber/messages';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst debug = require('debug')('e2e:world');\n\n/**\n * Provides a lot of useful functions to use inside our own step definitions.\n * Also used in `playwright-hooks.ts`.\n */\nexport class PlaywrightWorld extends World<TestRunOptions> {\n constructor(options: IWorldOptions) {\n super(options);\n if (!this.parameters?.outputDirectory) {\n throw new Error('Please specify output directory as world parameter');\n }\n if (!this.parameters?.baseUrl) {\n throw new Error('Please specify base URL as world parameter');\n }\n if (!isFullUrl(this.parameters.baseUrl)) {\n throw new Error('Please specify a valid base URL');\n }\n }\n\n /**\n * Creates a fresh {@link BrowserContext} with one {@link Page}.\n * Adds the created page to {@link pages}.\n */\n public async setupContext(locale = 'en'): Promise<void> {\n if (!this.parameters.outputDirectory) throw new Error('Output directory is not set');\n const { videosDirectory } = getOutputDirectories(this.parameters.outputDirectory);\n const defaultSize = { width: 1920, height: 1080 };\n const options = {\n ...(this.parameters.additionalPlaywrightConfiguration || {}),\n viewport: {\n width: this.parameters?.viewport?.width || defaultSize.width,\n height: this.parameters?.viewport?.height || defaultSize.height,\n },\n locale,\n } as BrowserContextOptions;\n\n if (!this.parameters.disableVideoAttachments || !this.parameters.disableVideoFiles) {\n options.recordVideo = {\n dir: videosDirectory,\n size: {\n width: this.parameters?.videoSize?.width || this.parameters?.viewport?.width || defaultSize.width,\n height: this.parameters?.videoSize?.height || this.parameters?.viewport?.height || defaultSize.height,\n },\n };\n }\n\n if (this.parameters.disableJavaScript) {\n options.javaScriptEnabled = false;\n }\n\n const newContext = await global.browser.newContext(options);\n newContext.setDefaultTimeout(this.parameters.cucumberTimeout || 30_000);\n this._contexts.push(newContext);\n\n if (!this.parameters.disableCoverage) {\n await prepareContextForIstanbulCoverage(newContext);\n }\n\n const newPage = await newContext.newPage();\n this._pages.push(newPage);\n\n if (this.parameters.disableAnimations) {\n // By default, we disable all animations\n newPage.on('load', async (page: Page) => {\n await page.addStyleTag({ content: '* { animation: none !important; } }' });\n });\n }\n }\n\n private async setupPageIfRequired() {\n if (!this.page) await this.setupContext();\n if (!this.page) throw new Error('Unexpected error: page is not initialized');\n }\n\n /**\n * Convenience method which combines {@link setupContext} and {@link Page.goto}.\n * @param subPath the relative URL to visit\n */\n public async visit(subPath: string): Promise<void> {\n await this.setupPageIfRequired(); // Setup context, if this is our first goto in the current world\n const start = !isFullUrl(subPath) ? this.parameters.baseUrl : '';\n await this.page?.goto(`${start}${subPath}`);\n }\n\n /**\n * Gets all created pages of all contexts\n */\n public get pages(): ReadonlyArray<Page> {\n return this._pages;\n }\n\n /**\n * Convenience method to get the first page created\n */\n public get page(): Page | undefined {\n return this._pages && this._pages.length > 0 ? this._pages[0] : undefined;\n }\n\n /**\n * Convenience method to get the API request context from the first page, set ups the browser context, if not yet done\n */\n public async request() {\n await this.setupPageIfRequired();\n return this.page?.request;\n }\n\n /**\n * Sets a custom item which is available in this world instance\n * @param key a custom key to retrieve the item\n * @param value a custom value\n */\n public setItem<T>(key: string, value: T): void {\n this._items[key] = value;\n }\n\n /**\n * Gets a custom item of this world instance which was set before\n * @param key the retrieval key\n * @param defaultValue the default value, if the item does not exist\n * @returns the custom value or the default value\n */\n public getItem<T>(key: string, defaultValue?: T): T {\n return (this._items[key] as T) ?? (defaultValue as T);\n }\n\n /**\n * Prepares this world for the current step.\n * For example, the counter for attached screenshots will be reset.\n * Invoked in `playwright-hooks.ts`.\n */\n public prepareStep() {\n this._attachedScreenshots = 0;\n this.setScreenshotOptions(undefined);\n }\n\n /**\n * Creates screenshots and attaches them to this world instance.\n * Those screenshots will be integrated in HTML reports for example.\n * Also stores screenshots in the file system, if the current scenario failed.\n * Invoked in `playwright-hooks.ts`.\n * @param result the test result of the current scenario\n */\n public async createScreenshots(result?: TestStepResult): Promise<void> {\n if (this.parameters.disableScreenshotAttachments && this.parameters.disableScreenshotFiles) {\n debug('Screenshots are disabled');\n return;\n }\n if (!this.parameters.outputDirectory) throw new Error('Output directory is not set');\n const { screenshotsDirectory } = getOutputDirectories(this.parameters.outputDirectory);\n if (this._pages.length > 0) {\n debug('Storing screenshots');\n for (let i = 0; i < this._pages.length; i++) {\n const image = await this._pages[i].screenshot(this.getScreenshotOptions());\n if (image) {\n if (!this.parameters.disableScreenshotAttachments) {\n debug('Attaching image to current step');\n this.attach(image, 'image/png');\n this._attachedScreenshots++;\n debug('Image attached');\n } else {\n debug('Screenshot attachments are disabled');\n }\n if (!this.parameters.disableScreenshotFiles) {\n if (!this.parameters.enableSuccessfulScreenshotFiles && result?.status === Status.PASSED) {\n debug('Successful screenshot files are disabled');\n } else {\n fs.mkdirSync(screenshotsDirectory, { recursive: true });\n const screenshotPath = getUniqueFileName(screenshotsDirectory, this.getScenarioFileName(), 'png');\n fs.writeFileSync(screenshotPath, image);\n debug(`Screenshot stored to ${screenshotPath}`);\n }\n } else {\n debug('Screenshot files are disabled');\n }\n }\n }\n debug('Screenshots stored');\n }\n }\n\n /**\n * Helper function to disable screenshots temporarily for the current step.\n * This avoids intermediate screenshots from other shared test code\n */\n public disableScreenshots() {\n this.setItem('disableScreenshotAttachmentsBefore', this.parameters.disableScreenshotAttachments); // use a world item for the restore function\n this.setItem('disableScreenshotFilesBefore', this.parameters.disableScreenshotFiles); // use a world item for the restore function\n this.parameters.disableScreenshotAttachments = true;\n this.parameters.disableScreenshotFiles = true;\n }\n\n /**\n * The counterpart of {@link disableScreenshots}.\n */\n public restoreScreenshots() {\n const disableScreenshotAttachmentsBefore = this.getItem<boolean>('disableScreenshotAttachmentsBefore');\n const disableScreenshotFilesBefore = this.getItem<boolean>('disableScreenshotFilesBefore');\n this.parameters.disableScreenshotAttachments = disableScreenshotAttachmentsBefore;\n this.parameters.disableScreenshotFiles = disableScreenshotFilesBefore;\n }\n\n /**\n * Sets the screenshot options for the current cucumber step\n * @param screenshotOptions the screenshot options (which will be reset in the next step)\n */\n public setScreenshotOptions(screenshotOptions?: PageScreenshotOptions) {\n this.setItem('screenshotOptions', screenshotOptions); // use a world item to store the screenshot options\n }\n\n private getScreenshotOptions() {\n return this.getItem<PageScreenshotOptions | undefined>('screenshotOptions');\n }\n\n private getScenarioFileName() {\n // Use encoded scenario name in image and video file names, only the * characters will be removed\n return encodeURIComponent(this.getItem<string>(scenarioName)).replace(/\\*/g, '');\n }\n\n /**\n * Renames the playwright generated videos and them to the reports.\n */\n public async createVideos(index: number) {\n if (this.parameters.disableVideoAttachments && this.parameters.disableVideoFiles) {\n debug('Videos are disabled');\n return;\n }\n if (!this.parameters.outputDirectory) throw new Error('Output directory is not set');\n const { videosDirectory } = getOutputDirectories(this.parameters.outputDirectory);\n debug('Storing videos');\n const page = this._pages[index];\n const video = page.video();\n if (!video) throw new Error('No video found');\n const videoPath = !this.parameters.disableVideoFiles\n ? getUniqueFileName(videosDirectory, this.getScenarioFileName(), 'webm')\n : await video.path();\n if (!this.parameters.disableVideoFiles) {\n await video.saveAs(videoPath); // save video path under new name\n debug(`Video stored to ${videoPath}`);\n } else {\n debug('Video files are disabled');\n }\n if (!this.parameters.disableVideoAttachments) {\n const fileName = path.basename(videoPath); // Use file name without path as attachment name\n const videoBuffer = fs.readFileSync(videoPath);\n this.attach(videoBuffer.toString('base64'), { mediaType: 'base64:video/webm', fileName });\n } else {\n debug('Video attachments are disabled');\n }\n await video.delete(); // always delete original video\n debug('Videos stored');\n }\n\n /**\n * Collects the coverage for the current scenario.\n * Invoked in `playwright-hooks.ts`.\n */\n public async collectIstanbulCoverage() {\n for (const context of this._contexts) {\n await collectIstanbulCoverageForContext(context);\n }\n }\n\n /**\n * Closes and resets all created contexts.\n * Resets all pages and items.\n * Invoked in `playwright-hooks.ts`.\n */\n public async cleanUp(): Promise<void> {\n // Restore current parameters to default parameters\n const defaultParameters = this.parameters.default;\n for (const key in defaultParameters) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.parameters[key] = defaultParameters[key];\n }\n\n debug('Cleaning up world instance');\n for (let i = 0; i < this._contexts.length; i++) {\n const context = this._contexts[i];\n try {\n // Close context and all its pages\n debug('Closing browser context');\n await context.close();\n debug('Browser context closed');\n if (!this.parameters.disableVideoAttachments || !this.parameters.disableVideoFiles) {\n await this.createVideos(i);\n }\n } catch (e) {\n debug('Could not close browser context: %O', e);\n }\n }\n this._contexts = [];\n this._pages = [];\n this._items = {};\n\n debug('World instance cleaned up');\n }\n\n private _contexts: Array<BrowserContext> = [];\n private _pages: Array<Page> = [];\n private _items: Record<string, unknown> = {};\n private _attachedScreenshots = 0;\n}\n\nfunction isFullUrl(url: string) {\n return url.match(/^https?:\\/\\//);\n}\n\nfunction getUniqueFileName(directory: string, baseName: string, extension: string) {\n let completeBaseName = '';\n let fullPath = '';\n let n = 1;\n do {\n const extra = n == 1 ? '' : '-' + String(n).padStart(2, '0');\n if (n > 1) {\n debug(`File ${completeBaseName} already exists`);\n }\n completeBaseName = `${baseName}${extra}.${extension}`;\n fullPath = path.join(directory, completeBaseName);\n n++;\n } while (fs.existsSync(fullPath));\n return fullPath;\n}\n\nexport const scenarioName = 'scenarioName';\n"]}
1
+ {"version":3,"file":"playwright-world.js","sourceRoot":"","sources":["../../../../../libs/nx-cucumber/src/playwright/playwright-world.ts"],"names":[],"mappings":"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","sourcesContent":["import type {} from '../global';\nimport { World, IWorldOptions, Status } from '@cucumber/cucumber';\nimport { BrowserContext, BrowserContextOptions, Page, PageScreenshotOptions } from 'playwright';\nimport { collectIstanbulCoverageForContext, prepareContextForIstanbulCoverage } from '@gnuechtel/shared-coverage';\nimport { getOutputDirectories } from '../core/output-directories';\nimport { TestRunOptions } from '../core/test-run-options';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport { TestStepResult } from '@cucumber/messages';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst debug = require('debug')('e2e:world');\n\n/**\n * Provides a lot of useful functions to use inside our own step definitions.\n * Also used in `playwright-hooks.ts`.\n */\nexport class PlaywrightWorld extends World<TestRunOptions> {\n constructor(options: IWorldOptions) {\n super(options);\n if (!this.parameters?.outputDirectory) {\n throw new Error('Please specify output directory as world parameter');\n }\n if (!this.parameters?.baseUrl) {\n throw new Error('Please specify base URL as world parameter');\n }\n if (!isFullUrl(this.parameters.baseUrl)) {\n throw new Error('Please specify a valid base URL');\n }\n }\n\n /**\n * Creates a fresh {@link BrowserContext} with one {@link Page}.\n * Adds the created page to {@link pages}.\n */\n public async setupContext(locale = 'en'): Promise<void> {\n if (!this.parameters.outputDirectory) throw new Error('Output directory is not set');\n const { videosDirectory } = getOutputDirectories(this.parameters.outputDirectory);\n const defaultSize = { width: 1920, height: 1080 };\n const options = {\n ...(this.parameters.additionalPlaywrightConfiguration || {}),\n viewport: {\n width: this.parameters?.viewport?.width || defaultSize.width,\n height: this.parameters?.viewport?.height || defaultSize.height,\n },\n locale,\n } as BrowserContextOptions;\n\n if (!this.parameters.disableVideoAttachments || !this.parameters.disableVideoFiles) {\n options.recordVideo = {\n dir: videosDirectory,\n size: {\n width: this.parameters?.videoSize?.width || this.parameters?.viewport?.width || defaultSize.width,\n height: this.parameters?.videoSize?.height || this.parameters?.viewport?.height || defaultSize.height,\n },\n };\n }\n\n if (this.parameters.disableJavaScript) {\n options.javaScriptEnabled = false;\n }\n\n const newContext = await global.browser.newContext(options);\n newContext.setDefaultTimeout(this.parameters.cucumberTimeout || 30_000);\n this._contexts.push(newContext);\n\n if (!this.parameters.disableCoverage) {\n await prepareContextForIstanbulCoverage(newContext);\n }\n\n const newPage = await newContext.newPage();\n this._pages.push(newPage);\n\n if (this.parameters.disableAnimations) {\n // By default, we disable all animations\n newPage.on('load', async (page: Page) => {\n await page.addStyleTag({ content: '* { animation: none !important; } }' });\n });\n }\n }\n\n private async setupPageIfRequired() {\n if (!this.page) await this.setupContext();\n if (!this.page) throw new Error('Unexpected error: page is not initialized');\n }\n\n /**\n * Convenience method which combines {@link setupContext} and {@link Page.goto}.\n * @param subPath the relative URL to visit\n */\n public async visit(subPath: string): Promise<void> {\n await this.setupPageIfRequired(); // Setup context, if this is our first goto in the current world\n const start = !isFullUrl(subPath) ? this.parameters.baseUrl : '';\n await this.page?.goto(`${start}${subPath}`);\n }\n\n /**\n * Gets all created pages of all contexts\n */\n public get pages(): ReadonlyArray<Page> {\n return this._pages;\n }\n\n /**\n * Convenience method to get the first page created\n */\n public get page(): Page | undefined {\n return this._pages && this._pages.length > 0 ? this._pages[0] : undefined;\n }\n\n /**\n * Convenience method to get the API request context from the first page, set ups the browser context, if not yet done\n */\n public async request() {\n await this.setupPageIfRequired();\n return this.page?.request;\n }\n\n /**\n * Sets a custom item which is available in this world instance\n * @param key a custom key to retrieve the item\n * @param value a custom value\n */\n public setItem<T>(key: string, value: T): void {\n this._items[key] = value;\n }\n\n /**\n * Gets a custom item of this world instance which was set before\n * @param key the retrieval key\n * @param defaultValue the default value, if the item does not exist\n * @returns the custom value or the default value\n */\n public getItem<T>(key: string, defaultValue?: T): T {\n return (this._items[key] as T) ?? (defaultValue as T);\n }\n\n /**\n * Prepares this world for the current step.\n * For example, the counter for attached screenshots will be reset.\n * Invoked in `playwright-hooks.ts`.\n */\n public prepareStep() {\n this._attachedScreenshots = 0;\n this.setScreenshotOptions(undefined);\n }\n\n /**\n * Creates screenshots and attaches them to this world instance.\n * Those screenshots will be integrated in HTML reports for example.\n * Also stores screenshots in the file system, if the current scenario failed.\n * Invoked in `playwright-hooks.ts`.\n * @param result the test result of the current scenario\n */\n public async createScreenshots(result?: TestStepResult): Promise<void> {\n if (this.parameters.disableScreenshotAttachments && this.parameters.disableScreenshotFiles) {\n debug('Screenshots are disabled');\n return;\n }\n if (!this.parameters.outputDirectory) throw new Error('Output directory is not set');\n const { screenshotsDirectory } = getOutputDirectories(this.parameters.outputDirectory);\n if (this._pages.length > 0) {\n debug('Storing screenshots');\n for (let i = 0; i < this._pages.length; i++) {\n const image = await this._pages[i].screenshot(this.getScreenshotOptions());\n if (image) {\n if (!this.parameters.disableScreenshotAttachments) {\n debug('Attaching image to current step');\n this.attach(image, 'image/png');\n this._attachedScreenshots++;\n debug('Image attached');\n } else {\n debug('Screenshot attachments are disabled');\n }\n if (!this.parameters.disableScreenshotFiles) {\n if (!this.parameters.enableSuccessfulScreenshotFiles && result?.status === Status.PASSED) {\n debug('Successful screenshot files are disabled');\n } else {\n fs.mkdirSync(screenshotsDirectory, { recursive: true });\n const screenshotPath = getUniqueFileName(screenshotsDirectory, this.getScenarioFileName(), 'png');\n fs.writeFileSync(screenshotPath, image);\n debug(`Screenshot stored to ${screenshotPath}`);\n }\n } else {\n debug('Screenshot files are disabled');\n }\n }\n }\n debug('Screenshots stored');\n }\n }\n\n /**\n * Helper function to disable screenshots temporarily for the current step.\n * This avoids intermediate screenshots from other shared test code\n */\n public disableScreenshots() {\n this.setItem('disableScreenshotAttachmentsBefore', this.parameters.disableScreenshotAttachments); // use a world item for the restore function\n this.setItem('disableScreenshotFilesBefore', this.parameters.disableScreenshotFiles); // use a world item for the restore function\n this.parameters.disableScreenshotAttachments = true;\n this.parameters.disableScreenshotFiles = true;\n }\n\n /**\n * The counterpart of {@link disableScreenshots}.\n */\n public restoreScreenshots() {\n const disableScreenshotAttachmentsBefore = this.getItem<boolean>('disableScreenshotAttachmentsBefore');\n const disableScreenshotFilesBefore = this.getItem<boolean>('disableScreenshotFilesBefore');\n this.parameters.disableScreenshotAttachments = disableScreenshotAttachmentsBefore;\n this.parameters.disableScreenshotFiles = disableScreenshotFilesBefore;\n }\n\n /**\n * Sets the screenshot options for the current cucumber step\n * @param screenshotOptions the screenshot options (which will be reset in the next step)\n */\n public setScreenshotOptions(screenshotOptions?: PageScreenshotOptions) {\n this.setItem('screenshotOptions', screenshotOptions); // use a world item to store the screenshot options\n }\n\n private getScreenshotOptions() {\n return this.getItem<PageScreenshotOptions | undefined>('screenshotOptions');\n }\n\n private getScenarioFileName() {\n // Use encoded scenario name in image and video file names, only the * characters will be removed\n return encodeURIComponent(this.getItem<string>(scenarioName)).replace(/\\*/g, '');\n }\n\n /**\n * Renames the playwright generated videos and them to the reports.\n */\n public async createVideos(index: number) {\n if (this.parameters.disableVideoAttachments && this.parameters.disableVideoFiles) {\n debug('Videos are disabled');\n return;\n }\n if (!this.parameters.outputDirectory) throw new Error('Output directory is not set');\n const { videosDirectory } = getOutputDirectories(this.parameters.outputDirectory);\n debug('Storing videos');\n const page = this._pages[index];\n const video = page.video();\n if (!video) throw new Error('No video found');\n const videoPath = !this.parameters.disableVideoFiles\n ? getUniqueFileName(videosDirectory, this.getScenarioFileName(), 'webm')\n : await video.path();\n if (!this.parameters.disableVideoFiles) {\n await video.saveAs(videoPath); // save video path under new name\n debug(`Video stored to ${videoPath}`);\n } else {\n debug('Video files are disabled');\n }\n if (!this.parameters.disableVideoAttachments) {\n const fileName = path.basename(videoPath); // Use file name without path as attachment name\n const videoBuffer = fs.readFileSync(videoPath);\n this.attach(videoBuffer.toString('base64'), { mediaType: 'base64:video/webm', fileName });\n } else {\n debug('Video attachments are disabled');\n }\n await video.delete(); // always delete original video\n debug('Videos stored');\n }\n\n /**\n * Collects the coverage for the current scenario.\n * Invoked in `playwright-hooks.ts`.\n */\n public async collectIstanbulCoverage() {\n for (const context of this._contexts) {\n await collectIstanbulCoverageForContext(context);\n }\n }\n\n /**\n * Closes and resets all created contexts.\n * Resets all pages and items.\n * Invoked in `playwright-hooks.ts`.\n */\n public async cleanUp(): Promise<void> {\n // Restore current parameters to default parameters\n const defaultParameters = this.parameters.default;\n for (const key in defaultParameters) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n this.parameters[key] = defaultParameters[key];\n }\n\n debug('Cleaning up world instance');\n for (let i = 0; i < this._contexts.length; i++) {\n const context = this._contexts[i];\n try {\n // Close context and all its pages\n debug('Closing browser context');\n await context.close();\n debug('Browser context closed');\n if (!this.parameters.disableVideoAttachments || !this.parameters.disableVideoFiles) {\n await this.createVideos(i);\n }\n } catch (e) {\n debug('Could not close browser context: %O', e);\n }\n }\n this._contexts = [];\n this._pages = [];\n this._items = {};\n\n debug('World instance cleaned up');\n }\n\n private _contexts: Array<BrowserContext> = [];\n private _pages: Array<Page> = [];\n private _items: Record<string, unknown> = {};\n private _attachedScreenshots = 0;\n}\n\nfunction isFullUrl(url: string) {\n return url.match(/^https?:\\/\\//);\n}\n\nfunction getUniqueFileName(directory: string, baseName: string, extension: string) {\n let completeBaseName = '';\n let fullPath = '';\n let n = 1;\n do {\n const extra = n == 1 ? '' : '-' + String(n).padStart(2, '0');\n if (n > 1) {\n debug(`File ${completeBaseName} already exists`);\n }\n completeBaseName = `${baseName}${extra}.${extension}`;\n fullPath = path.join(directory, completeBaseName);\n n++;\n } while (fs.existsSync(fullPath));\n return fullPath;\n}\n\nexport const scenarioName = 'scenarioName';\n"]}
@@ -8,6 +8,8 @@ exports.getUserDefinedTargets = getUserDefinedTargets;
8
8
  exports.filterConflictingTargets = filterConflictingTargets;
9
9
  const devkit_1 = require("@nx/devkit");
10
10
  const internal_1 = require("@nx/devkit/internal");
11
+ const devkit_internals_1 = require("nx/src/devkit-internals");
12
+ const cache_directory_1 = require("nx/src/utils/cache-directory");
11
13
  const node_fs_1 = require("node:fs");
12
14
  const node_path_1 = require("node:path");
13
15
  const contract_1 = require("../adapters/contract");
@@ -131,8 +133,8 @@ exports.createNodes = [
131
133
  const adapters = (0, registry_1.getBuiltinAdapters)();
132
134
  if (adapters.length === 0)
133
135
  return [];
134
- const optionsHash = (0, internal_1.hashObject)(options ?? {});
135
- const cachePath = (0, node_path_1.join)(internal_1.workspaceDataDirectory, `nx-cucumber-${optionsHash}.hash`);
136
+ const optionsHash = (0, devkit_internals_1.hashObject)(options ?? {});
137
+ const cachePath = (0, node_path_1.join)(cache_directory_1.workspaceDataDirectory, `nx-cucumber-${optionsHash}.hash`);
136
138
  const targetsCache = readTargetsCache(cachePath);
137
139
  try {
138
140
  return await (0, devkit_1.createNodesFromFiles)(async (configFilePath, opts, ctx) => {
@@ -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 CreateNodesResultArray,\n CreateNodes,\n ProjectConfiguration,\n TargetConfiguration,\n createNodesFromFiles,\n joinPathFragments,\n readJsonFile,\n writeJsonFile,\n} from '@nx/devkit';\nimport { calculateHashForCreateNodes, getNamedInputs, hashObject, workspaceDataDirectory } from '@nx/devkit/internal';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\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 env: {\n ...(adapterTarget.defaultOptions?.['env'] as Record<string, string> | undefined),\n TS_NODE_PROJECT: joinPathFragments(projectRoot, 'tsconfig.json'),\n },\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 createNodes: CreateNodes<NxCucumberPluginOptions> = [\n createDiscoveryGlob(),\n async (configFiles, options, context): Promise<CreateNodesResultArray> => {\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 CreateNodesResultArray,\n CreateNodes,\n ProjectConfiguration,\n TargetConfiguration,\n createNodesFromFiles,\n joinPathFragments,\n readJsonFile,\n writeJsonFile,\n} from '@nx/devkit';\nimport { calculateHashForCreateNodes, getNamedInputs } from '@nx/devkit/internal';\nimport { hashObject } from 'nx/src/devkit-internals';\nimport { workspaceDataDirectory } from 'nx/src/utils/cache-directory';\nimport { existsSync, readdirSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\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 env: {\n ...(adapterTarget.defaultOptions?.['env'] as Record<string, string> | undefined),\n TS_NODE_PROJECT: joinPathFragments(projectRoot, 'tsconfig.json'),\n },\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 createNodes: CreateNodes<NxCucumberPluginOptions> = [\n createDiscoveryGlob(),\n async (configFiles, options, context): Promise<CreateNodesResultArray> => {\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"]}