@e2edev/e2e 0.2.0 → 0.4.0

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 (242) hide show
  1. package/README.md +32 -3
  2. package/dist/agent/act.d.ts.map +1 -1
  3. package/dist/agent/act.js +124 -71
  4. package/dist/agent/act.js.map +1 -1
  5. package/dist/agent/actions.d.ts +15 -0
  6. package/dist/agent/actions.d.ts.map +1 -1
  7. package/dist/agent/actions.js +59 -1
  8. package/dist/agent/actions.js.map +1 -1
  9. package/dist/agent/default-agent.d.ts +34 -4
  10. package/dist/agent/default-agent.d.ts.map +1 -1
  11. package/dist/agent/default-agent.js +28 -150
  12. package/dist/agent/default-agent.js.map +1 -1
  13. package/dist/agent/derived.d.ts +17 -0
  14. package/dist/agent/derived.d.ts.map +1 -0
  15. package/dist/agent/derived.js +45 -0
  16. package/dist/agent/derived.js.map +1 -0
  17. package/dist/agent/executor.d.ts +122 -2
  18. package/dist/agent/executor.d.ts.map +1 -1
  19. package/dist/agent/executor.js.map +1 -1
  20. package/dist/agent/index.js +1 -1
  21. package/dist/agent/index.js.map +1 -1
  22. package/dist/agent/invocation.d.ts +4 -8
  23. package/dist/agent/invocation.d.ts.map +1 -1
  24. package/dist/agent/invocation.js +16 -42
  25. package/dist/agent/invocation.js.map +1 -1
  26. package/dist/agent/ledger.d.ts +14 -4
  27. package/dist/agent/ledger.d.ts.map +1 -1
  28. package/dist/agent/ledger.js +26 -5
  29. package/dist/agent/ledger.js.map +1 -1
  30. package/dist/agent/loop-guards.d.ts +14 -1
  31. package/dist/agent/loop-guards.d.ts.map +1 -1
  32. package/dist/agent/loop-guards.js +11 -8
  33. package/dist/agent/loop-guards.js.map +1 -1
  34. package/dist/agent/observation.d.ts +28 -7
  35. package/dist/agent/observation.d.ts.map +1 -1
  36. package/dist/agent/observation.js +52 -5
  37. package/dist/agent/observation.js.map +1 -1
  38. package/dist/agent/primitives.d.ts +86 -0
  39. package/dist/agent/primitives.d.ts.map +1 -0
  40. package/dist/agent/primitives.js +255 -0
  41. package/dist/agent/primitives.js.map +1 -0
  42. package/dist/agent/prompts.d.ts.map +1 -1
  43. package/dist/agent/prompts.js.map +1 -1
  44. package/dist/agent/public.d.ts +6 -3
  45. package/dist/agent/public.d.ts.map +1 -1
  46. package/dist/agent/public.js +4 -2
  47. package/dist/agent/public.js.map +1 -1
  48. package/dist/agent/replay.d.ts +1 -1
  49. package/dist/agent/replay.d.ts.map +1 -1
  50. package/dist/agent/replay.js +19 -2
  51. package/dist/agent/replay.js.map +1 -1
  52. package/dist/agent/step-cache.d.ts +5 -2
  53. package/dist/agent/step-cache.d.ts.map +1 -1
  54. package/dist/agent/step-cache.js +37 -5
  55. package/dist/agent/step-cache.js.map +1 -1
  56. package/dist/agent/tool-loop.d.ts +59 -5
  57. package/dist/agent/tool-loop.d.ts.map +1 -1
  58. package/dist/agent/tool-loop.js +77 -105
  59. package/dist/agent/tool-loop.js.map +1 -1
  60. package/dist/agent/tool.d.ts +11 -16
  61. package/dist/agent/tool.d.ts.map +1 -1
  62. package/dist/agent/tool.js +19 -13
  63. package/dist/agent/tool.js.map +1 -1
  64. package/dist/agent/usage.d.ts +27 -0
  65. package/dist/agent/usage.d.ts.map +1 -0
  66. package/dist/agent/usage.js +54 -0
  67. package/dist/agent/usage.js.map +1 -0
  68. package/dist/backend/index.d.ts +72 -6
  69. package/dist/backend/index.d.ts.map +1 -1
  70. package/dist/backend/index.js +4 -1
  71. package/dist/backend/index.js.map +1 -1
  72. package/dist/backend/session.d.ts.map +1 -1
  73. package/dist/backend/session.js +1 -0
  74. package/dist/backend/session.js.map +1 -1
  75. package/dist/backend/surface.d.ts +2 -0
  76. package/dist/backend/surface.d.ts.map +1 -1
  77. package/dist/backend/timing.d.ts +3 -0
  78. package/dist/backend/timing.d.ts.map +1 -0
  79. package/dist/backend/timing.js +8 -0
  80. package/dist/backend/timing.js.map +1 -0
  81. package/dist/cache/recorder.d.ts +2 -0
  82. package/dist/cache/recorder.d.ts.map +1 -1
  83. package/dist/cache/recorder.js +4 -1
  84. package/dist/cache/recorder.js.map +1 -1
  85. package/dist/cache/relocate.d.ts.map +1 -1
  86. package/dist/cache/relocate.js +11 -2
  87. package/dist/cache/relocate.js.map +1 -1
  88. package/dist/cache/trace.d.ts +11 -0
  89. package/dist/cache/trace.d.ts.map +1 -1
  90. package/dist/cache/trace.js +9 -0
  91. package/dist/cache/trace.js.map +1 -1
  92. package/dist/cli/index.d.ts.map +1 -1
  93. package/dist/cli/index.js +32 -22
  94. package/dist/cli/index.js.map +1 -1
  95. package/dist/cli/init/backends.d.ts +75 -0
  96. package/dist/cli/init/backends.d.ts.map +1 -0
  97. package/dist/cli/init/backends.js +98 -0
  98. package/dist/cli/init/backends.js.map +1 -0
  99. package/dist/cli/init/package.d.ts +43 -0
  100. package/dist/cli/init/package.d.ts.map +1 -0
  101. package/dist/cli/init/package.js +64 -0
  102. package/dist/cli/init/package.js.map +1 -0
  103. package/dist/cli/init/scaffold.d.ts +12 -0
  104. package/dist/cli/init/scaffold.d.ts.map +1 -0
  105. package/dist/cli/init/scaffold.js +36 -0
  106. package/dist/cli/init/scaffold.js.map +1 -0
  107. package/dist/cli/init.d.ts +8 -3
  108. package/dist/cli/init.d.ts.map +1 -1
  109. package/dist/cli/init.js +99 -72
  110. package/dist/cli/init.js.map +1 -1
  111. package/dist/cli/signals.d.ts +23 -0
  112. package/dist/cli/signals.d.ts.map +1 -0
  113. package/dist/cli/signals.js +42 -0
  114. package/dist/cli/signals.js.map +1 -0
  115. package/dist/collect/registry.d.ts +14 -4
  116. package/dist/collect/registry.d.ts.map +1 -1
  117. package/dist/collect/registry.js +10 -10
  118. package/dist/collect/registry.js.map +1 -1
  119. package/dist/config/app.d.ts +50 -0
  120. package/dist/config/app.d.ts.map +1 -0
  121. package/dist/config/app.js +168 -0
  122. package/dist/config/app.js.map +1 -0
  123. package/dist/config/esm.d.ts +4 -0
  124. package/dist/config/esm.d.ts.map +1 -0
  125. package/dist/config/esm.js +35 -0
  126. package/dist/config/esm.js.map +1 -0
  127. package/dist/config/load.d.ts.map +1 -1
  128. package/dist/config/load.js +4 -0
  129. package/dist/config/load.js.map +1 -1
  130. package/dist/config/resolve.d.ts +6 -16
  131. package/dist/config/resolve.d.ts.map +1 -1
  132. package/dist/config/resolve.js +18 -110
  133. package/dist/config/resolve.js.map +1 -1
  134. package/dist/config/validate.d.ts +3 -1
  135. package/dist/config/validate.d.ts.map +1 -1
  136. package/dist/config/validate.js +17 -1
  137. package/dist/config/validate.js.map +1 -1
  138. package/dist/index.d.ts +3 -2
  139. package/dist/index.d.ts.map +1 -1
  140. package/dist/index.js +1 -1
  141. package/dist/index.js.map +1 -1
  142. package/dist/internal/errors.d.ts +9 -0
  143. package/dist/internal/errors.d.ts.map +1 -1
  144. package/dist/internal/errors.js +15 -0
  145. package/dist/internal/errors.js.map +1 -1
  146. package/dist/internal/time.d.ts +10 -0
  147. package/dist/internal/time.d.ts.map +1 -1
  148. package/dist/internal/time.js +45 -0
  149. package/dist/internal/time.js.map +1 -1
  150. package/dist/internal/urls.d.ts +2 -1
  151. package/dist/internal/urls.d.ts.map +1 -1
  152. package/dist/internal/urls.js +22 -2
  153. package/dist/internal/urls.js.map +1 -1
  154. package/dist/locator/engine.d.ts +5 -3
  155. package/dist/locator/engine.d.ts.map +1 -1
  156. package/dist/locator/engine.js +7 -6
  157. package/dist/locator/engine.js.map +1 -1
  158. package/dist/report/build.d.ts +0 -1
  159. package/dist/report/build.d.ts.map +1 -1
  160. package/dist/report/build.js +2 -3
  161. package/dist/report/build.js.map +1 -1
  162. package/dist/report/junit.d.ts +11 -0
  163. package/dist/report/junit.d.ts.map +1 -0
  164. package/dist/report/junit.js +202 -0
  165. package/dist/report/junit.js.map +1 -0
  166. package/dist/report/list.d.ts +2 -0
  167. package/dist/report/list.d.ts.map +1 -1
  168. package/dist/report/list.js +15 -0
  169. package/dist/report/list.js.map +1 -1
  170. package/dist/report/live-status.d.ts.map +1 -1
  171. package/dist/report/live-status.js +2 -1
  172. package/dist/report/live-status.js.map +1 -1
  173. package/dist/report/write.d.ts +2 -0
  174. package/dist/report/write.d.ts.map +1 -1
  175. package/dist/report/write.js +7 -3
  176. package/dist/report/write.js.map +1 -1
  177. package/dist/run/budget.d.ts +25 -0
  178. package/dist/run/budget.d.ts.map +1 -0
  179. package/dist/run/budget.js +38 -0
  180. package/dist/run/budget.js.map +1 -0
  181. package/dist/run/events.d.ts +15 -0
  182. package/dist/run/events.d.ts.map +1 -1
  183. package/dist/run/events.js.map +1 -1
  184. package/dist/run/execute.d.ts +8 -0
  185. package/dist/run/execute.d.ts.map +1 -1
  186. package/dist/run/execute.js +53 -8
  187. package/dist/run/execute.js.map +1 -1
  188. package/dist/run/fixture-legacy.d.ts +36 -0
  189. package/dist/run/fixture-legacy.d.ts.map +1 -0
  190. package/dist/run/fixture-legacy.js +143 -0
  191. package/dist/run/fixture-legacy.js.map +1 -0
  192. package/dist/run/fixture-recording.d.ts +15 -0
  193. package/dist/run/fixture-recording.d.ts.map +1 -0
  194. package/dist/run/fixture-recording.js +75 -0
  195. package/dist/run/fixture-recording.js.map +1 -0
  196. package/dist/run/fixtures.d.ts +6 -3
  197. package/dist/run/fixtures.d.ts.map +1 -1
  198. package/dist/run/fixtures.js +32 -166
  199. package/dist/run/fixtures.js.map +1 -1
  200. package/dist/run/in-process.d.ts.map +1 -1
  201. package/dist/run/in-process.js +11 -2
  202. package/dist/run/in-process.js.map +1 -1
  203. package/dist/run/managed-process.d.ts +49 -0
  204. package/dist/run/managed-process.d.ts.map +1 -0
  205. package/dist/run/managed-process.js +202 -0
  206. package/dist/run/managed-process.js.map +1 -0
  207. package/dist/run/realm.d.ts +43 -8
  208. package/dist/run/realm.d.ts.map +1 -1
  209. package/dist/run/realm.js +67 -24
  210. package/dist/run/realm.js.map +1 -1
  211. package/dist/run/runner.d.ts +11 -1
  212. package/dist/run/runner.d.ts.map +1 -1
  213. package/dist/run/runner.js +151 -33
  214. package/dist/run/runner.js.map +1 -1
  215. package/dist/run/scheduler.d.ts +8 -0
  216. package/dist/run/scheduler.d.ts.map +1 -1
  217. package/dist/run/scheduler.js +37 -3
  218. package/dist/run/scheduler.js.map +1 -1
  219. package/dist/run/serial.d.ts +2 -0
  220. package/dist/run/serial.d.ts.map +1 -1
  221. package/dist/run/serial.js +10 -0
  222. package/dist/run/serial.js.map +1 -1
  223. package/dist/run/steps.d.ts +1 -1
  224. package/dist/run/steps.d.ts.map +1 -1
  225. package/dist/run/steps.js +12 -9
  226. package/dist/run/steps.js.map +1 -1
  227. package/dist/run/worker/entry.js +17 -2
  228. package/dist/run/worker/entry.js.map +1 -1
  229. package/dist/run/worker/protocol.d.ts +9 -1
  230. package/dist/run/worker/protocol.d.ts.map +1 -1
  231. package/dist/run/worker/protocol.js.map +1 -1
  232. package/dist/run/worker/session.d.ts +12 -0
  233. package/dist/run/worker/session.d.ts.map +1 -1
  234. package/dist/run/worker/session.js +23 -1
  235. package/dist/run/worker/session.js.map +1 -1
  236. package/dist/types.d.ts +33 -2
  237. package/dist/types.d.ts.map +1 -1
  238. package/package.json +2 -2
  239. package/dist/run/app-process.d.ts +0 -18
  240. package/dist/run/app-process.d.ts.map +0 -1
  241. package/dist/run/app-process.js +0 -112
  242. package/dist/run/app-process.js.map +0 -1
package/dist/cli/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Command, CommanderError, InvalidArgumentError } from 'commander';
3
3
  import { run } from '../run/runner.js';
4
4
  import { init } from './init.js';
5
+ import { SignalLadder } from './signals.js';
5
6
  /** Shape check only; the config resolver applies each flag's bounds. */
6
7
  function parseNonNegativeInt(value) {
7
8
  const parsed = Number(value);
@@ -16,7 +17,7 @@ function parseList(value) {
16
17
  .map((item) => item.trim())
17
18
  .filter((item) => item !== '');
18
19
  }
19
- const REPORTERS = ['list', 'json'];
20
+ const REPORTERS = ['list', 'json', 'junit'];
20
21
  function isReporter(value) {
21
22
  return REPORTERS.includes(value);
22
23
  }
@@ -32,8 +33,8 @@ function createProgram() {
32
33
  program.exitOverride();
33
34
  program
34
35
  .command('init')
35
- .description('scaffold e2e.config.ts, an example test, and .gitignore entries')
36
- .option('-y, --yes', 'skip confirmation prompts')
36
+ .description('scaffold an ESM package, e2e.config.ts, an example test, and .gitignore entries')
37
+ .option('-y, --yes', 'skip prompts; enable AI without a backend or installation')
37
38
  .action(async (options) => {
38
39
  process.exitCode = await init(process.cwd(), options);
39
40
  });
@@ -48,7 +49,7 @@ function createProgram() {
48
49
  .option('--headed', 'request visible UI when the backend supports it')
49
50
  .option('--retries <n>', 'replace resolved retry count', parseNonNegativeInt)
50
51
  .option('--workers <n>', 'replace worker count', parseNonNegativeInt)
51
- .option('--reporter <ids>', 'comma-separated reporters: list, json', parseList)
52
+ .option('--reporter <ids>', 'comma-separated reporters: list, json, junit', parseList)
52
53
  .option('--artifacts <dir>', 'artifact root, default .e2e/artifacts')
53
54
  .option('--no-cache', 'run without the trace cache, overriding the config')
54
55
  .option('--pass-with-no-tests', 'allow zero runnable ordinary test-target pairs')
@@ -67,24 +68,33 @@ function createProgram() {
67
68
  process.exitCode = 2;
68
69
  return;
69
70
  }
70
- const outcome = await run({
71
- files,
72
- configPath: options.config,
73
- targetIds: options.target,
74
- tags: options.tag,
75
- tagMode,
76
- headed: options.headed,
77
- retries: options.retries,
78
- workers: options.workers,
79
- // Validated above; the filter is the type narrowing, not a second check.
80
- reporters: reporter?.filter(isReporter),
81
- artifactsDir: options.artifacts,
82
- noCache: options.cache === false,
83
- passWithNoTests: options.passWithNoTests,
84
- debug: options.debug,
85
- aiTrace: options.aiTrace,
86
- });
87
- process.exitCode = outcome.exitCode;
71
+ const signals = new SignalLadder();
72
+ const release = signals.arm();
73
+ try {
74
+ const outcome = await run({
75
+ files,
76
+ configPath: options.config,
77
+ targetIds: options.target,
78
+ tags: options.tag,
79
+ tagMode,
80
+ headed: options.headed,
81
+ retries: options.retries,
82
+ workers: options.workers,
83
+ // Validated above; the filter is the type narrowing, not a second check.
84
+ reporters: reporter?.filter(isReporter),
85
+ artifactsDir: options.artifacts,
86
+ noCache: options.cache === false,
87
+ passWithNoTests: options.passWithNoTests,
88
+ debug: options.debug,
89
+ aiTrace: options.aiTrace,
90
+ interruptSignal: signals.interruptSignal,
91
+ forceSignal: signals.forceSignal,
92
+ });
93
+ process.exitCode = outcome.exitCode;
94
+ }
95
+ finally {
96
+ release();
97
+ }
88
98
  });
89
99
  return program;
90
100
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ /** CLI scaffold presets. Backend packages are referenced as generated source, never imported. */
2
+ export interface BackendPreset {
3
+ readonly id: string;
4
+ readonly label: string;
5
+ readonly hint: string;
6
+ readonly dependencies: Readonly<Record<string, string>>;
7
+ readonly imports: readonly string[];
8
+ readonly config: string;
9
+ readonly example: string;
10
+ readonly aiExample?: string;
11
+ readonly runCommand: string;
12
+ }
13
+ /** Builds prompt choices and scaffolds with defaults for the machine running init. */
14
+ export declare function getBackendPresets(): readonly [{
15
+ readonly id: 'none';
16
+ readonly label: 'None';
17
+ readonly hint: 'HTTP tests or your own backend';
18
+ readonly dependencies: {};
19
+ readonly imports: readonly [];
20
+ readonly config: ` app: { url: process.env.APP_URL ?? 'http://localhost:3000' },
21
+ // Add a backend here when your tests need to drive an app.
22
+ targets: [{ name: 'default', platform: 'custom' }],`;
23
+ readonly example: `import { test, expect } from '@e2edev/e2e';
24
+
25
+ test('app responds', async () => {
26
+ const response = await fetch(process.env.APP_URL ?? 'http://localhost:3000');
27
+ expect(response.ok).toBe(true);
28
+ });
29
+ `;
30
+ readonly runCommand: 'APP_URL=http://localhost:3000 npx --no-install e2e run';
31
+ }, {
32
+ readonly id: 'playwright';
33
+ readonly label: 'Playwright';
34
+ readonly hint: 'browser testing';
35
+ readonly dependencies: {
36
+ readonly '@e2edev/playwright': 'beta';
37
+ };
38
+ readonly imports: readonly ["import { playwright } from '@e2edev/playwright';"];
39
+ readonly config: ` app: { url: process.env.APP_URL ?? 'http://localhost:3000' },
40
+ targets: [{ name: 'web', platform: 'web', backend: playwright() }],`;
41
+ readonly example: `import { test } from '@e2edev/playwright';
42
+ import { expect } from '@e2edev/e2e';
43
+
44
+ test('app opens', async ({ app, web }) => {
45
+ await app.open();
46
+ await expect(web).toHaveURL('/');
47
+ });
48
+ `;
49
+ readonly aiExample: `
50
+ // Runs when E2E_MODEL and E2E_MODEL_API_KEY are set:
51
+ // test('the agent drives a flow', async ({ app, agent }) => {
52
+ // await app.open();
53
+ // await agent.act('one goal in plain language');
54
+ // await agent.assert('one question about the screen');
55
+ // });
56
+ `;
57
+ readonly runCommand: 'APP_URL=http://localhost:3000 npx --no-install e2e run';
58
+ }, {
59
+ readonly id: 'agent-device';
60
+ readonly label: 'agent-device';
61
+ readonly hint: 'mobile testing: iOS and Android';
62
+ readonly dependencies: {
63
+ readonly '@e2edev/agent-device': 'beta';
64
+ };
65
+ readonly imports: readonly ["import { agentDevice } from '@e2edev/agent-device';"];
66
+ readonly config: " // Requires Xcode and an iOS simulator. Replace Settings with your app's bundle ID.\n targets: [{ name: 'ios', platform: 'ios', backend: agentDevice({ platform: 'ios', app: 'Settings' }) }],\n workers: 1," | " // Requires the Android SDK and an emulator. Replace com.android.settings with your app's package.\n targets: [{ name: 'android', platform: 'android', backend: agentDevice({ platform: 'android', app: 'com.android.settings' }) }],\n workers: 1,";
67
+ readonly example: "import { test } from '@e2edev/agent-device';\nimport { expect } from '@e2edev/e2e';\n\ntest('Settings opens', async ({ screen }) => {\n await expect(screen.getByRole('button', { name: 'General' })).toBeVisible();\n});\n" | "import { test } from '@e2edev/agent-device';\nimport { expect } from '@e2edev/e2e';\n\ntest('Settings opens', async ({ screen }) => {\n await expect(screen.getByText('Network & internet')).toBeVisible();\n});\n";
68
+ readonly aiExample: "\n// Runs when E2E_MODEL and E2E_MODEL_API_KEY are set:\n// test('the agent opens General', async ({ agent, device }) => {\n// await agent.act('open General settings');\n// await expect(device.locator('role=NavigationBar id=General')).toBeVisible();\n// });\n" | "\n// Runs when E2E_MODEL and E2E_MODEL_API_KEY are set:\n// test('the agent opens Network settings', async ({ agent, device }) => {\n// await agent.act('open Network & internet settings');\n// await expect(device.locator('id=com.android.settings:id/collapsing_toolbar')).toHaveText('Network & internet');\n// });\n";
69
+ readonly runCommand: 'npx --no-install e2e run';
70
+ }];
71
+ export type BackendId = ReturnType<typeof getBackendPresets>[number]['id'];
72
+ export declare const DEFAULT_BACKEND_ID = "none";
73
+ /** Resolves a preset with the common shape used by scaffold generation. */
74
+ export declare function getBackendPreset(id: BackendId): BackendPreset;
75
+ //# sourceMappingURL=backends.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backends.d.ts","sourceRoot":"","sources":["../../../src/cli/init/backends.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAIjG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,sFAAsF;AACtF,wBAAgB,iBAAiB;iBAIvB,MAAM;oBACH,MAAM;mBACP,gCAAgC;;;qBAG9B;;sDAEwC;sBACvC;;;;;;CAMd;yBACiB,wDAAwD;;iBAGhE,YAAY;oBACT,YAAY;mBACb,iBAAiB;;iBACP,oBAAoB,EAAE,MAAM;;;qBAEpC;sEACwD;sBACvD;;;;;;;CAOd;wBACgB;;;;;;;CAOhB;yBACiB,wDAAwD;;iBAGhE,cAAc;oBACX,cAAc;mBACf,iCAAiC;;iBACvB,sBAAsB,EAAE,MAAM;;;;;;yBA+BlC,0BAA0B;GAG3C;AAED,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAC3E,eAAO,MAAM,kBAAkB,SAA6B,CAAC;AAE7D,2EAA2E;AAC3E,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,SAAS,GAAG,aAAa,CAI7D"}
@@ -0,0 +1,98 @@
1
+ /** CLI scaffold presets. Backend packages are referenced as generated source, never imported. */
2
+ import os from 'node:os';
3
+ /** Builds prompt choices and scaffolds with defaults for the machine running init. */
4
+ export function getBackendPresets() {
5
+ const ios = os.platform() === 'darwin';
6
+ return [
7
+ {
8
+ id: 'none',
9
+ label: 'None',
10
+ hint: 'HTTP tests or your own backend',
11
+ dependencies: {},
12
+ imports: [],
13
+ config: ` app: { url: process.env.APP_URL ?? 'http://localhost:3000' },
14
+ // Add a backend here when your tests need to drive an app.
15
+ targets: [{ name: 'default', platform: 'custom' }],`,
16
+ example: `import { test, expect } from '@e2edev/e2e';
17
+
18
+ test('app responds', async () => {
19
+ const response = await fetch(process.env.APP_URL ?? 'http://localhost:3000');
20
+ expect(response.ok).toBe(true);
21
+ });
22
+ `,
23
+ runCommand: 'APP_URL=http://localhost:3000 npx --no-install e2e run',
24
+ },
25
+ {
26
+ id: 'playwright',
27
+ label: 'Playwright',
28
+ hint: 'browser testing',
29
+ dependencies: { '@e2edev/playwright': 'beta' },
30
+ imports: ["import { playwright } from '@e2edev/playwright';"],
31
+ config: ` app: { url: process.env.APP_URL ?? 'http://localhost:3000' },
32
+ targets: [{ name: 'web', platform: 'web', backend: playwright() }],`,
33
+ example: `import { test } from '@e2edev/playwright';
34
+ import { expect } from '@e2edev/e2e';
35
+
36
+ test('app opens', async ({ app, web }) => {
37
+ await app.open();
38
+ await expect(web).toHaveURL('/');
39
+ });
40
+ `,
41
+ aiExample: `
42
+ // Runs when E2E_MODEL and E2E_MODEL_API_KEY are set:
43
+ // test('the agent drives a flow', async ({ app, agent }) => {
44
+ // await app.open();
45
+ // await agent.act('one goal in plain language');
46
+ // await agent.assert('one question about the screen');
47
+ // });
48
+ `,
49
+ runCommand: 'APP_URL=http://localhost:3000 npx --no-install e2e run',
50
+ },
51
+ {
52
+ id: 'agent-device',
53
+ label: 'agent-device',
54
+ hint: 'mobile testing: iOS and Android',
55
+ dependencies: { '@e2edev/agent-device': 'beta' },
56
+ imports: ["import { agentDevice } from '@e2edev/agent-device';"],
57
+ config: ios
58
+ ? ` // Requires Xcode and an iOS simulator. Replace Settings with your app's bundle ID.
59
+ targets: [{ name: 'ios', platform: 'ios', backend: agentDevice({ platform: 'ios', app: 'Settings' }) }],
60
+ workers: 1,`
61
+ : ` // Requires the Android SDK and an emulator. Replace com.android.settings with your app's package.
62
+ targets: [{ name: 'android', platform: 'android', backend: agentDevice({ platform: 'android', app: 'com.android.settings' }) }],
63
+ workers: 1,`,
64
+ example: `import { test } from '@e2edev/agent-device';
65
+ import { expect } from '@e2edev/e2e';
66
+
67
+ test('Settings opens', async ({ screen }) => {
68
+ await expect(${ios ? "screen.getByRole('button', { name: 'General' })" : "screen.getByText('Network & internet')"}).toBeVisible();
69
+ });
70
+ `,
71
+ aiExample: ios
72
+ ? `
73
+ // Runs when E2E_MODEL and E2E_MODEL_API_KEY are set:
74
+ // test('the agent opens General', async ({ agent, device }) => {
75
+ // await agent.act('open General settings');
76
+ // await expect(device.locator('role=NavigationBar id=General')).toBeVisible();
77
+ // });
78
+ `
79
+ : `
80
+ // Runs when E2E_MODEL and E2E_MODEL_API_KEY are set:
81
+ // test('the agent opens Network settings', async ({ agent, device }) => {
82
+ // await agent.act('open Network & internet settings');
83
+ // await expect(device.locator('id=com.android.settings:id/collapsing_toolbar')).toHaveText('Network & internet');
84
+ // });
85
+ `,
86
+ runCommand: 'npx --no-install e2e run',
87
+ },
88
+ ];
89
+ }
90
+ export const DEFAULT_BACKEND_ID = 'none';
91
+ /** Resolves a preset with the common shape used by scaffold generation. */
92
+ export function getBackendPreset(id) {
93
+ const preset = getBackendPresets().find((entry) => entry.id === id);
94
+ if (preset === undefined)
95
+ throw new Error(`unknown backend: ${id}`);
96
+ return preset;
97
+ }
98
+ //# sourceMappingURL=backends.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backends.js","sourceRoot":"","sources":["../../../src/cli/init/backends.ts"],"names":[],"mappings":"AAAA,iGAAiG;AAEjG,OAAO,EAAE,MAAM,SAAS,CAAC;AAczB,sFAAsF;AACtF,MAAM,UAAU,iBAAiB;IAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,QAAQ,CAAC;IACvC,OAAO;QACL;YACE,EAAE,EAAE,MAAM;YACV,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,gCAAgC;YACtC,YAAY,EAAE,EAAE;YAChB,OAAO,EAAE,EAAE;YACX,MAAM,EAAE;;sDAEwC;YAChD,OAAO,EAAE;;;;;;CAMd;YACK,UAAU,EAAE,wDAAwD;SACrE;QACD;YACE,EAAE,EAAE,YAAY;YAChB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,iBAAiB;YACvB,YAAY,EAAE,EAAE,oBAAoB,EAAE,MAAM,EAAE;YAC9C,OAAO,EAAE,CAAC,kDAAkD,CAAC;YAC7D,MAAM,EAAE;sEACwD;YAChE,OAAO,EAAE;;;;;;;CAOd;YACK,SAAS,EAAE;;;;;;;CAOhB;YACK,UAAU,EAAE,wDAAwD;SACrE;QACD;YACE,EAAE,EAAE,cAAc;YAClB,KAAK,EAAE,cAAc;YACrB,IAAI,EAAE,iCAAiC;YACvC,YAAY,EAAE,EAAE,sBAAsB,EAAE,MAAM,EAAE;YAChD,OAAO,EAAE,CAAC,qDAAqD,CAAC;YAChE,MAAM,EAAE,GAAG;gBACT,CAAC,CAAC;;cAEI;gBACN,CAAC,CAAC;;cAEI;YACR,OAAO,EAAE;;;;iBAIE,GAAG,CAAC,CAAC,CAAC,iDAAiD,CAAC,CAAC,CAAC,wCAAwC;;CAElH;YACK,SAAS,EAAE,GAAG;gBACZ,CAAC,CAAC;;;;;;CAMT;gBACO,CAAC,CAAC;;;;;;CAMT;YACK,UAAU,EAAE,0BAA0B;SACvC;KAC0C,CAAC;AAChD,CAAC;AAGD,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAA0B,CAAC;AAE7D,2EAA2E;AAC3E,MAAM,UAAU,gBAAgB,CAAC,EAAa;IAC5C,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACpE,IAAI,MAAM,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IACpE,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,43 @@
1
+ /** package.json reading, dependency additions, and package-manager detection for `e2e init`. */
2
+ import { z } from 'zod';
3
+ declare const packageSchema: z.ZodObject<{
4
+ dependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
5
+ devDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
6
+ peerDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
7
+ optionalDependencies: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
8
+ packageManager: z.ZodOptional<z.ZodString>;
9
+ }, z.core.$loose>;
10
+ type PackageManifest = z.infer<typeof packageSchema>;
11
+ /**
12
+ * Reads and validates the manifest, keeping its original text so edits can
13
+ * preserve formatting. A missing manifest starts as a private ESM package.
14
+ */
15
+ export declare function readPackage(cwd: string): {
16
+ original: string | undefined;
17
+ manifest: {
18
+ [x: string]: unknown;
19
+ dependencies?: Record<string, string> | undefined;
20
+ devDependencies?: Record<string, string> | undefined;
21
+ peerDependencies?: Record<string, string> | undefined;
22
+ optionalDependencies?: Record<string, string> | undefined;
23
+ packageManager?: string | undefined;
24
+ };
25
+ };
26
+ /** Adds only missing dependencies to devDependencies and returns what was added. */
27
+ export declare function addDependencies(manifest: PackageManifest, dependencies: Readonly<Record<string, string>>): {
28
+ manifest: {
29
+ [x: string]: unknown;
30
+ dependencies?: Record<string, string> | undefined;
31
+ devDependencies?: Record<string, string> | undefined;
32
+ peerDependencies?: Record<string, string> | undefined;
33
+ optionalDependencies?: Record<string, string> | undefined;
34
+ packageManager?: string | undefined;
35
+ };
36
+ additions: [string, string][];
37
+ };
38
+ /** The `packageManager` field wins, then a lockfile, then the manager that invoked the CLI, then npm. */
39
+ export declare function detectPackageManager(cwd: string, manifest: PackageManifest): string;
40
+ /** Serializes with the original manifest's indentation and newline convention. */
41
+ export declare function serializePackage(manifest: PackageManifest, original: string | undefined): string;
42
+ export {};
43
+ //# sourceMappingURL=package.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.d.ts","sourceRoot":"","sources":["../../../src/cli/init/package.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAIhG,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,QAAA,MAAM,aAAa;;;;;;iBAMjB,CAAC;AACH,KAAK,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAWrD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM;;;;;;;;;;EAKtC;AAQD,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;;;;;;;;;;EAOxG;AAED,yGAAyG;AACzG,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,MAAM,CAQnF;AAED,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAIhG"}
@@ -0,0 +1,64 @@
1
+ /** package.json reading, dependency additions, and package-manager detection for `e2e init`. */
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import path from 'node:path';
4
+ import { z } from 'zod';
5
+ const dependencyBlock = z.record(z.string(), z.string()).optional();
6
+ const packageSchema = z.looseObject({
7
+ dependencies: dependencyBlock,
8
+ devDependencies: dependencyBlock,
9
+ peerDependencies: dependencyBlock,
10
+ optionalDependencies: dependencyBlock,
11
+ packageManager: z.string().optional(),
12
+ });
13
+ const PACKAGE_MANAGERS = new Set(['npm', 'pnpm', 'yarn', 'bun']);
14
+ const LOCKFILES = [
15
+ ['pnpm-lock.yaml', 'pnpm'],
16
+ ['yarn.lock', 'yarn'],
17
+ ['bun.lock', 'bun'],
18
+ ['bun.lockb', 'bun'],
19
+ ['package-lock.json', 'npm'],
20
+ ];
21
+ /**
22
+ * Reads and validates the manifest, keeping its original text so edits can
23
+ * preserve formatting. A missing manifest starts as a private ESM package.
24
+ */
25
+ export function readPackage(cwd) {
26
+ const manifestPath = path.join(cwd, 'package.json');
27
+ const original = existsSync(manifestPath) ? readFileSync(manifestPath, 'utf8') : undefined;
28
+ const manifest = packageSchema.parse(original === undefined ? { private: true, type: 'module' } : JSON.parse(original));
29
+ return { original, manifest };
30
+ }
31
+ /** True when any dependency section lists `name`, so existing versions and workspace links are kept. */
32
+ function declaresDependency(manifest, name) {
33
+ return [manifest.dependencies, manifest.devDependencies, manifest.peerDependencies, manifest.optionalDependencies]
34
+ .some((block) => block?.[name] !== undefined);
35
+ }
36
+ /** Adds only missing dependencies to devDependencies and returns what was added. */
37
+ export function addDependencies(manifest, dependencies) {
38
+ const additions = Object.entries(dependencies).filter(([name]) => !declaresDependency(manifest, name));
39
+ if (additions.length === 0)
40
+ return { manifest, additions };
41
+ return {
42
+ manifest: { ...manifest, devDependencies: { ...manifest.devDependencies, ...Object.fromEntries(additions) } },
43
+ additions,
44
+ };
45
+ }
46
+ /** The `packageManager` field wins, then a lockfile, then the manager that invoked the CLI, then npm. */
47
+ export function detectPackageManager(cwd, manifest) {
48
+ const configured = manifest.packageManager?.split('@')[0];
49
+ if (configured !== undefined && PACKAGE_MANAGERS.has(configured))
50
+ return configured;
51
+ for (const [lock, manager] of LOCKFILES) {
52
+ if (existsSync(path.join(cwd, lock)))
53
+ return manager;
54
+ }
55
+ const invoking = process.env['npm_config_user_agent']?.split('/')[0];
56
+ return invoking !== undefined && PACKAGE_MANAGERS.has(invoking) ? invoking : 'npm';
57
+ }
58
+ /** Serializes with the original manifest's indentation and newline convention. */
59
+ export function serializePackage(manifest, original) {
60
+ const indent = original?.match(/\n([\t ]+)"/)?.[1] ?? ' ';
61
+ const newline = original?.includes('\r\n') ? '\r\n' : '\n';
62
+ return `${JSON.stringify(manifest, null, indent).replaceAll('\n', newline)}${newline}`;
63
+ }
64
+ //# sourceMappingURL=package.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/cli/init/package.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type BackendId } from './backends.ts';
2
+ /** Composes common setup, the selected backend, and optional AI support. */
3
+ export declare function createScaffold(backendId: BackendId, ai: boolean): {
4
+ dependencies: {
5
+ '@e2edev/e2e': string;
6
+ ai?: string;
7
+ };
8
+ config: string;
9
+ example: string;
10
+ runCommand: string;
11
+ };
12
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../../../src/cli/init/scaffold.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAQjE,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO;;;;;;;;EA2B/D"}
@@ -0,0 +1,36 @@
1
+ import { packageVersion } from '../../internal/package-version.js';
2
+ import { getBackendPreset } from './backends.js';
3
+ const AGENT_IMPORT = "import { createAgent } from '@e2edev/e2e/agent';";
4
+ const AGENT_CONFIG = ` // The model comes from E2E_MODEL; authenticate with E2E_MODEL_API_KEY.
5
+ agent: createAgent({
6
+ system: 'You are a thorough QA agent. Verify every outcome.',
7
+ }),`;
8
+ /** Composes common setup, the selected backend, and optional AI support. */
9
+ export function createScaffold(backendId, ai) {
10
+ const backend = getBackendPreset(backendId);
11
+ const imports = [
12
+ "import { defineConfig } from '@e2edev/e2e';",
13
+ ...(ai ? [AGENT_IMPORT] : []),
14
+ ...backend.imports,
15
+ ];
16
+ const configFields = [
17
+ ...(ai ? [AGENT_CONFIG] : []),
18
+ backend.config,
19
+ ];
20
+ return {
21
+ dependencies: {
22
+ '@e2edev/e2e': `^${packageVersion(import.meta.url, '../../../package.json', '0.0.0')}`,
23
+ ...backend.dependencies,
24
+ ...(ai ? { ai: '^7.0.0' } : {}),
25
+ },
26
+ config: `${imports.join('\n')}
27
+
28
+ export default defineConfig({
29
+ ${configFields.join('\n')}
30
+ });
31
+ `,
32
+ example: backend.example + (ai ? backend.aiExample ?? '' : ''),
33
+ runCommand: backend.runCommand,
34
+ };
35
+ }
36
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../../../src/cli/init/scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAkB,MAAM,eAAe,CAAC;AAEjE,MAAM,YAAY,GAAG,kDAAkD,CAAC;AACxE,MAAM,YAAY,GAAG;;;MAGf,CAAC;AAEP,4EAA4E;AAC5E,MAAM,UAAU,cAAc,CAAC,SAAoB,EAAE,EAAW;IAC9D,MAAM,OAAO,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG;QACd,6CAA6C;QAC7C,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,OAAO,CAAC,OAAO;KACnB,CAAC;IACF,MAAM,YAAY,GAAG;QACnB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,MAAM;KACf,CAAC;IAEF,OAAO;QACL,YAAY,EAAE;YACZ,aAAa,EAAE,IAAI,cAAc,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,uBAAuB,EAAE,OAAO,CAAC,EAAE;YACtF,GAAG,OAAO,CAAC,YAAY;YACvB,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC;QACD,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;;;EAG/B,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;;CAExB;QACG,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC"}
@@ -1,6 +1,11 @@
1
1
  /** Non-destructive project scaffolding (spec 06-cli.md). */
2
- /** Runs `e2e init`. Creates only missing files and stops before any conflict. */
3
- export declare function init(cwd: string, options?: {
2
+ export interface InitOptions {
4
3
  yes?: boolean;
5
- }): Promise<number>;
4
+ }
5
+ /**
6
+ * Runs `e2e init`. Every prompt happens before the first write, existing
7
+ * config and test files are never touched, and dependencies install only when
8
+ * the user asks.
9
+ */
10
+ export declare function init(cwd: string, options?: InitOptions): Promise<number>;
6
11
  //# sourceMappingURL=init.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAsD5D,iFAAiF;AACjF,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CA+DxF"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,4DAA4D;AAW5D,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAYD;;;;GAIG;AACH,wBAAsB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsGlF"}