@lynxwall/cucumber-tsflow 7.6.0 → 7.7.1

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.
Files changed (71) hide show
  1. package/README.md +266 -229
  2. package/lib/api/convert-configuration.d.ts +1 -0
  3. package/lib/api/convert-configuration.js +2 -0
  4. package/lib/api/convert-configuration.js.map +1 -1
  5. package/lib/api/load-configuration.js +23 -31
  6. package/lib/api/load-configuration.js.map +1 -1
  7. package/lib/api/load-support.d.ts +11 -2
  8. package/lib/api/load-support.js +31 -6
  9. package/lib/api/load-support.js.map +1 -1
  10. package/lib/api/loader-worker.d.ts +36 -0
  11. package/lib/api/loader-worker.js +74 -0
  12. package/lib/api/loader-worker.js.map +1 -0
  13. package/lib/api/parallel-loader.d.ts +31 -0
  14. package/lib/api/parallel-loader.js +169 -0
  15. package/lib/api/parallel-loader.js.map +1 -0
  16. package/lib/api/run-cucumber.js +42 -12
  17. package/lib/api/run-cucumber.js.map +1 -1
  18. package/lib/api/support.js +3 -0
  19. package/lib/api/support.js.map +1 -1
  20. package/lib/api/wrapper.mjs +1 -0
  21. package/lib/bindings/binding-decorator.d.ts +6 -0
  22. package/lib/bindings/binding-decorator.js +14 -0
  23. package/lib/bindings/binding-decorator.js.map +1 -1
  24. package/lib/bindings/binding-registry.d.ts +31 -1
  25. package/lib/bindings/binding-registry.js +95 -47
  26. package/lib/bindings/binding-registry.js.map +1 -1
  27. package/lib/bindings/step-binding.d.ts +37 -0
  28. package/lib/bindings/step-binding.js +23 -0
  29. package/lib/bindings/step-binding.js.map +1 -1
  30. package/lib/bindings/step-decorators.js.map +1 -1
  31. package/lib/bindings/types.js.map +1 -1
  32. package/lib/cli/argv-parser.d.ts +1 -0
  33. package/lib/cli/argv-parser.js +6 -0
  34. package/lib/cli/argv-parser.js.map +1 -1
  35. package/lib/formatter/{step-definition-snippit-syntax → step-definition-snippet-syntax}/tsflow-snippet-syntax.js.map +1 -1
  36. package/lib/index.d.ts +1 -1
  37. package/lib/index.js +1 -1
  38. package/lib/index.js.map +1 -1
  39. package/lib/runtime/coordinator.d.ts +2 -1
  40. package/lib/runtime/coordinator.js +4 -2
  41. package/lib/runtime/coordinator.js.map +1 -1
  42. package/lib/runtime/make-runtime.d.ts +3 -1
  43. package/lib/runtime/make-runtime.js +5 -4
  44. package/lib/runtime/make-runtime.js.map +1 -1
  45. package/lib/runtime/managed-scenario-context.js +2 -32
  46. package/lib/runtime/managed-scenario-context.js.map +1 -1
  47. package/lib/runtime/parallel/adapter.d.ts +4 -1
  48. package/lib/runtime/parallel/adapter.js +10 -2
  49. package/lib/runtime/parallel/adapter.js.map +1 -1
  50. package/lib/runtime/serial/adapter.d.ts +2 -1
  51. package/lib/runtime/serial/adapter.js +13 -3
  52. package/lib/runtime/serial/adapter.js.map +1 -1
  53. package/lib/runtime/test-case-runner.d.ts +4 -1
  54. package/lib/runtime/test-case-runner.js +4 -5
  55. package/lib/runtime/test-case-runner.js.map +1 -1
  56. package/lib/runtime/types.d.ts +2 -0
  57. package/lib/runtime/types.js.map +1 -1
  58. package/lib/runtime/utils.js +0 -6
  59. package/lib/runtime/utils.js.map +1 -1
  60. package/lib/runtime/worker.d.ts +14 -3
  61. package/lib/runtime/worker.js +91 -12
  62. package/lib/runtime/worker.js.map +1 -1
  63. package/lib/snippet.js +1 -1
  64. package/lib/snippet.js.map +1 -1
  65. package/lib/tsconfig.node.tsbuildinfo +1 -1
  66. package/lib/version.d.ts +1 -1
  67. package/lib/version.js +1 -1
  68. package/lib/version.js.map +1 -1
  69. package/package.json +8 -7
  70. /package/lib/formatter/{step-definition-snippit-syntax → step-definition-snippet-syntax}/tsflow-snippet-syntax.d.ts +0 -0
  71. /package/lib/formatter/{step-definition-snippit-syntax → step-definition-snippet-syntax}/tsflow-snippet-syntax.js +0 -0
@@ -3,5 +3,6 @@ import { ILogger } from '@cucumber/cucumber/lib/environment/index';
3
3
  import { ITsFlowRunConfiguration } from '../runtime/types';
4
4
  export interface IConfigurationExt extends IConfiguration {
5
5
  experimentalDecorators: boolean;
6
+ parallelLoad: boolean | number;
6
7
  }
7
8
  export declare function convertConfiguration(cucumberLogger: ILogger, flatConfiguration: IConfigurationExt, env: typeof process.env): Promise<ITsFlowRunConfiguration>;
@@ -30,6 +30,7 @@ async function convertConfiguration(cucumberLogger, flatConfiguration, env) {
30
30
  };
31
31
  logger.checkpoint('Building runtime config', {
32
32
  parallel: flatConfiguration.parallel,
33
+ parallelLoad: flatConfiguration.parallelLoad,
33
34
  experimentalDecorators: flatConfiguration.experimentalDecorators
34
35
  });
35
36
  const runtime = {
@@ -38,6 +39,7 @@ async function convertConfiguration(cucumberLogger, flatConfiguration, env) {
38
39
  failFast: flatConfiguration.failFast,
39
40
  filterStacktraces: !flatConfiguration.backtrace,
40
41
  parallel: flatConfiguration.parallel,
42
+ parallelLoad: flatConfiguration.parallelLoad,
41
43
  retry: flatConfiguration.retry,
42
44
  retryTagFilter: flatConfiguration.retryTagFilter,
43
45
  strict: flatConfiguration.strict,
@@ -1 +1 @@
1
- {"version":3,"file":"convert-configuration.js","sourceRoot":"","sources":["../../src/api/convert-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import { IConfiguration, isTruthyString, splitFormatDescriptor } from '@cucumber/cucumber/lib/configuration/index';\r\nimport { IPublishConfig } from '@cucumber/cucumber/lib/publish/index';\r\nimport { ILogger } from '@cucumber/cucumber/lib/environment/index';\r\nimport { ITsFlowRunConfiguration } from '../runtime/types';\r\nimport { createLogger } from '../utils/tsflow-logger';\r\n\r\nconst logger = createLogger('convert');\r\n\r\nexport interface IConfigurationExt extends IConfiguration {\r\n\texperimentalDecorators: boolean;\r\n}\r\n\r\nexport async function convertConfiguration(\r\n\tcucumberLogger: ILogger,\r\n\tflatConfiguration: IConfigurationExt,\r\n\tenv: typeof process.env\r\n): Promise<ITsFlowRunConfiguration> {\r\n\tlogger.checkpoint('convertConfiguration() started');\r\n\r\n\ttry {\r\n\t\tlogger.checkpoint('Building sources config', {\r\n\t\t\tpathCount: flatConfiguration.paths?.length,\r\n\t\t\tlanguage: flatConfiguration.language\r\n\t\t});\r\n\t\tconst sources = {\r\n\t\t\tpaths: flatConfiguration.paths,\r\n\t\t\tdefaultDialect: flatConfiguration.language,\r\n\t\t\tnames: flatConfiguration.name,\r\n\t\t\ttagExpression: flatConfiguration.tags,\r\n\t\t\torder: flatConfiguration.order\r\n\t\t};\r\n\r\n\t\tlogger.checkpoint('Building support config', {\r\n\t\t\trequireModules: flatConfiguration.requireModule,\r\n\t\t\tloaders: flatConfiguration.loader\r\n\t\t});\r\n\t\tconst support = {\r\n\t\t\trequireModules: flatConfiguration.requireModule,\r\n\t\t\trequirePaths: flatConfiguration.require,\r\n\t\t\timportPaths: flatConfiguration.import,\r\n\t\t\tloaders: flatConfiguration.loader\r\n\t\t};\r\n\r\n\t\tlogger.checkpoint('Building runtime config', {\r\n\t\t\tparallel: flatConfiguration.parallel,\r\n\t\t\texperimentalDecorators: flatConfiguration.experimentalDecorators\r\n\t\t});\r\n\t\tconst runtime = {\r\n\t\t\tdryRun: flatConfiguration.dryRun,\r\n\t\t\texperimentalDecorators: flatConfiguration.experimentalDecorators,\r\n\t\t\tfailFast: flatConfiguration.failFast,\r\n\t\t\tfilterStacktraces: !flatConfiguration.backtrace,\r\n\t\t\tparallel: flatConfiguration.parallel,\r\n\t\t\tretry: flatConfiguration.retry,\r\n\t\t\tretryTagFilter: flatConfiguration.retryTagFilter,\r\n\t\t\tstrict: flatConfiguration.strict,\r\n\t\t\tworldParameters: flatConfiguration.worldParameters\r\n\t\t};\r\n\r\n\t\tlogger.checkpoint('Building formats config');\r\n\t\tconst formats = convertFormats(cucumberLogger, flatConfiguration, env);\r\n\r\n\t\tlogger.checkpoint('convertConfiguration() completed');\r\n\r\n\t\treturn {\r\n\t\t\tsources,\r\n\t\t\tsupport,\r\n\t\t\truntime,\r\n\t\t\tformats\r\n\t\t};\r\n\t} catch (error: any) {\r\n\t\tlogger.error('convertConfiguration() failed', error);\r\n\t\tthrow new Error(`Failed to convert configuration: ${error.message}`, { cause: error });\r\n\t}\r\n}\r\n\r\nfunction convertFormats(cucumberLogger: ILogger, flatConfiguration: IConfiguration, env: typeof process.env) {\r\n\tlogger.checkpoint('convertFormats() started', { formatCount: flatConfiguration.format?.length });\r\n\r\n\ttry {\r\n\t\tconst splitFormats: string[][] = flatConfiguration.format.map((item, index) => {\r\n\t\t\tconst result = Array.isArray(item) ? item : splitFormatDescriptor(cucumberLogger, item);\r\n\t\t\tlogger.checkpoint(`Format[${index}] processed`, { input: item, output: result });\r\n\t\t\treturn result;\r\n\t\t});\r\n\r\n\t\tconst stdout = [...splitFormats].reverse().find(([, target]) => !target)?.[0] ?? 'progress';\r\n\t\tlogger.checkpoint('Stdout format', { stdout });\r\n\r\n\t\tconst files = splitFormats\r\n\t\t\t.filter(([, target]) => !!target)\r\n\t\t\t.reduce((mapped, [type, target]) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\t...mapped,\r\n\t\t\t\t\t[target]: type\r\n\t\t\t\t};\r\n\t\t\t}, {});\r\n\t\tlogger.checkpoint('File formats', { files });\r\n\r\n\t\tconst publish = makePublishConfig(flatConfiguration, env);\r\n\r\n\t\treturn {\r\n\t\t\tstdout,\r\n\t\t\tfiles,\r\n\t\t\tpublish,\r\n\t\t\toptions: flatConfiguration.formatOptions\r\n\t\t};\r\n\t} catch (error: any) {\r\n\t\tlogger.error('convertFormats() failed', error);\r\n\t\tthrow new Error(`Failed to convert formats: ${error.message}`, { cause: error });\r\n\t}\r\n}\r\n\r\nfunction makePublishConfig(flatConfiguration: IConfiguration, env: typeof process.env): IPublishConfig | false {\r\n\tconst enabled = isPublishing(flatConfiguration, env);\r\n\tif (!enabled) {\r\n\t\treturn false;\r\n\t}\r\n\treturn {\r\n\t\turl: env.CUCUMBER_PUBLISH_URL,\r\n\t\ttoken: env.CUCUMBER_PUBLISH_TOKEN\r\n\t};\r\n}\r\n\r\nfunction isPublishing(flatConfiguration: IConfiguration, env: typeof process.env): boolean {\r\n\treturn (\r\n\t\tflatConfiguration.publish ||\r\n\t\tisTruthyString(env.CUCUMBER_PUBLISH_ENABLED) ||\r\n\t\tenv.CUCUMBER_PUBLISH_TOKEN !== undefined\r\n\t);\r\n}\r\n"]}
1
+ {"version":3,"file":"convert-configuration.js","sourceRoot":"","sources":["../../src/api/convert-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import { IConfiguration, isTruthyString, splitFormatDescriptor } from '@cucumber/cucumber/lib/configuration/index';\r\nimport { IPublishConfig } from '@cucumber/cucumber/lib/publish/index';\r\nimport { ILogger } from '@cucumber/cucumber/lib/environment/index';\r\nimport { ITsFlowRunConfiguration } from '../runtime/types';\r\nimport { createLogger } from '../utils/tsflow-logger';\r\n\r\nconst logger = createLogger('convert');\r\n\r\nexport interface IConfigurationExt extends IConfiguration {\r\n\texperimentalDecorators: boolean;\r\n\tparallelLoad: boolean | number;\r\n}\r\n\r\nexport async function convertConfiguration(\r\n\tcucumberLogger: ILogger,\r\n\tflatConfiguration: IConfigurationExt,\r\n\tenv: typeof process.env\r\n): Promise<ITsFlowRunConfiguration> {\r\n\tlogger.checkpoint('convertConfiguration() started');\r\n\r\n\ttry {\r\n\t\tlogger.checkpoint('Building sources config', {\r\n\t\t\tpathCount: flatConfiguration.paths?.length,\r\n\t\t\tlanguage: flatConfiguration.language\r\n\t\t});\r\n\t\tconst sources = {\r\n\t\t\tpaths: flatConfiguration.paths,\r\n\t\t\tdefaultDialect: flatConfiguration.language,\r\n\t\t\tnames: flatConfiguration.name,\r\n\t\t\ttagExpression: flatConfiguration.tags,\r\n\t\t\torder: flatConfiguration.order\r\n\t\t};\r\n\r\n\t\tlogger.checkpoint('Building support config', {\r\n\t\t\trequireModules: flatConfiguration.requireModule,\r\n\t\t\tloaders: flatConfiguration.loader\r\n\t\t});\r\n\t\tconst support = {\r\n\t\t\trequireModules: flatConfiguration.requireModule,\r\n\t\t\trequirePaths: flatConfiguration.require,\r\n\t\t\timportPaths: flatConfiguration.import,\r\n\t\t\tloaders: flatConfiguration.loader\r\n\t\t};\r\n\r\n\t\tlogger.checkpoint('Building runtime config', {\r\n\t\t\tparallel: flatConfiguration.parallel,\r\n\t\t\tparallelLoad: flatConfiguration.parallelLoad,\r\n\t\t\texperimentalDecorators: flatConfiguration.experimentalDecorators\r\n\t\t});\r\n\t\tconst runtime = {\r\n\t\t\tdryRun: flatConfiguration.dryRun,\r\n\t\t\texperimentalDecorators: flatConfiguration.experimentalDecorators,\r\n\t\t\tfailFast: flatConfiguration.failFast,\r\n\t\t\tfilterStacktraces: !flatConfiguration.backtrace,\r\n\t\t\tparallel: flatConfiguration.parallel,\r\n\t\t\tparallelLoad: flatConfiguration.parallelLoad,\r\n\t\t\tretry: flatConfiguration.retry,\r\n\t\t\tretryTagFilter: flatConfiguration.retryTagFilter,\r\n\t\t\tstrict: flatConfiguration.strict,\r\n\t\t\tworldParameters: flatConfiguration.worldParameters\r\n\t\t};\r\n\r\n\t\tlogger.checkpoint('Building formats config');\r\n\t\tconst formats = convertFormats(cucumberLogger, flatConfiguration, env);\r\n\r\n\t\tlogger.checkpoint('convertConfiguration() completed');\r\n\r\n\t\treturn {\r\n\t\t\tsources,\r\n\t\t\tsupport,\r\n\t\t\truntime,\r\n\t\t\tformats\r\n\t\t};\r\n\t} catch (error: any) {\r\n\t\tlogger.error('convertConfiguration() failed', error);\r\n\t\tthrow new Error(`Failed to convert configuration: ${error.message}`, { cause: error });\r\n\t}\r\n}\r\n\r\nfunction convertFormats(cucumberLogger: ILogger, flatConfiguration: IConfiguration, env: typeof process.env) {\r\n\tlogger.checkpoint('convertFormats() started', { formatCount: flatConfiguration.format?.length });\r\n\r\n\ttry {\r\n\t\tconst splitFormats: string[][] = flatConfiguration.format.map((item, index) => {\r\n\t\t\tconst result = Array.isArray(item) ? item : splitFormatDescriptor(cucumberLogger, item);\r\n\t\t\tlogger.checkpoint(`Format[${index}] processed`, { input: item, output: result });\r\n\t\t\treturn result;\r\n\t\t});\r\n\r\n\t\tconst stdout = [...splitFormats].reverse().find(([, target]) => !target)?.[0] ?? 'progress';\r\n\t\tlogger.checkpoint('Stdout format', { stdout });\r\n\r\n\t\tconst files = splitFormats\r\n\t\t\t.filter(([, target]) => !!target)\r\n\t\t\t.reduce((mapped, [type, target]) => {\r\n\t\t\t\treturn {\r\n\t\t\t\t\t...mapped,\r\n\t\t\t\t\t[target]: type\r\n\t\t\t\t};\r\n\t\t\t}, {});\r\n\t\tlogger.checkpoint('File formats', { files });\r\n\r\n\t\tconst publish = makePublishConfig(flatConfiguration, env);\r\n\r\n\t\treturn {\r\n\t\t\tstdout,\r\n\t\t\tfiles,\r\n\t\t\tpublish,\r\n\t\t\toptions: flatConfiguration.formatOptions\r\n\t\t};\r\n\t} catch (error: any) {\r\n\t\tlogger.error('convertFormats() failed', error);\r\n\t\tthrow new Error(`Failed to convert formats: ${error.message}`, { cause: error });\r\n\t}\r\n}\r\n\r\nfunction makePublishConfig(flatConfiguration: IConfiguration, env: typeof process.env): IPublishConfig | false {\r\n\tconst enabled = isPublishing(flatConfiguration, env);\r\n\tif (!enabled) {\r\n\t\treturn false;\r\n\t}\r\n\treturn {\r\n\t\turl: env.CUCUMBER_PUBLISH_URL,\r\n\t\ttoken: env.CUCUMBER_PUBLISH_TOKEN\r\n\t};\r\n}\r\n\r\nfunction isPublishing(flatConfiguration: IConfiguration, env: typeof process.env): boolean {\r\n\treturn (\r\n\t\tflatConfiguration.publish ||\r\n\t\tisTruthyString(env.CUCUMBER_PUBLISH_ENABLED) ||\r\n\t\tenv.CUCUMBER_PUBLISH_TOKEN !== undefined\r\n\t);\r\n}\r\n"]}
@@ -118,6 +118,11 @@ const loadConfiguration = async (options = {}, environment = {}) => {
118
118
  global.experimentalDecorators = experimentalDecorators;
119
119
  process.env.CUCUMBER_EXPERIMENTAL_DECORATORS = String(experimentalDecorators);
120
120
  logger.checkpoint('Experimental decorators configured', { experimentalDecorators });
121
+ // Configure parallel loading
122
+ if (original.parallelLoad === undefined) {
123
+ original.parallelLoad = false;
124
+ }
125
+ logger.checkpoint('Parallel load configured', { parallelLoad: original.parallelLoad });
121
126
  /**
122
127
  * Ensures JSDOM environment is initialized before any test files are loaded.
123
128
  */
@@ -206,40 +211,27 @@ const loadConfiguration = async (options = {}, environment = {}) => {
206
211
  // Process format options
207
212
  logger.checkpoint('Processing format options', { formatCount: original.format?.length });
208
213
  try {
209
- for (let idx = 0; idx < original.format.length; idx++) {
210
- if (typeof original.format[idx] === 'string') {
211
- const formatItem = original.format[idx];
212
- if (formatItem.startsWith('behave:')) {
213
- original.format[idx] = formatItem.replace('behave', '@lynxwall/cucumber-tsflow/behave');
214
- logger.checkpoint('Replaced behave format', { index: idx });
215
- }
216
- }
217
- else if (original.format[idx].length > 0) {
218
- const formatItem = original.format[idx][0];
219
- if (formatItem.startsWith('behave')) {
220
- const newVal = formatItem.replace('behave', '@lynxwall/cucumber-tsflow/behave');
221
- original.format[idx] = original.format[idx].length > 1 ? [newVal, original.format[idx][1]] : [newVal];
222
- logger.checkpoint('Replaced behave format (array)', { index: idx });
223
- }
224
- }
225
- }
226
- for (let idx = 0; idx < original.format.length; idx++) {
227
- if (typeof original.format[idx] === 'string') {
228
- const formatItem = original.format[idx];
229
- if (formatItem.startsWith('junitbamboo:')) {
230
- original.format[idx] = formatItem.replace('junitbamboo', '@lynxwall/cucumber-tsflow/junitbamboo');
231
- logger.checkpoint('Replaced junitbamboo format', { index: idx });
214
+ const replaceFormatAlias = (alias, replacement) => {
215
+ for (let idx = 0; idx < original.format.length; idx++) {
216
+ if (typeof original.format[idx] === 'string') {
217
+ const formatItem = original.format[idx];
218
+ if (formatItem.startsWith(`${alias}:`)) {
219
+ original.format[idx] = formatItem.replace(alias, replacement);
220
+ logger.checkpoint(`Replaced ${alias} format`, { index: idx });
221
+ }
232
222
  }
233
- }
234
- else if (original.format[idx].length > 0) {
235
- const formatItem = original.format[idx][0];
236
- if (formatItem.startsWith('junitbamboo')) {
237
- const newVal = formatItem.replace('junitbamboo', '@lynxwall/cucumber-tsflow/junitbamboo');
238
- original.format[idx] = original.format[idx].length > 1 ? [newVal, original.format[idx][1]] : [newVal];
239
- logger.checkpoint('Replaced junitbamboo format (array)', { index: idx });
223
+ else if (original.format[idx].length > 0) {
224
+ const formatItem = original.format[idx][0];
225
+ if (formatItem.startsWith(alias)) {
226
+ const newVal = formatItem.replace(alias, replacement);
227
+ original.format[idx] = original.format[idx].length > 1 ? [newVal, original.format[idx][1]] : [newVal];
228
+ logger.checkpoint(`Replaced ${alias} format (array)`, { index: idx });
229
+ }
240
230
  }
241
231
  }
242
- }
232
+ };
233
+ replaceFormatAlias('behave', '@lynxwall/cucumber-tsflow/behave');
234
+ replaceFormatAlias('junitbamboo', '@lynxwall/cucumber-tsflow/junitbamboo');
243
235
  logger.checkpoint('Format options processed');
244
236
  }
245
237
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"load-configuration.js","sourceRoot":"","sources":["../../src/api/load-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILoadConfigurationOptions } from '@cucumber/cucumber/lib/api/types';\r\nimport { locateFile } from '@cucumber/cucumber/lib/configuration/locate_file';\r\nimport {\r\n\tDEFAULT_CONFIGURATION,\r\n\tfromFile,\r\n\tIConfiguration,\r\n\tparseConfiguration,\r\n\tmergeConfigurations\r\n} from '@cucumber/cucumber/lib/configuration/index';\r\nimport { validateConfiguration } from '@cucumber/cucumber/lib/configuration/validate_configuration';\r\nimport { convertConfiguration } from './convert-configuration';\r\nimport { IRunEnvironment, makeEnvironment } from '@cucumber/cucumber/lib/environment/index';\r\nimport { ITsflowConfiguration } from '../cli/argv-parser';\r\nimport { hasStringValue } from '../utils/helpers';\r\nimport GherkinManager from '../gherkin/gherkin-manager';\r\nimport ansis from 'ansis';\r\nimport { ITsFlowRunConfiguration } from '../runtime/types';\r\nimport { Console } from 'console';\r\nimport { join } from 'path';\r\nimport { createLogger } from '../utils/tsflow-logger';\r\n\r\nconst logger = createLogger('config');\r\n\r\nexport interface ITsflowResolvedConfiguration {\r\n\t/**\r\n\t * The final flat configuration object resolved from the configuration file/profiles plus any extra provided.\r\n\t */\r\n\tuseConfiguration: ITsflowConfiguration;\r\n\t/**\r\n\t * The format that can be passed into `runCucumber`.\r\n\t */\r\n\trunConfiguration: ITsFlowRunConfiguration;\r\n}\r\n\r\n/**\r\n * Load user-authored configuration to be used in a test run.\r\n *\r\n * @public\r\n * @param options - Coordinates required to find configuration.\r\n * @param environment - Project environment.\r\n */\r\nexport const loadConfiguration = async (\r\n\toptions: ILoadConfigurationOptions = {},\r\n\tenvironment: IRunEnvironment = {}\r\n): Promise<ITsflowResolvedConfiguration> => {\r\n\tlogger.checkpoint('loadConfiguration() started', {\r\n\t\toptionsFile: options.file,\r\n\t\toptionsProfiles: options.profiles\r\n\t});\r\n\r\n\tlet cwd: string;\r\n\tlet env: typeof process.env;\r\n\tlet cucumberLogger: any;\r\n\r\n\ttry {\r\n\t\tlogger.checkpoint('Creating environment');\r\n\t\tconst made = makeEnvironment(environment);\r\n\t\tcwd = made.cwd;\r\n\t\tenv = made.env;\r\n\t\tcucumberLogger = made.logger;\r\n\t\tlogger.checkpoint('Environment created', { cwd });\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to create environment', error);\r\n\t\tthrow new Error(`Failed to create environment: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Locate config file\r\n\tlet configFile: string | false | undefined;\r\n\ttry {\r\n\t\tlogger.checkpoint('Locating config file', { providedFile: options.file });\r\n\t\tconfigFile = options.file ?? locateFile(cwd);\r\n\t\tlogger.checkpoint('Config file resolved', { configFile });\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to locate config file', error);\r\n\t\tthrow new Error(`Failed to locate configuration file: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\tlet msg = '';\r\n\tif (configFile) {\r\n\t\tmsg = `Loading configuration from \"${configFile}\".`;\r\n\t} else if (configFile === false) {\r\n\t\tmsg = 'Skipping configuration file resolution';\r\n\t} else {\r\n\t\tmsg = 'No configuration file found';\r\n\t}\r\n\r\n\tconst consoleLogger = new Console(environment.stdout as any, environment.stderr);\r\n\tcucumberLogger.debug(msg);\r\n\tconsoleLogger.log(ansis.cyanBright(msg));\r\n\r\n\t// Load profile configuration from file\r\n\tlet profileConfiguration: Partial<IConfiguration> = {};\r\n\tif (configFile) {\r\n\t\ttry {\r\n\t\t\tlogger.checkpoint('Loading configuration from file', {\r\n\t\t\t\tconfigFile,\r\n\t\t\t\tprofiles: options.profiles\r\n\t\t\t});\r\n\t\t\tprofileConfiguration = await fromFile(cucumberLogger, cwd, configFile, options.profiles);\r\n\t\t\tlogger.checkpoint('Profile configuration loaded', {\r\n\t\t\t\tkeys: Object.keys(profileConfiguration),\r\n\t\t\t\ttranspiler: (profileConfiguration as any).transpiler,\r\n\t\t\t\tpaths: (profileConfiguration as any).paths\r\n\t\t\t});\r\n\t\t} catch (error: any) {\r\n\t\t\tlogger.error('Failed to load configuration from file', error, { configFile });\r\n\t\t\tthrow new Error(`Failed to load configuration from \"${configFile}\": ${error.message}`, { cause: error });\r\n\t\t}\r\n\t}\r\n\r\n\t// If a feature was passed in on command line, clear profile paths\r\n\tconst paths = (options.provided as Partial<IConfiguration>)?.paths;\r\n\tif (paths && paths?.length > 0) {\r\n\t\tlogger.checkpoint('Clearing profile paths (feature passed via CLI)', { providedPaths: paths });\r\n\t\tprofileConfiguration.paths = [];\r\n\t}\r\n\r\n\t// Merge configurations\r\n\tlet original: ITsflowConfiguration;\r\n\ttry {\r\n\t\tlogger.checkpoint('Merging configurations');\r\n\t\tconst parsedProvided = parseConfiguration(cucumberLogger, 'Provided', options.provided);\r\n\t\tlogger.checkpoint('Provided configuration parsed', { parsedKeys: Object.keys(parsedProvided) });\r\n\r\n\t\toriginal = mergeConfigurations(DEFAULT_CONFIGURATION, profileConfiguration, parsedProvided) as ITsflowConfiguration;\r\n\r\n\t\tlogger.checkpoint('Configurations merged', {\r\n\t\t\ttranspiler: original.transpiler,\r\n\t\t\texperimentalDecorators: original.experimentalDecorators,\r\n\t\t\tpathCount: original.paths?.length\r\n\t\t});\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to merge configurations', error);\r\n\t\tthrow new Error(`Failed to merge configurations: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Configure experimental decorators\r\n\tif (original.experimentalDecorators === undefined) {\r\n\t\toriginal.experimentalDecorators = false;\r\n\t}\r\n\tconst experimentalDecorators = original.experimentalDecorators;\r\n\tglobal.experimentalDecorators = experimentalDecorators;\r\n\tprocess.env.CUCUMBER_EXPERIMENTAL_DECORATORS = String(experimentalDecorators);\r\n\r\n\tlogger.checkpoint('Experimental decorators configured', { experimentalDecorators });\r\n\r\n\t/**\r\n\t * Ensures JSDOM environment is initialized before any test files are loaded.\r\n\t */\r\n\tconst initJsDom = () => {\r\n\t\tlogger.checkpoint('Initializing JSDOM setup');\r\n\t\ttry {\r\n\t\t\tconst setupPath = require.resolve('@lynxwall/cucumber-tsflow/lib/transpilers/esm/vue-jsdom-setup');\r\n\t\t\tlogger.checkpoint('JSDOM setup path resolved', { setupPath });\r\n\t\t\toriginal.require.unshift(setupPath);\r\n\t\t} catch (e: any) {\r\n\t\t\tlogger.checkpoint('require.resolve failed, using fallback', { error: e.message });\r\n\t\t\tconst setupPath = join(__dirname, '../../transpilers/esm/vue-jsdom-setup.mjs');\r\n\t\t\tlogger.checkpoint('JSDOM setup fallback path', { setupPath });\r\n\t\t\toriginal.require.unshift(setupPath);\r\n\t\t}\r\n\t};\r\n\r\n\t// Configure transpiler\r\n\tif (original.transpiler) {\r\n\t\tlogger.checkpoint('Configuring transpiler', { transpiler: original.transpiler });\r\n\t\ttry {\r\n\t\t\tswitch (original.transpiler) {\r\n\t\t\t\tcase 'es-vue':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-vue requireModule');\r\n\t\t\t\t\toriginal.requireModule.push('@lynxwall/cucumber-tsflow/lib/transpilers/esvue');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'ts-vue': {\r\n\t\t\t\t\tconst module = experimentalDecorators ? 'tsvue-exp' : 'tsvue';\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-vue requireModule', { module });\r\n\t\t\t\t\toriginal.requireModule.push(`@lynxwall/cucumber-tsflow/lib/transpilers/${module}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'es-node':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-node requireModule');\r\n\t\t\t\t\toriginal.requireModule.push('@lynxwall/cucumber-tsflow/lib/transpilers/esnode');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'ts-node': {\r\n\t\t\t\t\tconst module = experimentalDecorators ? 'tsnode-exp' : 'tsnode';\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-node requireModule', { module });\r\n\t\t\t\t\toriginal.requireModule.push(`@lynxwall/cucumber-tsflow/lib/transpilers/${module}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'ts-node-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-node-esm loader');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/tsnode-loader');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'es-node-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-node-esm loader');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/esnode-loader');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'ts-vue-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-vue-esm loader + JSDOM');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/vue-loader');\r\n\t\t\t\t\tinitJsDom();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'es-vue-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-vue-esm loader + JSDOM');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/esvue-loader');\r\n\t\t\t\t\tinitJsDom();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tlogger.checkpoint('No built-in transpiler (user-provided expected)', {\r\n\t\t\t\t\t\ttranspiler: original.transpiler\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tlogger.checkpoint('Transpiler configured', {\r\n\t\t\t\tloaders: original.loader,\r\n\t\t\t\trequireModules: original.requireModule,\r\n\t\t\t\trequires: original.require\r\n\t\t\t});\r\n\t\t} catch (error: any) {\r\n\t\t\tlogger.error('Failed to configure transpiler', error, { transpiler: original.transpiler });\r\n\t\t\tthrow new Error(`Failed to configure transpiler \"${original.transpiler}\": ${error.message}`, { cause: error });\r\n\t\t}\r\n\t} else {\r\n\t\tlogger.checkpoint('No transpiler specified');\r\n\t}\r\n\r\n\t// Set snippet syntax\r\n\tif (!original.formatOptions.snippetSyntax) {\r\n\t\toriginal.formatOptions.snippetSyntax = '@lynxwall/cucumber-tsflow/snippet';\r\n\t}\r\n\tlogger.checkpoint('Snippet syntax configured', { snippetSyntax: original.formatOptions.snippetSyntax });\r\n\r\n\t// Process format options\r\n\tlogger.checkpoint('Processing format options', { formatCount: original.format?.length });\r\n\ttry {\r\n\t\tfor (let idx = 0; idx < original.format.length; idx++) {\r\n\t\t\tif (typeof original.format[idx] === 'string') {\r\n\t\t\t\tconst formatItem = original.format[idx] as string;\r\n\t\t\t\tif (formatItem.startsWith('behave:')) {\r\n\t\t\t\t\toriginal.format[idx] = formatItem.replace('behave', '@lynxwall/cucumber-tsflow/behave');\r\n\t\t\t\t\tlogger.checkpoint('Replaced behave format', { index: idx });\r\n\t\t\t\t}\r\n\t\t\t} else if (original.format[idx].length > 0) {\r\n\t\t\t\tconst formatItem = original.format[idx][0] as string;\r\n\t\t\t\tif (formatItem.startsWith('behave')) {\r\n\t\t\t\t\tconst newVal = formatItem.replace('behave', '@lynxwall/cucumber-tsflow/behave');\r\n\t\t\t\t\toriginal.format[idx] = original.format[idx].length > 1 ? [newVal, original.format[idx][1]] : [newVal];\r\n\t\t\t\t\tlogger.checkpoint('Replaced behave format (array)', { index: idx });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (let idx = 0; idx < original.format.length; idx++) {\r\n\t\t\tif (typeof original.format[idx] === 'string') {\r\n\t\t\t\tconst formatItem = original.format[idx] as string;\r\n\t\t\t\tif (formatItem.startsWith('junitbamboo:')) {\r\n\t\t\t\t\toriginal.format[idx] = formatItem.replace('junitbamboo', '@lynxwall/cucumber-tsflow/junitbamboo');\r\n\t\t\t\t\tlogger.checkpoint('Replaced junitbamboo format', { index: idx });\r\n\t\t\t\t}\r\n\t\t\t} else if (original.format[idx].length > 0) {\r\n\t\t\t\tconst formatItem = original.format[idx][0] as string;\r\n\t\t\t\tif (formatItem.startsWith('junitbamboo')) {\r\n\t\t\t\t\tconst newVal = formatItem.replace('junitbamboo', '@lynxwall/cucumber-tsflow/junitbamboo');\r\n\t\t\t\t\toriginal.format[idx] = original.format[idx].length > 1 ? [newVal, original.format[idx][1]] : [newVal];\r\n\t\t\t\t\tlogger.checkpoint('Replaced junitbamboo format (array)', { index: idx });\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tlogger.checkpoint('Format options processed');\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to process format options', error);\r\n\t\tthrow new Error(`Failed to process format options: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Process debugFile\r\n\tif (hasStringValue(original.debugFile)) {\r\n\t\tlogger.checkpoint('Processing debugFile', { debugFile: original.debugFile });\r\n\t\ttry {\r\n\t\t\tconst gherkin = new GherkinManager();\r\n\t\t\tawait gherkin.loadFeatures(original.paths);\r\n\t\t\tconst features = gherkin.findFeaturesByStepFile(original.debugFile);\r\n\t\t\tif (features.length > 0) {\r\n\t\t\t\toriginal.paths = [];\r\n\t\t\t\tfeatures.forEach(x => original.paths.push(x.featureFile));\r\n\t\t\t\tlogger.checkpoint('Debug features found', { featureCount: features.length });\r\n\t\t\t} else {\r\n\t\t\t\tcucumberLogger.warn(ansis.yellow(`\\nUnable to find feature for debugFile: ${original.debugFile}`));\r\n\t\t\t\tcucumberLogger.warn(ansis.yellow('All tests will be executed\\n'));\r\n\t\t\t\tlogger.checkpoint('No features found for debugFile');\r\n\t\t\t}\r\n\t\t} catch (error: any) {\r\n\t\t\tlogger.error('Failed to process debugFile', error, { debugFile: original.debugFile });\r\n\t\t\tthrow new Error(`Failed to process debugFile \"${original.debugFile}\": ${error.message}`, { cause: error });\r\n\t\t}\r\n\t}\r\n\r\n\t// Configure Vue style\r\n\tif (original.enableVueStyle === null || original.enableVueStyle === undefined) {\r\n\t\toriginal.enableVueStyle = false;\r\n\t}\r\n\tglobal.enableVueStyle = original.enableVueStyle;\r\n\tlogger.checkpoint('Vue style configured', { enableVueStyle: original.enableVueStyle });\r\n\r\n\t// Validate configuration\r\n\ttry {\r\n\t\tlogger.checkpoint('Validating configuration');\r\n\t\tvalidateConfiguration(original, cucumberLogger);\r\n\t\tlogger.checkpoint('Configuration validated');\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Configuration validation failed', error);\r\n\t\tthrow new Error(`Configuration validation failed: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Convert configuration\r\n\tlet runnable: ITsFlowRunConfiguration;\r\n\ttry {\r\n\t\tlogger.checkpoint('Converting configuration');\r\n\t\trunnable = await convertConfiguration(cucumberLogger, original, env);\r\n\t\tlogger.checkpoint('Configuration converted', {\r\n\t\t\timportPaths: runnable.support?.importPaths,\r\n\t\t\tloaders: runnable.support?.loaders\r\n\t\t});\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to convert configuration', error);\r\n\t\tthrow new Error(`Failed to convert configuration: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\tlogger.checkpoint('loadConfiguration() completed');\r\n\r\n\treturn {\r\n\t\tuseConfiguration: original,\r\n\t\trunConfiguration: runnable\r\n\t};\r\n};\r\n"]}
1
+ {"version":3,"file":"load-configuration.js","sourceRoot":"","sources":["../../src/api/load-configuration.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILoadConfigurationOptions } from '@cucumber/cucumber/lib/api/types';\r\nimport { locateFile } from '@cucumber/cucumber/lib/configuration/locate_file';\r\nimport {\r\n\tDEFAULT_CONFIGURATION,\r\n\tfromFile,\r\n\tIConfiguration,\r\n\tparseConfiguration,\r\n\tmergeConfigurations\r\n} from '@cucumber/cucumber/lib/configuration/index';\r\nimport { validateConfiguration } from '@cucumber/cucumber/lib/configuration/validate_configuration';\r\nimport { convertConfiguration } from './convert-configuration';\r\nimport { IRunEnvironment, makeEnvironment } from '@cucumber/cucumber/lib/environment/index';\r\nimport { ITsflowConfiguration } from '../cli/argv-parser';\r\nimport { hasStringValue } from '../utils/helpers';\r\nimport GherkinManager from '../gherkin/gherkin-manager';\r\nimport ansis from 'ansis';\r\nimport { ITsFlowRunConfiguration } from '../runtime/types';\r\nimport { Console } from 'console';\r\nimport { join } from 'path';\r\nimport { createLogger } from '../utils/tsflow-logger';\r\n\r\nconst logger = createLogger('config');\r\n\r\nexport interface ITsflowResolvedConfiguration {\r\n\t/**\r\n\t * The final flat configuration object resolved from the configuration file/profiles plus any extra provided.\r\n\t */\r\n\tuseConfiguration: ITsflowConfiguration;\r\n\t/**\r\n\t * The format that can be passed into `runCucumber`.\r\n\t */\r\n\trunConfiguration: ITsFlowRunConfiguration;\r\n}\r\n\r\n/**\r\n * Load user-authored configuration to be used in a test run.\r\n *\r\n * @public\r\n * @param options - Coordinates required to find configuration.\r\n * @param environment - Project environment.\r\n */\r\nexport const loadConfiguration = async (\r\n\toptions: ILoadConfigurationOptions = {},\r\n\tenvironment: IRunEnvironment = {}\r\n): Promise<ITsflowResolvedConfiguration> => {\r\n\tlogger.checkpoint('loadConfiguration() started', {\r\n\t\toptionsFile: options.file,\r\n\t\toptionsProfiles: options.profiles\r\n\t});\r\n\r\n\tlet cwd: string;\r\n\tlet env: typeof process.env;\r\n\tlet cucumberLogger: any;\r\n\r\n\ttry {\r\n\t\tlogger.checkpoint('Creating environment');\r\n\t\tconst made = makeEnvironment(environment);\r\n\t\tcwd = made.cwd;\r\n\t\tenv = made.env;\r\n\t\tcucumberLogger = made.logger;\r\n\t\tlogger.checkpoint('Environment created', { cwd });\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to create environment', error);\r\n\t\tthrow new Error(`Failed to create environment: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Locate config file\r\n\tlet configFile: string | false | undefined;\r\n\ttry {\r\n\t\tlogger.checkpoint('Locating config file', { providedFile: options.file });\r\n\t\tconfigFile = options.file ?? locateFile(cwd);\r\n\t\tlogger.checkpoint('Config file resolved', { configFile });\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to locate config file', error);\r\n\t\tthrow new Error(`Failed to locate configuration file: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\tlet msg = '';\r\n\tif (configFile) {\r\n\t\tmsg = `Loading configuration from \"${configFile}\".`;\r\n\t} else if (configFile === false) {\r\n\t\tmsg = 'Skipping configuration file resolution';\r\n\t} else {\r\n\t\tmsg = 'No configuration file found';\r\n\t}\r\n\r\n\tconst consoleLogger = new Console(environment.stdout as any, environment.stderr);\r\n\tcucumberLogger.debug(msg);\r\n\tconsoleLogger.log(ansis.cyanBright(msg));\r\n\r\n\t// Load profile configuration from file\r\n\tlet profileConfiguration: Partial<IConfiguration> = {};\r\n\tif (configFile) {\r\n\t\ttry {\r\n\t\t\tlogger.checkpoint('Loading configuration from file', {\r\n\t\t\t\tconfigFile,\r\n\t\t\t\tprofiles: options.profiles\r\n\t\t\t});\r\n\t\t\tprofileConfiguration = await fromFile(cucumberLogger, cwd, configFile, options.profiles);\r\n\t\t\tlogger.checkpoint('Profile configuration loaded', {\r\n\t\t\t\tkeys: Object.keys(profileConfiguration),\r\n\t\t\t\ttranspiler: (profileConfiguration as any).transpiler,\r\n\t\t\t\tpaths: (profileConfiguration as any).paths\r\n\t\t\t});\r\n\t\t} catch (error: any) {\r\n\t\t\tlogger.error('Failed to load configuration from file', error, { configFile });\r\n\t\t\tthrow new Error(`Failed to load configuration from \"${configFile}\": ${error.message}`, { cause: error });\r\n\t\t}\r\n\t}\r\n\r\n\t// If a feature was passed in on command line, clear profile paths\r\n\tconst paths = (options.provided as Partial<IConfiguration>)?.paths;\r\n\tif (paths && paths?.length > 0) {\r\n\t\tlogger.checkpoint('Clearing profile paths (feature passed via CLI)', { providedPaths: paths });\r\n\t\tprofileConfiguration.paths = [];\r\n\t}\r\n\r\n\t// Merge configurations\r\n\tlet original: ITsflowConfiguration;\r\n\ttry {\r\n\t\tlogger.checkpoint('Merging configurations');\r\n\t\tconst parsedProvided = parseConfiguration(cucumberLogger, 'Provided', options.provided);\r\n\t\tlogger.checkpoint('Provided configuration parsed', { parsedKeys: Object.keys(parsedProvided) });\r\n\r\n\t\toriginal = mergeConfigurations(DEFAULT_CONFIGURATION, profileConfiguration, parsedProvided) as ITsflowConfiguration;\r\n\r\n\t\tlogger.checkpoint('Configurations merged', {\r\n\t\t\ttranspiler: original.transpiler,\r\n\t\t\texperimentalDecorators: original.experimentalDecorators,\r\n\t\t\tpathCount: original.paths?.length\r\n\t\t});\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to merge configurations', error);\r\n\t\tthrow new Error(`Failed to merge configurations: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Configure experimental decorators\r\n\tif (original.experimentalDecorators === undefined) {\r\n\t\toriginal.experimentalDecorators = false;\r\n\t}\r\n\tconst experimentalDecorators = original.experimentalDecorators;\r\n\tglobal.experimentalDecorators = experimentalDecorators;\r\n\tprocess.env.CUCUMBER_EXPERIMENTAL_DECORATORS = String(experimentalDecorators);\r\n\r\n\tlogger.checkpoint('Experimental decorators configured', { experimentalDecorators });\r\n\r\n\t// Configure parallel loading\r\n\tif (original.parallelLoad === undefined) {\r\n\t\toriginal.parallelLoad = false;\r\n\t}\r\n\tlogger.checkpoint('Parallel load configured', { parallelLoad: original.parallelLoad });\r\n\r\n\t/**\r\n\t * Ensures JSDOM environment is initialized before any test files are loaded.\r\n\t */\r\n\tconst initJsDom = () => {\r\n\t\tlogger.checkpoint('Initializing JSDOM setup');\r\n\t\ttry {\r\n\t\t\tconst setupPath = require.resolve('@lynxwall/cucumber-tsflow/lib/transpilers/esm/vue-jsdom-setup');\r\n\t\t\tlogger.checkpoint('JSDOM setup path resolved', { setupPath });\r\n\t\t\toriginal.require.unshift(setupPath);\r\n\t\t} catch (e: any) {\r\n\t\t\tlogger.checkpoint('require.resolve failed, using fallback', { error: e.message });\r\n\t\t\tconst setupPath = join(__dirname, '../../transpilers/esm/vue-jsdom-setup.mjs');\r\n\t\t\tlogger.checkpoint('JSDOM setup fallback path', { setupPath });\r\n\t\t\toriginal.require.unshift(setupPath);\r\n\t\t}\r\n\t};\r\n\r\n\t// Configure transpiler\r\n\tif (original.transpiler) {\r\n\t\tlogger.checkpoint('Configuring transpiler', { transpiler: original.transpiler });\r\n\t\ttry {\r\n\t\t\tswitch (original.transpiler) {\r\n\t\t\t\tcase 'es-vue':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-vue requireModule');\r\n\t\t\t\t\toriginal.requireModule.push('@lynxwall/cucumber-tsflow/lib/transpilers/esvue');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'ts-vue': {\r\n\t\t\t\t\tconst module = experimentalDecorators ? 'tsvue-exp' : 'tsvue';\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-vue requireModule', { module });\r\n\t\t\t\t\toriginal.requireModule.push(`@lynxwall/cucumber-tsflow/lib/transpilers/${module}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'es-node':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-node requireModule');\r\n\t\t\t\t\toriginal.requireModule.push('@lynxwall/cucumber-tsflow/lib/transpilers/esnode');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'ts-node': {\r\n\t\t\t\t\tconst module = experimentalDecorators ? 'tsnode-exp' : 'tsnode';\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-node requireModule', { module });\r\n\t\t\t\t\toriginal.requireModule.push(`@lynxwall/cucumber-tsflow/lib/transpilers/${module}`);\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t\tcase 'ts-node-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-node-esm loader');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/tsnode-loader');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'es-node-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-node-esm loader');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/esnode-loader');\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'ts-vue-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding ts-vue-esm loader + JSDOM');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/vue-loader');\r\n\t\t\t\t\tinitJsDom();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tcase 'es-vue-esm':\r\n\t\t\t\t\tlogger.checkpoint('Adding es-vue-esm loader + JSDOM');\r\n\t\t\t\t\toriginal.loader.push('@lynxwall/cucumber-tsflow/lib/transpilers/esm/esvue-loader');\r\n\t\t\t\t\tinitJsDom();\r\n\t\t\t\t\tbreak;\r\n\t\t\t\tdefault:\r\n\t\t\t\t\tlogger.checkpoint('No built-in transpiler (user-provided expected)', {\r\n\t\t\t\t\t\ttranspiler: original.transpiler\r\n\t\t\t\t\t});\r\n\t\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\tlogger.checkpoint('Transpiler configured', {\r\n\t\t\t\tloaders: original.loader,\r\n\t\t\t\trequireModules: original.requireModule,\r\n\t\t\t\trequires: original.require\r\n\t\t\t});\r\n\t\t} catch (error: any) {\r\n\t\t\tlogger.error('Failed to configure transpiler', error, { transpiler: original.transpiler });\r\n\t\t\tthrow new Error(`Failed to configure transpiler \"${original.transpiler}\": ${error.message}`, { cause: error });\r\n\t\t}\r\n\t} else {\r\n\t\tlogger.checkpoint('No transpiler specified');\r\n\t}\r\n\r\n\t// Set snippet syntax\r\n\tif (!original.formatOptions.snippetSyntax) {\r\n\t\toriginal.formatOptions.snippetSyntax = '@lynxwall/cucumber-tsflow/snippet';\r\n\t}\r\n\tlogger.checkpoint('Snippet syntax configured', { snippetSyntax: original.formatOptions.snippetSyntax });\r\n\r\n\t// Process format options\r\n\tlogger.checkpoint('Processing format options', { formatCount: original.format?.length });\r\n\ttry {\r\n\t\tconst replaceFormatAlias = (alias: string, replacement: string) => {\r\n\t\t\tfor (let idx = 0; idx < original.format.length; idx++) {\r\n\t\t\t\tif (typeof original.format[idx] === 'string') {\r\n\t\t\t\t\tconst formatItem = original.format[idx] as string;\r\n\t\t\t\t\tif (formatItem.startsWith(`${alias}:`)) {\r\n\t\t\t\t\t\toriginal.format[idx] = formatItem.replace(alias, replacement);\r\n\t\t\t\t\t\tlogger.checkpoint(`Replaced ${alias} format`, { index: idx });\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (original.format[idx].length > 0) {\r\n\t\t\t\t\tconst formatItem = original.format[idx][0] as string;\r\n\t\t\t\t\tif (formatItem.startsWith(alias)) {\r\n\t\t\t\t\t\tconst newVal = formatItem.replace(alias, replacement);\r\n\t\t\t\t\t\toriginal.format[idx] = original.format[idx].length > 1 ? [newVal, original.format[idx][1]] : [newVal];\r\n\t\t\t\t\t\tlogger.checkpoint(`Replaced ${alias} format (array)`, { index: idx });\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\treplaceFormatAlias('behave', '@lynxwall/cucumber-tsflow/behave');\r\n\t\treplaceFormatAlias('junitbamboo', '@lynxwall/cucumber-tsflow/junitbamboo');\r\n\t\tlogger.checkpoint('Format options processed');\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to process format options', error);\r\n\t\tthrow new Error(`Failed to process format options: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Process debugFile\r\n\tif (hasStringValue(original.debugFile)) {\r\n\t\tlogger.checkpoint('Processing debugFile', { debugFile: original.debugFile });\r\n\t\ttry {\r\n\t\t\tconst gherkin = new GherkinManager();\r\n\t\t\tawait gherkin.loadFeatures(original.paths);\r\n\t\t\tconst features = gherkin.findFeaturesByStepFile(original.debugFile);\r\n\t\t\tif (features.length > 0) {\r\n\t\t\t\toriginal.paths = [];\r\n\t\t\t\tfeatures.forEach(x => original.paths.push(x.featureFile));\r\n\t\t\t\tlogger.checkpoint('Debug features found', { featureCount: features.length });\r\n\t\t\t} else {\r\n\t\t\t\tcucumberLogger.warn(ansis.yellow(`\\nUnable to find feature for debugFile: ${original.debugFile}`));\r\n\t\t\t\tcucumberLogger.warn(ansis.yellow('All tests will be executed\\n'));\r\n\t\t\t\tlogger.checkpoint('No features found for debugFile');\r\n\t\t\t}\r\n\t\t} catch (error: any) {\r\n\t\t\tlogger.error('Failed to process debugFile', error, { debugFile: original.debugFile });\r\n\t\t\tthrow new Error(`Failed to process debugFile \"${original.debugFile}\": ${error.message}`, { cause: error });\r\n\t\t}\r\n\t}\r\n\r\n\t// Configure Vue style\r\n\tif (original.enableVueStyle === null || original.enableVueStyle === undefined) {\r\n\t\toriginal.enableVueStyle = false;\r\n\t}\r\n\tglobal.enableVueStyle = original.enableVueStyle;\r\n\tlogger.checkpoint('Vue style configured', { enableVueStyle: original.enableVueStyle });\r\n\r\n\t// Validate configuration\r\n\ttry {\r\n\t\tlogger.checkpoint('Validating configuration');\r\n\t\tvalidateConfiguration(original, cucumberLogger);\r\n\t\tlogger.checkpoint('Configuration validated');\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Configuration validation failed', error);\r\n\t\tthrow new Error(`Configuration validation failed: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\t// Convert configuration\r\n\tlet runnable: ITsFlowRunConfiguration;\r\n\ttry {\r\n\t\tlogger.checkpoint('Converting configuration');\r\n\t\trunnable = await convertConfiguration(cucumberLogger, original, env);\r\n\t\tlogger.checkpoint('Configuration converted', {\r\n\t\t\timportPaths: runnable.support?.importPaths,\r\n\t\t\tloaders: runnable.support?.loaders\r\n\t\t});\r\n\t} catch (error: any) {\r\n\t\tlogger.error('Failed to convert configuration', error);\r\n\t\tthrow new Error(`Failed to convert configuration: ${error.message}`, { cause: error });\r\n\t}\r\n\r\n\tlogger.checkpoint('loadConfiguration() completed');\r\n\r\n\treturn {\r\n\t\tuseConfiguration: original,\r\n\t\trunConfiguration: runnable\r\n\t};\r\n};\r\n"]}
@@ -1,5 +1,14 @@
1
1
  import { IRunEnvironment } from '@cucumber/cucumber/lib/environment/index';
2
2
  import { ILoadSupportOptions, ISupportCodeLibrary } from '@cucumber/cucumber/lib/api/types';
3
+ /**
4
+ * Options extending the standard load-support options with parallelLoad control.
5
+ */
6
+ export interface ITsFlowLoadSupportOptions extends ILoadSupportOptions {
7
+ /** Pre-warm transpiler caches in parallel worker threads. true = auto threads, number = explicit count. */
8
+ parallelLoad?: boolean | number;
9
+ /** Whether experimental decorators are enabled */
10
+ experimentalDecorators?: boolean;
11
+ }
3
12
  /**
4
13
  * Load support code for use in test runs
5
14
  *
@@ -7,7 +16,7 @@ import { ILoadSupportOptions, ISupportCodeLibrary } from '@cucumber/cucumber/lib
7
16
  * @param options - Options required to find the support code
8
17
  * @param environment - Project environment
9
18
  */
10
- export declare function loadSupport(options: ILoadSupportOptions, environment?: IRunEnvironment): Promise<ISupportCodeLibrary>;
19
+ export declare function loadSupport(options: ITsFlowLoadSupportOptions, environment?: IRunEnvironment): Promise<ISupportCodeLibrary>;
11
20
  /**
12
21
  * Incrementally reload support code. Evicts support modules from Node's
13
22
  * require cache so they are re-evaluated (re-running decorator registrations).
@@ -21,4 +30,4 @@ export declare function loadSupport(options: ILoadSupportOptions, environment?:
21
30
  * and re-evaluated (equivalent to a full reload).
22
31
  * @param environment - Project environment
23
32
  */
24
- export declare function reloadSupport(options: ILoadSupportOptions, changedPaths: string[], environment?: IRunEnvironment): Promise<ISupportCodeLibrary>;
33
+ export declare function reloadSupport(options: ITsFlowLoadSupportOptions, changedPaths: string[], environment?: IRunEnvironment): Promise<ISupportCodeLibrary>;
@@ -8,6 +8,9 @@ const index_2 = require("@cucumber/cucumber/lib/environment/index");
8
8
  const support_1 = require("./support");
9
9
  const plugins_1 = require("@cucumber/cucumber/lib/api/plugins");
10
10
  const binding_registry_1 = require("../bindings/binding-registry");
11
+ const parallel_loader_1 = require("./parallel-loader");
12
+ const tsflow_logger_1 = require("../utils/tsflow-logger");
13
+ const logger = (0, tsflow_logger_1.createLogger)('load-support');
11
14
  /**
12
15
  * Load support code for use in test runs
13
16
  *
@@ -17,7 +20,7 @@ const binding_registry_1 = require("../bindings/binding-registry");
17
20
  */
18
21
  async function loadSupport(options, environment = {}) {
19
22
  const mergedEnvironment = (0, index_2.makeEnvironment)(environment);
20
- const { cwd, logger } = mergedEnvironment;
23
+ const { cwd, logger: cucumberLogger } = mergedEnvironment;
21
24
  const newId = messages_1.IdGenerator.uuid();
22
25
  const supportCoordinates = Object.assign({
23
26
  requireModules: [],
@@ -26,11 +29,33 @@ async function loadSupport(options, environment = {}) {
26
29
  importPaths: []
27
30
  }, options.support);
28
31
  const pluginManager = await (0, plugins_1.initializeForLoadSupport)(mergedEnvironment);
29
- const resolvedPaths = await (0, index_1.resolvePaths)(logger, cwd, options.sources, supportCoordinates);
32
+ const resolvedPaths = await (0, index_1.resolvePaths)(cucumberLogger, cwd, options.sources, supportCoordinates);
30
33
  pluginManager.emit('paths:resolve', resolvedPaths);
31
34
  const { requirePaths, importPaths } = resolvedPaths;
35
+ // Parallel preload phase: warm transpiler caches in worker threads
36
+ if (options.parallelLoad) {
37
+ logger.checkpoint('Running parallel preload phase');
38
+ try {
39
+ const result = await (0, parallel_loader_1.parallelPreload)({
40
+ requirePaths,
41
+ importPaths,
42
+ requireModules: supportCoordinates.requireModules,
43
+ loaders: supportCoordinates.loaders,
44
+ experimentalDecorators: options.experimentalDecorators ?? false,
45
+ threadCount: options.parallelLoad
46
+ });
47
+ logger.checkpoint('Parallel preload completed', {
48
+ descriptors: result.descriptors.length,
49
+ files: result.loadedFiles.length,
50
+ durationMs: result.durationMs
51
+ });
52
+ }
53
+ catch (err) {
54
+ logger.error('Parallel preload failed, falling back to serial load', err);
55
+ }
56
+ }
32
57
  let supportCodeLibrary = await (0, support_1.getSupportCodeLibrary)({
33
- logger,
58
+ logger: cucumberLogger,
34
59
  cwd,
35
60
  newId,
36
61
  requireModules: supportCoordinates.requireModules,
@@ -61,7 +86,7 @@ async function loadSupport(options, environment = {}) {
61
86
  */
62
87
  async function reloadSupport(options, changedPaths, environment = {}) {
63
88
  const mergedEnvironment = (0, index_2.makeEnvironment)(environment);
64
- const { cwd, logger } = mergedEnvironment;
89
+ const { cwd, logger: cucumberLogger } = mergedEnvironment;
65
90
  const newId = messages_1.IdGenerator.uuid();
66
91
  const supportCoordinates = Object.assign({
67
92
  requireModules: [],
@@ -70,7 +95,7 @@ async function reloadSupport(options, changedPaths, environment = {}) {
70
95
  importPaths: []
71
96
  }, options.support);
72
97
  const pluginManager = await (0, plugins_1.initializeForLoadSupport)(mergedEnvironment);
73
- const resolvedPaths = await (0, index_1.resolvePaths)(logger, cwd, options.sources, supportCoordinates);
98
+ const resolvedPaths = await (0, index_1.resolvePaths)(cucumberLogger, cwd, options.sources, supportCoordinates);
74
99
  pluginManager.emit('paths:resolve', resolvedPaths);
75
100
  const { requirePaths, importPaths } = resolvedPaths;
76
101
  // Evict support modules from require.cache so they re-evaluate on next require().
@@ -82,7 +107,7 @@ async function reloadSupport(options, changedPaths, environment = {}) {
82
107
  evictAllSupportModules(requirePaths);
83
108
  }
84
109
  let supportCodeLibrary = await (0, support_1.getSupportCodeLibrary)({
85
- logger,
110
+ logger: cucumberLogger,
86
111
  cwd,
87
112
  newId,
88
113
  requireModules: supportCoordinates.requireModules,
@@ -1 +1 @@
1
- {"version":3,"file":"load-support.js","sourceRoot":"","sources":["../../src/api/load-support.ts"],"names":[],"mappings":"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","sourcesContent":["import { IdGenerator } from '@cucumber/messages';\r\nimport { resolvePaths } from '@cucumber/cucumber/lib/paths/index';\r\nimport { IRunEnvironment, makeEnvironment } from '@cucumber/cucumber/lib/environment/index';\r\nimport { ILoadSupportOptions, ISupportCodeLibrary } from '@cucumber/cucumber/lib/api/types';\r\nimport type { ISupportCodeCoordinates } from '@cucumber/cucumber/lib/support_code_library_builder/types';\r\nimport { getSupportCodeLibrary } from './support';\r\nimport { initializeForLoadSupport } from '@cucumber/cucumber/lib/api/plugins';\r\nimport { BindingRegistry } from '../bindings/binding-registry';\r\n\r\n/**\r\n * Load support code for use in test runs\r\n *\r\n * @public\r\n * @param options - Options required to find the support code\r\n * @param environment - Project environment\r\n */\r\nexport async function loadSupport(\r\n\toptions: ILoadSupportOptions,\r\n\tenvironment: IRunEnvironment = {}\r\n): Promise<ISupportCodeLibrary> {\r\n\tconst mergedEnvironment = makeEnvironment(environment);\r\n\tconst { cwd, logger } = mergedEnvironment;\r\n\tconst newId = IdGenerator.uuid();\r\n\tconst supportCoordinates = Object.assign(\r\n\t\t{\r\n\t\t\trequireModules: [],\r\n\t\t\trequirePaths: [],\r\n\t\t\tloaders: [],\r\n\t\t\timportPaths: []\r\n\t\t},\r\n\t\toptions.support\r\n\t);\r\n\tconst pluginManager = await initializeForLoadSupport(mergedEnvironment);\r\n\tconst resolvedPaths = await resolvePaths(logger, cwd, options.sources, supportCoordinates);\r\n\tpluginManager.emit('paths:resolve', resolvedPaths);\r\n\tconst { requirePaths, importPaths } = resolvedPaths;\r\n\tlet supportCodeLibrary = await getSupportCodeLibrary({\r\n\t\tlogger,\r\n\t\tcwd,\r\n\t\tnewId,\r\n\t\trequireModules: supportCoordinates.requireModules,\r\n\t\trequirePaths,\r\n\t\tloaders: supportCoordinates.loaders,\r\n\t\timportPaths\r\n\t});\r\n\tawait pluginManager.cleanup();\r\n\r\n\t// Set support to the updated step and hook definitions\r\n\t// in the supportCodeLibrary. We also need to initialize originalCoordinates\r\n\t// to support parallel execution.\r\n\tsupportCodeLibrary = BindingRegistry.instance.updateSupportCodeLibrary(supportCodeLibrary);\r\n\tsupportCodeLibrary = { ...supportCodeLibrary, ...{ originalCoordinates: supportCoordinates } };\r\n\r\n\treturn supportCodeLibrary;\r\n}\r\n\r\n/**\r\n * Incrementally reload support code. Evicts support modules from Node's\r\n * require cache so they are re-evaluated (re-running decorator registrations).\r\n * Transpiler caches (ts-node, swc, etc.) handle skipping recompilation for\r\n * unchanged files, making this significantly faster than a full loadSupport.\r\n *\r\n * @public\r\n * @param options - The same run options used for the original loadSupport call\r\n * @param changedPaths - Absolute paths to files that have changed since the\r\n * last load. If empty, all support modules are evicted\r\n * and re-evaluated (equivalent to a full reload).\r\n * @param environment - Project environment\r\n */\r\nexport async function reloadSupport(\r\n\toptions: ILoadSupportOptions,\r\n\tchangedPaths: string[],\r\n\tenvironment: IRunEnvironment = {}\r\n): Promise<ISupportCodeLibrary> {\r\n\tconst mergedEnvironment = makeEnvironment(environment);\r\n\tconst { cwd, logger } = mergedEnvironment;\r\n\tconst newId = IdGenerator.uuid();\r\n\tconst supportCoordinates: ISupportCodeCoordinates = Object.assign(\r\n\t\t{\r\n\t\t\trequireModules: [],\r\n\t\t\trequirePaths: [],\r\n\t\t\tloaders: [],\r\n\t\t\timportPaths: []\r\n\t\t},\r\n\t\toptions.support\r\n\t);\r\n\tconst pluginManager = await initializeForLoadSupport(mergedEnvironment);\r\n\tconst resolvedPaths = await resolvePaths(logger, cwd, options.sources, supportCoordinates);\r\n\tpluginManager.emit('paths:resolve', resolvedPaths);\r\n\tconst { requirePaths, importPaths } = resolvedPaths;\r\n\r\n\t// Evict support modules from require.cache so they re-evaluate on next require().\r\n\t// Transpiler caches ensure unchanged files don't pay recompilation cost.\r\n\tif (changedPaths.length > 0) {\r\n\t\tevictChangedAndDependents(changedPaths, requirePaths);\r\n\t} else {\r\n\t\tevictAllSupportModules(requirePaths);\r\n\t}\r\n\r\n\tlet supportCodeLibrary = await getSupportCodeLibrary({\r\n\t\tlogger,\r\n\t\tcwd,\r\n\t\tnewId,\r\n\t\trequireModules: supportCoordinates.requireModules,\r\n\t\trequirePaths,\r\n\t\tloaders: supportCoordinates.loaders,\r\n\t\timportPaths\r\n\t});\r\n\tawait pluginManager.cleanup();\r\n\r\n\tsupportCodeLibrary = BindingRegistry.instance.updateSupportCodeLibrary(supportCodeLibrary);\r\n\tsupportCodeLibrary = { ...supportCodeLibrary, ...{ originalCoordinates: supportCoordinates } };\r\n\r\n\treturn supportCodeLibrary;\r\n}\r\n\r\n/**\r\n * Evict changed files and any support modules that depend on them\r\n * from Node's require cache.\r\n */\r\nfunction evictChangedAndDependents(changedPaths: string[], allSupportPaths: string[]): void {\r\n\t// Resolve all changed paths\r\n\tconst changedResolved = new Set<string>();\r\n\tfor (const p of changedPaths) {\r\n\t\ttry {\r\n\t\t\tchangedResolved.add(require.resolve(p));\r\n\t\t} catch {\r\n\t\t\t// File may have been deleted — skip\r\n\t\t}\r\n\t}\r\n\r\n\t// Build set of modules to evict: changed files + any support module\r\n\t// whose dependency subtree includes a changed file\r\n\tconst toEvict = new Set<string>(changedResolved);\r\n\r\n\t// Walk require.cache to find transitive dependents\r\n\tlet found = true;\r\n\twhile (found) {\r\n\t\tfound = false;\r\n\t\tfor (const [key, mod] of Object.entries(require.cache)) {\r\n\t\t\tif (!toEvict.has(key) && mod?.children?.some(child => toEvict.has(child.id))) {\r\n\t\t\t\ttoEvict.add(key);\r\n\t\t\t\tfound = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Only evict modules that are changed or in the support paths set\r\n\t// (don't evict node_modules or unrelated files)\r\n\tconst supportResolved = new Set(\r\n\t\tallSupportPaths\r\n\t\t\t.map(p => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn require.resolve(p);\r\n\t\t\t\t} catch {\r\n\t\t\t\t\treturn '';\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.filter(Boolean)\r\n\t);\r\n\r\n\tfor (const key of toEvict) {\r\n\t\tif (changedResolved.has(key) || supportResolved.has(key)) {\r\n\t\t\tdelete require.cache[key];\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Evict all support modules from Node's require cache.\r\n * Used when no specific changed paths are provided.\r\n */\r\nfunction evictAllSupportModules(supportPaths: string[]): void {\r\n\tfor (const filePath of supportPaths) {\r\n\t\ttry {\r\n\t\t\tconst resolved = require.resolve(filePath);\r\n\t\t\tdelete require.cache[resolved];\r\n\t\t} catch {\r\n\t\t\t// File may not be resolvable — skip\r\n\t\t}\r\n\t}\r\n}\r\n"]}
1
+ {"version":3,"file":"load-support.js","sourceRoot":"","sources":["../../src/api/load-support.ts"],"names":[],"mappings":"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","sourcesContent":["import { IdGenerator } from '@cucumber/messages';\r\nimport { resolvePaths } from '@cucumber/cucumber/lib/paths/index';\r\nimport { IRunEnvironment, makeEnvironment } from '@cucumber/cucumber/lib/environment/index';\r\nimport { ILoadSupportOptions, ISupportCodeLibrary } from '@cucumber/cucumber/lib/api/types';\r\nimport type { ISupportCodeCoordinates } from '@cucumber/cucumber/lib/support_code_library_builder/types';\r\nimport { getSupportCodeLibrary } from './support';\r\nimport { initializeForLoadSupport } from '@cucumber/cucumber/lib/api/plugins';\r\nimport { BindingRegistry } from '../bindings/binding-registry';\r\nimport { parallelPreload } from './parallel-loader';\r\nimport { createLogger } from '../utils/tsflow-logger';\r\n\r\nconst logger = createLogger('load-support');\r\n\r\n/**\r\n * Options extending the standard load-support options with parallelLoad control.\r\n */\r\nexport interface ITsFlowLoadSupportOptions extends ILoadSupportOptions {\r\n\t/** Pre-warm transpiler caches in parallel worker threads. true = auto threads, number = explicit count. */\r\n\tparallelLoad?: boolean | number;\r\n\t/** Whether experimental decorators are enabled */\r\n\texperimentalDecorators?: boolean;\r\n}\r\n\r\n/**\r\n * Load support code for use in test runs\r\n *\r\n * @public\r\n * @param options - Options required to find the support code\r\n * @param environment - Project environment\r\n */\r\nexport async function loadSupport(\r\n\toptions: ITsFlowLoadSupportOptions,\r\n\tenvironment: IRunEnvironment = {}\r\n): Promise<ISupportCodeLibrary> {\r\n\tconst mergedEnvironment = makeEnvironment(environment);\r\n\tconst { cwd, logger: cucumberLogger } = mergedEnvironment;\r\n\tconst newId = IdGenerator.uuid();\r\n\tconst supportCoordinates = Object.assign(\r\n\t\t{\r\n\t\t\trequireModules: [],\r\n\t\t\trequirePaths: [],\r\n\t\t\tloaders: [],\r\n\t\t\timportPaths: []\r\n\t\t},\r\n\t\toptions.support\r\n\t);\r\n\tconst pluginManager = await initializeForLoadSupport(mergedEnvironment);\r\n\tconst resolvedPaths = await resolvePaths(cucumberLogger, cwd, options.sources, supportCoordinates);\r\n\tpluginManager.emit('paths:resolve', resolvedPaths);\r\n\tconst { requirePaths, importPaths } = resolvedPaths;\r\n\r\n\t// Parallel preload phase: warm transpiler caches in worker threads\r\n\tif (options.parallelLoad) {\r\n\t\tlogger.checkpoint('Running parallel preload phase');\r\n\t\ttry {\r\n\t\t\tconst result = await parallelPreload({\r\n\t\t\t\trequirePaths,\r\n\t\t\t\timportPaths,\r\n\t\t\t\trequireModules: supportCoordinates.requireModules,\r\n\t\t\t\tloaders: supportCoordinates.loaders,\r\n\t\t\t\texperimentalDecorators: options.experimentalDecorators ?? false,\r\n\t\t\t\tthreadCount: options.parallelLoad\r\n\t\t\t});\r\n\t\t\tlogger.checkpoint('Parallel preload completed', {\r\n\t\t\t\tdescriptors: result.descriptors.length,\r\n\t\t\t\tfiles: result.loadedFiles.length,\r\n\t\t\t\tdurationMs: result.durationMs\r\n\t\t\t});\r\n\t\t} catch (err: any) {\r\n\t\t\tlogger.error('Parallel preload failed, falling back to serial load', err);\r\n\t\t}\r\n\t}\r\n\r\n\tlet supportCodeLibrary = await getSupportCodeLibrary({\r\n\t\tlogger: cucumberLogger,\r\n\t\tcwd,\r\n\t\tnewId,\r\n\t\trequireModules: supportCoordinates.requireModules,\r\n\t\trequirePaths,\r\n\t\tloaders: supportCoordinates.loaders,\r\n\t\timportPaths\r\n\t});\r\n\tawait pluginManager.cleanup();\r\n\r\n\t// Set support to the updated step and hook definitions\r\n\t// in the supportCodeLibrary. We also need to initialize originalCoordinates\r\n\t// to support parallel execution.\r\n\tsupportCodeLibrary = BindingRegistry.instance.updateSupportCodeLibrary(supportCodeLibrary);\r\n\tsupportCodeLibrary = { ...supportCodeLibrary, ...{ originalCoordinates: supportCoordinates } };\r\n\r\n\treturn supportCodeLibrary;\r\n}\r\n\r\n/**\r\n * Incrementally reload support code. Evicts support modules from Node's\r\n * require cache so they are re-evaluated (re-running decorator registrations).\r\n * Transpiler caches (ts-node, swc, etc.) handle skipping recompilation for\r\n * unchanged files, making this significantly faster than a full loadSupport.\r\n *\r\n * @public\r\n * @param options - The same run options used for the original loadSupport call\r\n * @param changedPaths - Absolute paths to files that have changed since the\r\n * last load. If empty, all support modules are evicted\r\n * and re-evaluated (equivalent to a full reload).\r\n * @param environment - Project environment\r\n */\r\nexport async function reloadSupport(\r\n\toptions: ITsFlowLoadSupportOptions,\r\n\tchangedPaths: string[],\r\n\tenvironment: IRunEnvironment = {}\r\n): Promise<ISupportCodeLibrary> {\r\n\tconst mergedEnvironment = makeEnvironment(environment);\r\n\tconst { cwd, logger: cucumberLogger } = mergedEnvironment;\r\n\tconst newId = IdGenerator.uuid();\r\n\tconst supportCoordinates: ISupportCodeCoordinates = Object.assign(\r\n\t\t{\r\n\t\t\trequireModules: [],\r\n\t\t\trequirePaths: [],\r\n\t\t\tloaders: [],\r\n\t\t\timportPaths: []\r\n\t\t},\r\n\t\toptions.support\r\n\t);\r\n\tconst pluginManager = await initializeForLoadSupport(mergedEnvironment);\r\n\tconst resolvedPaths = await resolvePaths(cucumberLogger, cwd, options.sources, supportCoordinates);\r\n\tpluginManager.emit('paths:resolve', resolvedPaths);\r\n\tconst { requirePaths, importPaths } = resolvedPaths;\r\n\r\n\t// Evict support modules from require.cache so they re-evaluate on next require().\r\n\t// Transpiler caches ensure unchanged files don't pay recompilation cost.\r\n\tif (changedPaths.length > 0) {\r\n\t\tevictChangedAndDependents(changedPaths, requirePaths);\r\n\t} else {\r\n\t\tevictAllSupportModules(requirePaths);\r\n\t}\r\n\r\n\tlet supportCodeLibrary = await getSupportCodeLibrary({\r\n\t\tlogger: cucumberLogger,\r\n\t\tcwd,\r\n\t\tnewId,\r\n\t\trequireModules: supportCoordinates.requireModules,\r\n\t\trequirePaths,\r\n\t\tloaders: supportCoordinates.loaders,\r\n\t\timportPaths\r\n\t});\r\n\tawait pluginManager.cleanup();\r\n\r\n\tsupportCodeLibrary = BindingRegistry.instance.updateSupportCodeLibrary(supportCodeLibrary);\r\n\tsupportCodeLibrary = { ...supportCodeLibrary, ...{ originalCoordinates: supportCoordinates } };\r\n\r\n\treturn supportCodeLibrary;\r\n}\r\n\r\n/**\r\n * Evict changed files and any support modules that depend on them\r\n * from Node's require cache.\r\n */\r\nfunction evictChangedAndDependents(changedPaths: string[], allSupportPaths: string[]): void {\r\n\t// Resolve all changed paths\r\n\tconst changedResolved = new Set<string>();\r\n\tfor (const p of changedPaths) {\r\n\t\ttry {\r\n\t\t\tchangedResolved.add(require.resolve(p));\r\n\t\t} catch {\r\n\t\t\t// File may have been deleted — skip\r\n\t\t}\r\n\t}\r\n\r\n\t// Build set of modules to evict: changed files + any support module\r\n\t// whose dependency subtree includes a changed file\r\n\tconst toEvict = new Set<string>(changedResolved);\r\n\r\n\t// Walk require.cache to find transitive dependents\r\n\tlet found = true;\r\n\twhile (found) {\r\n\t\tfound = false;\r\n\t\tfor (const [key, mod] of Object.entries(require.cache)) {\r\n\t\t\tif (!toEvict.has(key) && mod?.children?.some(child => toEvict.has(child.id))) {\r\n\t\t\t\ttoEvict.add(key);\r\n\t\t\t\tfound = true;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Only evict modules that are changed or in the support paths set\r\n\t// (don't evict node_modules or unrelated files)\r\n\tconst supportResolved = new Set(\r\n\t\tallSupportPaths\r\n\t\t\t.map(p => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\treturn require.resolve(p);\r\n\t\t\t\t} catch {\r\n\t\t\t\t\treturn '';\r\n\t\t\t\t}\r\n\t\t\t})\r\n\t\t\t.filter(Boolean)\r\n\t);\r\n\r\n\tfor (const key of toEvict) {\r\n\t\tif (changedResolved.has(key) || supportResolved.has(key)) {\r\n\t\t\tdelete require.cache[key];\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Evict all support modules from Node's require cache.\r\n * Used when no specific changed paths are provided.\r\n */\r\nfunction evictAllSupportModules(supportPaths: string[]): void {\r\n\tfor (const filePath of supportPaths) {\r\n\t\ttry {\r\n\t\t\tconst resolved = require.resolve(filePath);\r\n\t\t\tdelete require.cache[resolved];\r\n\t\t} catch {\r\n\t\t\t// File may not be resolvable — skip\r\n\t\t}\r\n\t}\r\n}\r\n"]}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * loader-worker.ts
3
+ *
4
+ * Runs inside a worker_threads Worker. Receives support-code file paths and
5
+ * transpiler configuration, loads the files (warming the transpiler cache),
6
+ * extracts serializable binding descriptors from the BindingRegistry, and
7
+ * posts them back to the main thread.
8
+ *
9
+ * The __LOADER_WORKER global flag causes the binding decorator to skip
10
+ * Cucumber step/hook registration — only BindingRegistry population occurs.
11
+ */
12
+ import 'polyfill-symbol-metadata';
13
+ /** Message types sent from main thread to worker */
14
+ export interface LoaderWorkerRequest {
15
+ type: 'LOAD';
16
+ /** Absolute paths to load via require() */
17
+ requirePaths: string[];
18
+ /** Absolute paths to load via import() */
19
+ importPaths: string[];
20
+ /** Modules to require before support code (transpiler setup etc.) */
21
+ requireModules: string[];
22
+ /** ESM loaders to register before importing */
23
+ loaders: string[];
24
+ /** Whether to use experimental decorators */
25
+ experimentalDecorators: boolean;
26
+ }
27
+ /** Message types sent from worker back to main thread */
28
+ export interface LoaderWorkerResponse {
29
+ type: 'LOADED' | 'ERROR';
30
+ /** Serializable binding descriptors extracted from the registry */
31
+ descriptors?: import('../bindings/step-binding').SerializableBindingDescriptor[];
32
+ /** Source files that were successfully loaded */
33
+ loadedFiles?: string[];
34
+ /** Error message if something went wrong */
35
+ error?: string;
36
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ /**
3
+ * loader-worker.ts
4
+ *
5
+ * Runs inside a worker_threads Worker. Receives support-code file paths and
6
+ * transpiler configuration, loads the files (warming the transpiler cache),
7
+ * extracts serializable binding descriptors from the BindingRegistry, and
8
+ * posts them back to the main thread.
9
+ *
10
+ * The __LOADER_WORKER global flag causes the binding decorator to skip
11
+ * Cucumber step/hook registration — only BindingRegistry population occurs.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ // Shim 'window' for libraries that expect a browser environment in worker threads
15
+ if (typeof globalThis.window === 'undefined') {
16
+ globalThis.window = globalThis;
17
+ }
18
+ const node_worker_threads_1 = require("node:worker_threads");
19
+ const node_module_1 = require("node:module");
20
+ const node_url_1 = require("node:url");
21
+ require("polyfill-symbol-metadata");
22
+ // Signal that we're in a loader-worker context so decorators skip Cucumber APIs
23
+ global.__LOADER_WORKER = true;
24
+ async function processMessage(message) {
25
+ if (message.type !== 'LOAD') {
26
+ return;
27
+ }
28
+ try {
29
+ // Set the experimental decorators flag before loading support code
30
+ global.experimentalDecorators = message.experimentalDecorators;
31
+ process.env.CUCUMBER_EXPERIMENTAL_DECORATORS = String(message.experimentalDecorators);
32
+ // Load require modules (transpiler setup)
33
+ for (const modulePath of message.requireModules) {
34
+ require(modulePath);
35
+ }
36
+ // Load support files via require (CJS)
37
+ for (const filePath of message.requirePaths) {
38
+ require(filePath);
39
+ }
40
+ // Register ESM loaders
41
+ for (const specifier of message.loaders) {
42
+ (0, node_module_1.register)(specifier, (0, node_url_1.pathToFileURL)('./'));
43
+ }
44
+ // Load support files via import (ESM)
45
+ for (const filePath of message.importPaths) {
46
+ await import((0, node_url_1.pathToFileURL)(filePath).toString());
47
+ }
48
+ // Extract descriptors from the binding registry
49
+ const { BindingRegistry } = require('../bindings/binding-registry');
50
+ const registry = BindingRegistry.instance;
51
+ const descriptors = registry.toDescriptors();
52
+ const loadedFiles = Array.from(registry.getDescriptorSourceFiles());
53
+ const response = {
54
+ type: 'LOADED',
55
+ descriptors,
56
+ loadedFiles
57
+ };
58
+ node_worker_threads_1.parentPort.postMessage(response);
59
+ }
60
+ catch (err) {
61
+ const response = {
62
+ type: 'ERROR',
63
+ error: err.message || String(err)
64
+ };
65
+ node_worker_threads_1.parentPort.postMessage(response);
66
+ }
67
+ }
68
+ // Handle initial workerData (if files are passed at construction time)
69
+ if (node_worker_threads_1.workerData && node_worker_threads_1.workerData.type === 'LOAD') {
70
+ processMessage(node_worker_threads_1.workerData);
71
+ }
72
+ // Handle messages posted after construction
73
+ node_worker_threads_1.parentPort?.on('message', (msg) => processMessage(msg));
74
+ //# sourceMappingURL=loader-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-worker.js","sourceRoot":"","sources":["../../src/api/loader-worker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AAEH,kFAAkF;AAClF,IAAI,OAAO,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;IAC7C,UAAsC,CAAC,MAAM,GAAG,UAAU,CAAC;AAC7D,CAAC;AAED,6DAA6D;AAC7D,6CAAuC;AACvC,uCAAyC;AACzC,oCAAkC;AAElC,gFAAgF;AAC/E,MAAc,CAAC,eAAe,GAAG,IAAI,CAAC;AA4BvC,KAAK,UAAU,cAAc,CAAC,OAA4B;IACzD,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC7B,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,mEAAmE;QACnE,MAAM,CAAC,sBAAsB,GAAG,OAAO,CAAC,sBAAsB,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAEtF,0CAA0C;QAC1C,KAAK,MAAM,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YACjD,OAAO,CAAC,UAAU,CAAC,CAAC;QACrB,CAAC;QAED,uCAAuC;QACvC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YAC7C,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnB,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,IAAA,sBAAQ,EAAC,SAAS,EAAE,IAAA,wBAAa,EAAC,IAAI,CAAC,CAAC,CAAC;QAC1C,CAAC;QAED,sCAAsC;QACtC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,MAAM,CAAC,IAAA,wBAAa,EAAC,QAAQ,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,gDAAgD;QAChD,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,8BAA8B,CAAC,CAAC;QACpE,MAAM,QAAQ,GAAG,eAAe,CAAC,QAAQ,CAAC;QAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAa,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,wBAAwB,EAAE,CAAC,CAAC;QAE9E,MAAM,QAAQ,GAAyB;YACtC,IAAI,EAAE,QAAQ;YACd,WAAW;YACX,WAAW;SACX,CAAC;QACF,gCAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAyB;YACtC,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC;SACjC,CAAC;QACF,gCAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;AACF,CAAC;AAED,uEAAuE;AACvE,IAAI,gCAAU,IAAI,gCAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC9C,cAAc,CAAC,gCAAiC,CAAC,CAAC;AACnD,CAAC;AAED,4CAA4C;AAC5C,gCAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,GAAwB,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC","sourcesContent":["/**\r\n * loader-worker.ts\r\n *\r\n * Runs inside a worker_threads Worker. Receives support-code file paths and\r\n * transpiler configuration, loads the files (warming the transpiler cache),\r\n * extracts serializable binding descriptors from the BindingRegistry, and\r\n * posts them back to the main thread.\r\n *\r\n * The __LOADER_WORKER global flag causes the binding decorator to skip\r\n * Cucumber step/hook registration — only BindingRegistry population occurs.\r\n */\r\n\r\n// Shim 'window' for libraries that expect a browser environment in worker threads\r\nif (typeof globalThis.window === 'undefined') {\r\n\t(globalThis as Record<string, unknown>).window = globalThis;\r\n}\r\n\r\nimport { parentPort, workerData } from 'node:worker_threads';\r\nimport { register } from 'node:module';\r\nimport { pathToFileURL } from 'node:url';\r\nimport 'polyfill-symbol-metadata';\r\n\r\n// Signal that we're in a loader-worker context so decorators skip Cucumber APIs\r\n(global as any).__LOADER_WORKER = true;\r\n\r\n/** Message types sent from main thread to worker */\r\nexport interface LoaderWorkerRequest {\r\n\ttype: 'LOAD';\r\n\t/** Absolute paths to load via require() */\r\n\trequirePaths: string[];\r\n\t/** Absolute paths to load via import() */\r\n\timportPaths: string[];\r\n\t/** Modules to require before support code (transpiler setup etc.) */\r\n\trequireModules: string[];\r\n\t/** ESM loaders to register before importing */\r\n\tloaders: string[];\r\n\t/** Whether to use experimental decorators */\r\n\texperimentalDecorators: boolean;\r\n}\r\n\r\n/** Message types sent from worker back to main thread */\r\nexport interface LoaderWorkerResponse {\r\n\ttype: 'LOADED' | 'ERROR';\r\n\t/** Serializable binding descriptors extracted from the registry */\r\n\tdescriptors?: import('../bindings/step-binding').SerializableBindingDescriptor[];\r\n\t/** Source files that were successfully loaded */\r\n\tloadedFiles?: string[];\r\n\t/** Error message if something went wrong */\r\n\terror?: string;\r\n}\r\n\r\nasync function processMessage(message: LoaderWorkerRequest): Promise<void> {\r\n\tif (message.type !== 'LOAD') {\r\n\t\treturn;\r\n\t}\r\n\r\n\ttry {\r\n\t\t// Set the experimental decorators flag before loading support code\r\n\t\tglobal.experimentalDecorators = message.experimentalDecorators;\r\n\t\tprocess.env.CUCUMBER_EXPERIMENTAL_DECORATORS = String(message.experimentalDecorators);\r\n\r\n\t\t// Load require modules (transpiler setup)\r\n\t\tfor (const modulePath of message.requireModules) {\r\n\t\t\trequire(modulePath);\r\n\t\t}\r\n\r\n\t\t// Load support files via require (CJS)\r\n\t\tfor (const filePath of message.requirePaths) {\r\n\t\t\trequire(filePath);\r\n\t\t}\r\n\r\n\t\t// Register ESM loaders\r\n\t\tfor (const specifier of message.loaders) {\r\n\t\t\tregister(specifier, pathToFileURL('./'));\r\n\t\t}\r\n\r\n\t\t// Load support files via import (ESM)\r\n\t\tfor (const filePath of message.importPaths) {\r\n\t\t\tawait import(pathToFileURL(filePath).toString());\r\n\t\t}\r\n\r\n\t\t// Extract descriptors from the binding registry\r\n\t\tconst { BindingRegistry } = require('../bindings/binding-registry');\r\n\t\tconst registry = BindingRegistry.instance;\r\n\t\tconst descriptors = registry.toDescriptors();\r\n\t\tconst loadedFiles: string[] = Array.from(registry.getDescriptorSourceFiles());\r\n\r\n\t\tconst response: LoaderWorkerResponse = {\r\n\t\t\ttype: 'LOADED',\r\n\t\t\tdescriptors,\r\n\t\t\tloadedFiles\r\n\t\t};\r\n\t\tparentPort!.postMessage(response);\r\n\t} catch (err: any) {\r\n\t\tconst response: LoaderWorkerResponse = {\r\n\t\t\ttype: 'ERROR',\r\n\t\t\terror: err.message || String(err)\r\n\t\t};\r\n\t\tparentPort!.postMessage(response);\r\n\t}\r\n}\r\n\r\n// Handle initial workerData (if files are passed at construction time)\r\nif (workerData && workerData.type === 'LOAD') {\r\n\tprocessMessage(workerData as LoaderWorkerRequest);\r\n}\r\n\r\n// Handle messages posted after construction\r\nparentPort?.on('message', (msg: LoaderWorkerRequest) => processMessage(msg));\r\n"]}
@@ -0,0 +1,31 @@
1
+ import type { SerializableBindingDescriptor } from '../bindings/step-binding';
2
+ export interface ParallelLoadOptions {
3
+ /** Absolute require-paths for CJS support files */
4
+ requirePaths: string[];
5
+ /** Absolute import-paths for ESM support files */
6
+ importPaths: string[];
7
+ /** Modules to require before support code (transpiler hooks) */
8
+ requireModules: string[];
9
+ /** ESM loaders to register */
10
+ loaders: string[];
11
+ /** Whether experimental decorators are enabled */
12
+ experimentalDecorators: boolean;
13
+ /** Number of threads (true = auto, number = explicit) */
14
+ threadCount: boolean | number;
15
+ }
16
+ export interface ParallelLoadResult {
17
+ /** All descriptors collected across workers (for validation) */
18
+ descriptors: SerializableBindingDescriptor[];
19
+ /** Unique source files loaded across all workers */
20
+ loadedFiles: string[];
21
+ /** Time spent in parallel phase (ms) */
22
+ durationMs: number;
23
+ }
24
+ /**
25
+ * Pre-warm transpiler caches by loading support files in parallel worker threads.
26
+ *
27
+ * Each worker receives a subset of files, loads them (which triggers transpilation),
28
+ * and returns serializable binding descriptors. The transpiler cache on disk is now
29
+ * warm for the main thread's subsequent load.
30
+ */
31
+ export declare function parallelPreload(options: ParallelLoadOptions): Promise<ParallelLoadResult>;