@gnuechtel/nx-cucumber 23.0.0 → 24.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 +11 -11
- package/package.json +5 -5
- package/src/plugin/create-nodes.js +2 -4
- package/src/plugin/create-nodes.js.map +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Plugin to use Cucumber within Nx workspaces
|
|
|
5
5
|
<!-- TOC -->
|
|
6
6
|
|
|
7
7
|
- [Introduction](#introduction)
|
|
8
|
-
- [Release
|
|
8
|
+
- [Release 24.0.0 and versioning](#release-2400-and-versioning)
|
|
9
9
|
- [Dependency security notice](#dependency-security-notice)
|
|
10
10
|
- [What changed in 2.x](#what-changed-in-2x)
|
|
11
11
|
- [Prerequisites](#prerequisites)
|
|
@@ -59,15 +59,15 @@ Plugin to use Cucumber within Nx workspaces
|
|
|
59
59
|
|
|
60
60
|
Nx-cucumber provides generators and inferred tasks for [Cucumber for JavaScript](https://github.com/cucumber/cucumber-js) within Nx workspaces, with optional [Playwright](https://playwright.dev/docs/library) support. It is intended for teams that have chosen Cucumber as part of their shared workflow.
|
|
61
61
|
|
|
62
|
-
## Release
|
|
62
|
+
## Release 24.0.0 and versioning
|
|
63
63
|
|
|
64
64
|
Starting with 23.0.0, the plugin major matches the supported Nx major: plugin
|
|
65
|
-
23.x supports Nx 23. Minor and patch versions are independent and describe our
|
|
65
|
+
23.x supports Nx 23, and plugin 24.x supports Nx 24. Minor and patch versions are independent and describe our
|
|
66
66
|
own changes. For example, a plugin-only fix can be released as 23.0.1 while the
|
|
67
67
|
supported Nx baseline stays the same. The exact compatibility ranges are defined
|
|
68
68
|
in the package's dependencies and peer dependencies.
|
|
69
69
|
|
|
70
|
-
This release updates the existing integration for Nx
|
|
70
|
+
This release updates the existing integration for Nx 24, 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 [24.0.0 release notes](../../docs/release-24.md), including the reviewed upstream security exception, before upgrading.
|
|
71
71
|
|
|
72
72
|
## Dependency security notice
|
|
73
73
|
|
|
@@ -117,7 +117,7 @@ Version 2.x is a deliberate breaking release that simplifies the plugin architec
|
|
|
117
117
|
|
|
118
118
|
## Prerequisites
|
|
119
119
|
|
|
120
|
-
This plugin requires [Node.js](https://nodejs.org/), [Nx](https://nx.dev/) and [Cucumber](https://github.com/cucumber/cucumber-js). Version
|
|
120
|
+
This plugin requires [Node.js](https://nodejs.org/), [Nx](https://nx.dev/) and [Cucumber](https://github.com/cucumber/cucumber-js). Version 24.0.0 targets Nx `>=24 <25` and Node.js 24; published 2.x packages remain the Nx-22 path. Plugin 23.x remains available for Nx 23. 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.
|
|
121
121
|
|
|
122
122
|
## Quick start
|
|
123
123
|
|
|
@@ -125,18 +125,18 @@ To immediately use this plugin with a new example React application use the foll
|
|
|
125
125
|
|
|
126
126
|
```bash
|
|
127
127
|
# option 1: create a new app inside an existing nx workspace
|
|
128
|
-
npm i -D @nx/react@
|
|
128
|
+
npm i -D @nx/react@24.0.1
|
|
129
129
|
npx nx g @nx/react:application gnu-app --bundler=vite --style=css --e2eTestRunner=none --routing
|
|
130
130
|
|
|
131
131
|
# option 2: create a new nx workspace with a 'gnu-app' and change to its directory
|
|
132
|
-
npx create-nx-workspace@
|
|
132
|
+
npx create-nx-workspace@24.0.1 gnu-repo --preset=react-monorepo --e2eTestRunner=none --appName=gnu-app --bundler=vite --style=css --nxCloud=skip
|
|
133
133
|
cd gnu-repo
|
|
134
134
|
|
|
135
135
|
# install cucumber and playwright-test
|
|
136
136
|
npm i -D @cucumber/cucumber@13.3.0 @playwright/test@1.64.1
|
|
137
137
|
|
|
138
138
|
# install this plugin
|
|
139
|
-
npm i -D @gnuechtel/nx-cucumber@
|
|
139
|
+
npm i -D @gnuechtel/nx-cucumber@24.0.0
|
|
140
140
|
|
|
141
141
|
# register the plugin in nx.json (enables inferred tasks)
|
|
142
142
|
# add "@gnuechtel/nx-cucumber" to the "plugins" array in nx.json
|
|
@@ -155,13 +155,13 @@ npx nx e2e "@gnu-repo/gnu-app-e2e"
|
|
|
155
155
|
|
|
156
156
|
There are two feasible options to [install Nx](https://nx.dev/getting-started/installation):
|
|
157
157
|
|
|
158
|
-
- either via `npx create-nx-workspace@
|
|
159
|
-
- via `npx nx@
|
|
158
|
+
- either via `npx create-nx-workspace@24.0.1` to setup a fresh Nx repo or
|
|
159
|
+
- via `npx nx@24.0.1 init` to convert an existing Node.js project into an Nx workspace.
|
|
160
160
|
|
|
161
161
|
It is never recommended to install all those Nx [dependencies](https://www.npmjs.com/org/nx) manually.
|
|
162
162
|
It would just cause too much unnecessary work.
|
|
163
163
|
|
|
164
|
-
Before installing this plugin, verify the installed Nx version with `npx nx --version`: it must be `>=
|
|
164
|
+
Before installing this plugin, verify the installed Nx version with `npx nx --version`: it must be `>=24 <25`. 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 24 or use an existing Nx-24 workspace; do not bypass the peer requirements.
|
|
165
165
|
|
|
166
166
|
## Install dependencies
|
|
167
167
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gnuechtel/nx-cucumber",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "24.0.0",
|
|
4
4
|
"description": "Plugin to use Cucumber within Nx workspaces",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -9,11 +9,11 @@
|
|
|
9
9
|
"directory": "libs/nx-cucumber"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@nx/devkit": ">=
|
|
12
|
+
"@nx/devkit": ">=24 <25",
|
|
13
13
|
"minimatch": "^10.0.0",
|
|
14
14
|
"tslib": "^2.8.1",
|
|
15
|
-
"@gnuechtel/shared-coverage": "
|
|
16
|
-
"@gnuechtel/shared-util": "
|
|
15
|
+
"@gnuechtel/shared-coverage": "24.0.0",
|
|
16
|
+
"@gnuechtel/shared-util": "24.0.0"
|
|
17
17
|
},
|
|
18
18
|
"peerDependencies": {
|
|
19
19
|
"@cucumber/cucumber": ">=13 <14",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"playwright-core": ">=1.64 <2",
|
|
23
23
|
"playwright": ">=1.64 <2",
|
|
24
24
|
"@playwright/test": ">=1.64 <2",
|
|
25
|
-
"nx": ">=
|
|
25
|
+
"nx": ">=24 <25"
|
|
26
26
|
},
|
|
27
27
|
"type": "commonjs",
|
|
28
28
|
"main": "./src/index.js",
|
|
@@ -8,8 +8,6 @@ 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");
|
|
13
11
|
const node_fs_1 = require("node:fs");
|
|
14
12
|
const node_path_1 = require("node:path");
|
|
15
13
|
const contract_1 = require("../adapters/contract");
|
|
@@ -133,8 +131,8 @@ exports.createNodes = [
|
|
|
133
131
|
const adapters = (0, registry_1.getBuiltinAdapters)();
|
|
134
132
|
if (adapters.length === 0)
|
|
135
133
|
return [];
|
|
136
|
-
const optionsHash = (0,
|
|
137
|
-
const cachePath = (0, node_path_1.join)(
|
|
134
|
+
const optionsHash = (0, internal_1.hashObject)(options ?? {});
|
|
135
|
+
const cachePath = (0, node_path_1.join)(internal_1.workspaceDataDirectory, `nx-cucumber-${optionsHash}.hash`);
|
|
138
136
|
const targetsCache = readTargetsCache(cachePath);
|
|
139
137
|
try {
|
|
140
138
|
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 } 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"]}
|
|
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"]}
|