@gherkle/runner 0.1.2 → 0.1.3
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/dist/__tests__/cucumber-config-resolution.test.d.ts +17 -0
- package/dist/__tests__/cucumber-config-resolution.test.d.ts.map +1 -0
- package/dist/__tests__/cucumber-config-resolution.test.js +104 -0
- package/dist/__tests__/cucumber-config-resolution.test.js.map +1 -0
- package/dist/workers/cucumber-worker.js +7 -1
- package/dist/workers/cucumber-worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Regression: cucumber-worker must pass a RELATIVE config path to
|
|
3
|
+
* loadConfiguration, not an absolute one.
|
|
4
|
+
*
|
|
5
|
+
* Bug observed in prod on 2026-05-27 — worker passed
|
|
6
|
+
* { file: path.join(tmpdir, 'cucumber.cjs'), ... }
|
|
7
|
+
* with environment.cwd = tmpdir. Cucumber's loadFile does
|
|
8
|
+
* `path.join(cwd, file)` (node_modules/@cucumber/cucumber/lib/configuration/
|
|
9
|
+
* from_file.js:50). path.join does NOT treat the second arg as absolute, so
|
|
10
|
+
* the prefix doubled → /tmp/x/tmp/x/cucumber.cjs → "Cannot find module".
|
|
11
|
+
*
|
|
12
|
+
* This test pins the contract we depend on: with cwd=tmpdir, file must be
|
|
13
|
+
* 'cucumber.cjs' (relative). If anyone ever changes the worker to pass an
|
|
14
|
+
* absolute path again, this test fails RED.
|
|
15
|
+
*/
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=cucumber-config-resolution.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cucumber-config-resolution.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/cucumber-config-resolution.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Regression: cucumber-worker must pass a RELATIVE config path to
|
|
4
|
+
* loadConfiguration, not an absolute one.
|
|
5
|
+
*
|
|
6
|
+
* Bug observed in prod on 2026-05-27 — worker passed
|
|
7
|
+
* { file: path.join(tmpdir, 'cucumber.cjs'), ... }
|
|
8
|
+
* with environment.cwd = tmpdir. Cucumber's loadFile does
|
|
9
|
+
* `path.join(cwd, file)` (node_modules/@cucumber/cucumber/lib/configuration/
|
|
10
|
+
* from_file.js:50). path.join does NOT treat the second arg as absolute, so
|
|
11
|
+
* the prefix doubled → /tmp/x/tmp/x/cucumber.cjs → "Cannot find module".
|
|
12
|
+
*
|
|
13
|
+
* This test pins the contract we depend on: with cwd=tmpdir, file must be
|
|
14
|
+
* 'cucumber.cjs' (relative). If anyone ever changes the worker to pass an
|
|
15
|
+
* absolute path again, this test fails RED.
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
const vitest_1 = require("vitest");
|
|
52
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
53
|
+
const path = __importStar(require("node:path"));
|
|
54
|
+
const cucumber_subprocess_1 = require("../frameworks/cucumber-subprocess");
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
56
|
+
const { loadConfiguration } = require('@cucumber/cucumber/api');
|
|
57
|
+
const cleanupPaths = [];
|
|
58
|
+
(0, vitest_1.afterEach)(async () => {
|
|
59
|
+
while (cleanupPaths.length) {
|
|
60
|
+
const p = cleanupPaths.pop();
|
|
61
|
+
try {
|
|
62
|
+
await fs.rm(p, { recursive: true, force: true });
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
/* best-effort */
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
const dummyFeature = {
|
|
70
|
+
id: 'feat-1',
|
|
71
|
+
name: 'features/demo.feature',
|
|
72
|
+
path: 'features/demo.feature',
|
|
73
|
+
content: 'Feature: demo\n Scenario: it works\n Given a thing\n',
|
|
74
|
+
};
|
|
75
|
+
const dummyStepDef = {
|
|
76
|
+
featureId: 'feat-1',
|
|
77
|
+
filename: 'steps.js',
|
|
78
|
+
content: '// stub\n',
|
|
79
|
+
language: 'javascript',
|
|
80
|
+
};
|
|
81
|
+
(0, vitest_1.describe)('cucumber-worker config path resolution', () => {
|
|
82
|
+
(0, vitest_1.it)('loadConfiguration succeeds when file is relative and cwd is tmpdir', async () => {
|
|
83
|
+
const exec = new cucumber_subprocess_1.CucumberSubprocessExecutor();
|
|
84
|
+
const tmpdir = await exec.prepareTmpdir([dummyFeature], [dummyStepDef]);
|
|
85
|
+
cleanupPaths.push(tmpdir);
|
|
86
|
+
// This call shape MUST match cucumber-worker.ts. If someone changes the
|
|
87
|
+
// worker to pass an absolute path, the integration breaks in prod but
|
|
88
|
+
// unit tests stay green unless this assertion exists.
|
|
89
|
+
const { runConfiguration } = await loadConfiguration({ file: 'cucumber.cjs', provided: {} }, { cwd: tmpdir, env: process.env, stdout: process.stdout, stderr: process.stderr, debug: false });
|
|
90
|
+
(0, vitest_1.expect)(runConfiguration).toBeDefined();
|
|
91
|
+
(0, vitest_1.expect)(runConfiguration.sources).toBeDefined();
|
|
92
|
+
});
|
|
93
|
+
(0, vitest_1.it)('demonstrates the bug: absolute file path produces a doubled-prefix module-not-found', async () => {
|
|
94
|
+
const exec = new cucumber_subprocess_1.CucumberSubprocessExecutor();
|
|
95
|
+
const tmpdir = await exec.prepareTmpdir([dummyFeature], [dummyStepDef]);
|
|
96
|
+
cleanupPaths.push(tmpdir);
|
|
97
|
+
// This is the OLD broken shape. We document it here so future readers
|
|
98
|
+
// can see exactly why we pass a relative path. If cucumber ever fixes
|
|
99
|
+
// path.join → path.resolve, this test will start passing and we can
|
|
100
|
+
// simplify the contract — until then it must throw.
|
|
101
|
+
await (0, vitest_1.expect)(loadConfiguration({ file: path.join(tmpdir, 'cucumber.cjs'), provided: {} }, { cwd: tmpdir, env: process.env, stdout: process.stdout, stderr: process.stderr, debug: false })).rejects.toThrow(/Cannot find module/);
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=cucumber-config-resolution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cucumber-config-resolution.test.js","sourceRoot":"","sources":["../../src/__tests__/cucumber-config-resolution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -117,7 +117,13 @@ async function main() {
|
|
|
117
117
|
// runConfiguration field is the one shaped for runCucumber (sources +
|
|
118
118
|
// support + runtime + formats); useConfiguration is the flat IConfiguration
|
|
119
119
|
// form, which runCucumber does NOT accept.
|
|
120
|
-
|
|
120
|
+
//
|
|
121
|
+
// `file` must be RELATIVE to environment.cwd — cucumber's loadFile() does
|
|
122
|
+
// `path.join(cwd, file)` (lib/configuration/from_file.js), and path.join
|
|
123
|
+
// does not treat the second arg as absolute. Passing an absolute path here
|
|
124
|
+
// produces a doubled prefix like /tmp/x/tmp/x/cucumber.cjs and crashes
|
|
125
|
+
// with "Cannot find module …".
|
|
126
|
+
const { runConfiguration } = await loadConfiguration({ file: 'cucumber.cjs', provided: {} }, environment);
|
|
121
127
|
const { success } = await runCucumber(runConfiguration, environment, (envelope) => {
|
|
122
128
|
// Envelopes are small JSON objects (testCase, testCaseStarted,
|
|
123
129
|
// testStepFinished, etc). The parent maps them to runner events.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cucumber-worker.js","sourceRoot":"","sources":["../../src/workers/cucumber-worker.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,gDAAkC;AAElC,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,gBAAgB,CACd,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,sCAAsC,EAAE,EAClE,CAAC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,uEAAuE;IACvE,qEAAqE;IACrE,8DAA8D;IAC9D,MAAM,KAAK,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7D,IAAI,KAAK,EAAE,CAAC;QACV,IAAI,CAAC;YACH,iEAAiE;YACjE,OAAO,CAAC,iCAAiC,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,gBAAgB,CACd;gBACE,IAAI,EAAE,OAAO;gBACb,OAAO,EAAE,yEAA0E,GAAa,CAAC,OAAO,EAAE;aAC3G,EACD,CAAC,CACF,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,WAAgE,CAAC;IACrE,IAAI,iBAA4E,CAAC;IACjF,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,GAAG,GAAG,OAAO,CAAC,wBAAwB,CAA4C,CAAC;QACzF,WAAW,GAAG,GAAG,CAAC,WAAW,CAAC;QAC9B,iBAAiB,GAAG,GAAG,CAAC,iBAAiB,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,gBAAgB,CACd;YACE,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,sDAAuD,GAAa,CAAC,OAAO,EAAE;SACxF,EACD,CAAC,CACF,CAAC;QACF,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,mEAAmE;QACnE,0EAA0E;QAC1E,oEAAoE;QACpE,gDAAgD;QAChD,MAAM,WAAW,GAAG;YAClB,GAAG,EAAE,MAAM;YACX,sEAAsE;YACtE,kEAAkE;YAClE,sCAAsC;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,GAAG,EAAE,OAAO,CAAC,GAA6B;SAC3C,CAAC;QAEF,wEAAwE;QACxE,sEAAsE;QACtE,4EAA4E;QAC5E,2CAA2C;QAC3C,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,iBAAiB,CAClD,EAAE,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"cucumber-worker.js","sourceRoot":"","sources":["../../src/workers/cucumber-worker.ts"],"names":[],"mappings":"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"}
|