@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,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,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../../src/scenarios/cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const config_1 = require("../../config");
5
+ const RemoteScenarioFetcher_1 = require("./RemoteScenarioFetcher");
6
+ /**
7
+ * Prefetch step for the `remote` cucumber profile: fetch scenarios from the requ
8
+ * scenario API and reconstruct them into `.feature` files, then exit. Run before
9
+ * `cucumber-js --profile remote`.
10
+ */
11
+ async function main() {
12
+ const remote = config_1.config.remoteScenarios;
13
+ if (!remote) {
14
+ throw new Error('No `remoteScenarios` config found. Configure it in config/environments or via REMOTE_SCENARIOS_* env vars.');
15
+ }
16
+ const where = remote.project ? ` (project: ${remote.project})` : '';
17
+ console.log(`Fetching scenarios from ${remote.baseUrl}${where} ...`);
18
+ const scenarios = await (0, RemoteScenarioFetcher_1.fetchScenarios)(remote);
19
+ const result = await (0, RemoteScenarioFetcher_1.reconstructFeatureFiles)(scenarios, remote.outputDir);
20
+ console.log(`Wrote ${result.scenarios} scenario(s) across ${result.features} feature file(s) to ${result.dir}`);
21
+ }
22
+ main().catch((err) => {
23
+ console.error(`fetch-features failed: ${err.message}`);
24
+ process.exit(1);
25
+ });
26
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../../src/scenarios/cli.ts"],"names":[],"mappings":";;;AACA,yCAAsC;AACtC,mEAAkF;AAElF;;;;GAIG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,eAAM,CAAC,eAAe,CAAC;IACtC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,4GAA4G,CAC7G,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,2BAA2B,MAAM,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC;IAErE,MAAM,SAAS,GAAG,MAAM,IAAA,sCAAc,EAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,MAAM,IAAA,+CAAuB,EAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAE1E,OAAO,CAAC,GAAG,CACT,SAAS,MAAM,CAAC,SAAS,uBAAuB,MAAM,CAAC,QAAQ,uBAAuB,MAAM,CAAC,GAAG,EAAE,CACnG,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,KAAK,CAAC,0BAA2B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import pino from 'pino';
2
+ export declare function createLogger(name: string): pino.Logger<never, boolean>;
3
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/support/logger.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,+BAOxC"}
@@ -0,0 +1,16 @@
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.createLogger = createLogger;
7
+ const pino_1 = __importDefault(require("pino"));
8
+ function createLogger(name) {
9
+ const isDev = process.env.NODE_ENV !== 'production';
10
+ return (0, pino_1.default)({
11
+ name,
12
+ level: process.env.LOG_LEVEL ?? 'info',
13
+ transport: isDev ? { target: 'pino-pretty', options: { colorize: true } } : undefined
14
+ });
15
+ }
16
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/support/logger.ts"],"names":[],"mappings":";;;;;AAEA,oCAOC;AATD,gDAAwB;AAExB,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,CAAC;IACpD,OAAO,IAAA,cAAI,EAAC;QACV,IAAI;QACJ,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,MAAM;QACtC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS;KACtF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface RetryOptions {
2
+ attempts?: number;
3
+ delayMs?: number;
4
+ backoff?: 'fixed' | 'exponential';
5
+ }
6
+ export declare function retry<T>(fn: () => Promise<T>, opts?: RetryOptions): Promise<T>;
7
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../../src/support/retry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,GAAG,aAAa,CAAC;CACnC;AAED,wBAAsB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,GAAE,YAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAiBxF"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retry = retry;
4
+ async function retry(fn, opts = {}) {
5
+ const { attempts = 3, delayMs = 1000, backoff = 'fixed' } = opts;
6
+ let lastError;
7
+ for (let i = 0; i < attempts; i++) {
8
+ try {
9
+ return await fn();
10
+ }
11
+ catch (err) {
12
+ lastError = err;
13
+ if (i < attempts - 1) {
14
+ const wait = backoff === 'exponential' ? delayMs * 2 ** i : delayMs;
15
+ await new Promise((r) => setTimeout(r, wait));
16
+ }
17
+ }
18
+ }
19
+ throw lastError;
20
+ }
21
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../../src/support/retry.ts"],"names":[],"mappings":";;AAMA,sBAiBC;AAjBM,KAAK,UAAU,KAAK,CAAI,EAAoB,EAAE,OAAqB,EAAE;IAC1E,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC;IACjE,IAAI,SAAkB,CAAC;IAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAG,CAAC;YAChB,IAAI,CAAC,GAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACrB,MAAM,IAAI,GAAG,OAAO,KAAK,aAAa,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;gBACpE,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { IWorldOptions, World } from '@cucumber/cucumber';
2
+ import { Page, APIRequestContext } from 'playwright';
3
+ import type { EnvironmentConfig } from '../../config/types';
4
+ import { WebDriver } from '../drivers/WebDriver';
5
+ import { ApiDriver } from '../drivers/ApiDriver';
6
+ import { MaestroDriver } from '../drivers/MaestroDriver';
7
+ import { DatabaseDriver } from '../drivers/DatabaseDriver';
8
+ import { JavaFxDriver } from 'javafx-driver';
9
+ import { FlutterDesktopDriver } from '../drivers/FlutterDesktopDriver';
10
+ export declare class ConductorWorld extends World {
11
+ readonly config: EnvironmentConfig;
12
+ readonly logger: import("pino").Logger<never, boolean>;
13
+ readonly data: Record<string, unknown>;
14
+ private _webDriver;
15
+ private _apiDriver;
16
+ private _maestroDriver;
17
+ private _dbDriver;
18
+ private _fxDriver;
19
+ private _flutterDesktopDriver;
20
+ constructor(options: IWorldOptions);
21
+ get web(): WebDriver;
22
+ get page(): Page;
23
+ get api(): ApiDriver;
24
+ get request(): APIRequestContext;
25
+ get maestro(): MaestroDriver;
26
+ get fx(): JavaFxDriver;
27
+ get isFxLaunched(): boolean;
28
+ closeFx(): Promise<void>;
29
+ get flutterDesktop(): FlutterDesktopDriver;
30
+ get isFlutterDesktopLaunched(): boolean;
31
+ closeFlutterDesktop(): Promise<void>;
32
+ setDb(driver: DatabaseDriver): void;
33
+ get db(): DatabaseDriver;
34
+ get hasDb(): boolean;
35
+ closeWeb(): Promise<void>;
36
+ disposeApi(): Promise<void>;
37
+ disconnectDb(): Promise<void>;
38
+ }
39
+ //# sourceMappingURL=ConductorWorld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConductorWorld.d.ts","sourceRoot":"","sources":["../../../src/world/ConductorWorld.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AAGvE,qBAAa,cAAe,SAAQ,KAAK;IACvC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAU;IAC5C,QAAQ,CAAC,MAAM,wCAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IAE5C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,UAAU,CAA0B;IAC5C,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,qBAAqB,CAAqC;gBAEtD,OAAO,EAAE,aAAa;IAMlC,IAAI,GAAG,IAAI,SAAS,CAGnB;IAED,IAAI,IAAI,IAAI,IAAI,CAEf;IAID,IAAI,GAAG,IAAI,SAAS,CAGnB;IAED,IAAI,OAAO,IAAI,iBAAiB,CAE/B;IAID,IAAI,OAAO,IAAI,aAAa,CAG3B;IAID,IAAI,EAAE,IAAI,YAAY,CAQrB;IAED,IAAI,YAAY,IAAI,OAAO,CAE1B;IAEK,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,IAAI,cAAc,IAAI,oBAAoB,CAQzC;IAED,IAAI,wBAAwB,IAAI,OAAO,CAEtC;IAEK,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAO1C,KAAK,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI;IAInC,IAAI,EAAE,IAAI,cAAc,CAGvB;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAIK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAK3B,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAMpC"}
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConductorWorld = void 0;
4
+ const cucumber_1 = require("@cucumber/cucumber");
5
+ const config_1 = require("../../config");
6
+ const WebDriver_1 = require("../drivers/WebDriver");
7
+ const ApiDriver_1 = require("../drivers/ApiDriver");
8
+ const MaestroDriver_1 = require("../drivers/MaestroDriver");
9
+ const javafx_driver_1 = require("javafx-driver");
10
+ const FlutterDesktopDriver_1 = require("../drivers/FlutterDesktopDriver");
11
+ const logger_1 = require("../support/logger");
12
+ class ConductorWorld extends cucumber_1.World {
13
+ config = config_1.config;
14
+ logger = (0, logger_1.createLogger)('conductor');
15
+ data = {};
16
+ _webDriver = null;
17
+ _apiDriver = null;
18
+ _maestroDriver = null;
19
+ _dbDriver = null;
20
+ _fxDriver = null;
21
+ _flutterDesktopDriver = null;
22
+ constructor(options) {
23
+ super(options);
24
+ }
25
+ // Web
26
+ get web() {
27
+ if (!this._webDriver)
28
+ this._webDriver = new WebDriver_1.WebDriver(this.config);
29
+ return this._webDriver;
30
+ }
31
+ get page() {
32
+ return this.web.page;
33
+ }
34
+ // API
35
+ get api() {
36
+ if (!this._apiDriver)
37
+ this._apiDriver = new ApiDriver_1.ApiDriver(this.config);
38
+ return this._apiDriver;
39
+ }
40
+ get request() {
41
+ return this.api.client;
42
+ }
43
+ // Mobile
44
+ get maestro() {
45
+ if (!this._maestroDriver)
46
+ this._maestroDriver = new MaestroDriver_1.MaestroDriver(this.config);
47
+ return this._maestroDriver;
48
+ }
49
+ // Desktop (JavaFX)
50
+ get fx() {
51
+ if (!this._fxDriver) {
52
+ if (!this.config.desktop) {
53
+ throw new Error('No desktop config. Set config.desktop with DesktopConfig.');
54
+ }
55
+ this._fxDriver = new javafx_driver_1.JavaFxDriver(this.config.desktop);
56
+ }
57
+ return this._fxDriver;
58
+ }
59
+ get isFxLaunched() {
60
+ return this._fxDriver?.isLaunched ?? false;
61
+ }
62
+ async closeFx() {
63
+ await this._fxDriver?.close();
64
+ this._fxDriver = null;
65
+ }
66
+ // Desktop (Flutter)
67
+ get flutterDesktop() {
68
+ if (!this._flutterDesktopDriver) {
69
+ if (!this.config.flutterDesktop) {
70
+ throw new Error('No flutterDesktop config. Set config.flutterDesktop with FlutterDesktopConfig.');
71
+ }
72
+ this._flutterDesktopDriver = new FlutterDesktopDriver_1.FlutterDesktopDriver(this.config);
73
+ }
74
+ return this._flutterDesktopDriver;
75
+ }
76
+ get isFlutterDesktopLaunched() {
77
+ return this._flutterDesktopDriver?.isLaunched ?? false;
78
+ }
79
+ async closeFlutterDesktop() {
80
+ await this._flutterDesktopDriver?.close();
81
+ this._flutterDesktopDriver = null;
82
+ }
83
+ // Database (plugin — user registers their adapter)
84
+ setDb(driver) {
85
+ this._dbDriver = driver;
86
+ }
87
+ get db() {
88
+ if (!this._dbDriver)
89
+ throw new Error('No DatabaseDriver registered. Call world.setDb(adapter) in a Before hook.');
90
+ return this._dbDriver;
91
+ }
92
+ get hasDb() {
93
+ return this._dbDriver !== null;
94
+ }
95
+ // Tear-down helpers (called by hooks)
96
+ async closeWeb() {
97
+ await this._webDriver?.close();
98
+ this._webDriver = null;
99
+ }
100
+ async disposeApi() {
101
+ await this._apiDriver?.dispose();
102
+ this._apiDriver = null;
103
+ }
104
+ async disconnectDb() {
105
+ if (this._dbDriver) {
106
+ await this._dbDriver.disconnect();
107
+ this._dbDriver = null;
108
+ }
109
+ }
110
+ }
111
+ exports.ConductorWorld = ConductorWorld;
112
+ //# sourceMappingURL=ConductorWorld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConductorWorld.js","sourceRoot":"","sources":["../../../src/world/ConductorWorld.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,83 @@
1
1
  {
2
2
  "name": "@nouhouari/conductor-e2e",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.9",
4
+ "description": "Multi-platform E2E test framework — web (Playwright), API, mobile (Maestro), desktop (JavaFX), and database in one Cucumber scenario",
5
+ "keywords": [
6
+ "e2e",
7
+ "testing",
8
+ "cucumber",
9
+ "bdd",
10
+ "playwright",
11
+ "maestro",
12
+ "flutter",
13
+ "javafx",
14
+ "multi-platform",
15
+ "test-framework"
16
+ ],
17
+ "author": "Nourreddine Houari",
18
+ "license": "MIT",
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/nouhouari/conductor.git"
22
+ },
23
+ "homepage": "https://github.com/nouhouari/conductor#readme",
24
+ "bugs": {
25
+ "url": "https://github.com/nouhouari/conductor/issues"
26
+ },
27
+ "workspaces": [
28
+ "example",
29
+ "mcp"
30
+ ],
31
+ "main": "dist/src/index.js",
32
+ "types": "dist/src/index.d.ts",
33
+ "bin": {
34
+ "conductor-fetch-features": "dist/src/scenarios/cli.js"
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "config",
39
+ "README.md",
40
+ "LICENSE",
41
+ "CHANGELOG.md"
42
+ ],
43
+ "scripts": {
44
+ "build": "tsc",
45
+ "clean": "rm -rf dist",
46
+ "prepublishOnly": "npm run clean && npm run build",
47
+ "test": "cucumber-js",
48
+ "test:dry-run": "cucumber-js --dry-run",
49
+ "flutter:build:macos": "cd apps/mobile && flutter build macos --profile -t lib/main_test.dart --dart-define=API_BASE_URL=http://localhost:3000/api --dart-define=DISABLE_SWIPE_GESTURES=true",
50
+ "report": "allure generate allure-results --clean -o allure-report",
51
+ "report:open": "allure open allure-report"
52
+ },
53
+ "exports": {
54
+ ".": {
55
+ "import": "./dist/src/index.js",
56
+ "require": "./dist/src/index.js",
57
+ "types": "./dist/src/index.d.ts"
58
+ }
59
+ },
60
+ "engines": {
61
+ "node": ">=18.0.0"
62
+ },
63
+ "dependencies": {
64
+ "@cucumber/cucumber": "^11.0.0",
65
+ "allure-commandline": "^2.27.0",
66
+ "allure-cucumberjs": "^3.0.0",
67
+ "dotenv": "^16.4.5",
68
+ "javafx-driver": "^0.2.2",
69
+ "pino": "^9.0.0",
70
+ "pino-pretty": "^11.0.0",
71
+ "playwright": "^1.44.0",
72
+ "ws": "^8.21.0"
73
+ },
74
+ "devDependencies": {
75
+ "@types/node": "^20.0.0",
76
+ "@types/ws": "^8.18.1",
77
+ "ts-node": "^10.9.0",
78
+ "typescript": "^5.4.0"
79
+ },
80
+ "publishConfig": {
81
+ "registry": "https://npm.pkg.github.com"
82
+ }
83
+ }