@nouhouari/conductor-e2e 0.0.0-stage → 0.1.8
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/CHANGELOG.md +228 -0
- package/LICENSE +21 -0
- package/README.md +138 -2
- package/config/environments/default.ts +41 -0
- package/config/environments/dev.ts +16 -0
- package/config/environments/staging.ts +15 -0
- package/config/index.ts +70 -0
- package/config/types.ts +94 -0
- package/dist/config/environments/default.d.ts +3 -0
- package/dist/config/environments/default.d.ts.map +1 -0
- package/dist/config/environments/default.js +40 -0
- package/dist/config/environments/default.js.map +1 -0
- package/dist/config/environments/dev.d.ts +3 -0
- package/dist/config/environments/dev.d.ts.map +1 -0
- package/dist/config/environments/dev.js +18 -0
- package/dist/config/environments/dev.js.map +1 -0
- package/dist/config/environments/staging.d.ts +3 -0
- package/dist/config/environments/staging.d.ts.map +1 -0
- package/dist/config/environments/staging.js +17 -0
- package/dist/config/environments/staging.js.map +1 -0
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +81 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +93 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +3 -0
- package/dist/config/types.js.map +1 -0
- package/dist/src/drivers/ApiDriver.d.ts +16 -0
- package/dist/src/drivers/ApiDriver.d.ts.map +1 -0
- package/dist/src/drivers/ApiDriver.js +48 -0
- package/dist/src/drivers/ApiDriver.js.map +1 -0
- package/dist/src/drivers/DatabaseDriver.d.ts +12 -0
- package/dist/src/drivers/DatabaseDriver.d.ts.map +1 -0
- package/dist/src/drivers/DatabaseDriver.js +15 -0
- package/dist/src/drivers/DatabaseDriver.js.map +1 -0
- package/dist/src/drivers/FlutterDesktopDriver.d.ts +139 -0
- package/dist/src/drivers/FlutterDesktopDriver.d.ts.map +1 -0
- package/dist/src/drivers/FlutterDesktopDriver.js +445 -0
- package/dist/src/drivers/FlutterDesktopDriver.js.map +1 -0
- package/dist/src/drivers/MaestroDriver.d.ts +19 -0
- package/dist/src/drivers/MaestroDriver.d.ts.map +1 -0
- package/dist/src/drivers/MaestroDriver.js +144 -0
- package/dist/src/drivers/MaestroDriver.js.map +1 -0
- package/dist/src/drivers/WebDriver.d.ts +21 -0
- package/dist/src/drivers/WebDriver.d.ts.map +1 -0
- package/dist/src/drivers/WebDriver.js +57 -0
- package/dist/src/drivers/WebDriver.js.map +1 -0
- package/dist/src/hooks/browser.hooks.d.ts +2 -0
- package/dist/src/hooks/browser.hooks.d.ts.map +1 -0
- package/dist/src/hooks/browser.hooks.js +15 -0
- package/dist/src/hooks/browser.hooks.js.map +1 -0
- package/dist/src/hooks/database.hooks.d.ts +2 -0
- package/dist/src/hooks/database.hooks.d.ts.map +1 -0
- package/dist/src/hooks/database.hooks.js +11 -0
- package/dist/src/hooks/database.hooks.js.map +1 -0
- package/dist/src/hooks/desktop.hooks.d.ts +2 -0
- package/dist/src/hooks/desktop.hooks.d.ts.map +1 -0
- package/dist/src/hooks/desktop.hooks.js +15 -0
- package/dist/src/hooks/desktop.hooks.js.map +1 -0
- package/dist/src/hooks/flutterDesktop.hooks.d.ts +2 -0
- package/dist/src/hooks/flutterDesktop.hooks.d.ts.map +1 -0
- package/dist/src/hooks/flutterDesktop.hooks.js +26 -0
- package/dist/src/hooks/flutterDesktop.hooks.js.map +1 -0
- package/dist/src/hooks/index.d.ts +6 -0
- package/dist/src/hooks/index.d.ts.map +1 -0
- package/dist/src/hooks/index.js +25 -0
- package/dist/src/hooks/index.js.map +1 -0
- package/dist/src/hooks/maestro.hooks.d.ts +2 -0
- package/dist/src/hooks/maestro.hooks.d.ts.map +1 -0
- package/dist/src/hooks/maestro.hooks.js +8 -0
- package/dist/src/hooks/maestro.hooks.js.map +1 -0
- package/dist/src/index.d.ts +21 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +30 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/pages/BasePage.d.ts +11 -0
- package/dist/src/pages/BasePage.d.ts.map +1 -0
- package/dist/src/pages/BasePage.js +22 -0
- package/dist/src/pages/BasePage.js.map +1 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.d.ts +51 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.d.ts.map +1 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.js +162 -0
- package/dist/src/scenarios/RemoteScenarioFetcher.js.map +1 -0
- package/dist/src/scenarios/cli.d.ts +3 -0
- package/dist/src/scenarios/cli.d.ts.map +1 -0
- package/dist/src/scenarios/cli.js +26 -0
- package/dist/src/scenarios/cli.js.map +1 -0
- package/dist/src/support/logger.d.ts +3 -0
- package/dist/src/support/logger.d.ts.map +1 -0
- package/dist/src/support/logger.js +16 -0
- package/dist/src/support/logger.js.map +1 -0
- package/dist/src/support/retry.d.ts +7 -0
- package/dist/src/support/retry.d.ts.map +1 -0
- package/dist/src/support/retry.js +21 -0
- package/dist/src/support/retry.js.map +1 -0
- package/dist/src/world/ConductorWorld.d.ts +39 -0
- package/dist/src/world/ConductorWorld.d.ts.map +1 -0
- package/dist/src/world/ConductorWorld.js +112 -0
- package/dist/src/world/ConductorWorld.js.map +1 -0
- package/package.json +81 -4
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Browser, BrowserContext, Page } from 'playwright';
|
|
2
|
+
import type { EnvironmentConfig } from '../../config/types';
|
|
3
|
+
export interface WebDriverOptions {
|
|
4
|
+
headless?: boolean;
|
|
5
|
+
slowMo?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class WebDriver {
|
|
8
|
+
private config;
|
|
9
|
+
private _browser;
|
|
10
|
+
private _context;
|
|
11
|
+
private _page;
|
|
12
|
+
constructor(config: EnvironmentConfig);
|
|
13
|
+
launch(opts?: WebDriverOptions): Promise<void>;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
get page(): Page;
|
|
16
|
+
get context(): BrowserContext;
|
|
17
|
+
get browser(): Browser;
|
|
18
|
+
get isLaunched(): boolean;
|
|
19
|
+
takeScreenshot(name: string): Promise<Buffer>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=WebDriver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebDriver.d.ts","sourceRoot":"","sources":["../../../src/drivers/WebDriver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAA6B,MAAM,YAAY,CAAC;AACtF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,SAAS;IAKR,OAAO,CAAC,MAAM;IAJ1B,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,KAAK,CAAqB;gBAEd,MAAM,EAAE,iBAAiB;IAEvC,MAAM,CAAC,IAAI,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,IAAI,IAAI,IAAI,IAAI,CAGf;IAED,IAAI,OAAO,IAAI,cAAc,CAG5B;IAED,IAAI,OAAO,IAAI,OAAO,CAGrB;IAED,IAAI,UAAU,IAAI,OAAO,CAExB;IAEK,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAGpD"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebDriver = void 0;
|
|
4
|
+
const playwright_1 = require("playwright");
|
|
5
|
+
class WebDriver {
|
|
6
|
+
config;
|
|
7
|
+
_browser = null;
|
|
8
|
+
_context = null;
|
|
9
|
+
_page = null;
|
|
10
|
+
constructor(config) {
|
|
11
|
+
this.config = config;
|
|
12
|
+
}
|
|
13
|
+
async launch(opts) {
|
|
14
|
+
const browserName = this.config.web.browserName;
|
|
15
|
+
const launcher = { chromium: playwright_1.chromium, firefox: playwright_1.firefox, webkit: playwright_1.webkit }[browserName];
|
|
16
|
+
this._browser = await launcher.launch({
|
|
17
|
+
headless: opts?.headless ?? this.config.web.headless,
|
|
18
|
+
slowMo: opts?.slowMo ?? this.config.web.slowMo
|
|
19
|
+
});
|
|
20
|
+
this._context = await this._browser.newContext({
|
|
21
|
+
baseURL: this.config.web.baseUrl,
|
|
22
|
+
viewport: this.config.web.viewport ?? { width: 1280, height: 720 }
|
|
23
|
+
});
|
|
24
|
+
this._page = await this._context.newPage();
|
|
25
|
+
}
|
|
26
|
+
async close() {
|
|
27
|
+
await this._page?.close();
|
|
28
|
+
await this._context?.close();
|
|
29
|
+
await this._browser?.close();
|
|
30
|
+
this._page = null;
|
|
31
|
+
this._context = null;
|
|
32
|
+
this._browser = null;
|
|
33
|
+
}
|
|
34
|
+
get page() {
|
|
35
|
+
if (!this._page)
|
|
36
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
37
|
+
return this._page;
|
|
38
|
+
}
|
|
39
|
+
get context() {
|
|
40
|
+
if (!this._context)
|
|
41
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
42
|
+
return this._context;
|
|
43
|
+
}
|
|
44
|
+
get browser() {
|
|
45
|
+
if (!this._browser)
|
|
46
|
+
throw new Error('Browser not launched. Call launch() first.');
|
|
47
|
+
return this._browser;
|
|
48
|
+
}
|
|
49
|
+
get isLaunched() {
|
|
50
|
+
return this._browser !== null;
|
|
51
|
+
}
|
|
52
|
+
async takeScreenshot(name) {
|
|
53
|
+
return this.page.screenshot({ path: `reports/screenshots/${name}.png`, fullPage: true });
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.WebDriver = WebDriver;
|
|
57
|
+
//# sourceMappingURL=WebDriver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebDriver.js","sourceRoot":"","sources":["../../../src/drivers/WebDriver.ts"],"names":[],"mappings":";;;AAAA,2CAAsF;AAQtF,MAAa,SAAS;IAKA;IAJZ,QAAQ,GAAmB,IAAI,CAAC;IAChC,QAAQ,GAA0B,IAAI,CAAC;IACvC,KAAK,GAAgB,IAAI,CAAC;IAElC,YAAoB,MAAyB;QAAzB,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAEjD,KAAK,CAAC,MAAM,CAAC,IAAuB;QAClC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;QAChD,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAR,qBAAQ,EAAE,OAAO,EAAP,oBAAO,EAAE,MAAM,EAAN,mBAAM,EAAE,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;YACpC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ;YACpD,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM;SAC/C,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;YAC7C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO;YAChC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;SACnE,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;IAED,IAAI,IAAI;QACN,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC/E,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,OAAO;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAClF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAY;QAC/B,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,uBAAuB,IAAI,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC;CACF;AApDD,8BAoDC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.hooks.d.ts","sourceRoot":"","sources":["../../../src/hooks/browser.hooks.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
4
|
+
(0, cucumber_1.Before)({ tags: '@web or @cross-platform' }, async function () {
|
|
5
|
+
await this.web.launch();
|
|
6
|
+
});
|
|
7
|
+
(0, cucumber_1.After)({ tags: '@web or @cross-platform' }, async function (scenario) {
|
|
8
|
+
if (scenario.result?.status === cucumber_1.Status.FAILED && this.web.isLaunched) {
|
|
9
|
+
const name = scenario.pickle.name.replace(/\s+/g, '-').toLowerCase();
|
|
10
|
+
const screenshot = await this.web.takeScreenshot(`failure-${name}-${Date.now()}`);
|
|
11
|
+
await this.attach(screenshot, 'image/png');
|
|
12
|
+
}
|
|
13
|
+
await this.closeWeb();
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=browser.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.hooks.js","sourceRoot":"","sources":["../../../src/hooks/browser.hooks.ts"],"names":[],"mappings":";;AAAA,iDAA2D;AAG3D,IAAA,iBAAM,EAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,KAAK;IAC/C,MAAM,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAK,EAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,EAAE,KAAK,WAAiC,QAAQ;IACvF,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,iBAAM,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QACrE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.hooks.d.ts","sourceRoot":"","sources":["../../../src/hooks/database.hooks.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
4
|
+
(0, cucumber_1.Before)({ tags: '@database or @cross-platform' }, async function () {
|
|
5
|
+
if (this.hasDb)
|
|
6
|
+
await this.db.connect();
|
|
7
|
+
});
|
|
8
|
+
(0, cucumber_1.After)({ tags: '@database or @cross-platform' }, async function () {
|
|
9
|
+
await this.disconnectDb();
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=database.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.hooks.js","sourceRoot":"","sources":["../../../src/hooks/database.hooks.ts"],"names":[],"mappings":";;AAAA,iDAAmD;AAGnD,IAAA,iBAAM,EAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,EAAE,KAAK;IACpD,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAK,EAAC,EAAE,IAAI,EAAE,8BAA8B,EAAE,EAAE,KAAK;IACnD,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop.hooks.d.ts","sourceRoot":"","sources":["../../../src/hooks/desktop.hooks.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
4
|
+
(0, cucumber_1.Before)({ tags: '@desktop or @cross-platform' }, async function () {
|
|
5
|
+
this.logger.info('Desktop driver initialized for @desktop scenario');
|
|
6
|
+
});
|
|
7
|
+
(0, cucumber_1.After)({ tags: '@desktop or @cross-platform' }, async function (scenario) {
|
|
8
|
+
if (scenario.result?.status === cucumber_1.Status.FAILED && this.isFxLaunched) {
|
|
9
|
+
const name = scenario.pickle.name.replace(/\s+/g, '-').toLowerCase();
|
|
10
|
+
const screenshot = await this.fx.takeScreenshot(`failure-${name}-${Date.now()}`);
|
|
11
|
+
await this.attach(screenshot, 'image/png');
|
|
12
|
+
}
|
|
13
|
+
await this.closeFx();
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=desktop.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktop.hooks.js","sourceRoot":"","sources":["../../../src/hooks/desktop.hooks.ts"],"names":[],"mappings":";;AAAA,iDAA2D;AAG3D,IAAA,iBAAM,EAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE,KAAK;IACnD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAK,EAAC,EAAE,IAAI,EAAE,6BAA6B,EAAE,EAAE,KAAK,WAAiC,QAAQ;IAC3F,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,iBAAM,CAAC,MAAM,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACrE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACjF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flutterDesktop.hooks.d.ts","sourceRoot":"","sources":["../../../src/hooks/flutterDesktop.hooks.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
4
|
+
(0, cucumber_1.Before)({ tags: '@flutter-desktop or @cross-platform' }, async function () {
|
|
5
|
+
// Lazy: many @cross-platform scenarios won't actually exercise Flutter desktop;
|
|
6
|
+
// we don't pre-launch here. Step definitions call `await this.flutterDesktop.launch()`
|
|
7
|
+
// when needed. This keeps non-flutter scenarios fast.
|
|
8
|
+
if (this.config.flutterDesktop) {
|
|
9
|
+
this.logger.info(`FlutterDesktopDriver available: ${this.config.flutterDesktop.appPath}`);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
(0, cucumber_1.After)({ tags: '@flutter-desktop or @cross-platform' }, async function (scenario) {
|
|
13
|
+
if (scenario.result?.status === cucumber_1.Status.FAILED && this.isFlutterDesktopLaunched) {
|
|
14
|
+
try {
|
|
15
|
+
const name = scenario.pickle.name.replace(/\s+/g, '-').toLowerCase();
|
|
16
|
+
const screenshot = await this.flutterDesktop.takeScreenshot(`failure-${name}-${Date.now()}`);
|
|
17
|
+
const buf = require('fs').readFileSync(screenshot);
|
|
18
|
+
await this.attach(buf, 'image/png');
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
this.logger.warn(`Failed to capture FlutterDesktop screenshot: ${err.message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
await this.closeFlutterDesktop();
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=flutterDesktop.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flutterDesktop.hooks.js","sourceRoot":"","sources":["../../../src/hooks/flutterDesktop.hooks.ts"],"names":[],"mappings":";;AAAA,iDAA2D;AAG3D,IAAA,iBAAM,EAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,KAAK;IAC3D,gFAAgF;IAChF,uFAAuF;IACvF,sDAAsD;IACtD,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;QAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mCAAmC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,IAAA,gBAAK,EAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,KAAK,WAAiC,QAAQ;IACnG,IAAI,QAAQ,CAAC,MAAM,EAAE,MAAM,KAAK,iBAAM,CAAC,MAAM,IAAI,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAC/E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACrE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC7F,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAiD,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IACD,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACnC,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":"AAKA,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
18
|
+
const ConductorWorld_1 = require("../world/ConductorWorld");
|
|
19
|
+
(0, cucumber_1.setWorldConstructor)(ConductorWorld_1.ConductorWorld);
|
|
20
|
+
__exportStar(require("./browser.hooks"), exports);
|
|
21
|
+
__exportStar(require("./database.hooks"), exports);
|
|
22
|
+
__exportStar(require("./maestro.hooks"), exports);
|
|
23
|
+
__exportStar(require("./desktop.hooks"), exports);
|
|
24
|
+
__exportStar(require("./flutterDesktop.hooks"), exports);
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAAyD;AACzD,4DAAyD;AAEzD,IAAA,8BAAmB,EAAC,+BAAc,CAAC,CAAC;AAEpC,kDAAgC;AAChC,mDAAiC;AACjC,kDAAgC;AAChC,kDAAgC;AAChC,yDAAuC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maestro.hooks.d.ts","sourceRoot":"","sources":["../../../src/hooks/maestro.hooks.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const cucumber_1 = require("@cucumber/cucumber");
|
|
4
|
+
(0, cucumber_1.Before)({ tags: '@mobile or @cross-platform' }, async function () {
|
|
5
|
+
const deviceId = this.config.mobile.deviceId ?? 'default';
|
|
6
|
+
this.logger.info({ deviceId }, 'Targeting Maestro device');
|
|
7
|
+
});
|
|
8
|
+
//# sourceMappingURL=maestro.hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maestro.hooks.js","sourceRoot":"","sources":["../../../src/hooks/maestro.hooks.ts"],"names":[],"mappings":";;AAAA,iDAA4C;AAG5C,IAAA,iBAAM,EAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAE,KAAK;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,IAAI,SAAS,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,0BAA0B,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export { ConductorWorld } from './world/ConductorWorld';
|
|
2
|
+
export { WebDriver } from './drivers/WebDriver';
|
|
3
|
+
export type { WebDriverOptions } from './drivers/WebDriver';
|
|
4
|
+
export { ApiDriver } from './drivers/ApiDriver';
|
|
5
|
+
export { MaestroDriver } from './drivers/MaestroDriver';
|
|
6
|
+
export type { MaestroRunOptions, MaestroResult } from './drivers/MaestroDriver';
|
|
7
|
+
export { JavaFxDriver } from 'javafx-driver';
|
|
8
|
+
export type { JavaFxConfig, JavaFxLaunchOptions } from 'javafx-driver';
|
|
9
|
+
export { DatabaseDriver } from './drivers/DatabaseDriver';
|
|
10
|
+
export type { QueryResult } from './drivers/DatabaseDriver';
|
|
11
|
+
export { FlutterDesktopDriver } from './drivers/FlutterDesktopDriver';
|
|
12
|
+
export type { Finder, FinderType, Offset, OffsetType, WaitCondition } from './drivers/FlutterDesktopDriver';
|
|
13
|
+
export { BasePage } from './pages/BasePage';
|
|
14
|
+
export { createLogger } from './support/logger';
|
|
15
|
+
export { retry } from './support/retry';
|
|
16
|
+
export type { RetryOptions } from './support/retry';
|
|
17
|
+
export { fetchScenarios, reconstructFeatureFiles } from './scenarios/RemoteScenarioFetcher';
|
|
18
|
+
export type { RemoteScenarioSummary, ReconstructResult } from './scenarios/RemoteScenarioFetcher';
|
|
19
|
+
export { config, loadConfig } from '../config';
|
|
20
|
+
export type { EnvironmentConfig, WebConfig, ApiConfig, MobileConfig, DatabaseConfig, DesktopConfig, FlutterDesktopConfig, RemoteScenariosConfig, RemoteScenariosFilters } from '../config/types';
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEhF,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAE5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,gCAAgC,CAAC;AAE5G,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,YAAY,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAElG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/C,YAAY,EAAE,iBAAiB,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.loadConfig = exports.config = exports.reconstructFeatureFiles = exports.fetchScenarios = exports.retry = exports.createLogger = exports.BasePage = exports.FlutterDesktopDriver = exports.DatabaseDriver = exports.JavaFxDriver = exports.MaestroDriver = exports.ApiDriver = exports.WebDriver = exports.ConductorWorld = void 0;
|
|
4
|
+
var ConductorWorld_1 = require("./world/ConductorWorld");
|
|
5
|
+
Object.defineProperty(exports, "ConductorWorld", { enumerable: true, get: function () { return ConductorWorld_1.ConductorWorld; } });
|
|
6
|
+
var WebDriver_1 = require("./drivers/WebDriver");
|
|
7
|
+
Object.defineProperty(exports, "WebDriver", { enumerable: true, get: function () { return WebDriver_1.WebDriver; } });
|
|
8
|
+
var ApiDriver_1 = require("./drivers/ApiDriver");
|
|
9
|
+
Object.defineProperty(exports, "ApiDriver", { enumerable: true, get: function () { return ApiDriver_1.ApiDriver; } });
|
|
10
|
+
var MaestroDriver_1 = require("./drivers/MaestroDriver");
|
|
11
|
+
Object.defineProperty(exports, "MaestroDriver", { enumerable: true, get: function () { return MaestroDriver_1.MaestroDriver; } });
|
|
12
|
+
var javafx_driver_1 = require("javafx-driver");
|
|
13
|
+
Object.defineProperty(exports, "JavaFxDriver", { enumerable: true, get: function () { return javafx_driver_1.JavaFxDriver; } });
|
|
14
|
+
var DatabaseDriver_1 = require("./drivers/DatabaseDriver");
|
|
15
|
+
Object.defineProperty(exports, "DatabaseDriver", { enumerable: true, get: function () { return DatabaseDriver_1.DatabaseDriver; } });
|
|
16
|
+
var FlutterDesktopDriver_1 = require("./drivers/FlutterDesktopDriver");
|
|
17
|
+
Object.defineProperty(exports, "FlutterDesktopDriver", { enumerable: true, get: function () { return FlutterDesktopDriver_1.FlutterDesktopDriver; } });
|
|
18
|
+
var BasePage_1 = require("./pages/BasePage");
|
|
19
|
+
Object.defineProperty(exports, "BasePage", { enumerable: true, get: function () { return BasePage_1.BasePage; } });
|
|
20
|
+
var logger_1 = require("./support/logger");
|
|
21
|
+
Object.defineProperty(exports, "createLogger", { enumerable: true, get: function () { return logger_1.createLogger; } });
|
|
22
|
+
var retry_1 = require("./support/retry");
|
|
23
|
+
Object.defineProperty(exports, "retry", { enumerable: true, get: function () { return retry_1.retry; } });
|
|
24
|
+
var RemoteScenarioFetcher_1 = require("./scenarios/RemoteScenarioFetcher");
|
|
25
|
+
Object.defineProperty(exports, "fetchScenarios", { enumerable: true, get: function () { return RemoteScenarioFetcher_1.fetchScenarios; } });
|
|
26
|
+
Object.defineProperty(exports, "reconstructFeatureFiles", { enumerable: true, get: function () { return RemoteScenarioFetcher_1.reconstructFeatureFiles; } });
|
|
27
|
+
var config_1 = require("../config");
|
|
28
|
+
Object.defineProperty(exports, "config", { enumerable: true, get: function () { return config_1.config; } });
|
|
29
|
+
Object.defineProperty(exports, "loadConfig", { enumerable: true, get: function () { return config_1.loadConfig; } });
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,yDAAwD;AAA/C,gHAAA,cAAc,OAAA;AAEvB,iDAAgD;AAAvC,sGAAA,SAAS,OAAA;AAGlB,iDAAgD;AAAvC,sGAAA,SAAS,OAAA;AAElB,yDAAwD;AAA/C,8GAAA,aAAa,OAAA;AAGtB,+CAA6C;AAApC,6GAAA,YAAY,OAAA;AAGrB,2DAA0D;AAAjD,gHAAA,cAAc,OAAA;AAGvB,uEAAsE;AAA7D,4HAAA,oBAAoB,OAAA;AAG7B,6CAA4C;AAAnC,oGAAA,QAAQ,OAAA;AAEjB,2CAAgD;AAAvC,sGAAA,YAAY,OAAA;AACrB,yCAAwC;AAA/B,8FAAA,KAAK,OAAA;AAGd,2EAA4F;AAAnF,uHAAA,cAAc,OAAA;AAAE,gIAAA,uBAAuB,OAAA;AAGhD,oCAA+C;AAAtC,gGAAA,MAAM,OAAA;AAAE,oGAAA,UAAU,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Page } from 'playwright';
|
|
2
|
+
import type { EnvironmentConfig } from '../../config/types';
|
|
3
|
+
export declare abstract class BasePage {
|
|
4
|
+
protected page: Page;
|
|
5
|
+
protected config: EnvironmentConfig;
|
|
6
|
+
constructor(page: Page, config: EnvironmentConfig);
|
|
7
|
+
navigate(path: string): Promise<void>;
|
|
8
|
+
waitForLoad(): Promise<void>;
|
|
9
|
+
getTitle(): Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=BasePage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasePage.d.ts","sourceRoot":"","sources":["../../../src/pages/BasePage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,8BAAsB,QAAQ;IAChB,SAAS,CAAC,IAAI,EAAE,IAAI;IAAE,SAAS,CAAC,MAAM,EAAE,iBAAiB;gBAA/C,IAAI,EAAE,IAAI,EAAY,MAAM,EAAE,iBAAiB;IAE/D,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;CAGlC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BasePage = void 0;
|
|
4
|
+
class BasePage {
|
|
5
|
+
page;
|
|
6
|
+
config;
|
|
7
|
+
constructor(page, config) {
|
|
8
|
+
this.page = page;
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
async navigate(path) {
|
|
12
|
+
await this.page.goto(path);
|
|
13
|
+
}
|
|
14
|
+
async waitForLoad() {
|
|
15
|
+
await this.page.waitForLoadState('networkidle');
|
|
16
|
+
}
|
|
17
|
+
async getTitle() {
|
|
18
|
+
return this.page.title();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.BasePage = BasePage;
|
|
22
|
+
//# sourceMappingURL=BasePage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BasePage.js","sourceRoot":"","sources":["../../../src/pages/BasePage.ts"],"names":[],"mappings":";;;AAGA,MAAsB,QAAQ;IACN;IAAsB;IAA5C,YAAsB,IAAU,EAAY,MAAyB;QAA/C,SAAI,GAAJ,IAAI,CAAM;QAAY,WAAM,GAAN,MAAM,CAAmB;IAAG,CAAC;IAEzE,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;CACF;AAdD,4BAcC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { RemoteScenariosConfig } from '../../config/types';
|
|
2
|
+
/**
|
|
3
|
+
* Sources cucumber scenarios from the requ scenario API and reconstructs them
|
|
4
|
+
* into `.feature` files on disk so `cucumber-js` (which only reads filesystem
|
|
5
|
+
* globs) can run them — without touching the local `features/` folder.
|
|
6
|
+
*
|
|
7
|
+
* See the requ OpenAPI spec: GET /api/scenarios returns scenario summaries; with
|
|
8
|
+
* `content=true` each carries the raw gherkin of one Scenario block plus the
|
|
9
|
+
* feature's Background.
|
|
10
|
+
*/
|
|
11
|
+
/** One scenario summary as returned by GET /api/scenarios (with content=true). */
|
|
12
|
+
export interface RemoteScenarioSummary {
|
|
13
|
+
/** testKey, i.e. `${feature}::${name}`. */
|
|
14
|
+
id: string;
|
|
15
|
+
feature: string;
|
|
16
|
+
name: string;
|
|
17
|
+
tags: string[];
|
|
18
|
+
storyIds?: string[];
|
|
19
|
+
requirementIds?: string[];
|
|
20
|
+
valid?: boolean;
|
|
21
|
+
hasContent?: boolean;
|
|
22
|
+
hasBackground?: boolean;
|
|
23
|
+
status?: 'pass' | 'fail' | 'pending';
|
|
24
|
+
/** Raw gherkin of this scenario block (its own tag lines + steps + Examples). */
|
|
25
|
+
content?: string;
|
|
26
|
+
/** Raw gherkin of the feature's Background block ("" when none). */
|
|
27
|
+
background?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Fetch scenarios from the requ scenario API, applying server-side filters.
|
|
31
|
+
* Always requests `content=true` so the gherkin body and background come inline.
|
|
32
|
+
*/
|
|
33
|
+
export declare function fetchScenarios(config: RemoteScenariosConfig): Promise<RemoteScenarioSummary[]>;
|
|
34
|
+
export interface ReconstructResult {
|
|
35
|
+
/** Number of feature files written. */
|
|
36
|
+
features: number;
|
|
37
|
+
/** Number of scenarios written across all files. */
|
|
38
|
+
scenarios: number;
|
|
39
|
+
/** Absolute path of the output directory. */
|
|
40
|
+
dir: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Reconstruct `.feature` files from API scenario summaries, grouped by feature.
|
|
44
|
+
* Writes one file per feature into `outputDir` (which is cleaned first).
|
|
45
|
+
*
|
|
46
|
+
* Feature-level tags (e.g. `@web`) are recovered as the tags common to every
|
|
47
|
+
* scenario in a feature that do NOT appear on that scenario's own content tag
|
|
48
|
+
* lines, then emitted above `Feature:` so local `--tags`/profiles still match.
|
|
49
|
+
*/
|
|
50
|
+
export declare function reconstructFeatureFiles(scenarios: RemoteScenarioSummary[], outputDir: string): Promise<ReconstructResult>;
|
|
51
|
+
//# sourceMappingURL=RemoteScenarioFetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteScenarioFetcher.d.ts","sourceRoot":"","sources":["../../../src/scenarios/RemoteScenarioFetcher.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;GAQG;AAEH,kFAAkF;AAClF,MAAM,WAAW,qBAAqB;IACpC,2CAA2C;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrC,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,qBAAqB,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAuCpG;AA2BD,MAAM,WAAW,iBAAiB;IAChC,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,SAAS,EAAE,qBAAqB,EAAE,EAClC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,iBAAiB,CAAC,CAoE5B"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fetchScenarios = fetchScenarios;
|
|
7
|
+
exports.reconstructFeatureFiles = reconstructFeatureFiles;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
+
/**
|
|
11
|
+
* Fetch scenarios from the requ scenario API, applying server-side filters.
|
|
12
|
+
* Always requests `content=true` so the gherkin body and background come inline.
|
|
13
|
+
*/
|
|
14
|
+
async function fetchScenarios(config) {
|
|
15
|
+
const base = config.baseUrl.replace(/\/+$/, '');
|
|
16
|
+
const params = new URLSearchParams();
|
|
17
|
+
params.set('content', 'true');
|
|
18
|
+
if (config.project)
|
|
19
|
+
params.set('project', config.project);
|
|
20
|
+
const f = config.filters ?? {};
|
|
21
|
+
if (f.story)
|
|
22
|
+
params.set('story', f.story);
|
|
23
|
+
if (f.requirement)
|
|
24
|
+
params.set('requirement', f.requirement);
|
|
25
|
+
if (f.phase)
|
|
26
|
+
params.set('phase', f.phase);
|
|
27
|
+
if (f.mode)
|
|
28
|
+
params.set('mode', f.mode);
|
|
29
|
+
if (f.tags)
|
|
30
|
+
params.set('tags', f.tags);
|
|
31
|
+
if (f.feature)
|
|
32
|
+
params.set('feature', f.feature);
|
|
33
|
+
if (f.q)
|
|
34
|
+
params.set('q', f.q);
|
|
35
|
+
if (typeof f.valid === 'boolean')
|
|
36
|
+
params.set('valid', String(f.valid));
|
|
37
|
+
const url = `${base}/scenarios?${params.toString()}`;
|
|
38
|
+
let res;
|
|
39
|
+
try {
|
|
40
|
+
res = await fetch(url);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
throw new Error(`Failed to reach requ scenario API at ${url}: ${err.message}`);
|
|
44
|
+
}
|
|
45
|
+
if (!res.ok) {
|
|
46
|
+
let detail = '';
|
|
47
|
+
try {
|
|
48
|
+
const body = (await res.json());
|
|
49
|
+
if (body.error)
|
|
50
|
+
detail = body.error;
|
|
51
|
+
if (body.available)
|
|
52
|
+
detail += ` (available projects: ${body.available.join(', ')})`;
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// non-JSON error body; ignore
|
|
56
|
+
}
|
|
57
|
+
throw new Error(`requ scenario API returned ${res.status} for ${url}${detail ? `: ${detail}` : ''}`);
|
|
58
|
+
}
|
|
59
|
+
const data = (await res.json());
|
|
60
|
+
return data.scenarios ?? [];
|
|
61
|
+
}
|
|
62
|
+
/** Tag tokens on the leading tag lines of a scenario's content block. */
|
|
63
|
+
function leadingContentTags(content) {
|
|
64
|
+
const tags = new Set();
|
|
65
|
+
for (const raw of content.split(/\r?\n/)) {
|
|
66
|
+
const line = raw.trim();
|
|
67
|
+
if (line === '')
|
|
68
|
+
continue;
|
|
69
|
+
if (line.startsWith('@')) {
|
|
70
|
+
for (const t of line.split(/\s+/))
|
|
71
|
+
if (t.startsWith('@'))
|
|
72
|
+
tags.add(t);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
break; // first non-tag, non-blank line ends the leading tag block
|
|
76
|
+
}
|
|
77
|
+
return tags;
|
|
78
|
+
}
|
|
79
|
+
/** Slugify a feature name into a safe `.feature` filename. */
|
|
80
|
+
function featureFileName(feature) {
|
|
81
|
+
const slug = feature
|
|
82
|
+
.trim()
|
|
83
|
+
.toLowerCase()
|
|
84
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
85
|
+
.replace(/^-+|-+$/g, '');
|
|
86
|
+
return `${slug || 'feature'}.feature`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Reconstruct `.feature` files from API scenario summaries, grouped by feature.
|
|
90
|
+
* Writes one file per feature into `outputDir` (which is cleaned first).
|
|
91
|
+
*
|
|
92
|
+
* Feature-level tags (e.g. `@web`) are recovered as the tags common to every
|
|
93
|
+
* scenario in a feature that do NOT appear on that scenario's own content tag
|
|
94
|
+
* lines, then emitted above `Feature:` so local `--tags`/profiles still match.
|
|
95
|
+
*/
|
|
96
|
+
async function reconstructFeatureFiles(scenarios, outputDir) {
|
|
97
|
+
const dir = node_path_1.default.resolve(outputDir);
|
|
98
|
+
await node_fs_1.promises.rm(dir, { recursive: true, force: true });
|
|
99
|
+
await node_fs_1.promises.mkdir(dir, { recursive: true });
|
|
100
|
+
// Group by feature name, preserving first-seen order.
|
|
101
|
+
const groups = new Map();
|
|
102
|
+
for (const sc of scenarios) {
|
|
103
|
+
const list = groups.get(sc.feature) ?? [];
|
|
104
|
+
list.push(sc);
|
|
105
|
+
groups.set(sc.feature, list);
|
|
106
|
+
}
|
|
107
|
+
const usedNames = new Set();
|
|
108
|
+
let featuresWritten = 0;
|
|
109
|
+
let scenariosWritten = 0;
|
|
110
|
+
for (const [feature, group] of groups) {
|
|
111
|
+
// Only content-bearing scenarios contribute to the file and to tag recovery.
|
|
112
|
+
// A feature with a Background but no scenarios is invalid Gherkin, so skip it.
|
|
113
|
+
const withContent = group.filter((sc) => (sc.content ?? '').trim() !== '');
|
|
114
|
+
if (withContent.length === 0)
|
|
115
|
+
continue;
|
|
116
|
+
// Feature-level tags = present on every scenario, absent from each one's own tag lines.
|
|
117
|
+
let featureTags = null;
|
|
118
|
+
for (const sc of withContent) {
|
|
119
|
+
const own = leadingContentTags(sc.content ?? '');
|
|
120
|
+
const inherited = new Set((sc.tags ?? []).filter((t) => !own.has(t)));
|
|
121
|
+
if (featureTags === null) {
|
|
122
|
+
featureTags = inherited;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
for (const t of [...featureTags])
|
|
126
|
+
if (!inherited.has(t))
|
|
127
|
+
featureTags.delete(t);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
// Sorted for deterministic, diff-stable output (tag order is insignificant to cucumber).
|
|
131
|
+
const tags = featureTags ? [...featureTags].sort() : [];
|
|
132
|
+
const background = withContent.find((sc) => (sc.background ?? '').trim() !== '')?.background?.trim();
|
|
133
|
+
const lines = [];
|
|
134
|
+
if (tags.length)
|
|
135
|
+
lines.push(tags.join(' '));
|
|
136
|
+
lines.push(`Feature: ${feature}`);
|
|
137
|
+
lines.push('');
|
|
138
|
+
if (background) {
|
|
139
|
+
lines.push(background);
|
|
140
|
+
lines.push('');
|
|
141
|
+
}
|
|
142
|
+
for (const sc of withContent) {
|
|
143
|
+
lines.push((sc.content ?? '').replace(/\s+$/, ''));
|
|
144
|
+
lines.push('');
|
|
145
|
+
scenariosWritten++;
|
|
146
|
+
}
|
|
147
|
+
let name = featureFileName(feature);
|
|
148
|
+
if (usedNames.has(name)) {
|
|
149
|
+
const stem = name.replace(/\.feature$/, '');
|
|
150
|
+
let i = 2;
|
|
151
|
+
while (usedNames.has(`${stem}-${i}.feature`))
|
|
152
|
+
i++;
|
|
153
|
+
name = `${stem}-${i}.feature`;
|
|
154
|
+
}
|
|
155
|
+
usedNames.add(name);
|
|
156
|
+
const body = `${lines.join('\n').replace(/\n+$/, '')}\n`;
|
|
157
|
+
await node_fs_1.promises.writeFile(node_path_1.default.join(dir, name), body, 'utf8');
|
|
158
|
+
featuresWritten++;
|
|
159
|
+
}
|
|
160
|
+
return { features: featuresWritten, scenarios: scenariosWritten, dir };
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=RemoteScenarioFetcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RemoteScenarioFetcher.js","sourceRoot":"","sources":["../../../src/scenarios/RemoteScenarioFetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/scenarios/cli.ts"],"names":[],"mappings":""}
|