@nouhouari/conductor-e2e 0.0.0-stage → 0.1.9

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 (101) hide show
  1. package/CHANGELOG.md +237 -0
  2. package/LICENSE +21 -0
  3. package/README.md +196 -2
  4. package/config/environments/default.ts +41 -0
  5. package/config/environments/dev.ts +16 -0
  6. package/config/environments/staging.ts +15 -0
  7. package/config/index.ts +70 -0
  8. package/config/types.ts +94 -0
  9. package/dist/config/environments/default.d.ts +3 -0
  10. package/dist/config/environments/default.d.ts.map +1 -0
  11. package/dist/config/environments/default.js +40 -0
  12. package/dist/config/environments/default.js.map +1 -0
  13. package/dist/config/environments/dev.d.ts +3 -0
  14. package/dist/config/environments/dev.d.ts.map +1 -0
  15. package/dist/config/environments/dev.js +18 -0
  16. package/dist/config/environments/dev.js.map +1 -0
  17. package/dist/config/environments/staging.d.ts +3 -0
  18. package/dist/config/environments/staging.d.ts.map +1 -0
  19. package/dist/config/environments/staging.js +17 -0
  20. package/dist/config/environments/staging.js.map +1 -0
  21. package/dist/config/index.d.ts +7 -0
  22. package/dist/config/index.d.ts.map +1 -0
  23. package/dist/config/index.js +81 -0
  24. package/dist/config/index.js.map +1 -0
  25. package/dist/config/types.d.ts +93 -0
  26. package/dist/config/types.d.ts.map +1 -0
  27. package/dist/config/types.js +3 -0
  28. package/dist/config/types.js.map +1 -0
  29. package/dist/src/drivers/ApiDriver.d.ts +16 -0
  30. package/dist/src/drivers/ApiDriver.d.ts.map +1 -0
  31. package/dist/src/drivers/ApiDriver.js +48 -0
  32. package/dist/src/drivers/ApiDriver.js.map +1 -0
  33. package/dist/src/drivers/DatabaseDriver.d.ts +12 -0
  34. package/dist/src/drivers/DatabaseDriver.d.ts.map +1 -0
  35. package/dist/src/drivers/DatabaseDriver.js +15 -0
  36. package/dist/src/drivers/DatabaseDriver.js.map +1 -0
  37. package/dist/src/drivers/FlutterDesktopDriver.d.ts +139 -0
  38. package/dist/src/drivers/FlutterDesktopDriver.d.ts.map +1 -0
  39. package/dist/src/drivers/FlutterDesktopDriver.js +445 -0
  40. package/dist/src/drivers/FlutterDesktopDriver.js.map +1 -0
  41. package/dist/src/drivers/MaestroDriver.d.ts +19 -0
  42. package/dist/src/drivers/MaestroDriver.d.ts.map +1 -0
  43. package/dist/src/drivers/MaestroDriver.js +144 -0
  44. package/dist/src/drivers/MaestroDriver.js.map +1 -0
  45. package/dist/src/drivers/WebDriver.d.ts +21 -0
  46. package/dist/src/drivers/WebDriver.d.ts.map +1 -0
  47. package/dist/src/drivers/WebDriver.js +57 -0
  48. package/dist/src/drivers/WebDriver.js.map +1 -0
  49. package/dist/src/hooks/browser.hooks.d.ts +2 -0
  50. package/dist/src/hooks/browser.hooks.d.ts.map +1 -0
  51. package/dist/src/hooks/browser.hooks.js +15 -0
  52. package/dist/src/hooks/browser.hooks.js.map +1 -0
  53. package/dist/src/hooks/database.hooks.d.ts +2 -0
  54. package/dist/src/hooks/database.hooks.d.ts.map +1 -0
  55. package/dist/src/hooks/database.hooks.js +11 -0
  56. package/dist/src/hooks/database.hooks.js.map +1 -0
  57. package/dist/src/hooks/desktop.hooks.d.ts +2 -0
  58. package/dist/src/hooks/desktop.hooks.d.ts.map +1 -0
  59. package/dist/src/hooks/desktop.hooks.js +15 -0
  60. package/dist/src/hooks/desktop.hooks.js.map +1 -0
  61. package/dist/src/hooks/flutterDesktop.hooks.d.ts +2 -0
  62. package/dist/src/hooks/flutterDesktop.hooks.d.ts.map +1 -0
  63. package/dist/src/hooks/flutterDesktop.hooks.js +26 -0
  64. package/dist/src/hooks/flutterDesktop.hooks.js.map +1 -0
  65. package/dist/src/hooks/index.d.ts +6 -0
  66. package/dist/src/hooks/index.d.ts.map +1 -0
  67. package/dist/src/hooks/index.js +25 -0
  68. package/dist/src/hooks/index.js.map +1 -0
  69. package/dist/src/hooks/maestro.hooks.d.ts +2 -0
  70. package/dist/src/hooks/maestro.hooks.d.ts.map +1 -0
  71. package/dist/src/hooks/maestro.hooks.js +8 -0
  72. package/dist/src/hooks/maestro.hooks.js.map +1 -0
  73. package/dist/src/index.d.ts +21 -0
  74. package/dist/src/index.d.ts.map +1 -0
  75. package/dist/src/index.js +30 -0
  76. package/dist/src/index.js.map +1 -0
  77. package/dist/src/pages/BasePage.d.ts +11 -0
  78. package/dist/src/pages/BasePage.d.ts.map +1 -0
  79. package/dist/src/pages/BasePage.js +22 -0
  80. package/dist/src/pages/BasePage.js.map +1 -0
  81. package/dist/src/scenarios/RemoteScenarioFetcher.d.ts +51 -0
  82. package/dist/src/scenarios/RemoteScenarioFetcher.d.ts.map +1 -0
  83. package/dist/src/scenarios/RemoteScenarioFetcher.js +162 -0
  84. package/dist/src/scenarios/RemoteScenarioFetcher.js.map +1 -0
  85. package/dist/src/scenarios/cli.d.ts +3 -0
  86. package/dist/src/scenarios/cli.d.ts.map +1 -0
  87. package/dist/src/scenarios/cli.js +26 -0
  88. package/dist/src/scenarios/cli.js.map +1 -0
  89. package/dist/src/support/logger.d.ts +3 -0
  90. package/dist/src/support/logger.d.ts.map +1 -0
  91. package/dist/src/support/logger.js +16 -0
  92. package/dist/src/support/logger.js.map +1 -0
  93. package/dist/src/support/retry.d.ts +7 -0
  94. package/dist/src/support/retry.d.ts.map +1 -0
  95. package/dist/src/support/retry.js +21 -0
  96. package/dist/src/support/retry.js.map +1 -0
  97. package/dist/src/world/ConductorWorld.d.ts +39 -0
  98. package/dist/src/world/ConductorWorld.d.ts.map +1 -0
  99. package/dist/src/world/ConductorWorld.js +112 -0
  100. package/dist/src/world/ConductorWorld.js.map +1 -0
  101. package/package.json +81 -4
@@ -0,0 +1,144 @@
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.MaestroDriver = void 0;
37
+ const child_process_1 = require("child_process");
38
+ const path = __importStar(require("path"));
39
+ class MaestroDriver {
40
+ config;
41
+ constructor(config) {
42
+ this.config = config;
43
+ }
44
+ async run(flowName, opts) {
45
+ const flowPath = path.resolve(this.config.mobile.flowsDir, `${flowName}.yaml`);
46
+ const timeoutMs = opts?.timeoutMs ?? this.config.mobile.timeoutMs;
47
+ const maestroBin = this.config.mobile.maestroBin ?? 'maestro';
48
+ const stream = process.env.DEBUG_MAESTRO !== '0' && process.env.DEBUG_MAESTRO !== 'false';
49
+ const args = ['test', flowPath];
50
+ if (opts?.reinstallDriver)
51
+ args.push('--reinstall-driver');
52
+ if (this.config.mobile.deviceId)
53
+ args.unshift('--device', this.config.mobile.deviceId);
54
+ if (opts?.env) {
55
+ for (const [k, v] of Object.entries(opts.env))
56
+ args.push('--env', `${k}=${v}`);
57
+ }
58
+ if (stream) {
59
+ const envSummary = opts?.env ? ' ' + Object.entries(opts.env).map(([k, v]) => `${k}=${v}`).join(' ') : '';
60
+ process.stderr.write(`\n[maestro] ▶ ${flowName}${envSummary}\n`);
61
+ }
62
+ return new Promise((resolve) => {
63
+ let output = '';
64
+ let buffer = '';
65
+ const proc = (0, child_process_1.spawn)(maestroBin, args, { env: process.env });
66
+ const onData = (chunk) => {
67
+ const text = chunk.toString();
68
+ output += text;
69
+ if (!stream)
70
+ return;
71
+ buffer += text;
72
+ const lines = buffer.split('\n');
73
+ buffer = lines.pop() ?? '';
74
+ for (const line of lines) {
75
+ if (line.trim())
76
+ process.stderr.write(`[maestro] ${line}\n`);
77
+ }
78
+ };
79
+ proc.stdout.on('data', onData);
80
+ proc.stderr.on('data', onData);
81
+ const timer = setTimeout(() => {
82
+ proc.kill('SIGTERM');
83
+ setTimeout(() => { try {
84
+ proc.kill('SIGKILL');
85
+ }
86
+ catch { } }, 2000);
87
+ if (stream)
88
+ process.stderr.write(`[maestro] ✖ ${flowName} — timeout after ${timeoutMs}ms\n`);
89
+ resolve({ success: false, output: output + '\nTimeout exceeded', exitCode: -1 });
90
+ }, timeoutMs);
91
+ proc.on('close', (code) => {
92
+ clearTimeout(timer);
93
+ if (stream && buffer.trim())
94
+ process.stderr.write(`[maestro] ${buffer}\n`);
95
+ const exitCode = code ?? -1;
96
+ const failed = exitCode !== 0 || output.includes('Flow Failed');
97
+ if (stream)
98
+ process.stderr.write(`[maestro] ${failed ? '✖' : '✔'} ${flowName} (exit=${exitCode})\n`);
99
+ resolve({ success: !failed, output, exitCode });
100
+ });
101
+ });
102
+ }
103
+ async runOrThrow(flowName, opts) {
104
+ const result = await this.run(flowName, opts);
105
+ if (!result.success) {
106
+ // Only retry with --reinstall-driver on real on-device gRPC crashes, NOT on our own timeout
107
+ const driverCrashed = /io\.grpc\.StatusRuntimeException: UNAVAILABLE|Command failed \(tcp:\d+\): closed/.test(result.output);
108
+ if (driverCrashed && !opts?.reinstallDriver) {
109
+ process.stderr.write(`[maestro] ⚠ device driver crashed — retrying with --reinstall-driver\n`);
110
+ const retry = await this.run(flowName, { ...opts, reinstallDriver: true });
111
+ if (retry.success)
112
+ return retry;
113
+ }
114
+ throw new Error(`Maestro flow "${flowName}" failed:\n${result.output}`);
115
+ }
116
+ return result;
117
+ }
118
+ async takeScreenshot(name) {
119
+ const outputDir = 'reports/screenshots';
120
+ const screenshotPath = path.resolve(outputDir, `${name}.png`);
121
+ const deviceArgs = this.config.mobile.deviceId ? ['-s', this.config.mobile.deviceId] : [];
122
+ const adb = process.env.ANDROID_HOME
123
+ ? path.join(process.env.ANDROID_HOME, 'platform-tools', 'adb')
124
+ : 'adb';
125
+ return new Promise((resolve, reject) => {
126
+ const proc = (0, child_process_1.spawn)(adb, [...deviceArgs, 'exec-out', 'screencap', '-p'], { env: process.env });
127
+ const chunks = [];
128
+ proc.stdout.on('data', (chunk) => chunks.push(chunk));
129
+ proc.on('close', (code) => {
130
+ if (code === 0 && chunks.length > 0) {
131
+ const fs = require('fs');
132
+ fs.mkdirSync(outputDir, { recursive: true });
133
+ fs.writeFileSync(screenshotPath, Buffer.concat(chunks));
134
+ resolve(screenshotPath);
135
+ }
136
+ else {
137
+ reject(new Error(`adb screencap failed with code ${code}`));
138
+ }
139
+ });
140
+ });
141
+ }
142
+ }
143
+ exports.MaestroDriver = MaestroDriver;
144
+ //# sourceMappingURL=MaestroDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MaestroDriver.js","sourceRoot":"","sources":["../../../src/drivers/MaestroDriver.ts"],"names":[],"mappings":"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"}
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=browser.hooks.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=database.hooks.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=desktop.hooks.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=flutterDesktop.hooks.d.ts.map
@@ -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,6 @@
1
+ export * from './browser.hooks';
2
+ export * from './database.hooks';
3
+ export * from './maestro.hooks';
4
+ export * from './desktop.hooks';
5
+ export * from './flutterDesktop.hooks';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=maestro.hooks.d.ts.map
@@ -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"}