@essential-apps/shopify-test-runner 1.0.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 (265) hide show
  1. package/dist/contracts/normalize.d.ts +61 -0
  2. package/dist/contracts/normalize.d.ts.map +1 -0
  3. package/dist/contracts/normalize.js +99 -0
  4. package/dist/contracts/normalize.js.map +1 -0
  5. package/dist/contracts/normalizeHtml.d.ts +37 -0
  6. package/dist/contracts/normalizeHtml.d.ts.map +1 -0
  7. package/dist/contracts/normalizeHtml.js +89 -0
  8. package/dist/contracts/normalizeHtml.js.map +1 -0
  9. package/dist/edge/cert.d.ts +44 -0
  10. package/dist/edge/cert.d.ts.map +1 -0
  11. package/dist/edge/cert.js +117 -0
  12. package/dist/edge/cert.js.map +1 -0
  13. package/dist/edge/edgeProxy.d.ts +43 -0
  14. package/dist/edge/edgeProxy.d.ts.map +1 -0
  15. package/dist/edge/edgeProxy.js +297 -0
  16. package/dist/edge/edgeProxy.js.map +1 -0
  17. package/dist/edge/nodeShim.d.ts +2 -0
  18. package/dist/edge/nodeShim.d.ts.map +1 -0
  19. package/dist/edge/nodeShim.js +217 -0
  20. package/dist/edge/nodeShim.js.map +1 -0
  21. package/dist/index.d.ts +39 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +36 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/lib/buildSourceBundle.d.ts +56 -0
  26. package/dist/lib/buildSourceBundle.d.ts.map +1 -0
  27. package/dist/lib/buildSourceBundle.js +153 -0
  28. package/dist/lib/buildSourceBundle.js.map +1 -0
  29. package/dist/lib/freePort.d.ts +5 -0
  30. package/dist/lib/freePort.d.ts.map +1 -0
  31. package/dist/lib/freePort.js +33 -0
  32. package/dist/lib/freePort.js.map +1 -0
  33. package/dist/lib/functionBuild.d.ts +99 -0
  34. package/dist/lib/functionBuild.d.ts.map +1 -0
  35. package/dist/lib/functionBuild.js +413 -0
  36. package/dist/lib/functionBuild.js.map +1 -0
  37. package/dist/lib/neonWsProxy.d.ts +41 -0
  38. package/dist/lib/neonWsProxy.d.ts.map +1 -0
  39. package/dist/lib/neonWsProxy.js +101 -0
  40. package/dist/lib/neonWsProxy.js.map +1 -0
  41. package/dist/lib/sourceZipUpload.d.ts +45 -0
  42. package/dist/lib/sourceZipUpload.d.ts.map +1 -0
  43. package/dist/lib/sourceZipUpload.js +129 -0
  44. package/dist/lib/sourceZipUpload.js.map +1 -0
  45. package/dist/lib/stealthLaunch.d.ts +35 -0
  46. package/dist/lib/stealthLaunch.d.ts.map +1 -0
  47. package/dist/lib/stealthLaunch.js +46 -0
  48. package/dist/lib/stealthLaunch.js.map +1 -0
  49. package/dist/lib/storeAutomation.d.ts +22 -0
  50. package/dist/lib/storeAutomation.d.ts.map +1 -0
  51. package/dist/lib/storeAutomation.js +85 -0
  52. package/dist/lib/storeAutomation.js.map +1 -0
  53. package/dist/playwright/baseConfig.d.ts +62 -0
  54. package/dist/playwright/baseConfig.d.ts.map +1 -0
  55. package/dist/playwright/baseConfig.js +68 -0
  56. package/dist/playwright/baseConfig.js.map +1 -0
  57. package/dist/playwright/globalSetup.d.ts +2 -0
  58. package/dist/playwright/globalSetup.d.ts.map +1 -0
  59. package/dist/playwright/globalSetup.js +139 -0
  60. package/dist/playwright/globalSetup.js.map +1 -0
  61. package/dist/playwright/index.d.ts +9 -0
  62. package/dist/playwright/index.d.ts.map +1 -0
  63. package/dist/playwright/index.js +9 -0
  64. package/dist/playwright/index.js.map +1 -0
  65. package/dist/probes/fonts.d.ts +4 -0
  66. package/dist/probes/fonts.d.ts.map +1 -0
  67. package/dist/probes/fonts.js +255 -0
  68. package/dist/probes/fonts.js.map +1 -0
  69. package/dist/probes/mirror.d.ts +4 -0
  70. package/dist/probes/mirror.d.ts.map +1 -0
  71. package/dist/probes/mirror.js +260 -0
  72. package/dist/probes/mirror.js.map +1 -0
  73. package/dist/probes/runProbe.d.ts +3 -0
  74. package/dist/probes/runProbe.d.ts.map +1 -0
  75. package/dist/probes/runProbe.js +219 -0
  76. package/dist/probes/runProbe.js.map +1 -0
  77. package/dist/probes/types.d.ts +72 -0
  78. package/dist/probes/types.d.ts.map +1 -0
  79. package/dist/probes/types.js +2 -0
  80. package/dist/probes/types.js.map +1 -0
  81. package/dist/scripts/_probeSourceUrl.d.ts +3 -0
  82. package/dist/scripts/_probeSourceUrl.d.ts.map +1 -0
  83. package/dist/scripts/_probeSourceUrl.js +119 -0
  84. package/dist/scripts/_probeSourceUrl.js.map +1 -0
  85. package/dist/scripts/addStore.d.ts +3 -0
  86. package/dist/scripts/addStore.d.ts.map +1 -0
  87. package/dist/scripts/addStore.js +46 -0
  88. package/dist/scripts/addStore.js.map +1 -0
  89. package/dist/scripts/buildDockerImage.d.ts +3 -0
  90. package/dist/scripts/buildDockerImage.d.ts.map +1 -0
  91. package/dist/scripts/buildDockerImage.js +60 -0
  92. package/dist/scripts/buildDockerImage.js.map +1 -0
  93. package/dist/scripts/captureAuth.d.ts +3 -0
  94. package/dist/scripts/captureAuth.d.ts.map +1 -0
  95. package/dist/scripts/captureAuth.js +124 -0
  96. package/dist/scripts/captureAuth.js.map +1 -0
  97. package/dist/scripts/captureContracts.d.ts +3 -0
  98. package/dist/scripts/captureContracts.d.ts.map +1 -0
  99. package/dist/scripts/captureContracts.js +517 -0
  100. package/dist/scripts/captureContracts.js.map +1 -0
  101. package/dist/scripts/captureRestContracts.d.ts +3 -0
  102. package/dist/scripts/captureRestContracts.d.ts.map +1 -0
  103. package/dist/scripts/captureRestContracts.js +245 -0
  104. package/dist/scripts/captureRestContracts.js.map +1 -0
  105. package/dist/scripts/checkOperationCoverage.d.ts +3 -0
  106. package/dist/scripts/checkOperationCoverage.d.ts.map +1 -0
  107. package/dist/scripts/checkOperationCoverage.js +302 -0
  108. package/dist/scripts/checkOperationCoverage.js.map +1 -0
  109. package/dist/scripts/cleanupStores.d.ts +3 -0
  110. package/dist/scripts/cleanupStores.d.ts.map +1 -0
  111. package/dist/scripts/cleanupStores.js +77 -0
  112. package/dist/scripts/cleanupStores.js.map +1 -0
  113. package/dist/scripts/createStores.d.ts +3 -0
  114. package/dist/scripts/createStores.d.ts.map +1 -0
  115. package/dist/scripts/createStores.js +66 -0
  116. package/dist/scripts/createStores.js.map +1 -0
  117. package/dist/scripts/deployAppVersion.d.ts +3 -0
  118. package/dist/scripts/deployAppVersion.d.ts.map +1 -0
  119. package/dist/scripts/deployAppVersion.js +591 -0
  120. package/dist/scripts/deployAppVersion.js.map +1 -0
  121. package/dist/scripts/devE2eBackend.d.ts +3 -0
  122. package/dist/scripts/devE2eBackend.d.ts.map +1 -0
  123. package/dist/scripts/devE2eBackend.js +117 -0
  124. package/dist/scripts/devE2eBackend.js.map +1 -0
  125. package/dist/scripts/devOnlineBackend.d.ts +3 -0
  126. package/dist/scripts/devOnlineBackend.d.ts.map +1 -0
  127. package/dist/scripts/devOnlineBackend.js +117 -0
  128. package/dist/scripts/devOnlineBackend.js.map +1 -0
  129. package/dist/scripts/installApp.d.ts +3 -0
  130. package/dist/scripts/installApp.d.ts.map +1 -0
  131. package/dist/scripts/installApp.js +163 -0
  132. package/dist/scripts/installApp.js.map +1 -0
  133. package/dist/scripts/listStores.d.ts +3 -0
  134. package/dist/scripts/listStores.d.ts.map +1 -0
  135. package/dist/scripts/listStores.js +18 -0
  136. package/dist/scripts/listStores.js.map +1 -0
  137. package/dist/scripts/runDocker.d.ts +3 -0
  138. package/dist/scripts/runDocker.d.ts.map +1 -0
  139. package/dist/scripts/runDocker.js +88 -0
  140. package/dist/scripts/runDocker.js.map +1 -0
  141. package/dist/scripts/runDockerAuth.d.ts +3 -0
  142. package/dist/scripts/runDockerAuth.d.ts.map +1 -0
  143. package/dist/scripts/runDockerAuth.js +108 -0
  144. package/dist/scripts/runDockerAuth.js.map +1 -0
  145. package/dist/scripts/runDockerOffline.d.ts +3 -0
  146. package/dist/scripts/runDockerOffline.d.ts.map +1 -0
  147. package/dist/scripts/runDockerOffline.js +129 -0
  148. package/dist/scripts/runDockerOffline.js.map +1 -0
  149. package/dist/scripts/runDockerOfflineExplore.d.ts +3 -0
  150. package/dist/scripts/runDockerOfflineExplore.d.ts.map +1 -0
  151. package/dist/scripts/runDockerOfflineExplore.js +116 -0
  152. package/dist/scripts/runDockerOfflineExplore.js.map +1 -0
  153. package/dist/scripts/runIsolatedDockerOffline.d.ts +3 -0
  154. package/dist/scripts/runIsolatedDockerOffline.d.ts.map +1 -0
  155. package/dist/scripts/runIsolatedDockerOffline.js +351 -0
  156. package/dist/scripts/runIsolatedDockerOffline.js.map +1 -0
  157. package/dist/scripts/runOffline.d.ts +3 -0
  158. package/dist/scripts/runOffline.d.ts.map +1 -0
  159. package/dist/scripts/runOffline.js +521 -0
  160. package/dist/scripts/runOffline.js.map +1 -0
  161. package/dist/scripts/runOfflineE2e.d.ts +3 -0
  162. package/dist/scripts/runOfflineE2e.d.ts.map +1 -0
  163. package/dist/scripts/runOfflineE2e.js +408 -0
  164. package/dist/scripts/runOfflineE2e.js.map +1 -0
  165. package/dist/scripts/runOfflineFullTests.d.ts +3 -0
  166. package/dist/scripts/runOfflineFullTests.d.ts.map +1 -0
  167. package/dist/scripts/runOfflineFullTests.js +1456 -0
  168. package/dist/scripts/runOfflineFullTests.js.map +1 -0
  169. package/dist/scripts/runSupermachine.d.ts +3 -0
  170. package/dist/scripts/runSupermachine.d.ts.map +1 -0
  171. package/dist/scripts/runSupermachine.js +474 -0
  172. package/dist/scripts/runSupermachine.js.map +1 -0
  173. package/dist/scripts/runSupermachineAuth.d.ts +3 -0
  174. package/dist/scripts/runSupermachineAuth.d.ts.map +1 -0
  175. package/dist/scripts/runSupermachineAuth.js +454 -0
  176. package/dist/scripts/runSupermachineAuth.js.map +1 -0
  177. package/dist/scripts/runTests.d.ts +3 -0
  178. package/dist/scripts/runTests.d.ts.map +1 -0
  179. package/dist/scripts/runTests.js +278 -0
  180. package/dist/scripts/runTests.js.map +1 -0
  181. package/dist/scripts/runVm.d.ts +3 -0
  182. package/dist/scripts/runVm.d.ts.map +1 -0
  183. package/dist/scripts/runVm.js +524 -0
  184. package/dist/scripts/runVm.js.map +1 -0
  185. package/dist/scripts/runVmAuth.d.ts +3 -0
  186. package/dist/scripts/runVmAuth.d.ts.map +1 -0
  187. package/dist/scripts/runVmAuth.js +475 -0
  188. package/dist/scripts/runVmAuth.js.map +1 -0
  189. package/dist/scripts/runVmScript.d.ts +3 -0
  190. package/dist/scripts/runVmScript.d.ts.map +1 -0
  191. package/dist/scripts/runVmScript.js +242 -0
  192. package/dist/scripts/runVmScript.js.map +1 -0
  193. package/dist/scripts/setupTestDb.d.ts +3 -0
  194. package/dist/scripts/setupTestDb.d.ts.map +1 -0
  195. package/dist/scripts/setupTestDb.js +61 -0
  196. package/dist/scripts/setupTestDb.js.map +1 -0
  197. package/dist/scripts/verifyContracts.d.ts +3 -0
  198. package/dist/scripts/verifyContracts.d.ts.map +1 -0
  199. package/dist/scripts/verifyContracts.js +258 -0
  200. package/dist/scripts/verifyContracts.js.map +1 -0
  201. package/dist/scripts/verifyRestContracts.d.ts +3 -0
  202. package/dist/scripts/verifyRestContracts.d.ts.map +1 -0
  203. package/dist/scripts/verifyRestContracts.js +237 -0
  204. package/dist/scripts/verifyRestContracts.js.map +1 -0
  205. package/dist/vite/offlineConfig.d.ts +34 -0
  206. package/dist/vite/offlineConfig.d.ts.map +1 -0
  207. package/dist/vite/offlineConfig.js +61 -0
  208. package/dist/vite/offlineConfig.js.map +1 -0
  209. package/dist/vite/onlineConfig.d.ts +42 -0
  210. package/dist/vite/onlineConfig.d.ts.map +1 -0
  211. package/dist/vite/onlineConfig.js +56 -0
  212. package/dist/vite/onlineConfig.js.map +1 -0
  213. package/docker/Dockerfile +67 -0
  214. package/docker/Dockerfile.vm +137 -0
  215. package/docker/README.md +50 -0
  216. package/docker/entrypoint.sh +198 -0
  217. package/package.json +85 -0
  218. package/src/contracts/normalize.ts +96 -0
  219. package/src/contracts/normalizeHtml.ts +98 -0
  220. package/src/edge/ca.cnf +14 -0
  221. package/src/edge/ca.crt +22 -0
  222. package/src/edge/ca.key +28 -0
  223. package/src/edge/cert.ts +117 -0
  224. package/src/edge/edgeProxy.ts +390 -0
  225. package/src/edge/server.cnf +28 -0
  226. package/src/edge/server.crt +26 -0
  227. package/src/edge/server.key +28 -0
  228. package/src/index.ts +67 -0
  229. package/src/lib/buildSourceBundle.ts +197 -0
  230. package/src/lib/freePort.ts +33 -0
  231. package/src/lib/functionBuild.ts +490 -0
  232. package/src/lib/neonWsProxy.ts +124 -0
  233. package/src/lib/sourceZipUpload.ts +168 -0
  234. package/src/lib/stealthLaunch.ts +57 -0
  235. package/src/lib/storeAutomation.ts +110 -0
  236. package/src/playwright/baseConfig.ts +120 -0
  237. package/src/playwright/globalSetup.ts +179 -0
  238. package/src/playwright/index.ts +11 -0
  239. package/src/probes/fonts.ts +279 -0
  240. package/src/probes/mirror.ts +283 -0
  241. package/src/probes/runProbe.ts +257 -0
  242. package/src/probes/types.ts +73 -0
  243. package/src/scripts/addStore.ts +59 -0
  244. package/src/scripts/buildDockerImage.ts +66 -0
  245. package/src/scripts/captureAuth.ts +145 -0
  246. package/src/scripts/captureContracts.ts +675 -0
  247. package/src/scripts/captureRestContracts.ts +319 -0
  248. package/src/scripts/checkOperationCoverage.ts +365 -0
  249. package/src/scripts/cleanupStores.ts +91 -0
  250. package/src/scripts/createStores.ts +77 -0
  251. package/src/scripts/deployAppVersion.ts +692 -0
  252. package/src/scripts/devOnlineBackend.ts +141 -0
  253. package/src/scripts/installApp.ts +188 -0
  254. package/src/scripts/listStores.ts +19 -0
  255. package/src/scripts/runDockerAuth.ts +120 -0
  256. package/src/scripts/runOffline.ts +577 -0
  257. package/src/scripts/runOfflineFullTests.ts +1634 -0
  258. package/src/scripts/runTests.ts +306 -0
  259. package/src/scripts/runVm.ts +562 -0
  260. package/src/scripts/runVmAuth.ts +541 -0
  261. package/src/scripts/runVmScript.ts +282 -0
  262. package/src/scripts/setupTestDb.ts +71 -0
  263. package/src/scripts/verifyContracts.ts +310 -0
  264. package/src/scripts/verifyRestContracts.ts +275 -0
  265. package/src/vite/onlineConfig.ts +60 -0
@@ -0,0 +1,475 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * One-time interactive Shopify auth capture inside a VM.
4
+ *
5
+ * Why this exists: online tests run inside an HVF arm64
6
+ * microVM (via supermachine HVF) with chromium under a virtual Xvfb display. There's no way
7
+ * to interactively log in to Shopify from outside the VM, but the
8
+ * captured storage state (cookies — Partners session AND, crucially,
9
+ * Cloudflare's `cf_clearance` Turnstile-bypass cookie) needs to be
10
+ * captured INSIDE that same VM so the browser fingerprint matches at
11
+ * test time. Captures from the macOS host (different UA, different
12
+ * canvas/WebGL hashes) trigger CF re-challenge.
13
+ *
14
+ * Flow:
15
+ * 1. Bake / acquire the same VM the online suite uses (same image,
16
+ * same warmupTag → reuses the snapshot — warm acquires are
17
+ * ~3 s instead of ~4 min cold bake).
18
+ * 2. Mount the workspace so storageState.json writes land on the
19
+ * host filesystem.
20
+ * 3. Start x11vnc inside the guest, bound to 0.0.0.0:5900.
21
+ * 4. Forward host 127.0.0.1:5900 → guest:5900 via vm.exposeTcp.
22
+ * 5. Open macOS Screen Sharing pointed at vnc://localhost:5900.
23
+ * 6. Spawn captureAuth.js inside the guest. It opens chrome on
24
+ * DISPLAY=:99, navigates to accounts.shopify.com/lookup, and
25
+ * waits for a host-side Enter keystroke.
26
+ * 7. User logs in via VNC, ALSO visits the test store admin to
27
+ * pass any Turnstile (so cf_clearance gets captured), then
28
+ * hits Enter in the host terminal.
29
+ * 8. captureAuth writes storageState.json (via the mounted
30
+ * workspace → host disk), then exits. We release the VM.
31
+ *
32
+ * Usage (one-time per developer machine, or when cf_clearance / the
33
+ * Partner session expires):
34
+ *
35
+ * npm run test:online:auth
36
+ *
37
+ * macOS Screen Sharing opens automatically. If it doesn't, run
38
+ * `open vnc://localhost:5900` manually. VNC password is "test" by
39
+ * default; override with TEST_ONLINE_VNC_PASSWORD.
40
+ *
41
+ * Supersedes runDockerAuth.ts (libkrun-based; we no longer use
42
+ * libkrun for any test path).
43
+ */
44
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
45
+ import { homedir, platform as osPlatform } from 'node:os';
46
+ import { resolve } from 'node:path';
47
+ import { spawn as nodeSpawn } from 'node:child_process';
48
+ import { setTimeout as sleep } from 'node:timers/promises';
49
+ import { prepareOciArchive, envFileArgs } from '@essential-apps/shopify-test-core';
50
+ const repoRoot = process.cwd();
51
+ const VNC_PORT = 5900;
52
+ /**
53
+ * Resolve the VM image source the same way runVm.ts
54
+ * does. Without this, the VM runtime treats TEST_ONLINE_VM_IMAGE as
55
+ * a Docker Hub registry ref and tries to pull it — which 401s for
56
+ * locally-built `container build` images that never went to a
57
+ * registry. oci-archive mode is the only one that works for the
58
+ * Apple-`container`-built images we actually use.
59
+ */
60
+ async function imageSourceOptions() {
61
+ const mode = process.env['TEST_ONLINE_VM_IMAGE_SOURCE'] ?? 'oci-archive';
62
+ if (mode === 'registry')
63
+ return {};
64
+ const ref = process.env['TEST_ONLINE_VM_IMAGE'] ??
65
+ 'essential-apps/shopify-test-vm:latest';
66
+ if (mode === 'oci-archive') {
67
+ const prep = await prepareOciArchive(ref);
68
+ if (prep.freshlySaved) {
69
+ console.error(`[runVmAuth] saved ${ref} → ${prep.archivePath} (${(prep.sizeBytes / 1024 / 1024).toFixed(1)} MB)`);
70
+ }
71
+ return { source: 'oci-archive', sourcePath: prep.archivePath };
72
+ }
73
+ if (mode === 'oci-layout') {
74
+ const sourcePath = process.env['TEST_ONLINE_VM_IMAGE_LAYOUT_PATH'];
75
+ if (!sourcePath) {
76
+ throw new Error(`TEST_ONLINE_VM_IMAGE_SOURCE=oci-layout requires TEST_ONLINE_VM_IMAGE_LAYOUT_PATH`);
77
+ }
78
+ return { source: 'oci-layout', sourcePath };
79
+ }
80
+ throw new Error(`TEST_ONLINE_VM_IMAGE_SOURCE=${mode} not recognised. Valid: oci-archive | oci-layout | registry`);
81
+ }
82
+ function readAppName() {
83
+ const pkgPath = resolve(repoRoot, 'package.json');
84
+ if (!existsSync(pkgPath)) {
85
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
86
+ }
87
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
88
+ if (!pkg.name)
89
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
90
+ return pkg.name.replace(/^@[^/]+\//, '');
91
+ }
92
+ async function main() {
93
+ const appName = readAppName();
94
+ // Same node_modules volume + tarball-manifest extraFile as
95
+ // runVm.ts. Sharing both means auth-capture and online
96
+ // tests use the SAME snapshot (same warmupTag), so a single bake
97
+ // serves both flows.
98
+ const linuxModulesVolume = process.env['TEST_LINUX_NODE_MODULES_VOLUME'] ??
99
+ resolve(homedir(), `.cache/${appName}-test/node_modules.img`);
100
+ mkdirSync(resolve(linuxModulesVolume, '..'), { recursive: true });
101
+ const tarballManifest = resolve(repoRoot, 'vendor/essential-apps-shopify-test/.tarball-manifest');
102
+ const tarballManifestExists = existsSync(tarballManifest);
103
+ const vncPassword = process.env['TEST_ONLINE_VNC_PASSWORD'] ?? 'test';
104
+ const ref = process.env['TEST_ONLINE_VM_IMAGE'] ?? 'essential-apps/shopify-test-vm:latest';
105
+ // amd64+Rosetta is the only path that has real Google Chrome
106
+ // installed (the Dockerfile installs google-chrome-stable amd64);
107
+ // we want real Chrome here so the captured fingerprint matches
108
+ // what online tests use (channel: 'chrome' via TEST_FORCE_REAL_CHROME,
109
+ // OR patchright bundled chromium — both run on this image).
110
+ const platform = process.env['TEST_ONLINE_VM_PLATFORM'] ?? 'linux/arm64';
111
+ console.error(`[runVmAuth] baking image…`);
112
+ const tBake = performance.now();
113
+ const { Image } = await import('@supermachine/core');
114
+ const imageOpts = await imageSourceOptions();
115
+ // Same warmup pattern as runVm.ts so this bake hits the
116
+ // existing snapshot (warmupTag must match). If runVm has
117
+ // never run cold yet, this will trigger that warmup — ~4 min once.
118
+ const image = await Image.build({
119
+ ref,
120
+ memoryMib: Number(process.env['TEST_ONLINE_VM_MEMORY_MIB'] ?? 8192),
121
+ vcpus: Number(process.env['TEST_ONLINE_VM_VCPUS'] ?? 4),
122
+ cmd: ['sleep', 'infinity'],
123
+ env: { SKIP_OFFLINE_HOST_HIJACK: '1' },
124
+ platform,
125
+ mounts: [
126
+ // VM runtime 0.7.28+ requires explicit guestPath and
127
+ // auto-mounts at boot before warmup fires.
128
+ { hostPath: repoRoot, guestTag: 'workspace', guestPath: '/workspace' },
129
+ ],
130
+ volumes: [
131
+ {
132
+ hostPath: linuxModulesVolume,
133
+ guestPath: '/workspace/node_modules',
134
+ sizeMib: 4096,
135
+ },
136
+ ],
137
+ extraFiles: tarballManifestExists
138
+ ? [
139
+ { hostPath: tarballManifest, guestPath: '/etc/.shopify-test-tarball-manifest' },
140
+ ]
141
+ : [],
142
+ // Independent auth-capture snapshot. (Despite the historical name
143
+ // this no longer shares runVm.ts's tag — that moved to
144
+ // `online-v15-<runtime>-<manifest>`.) This rarely-run flow keys on a
145
+ // static tag rather than auto-folding the @supermachine/core runtime
146
+ // version like the main runners, so bump it on warmup-script OR VM
147
+ // runtime changes. Bumped v3→v4 for the 0.7.62 runtime adoption.
148
+ warmupTag: 'online-v4',
149
+ // @ts-expect-error — @supermachine/core's BuildOptions type
150
+ // doesn't declare `warmup`, but the runtime accepts it. Tracked
151
+ // upstream; fix-or-augment when the types catch up.
152
+ warmup: async (vm) => {
153
+ const r = await vm.exec({
154
+ argv: [
155
+ 'sh',
156
+ '-c',
157
+ `
158
+ echo "[warmup] >>> ENTERED warmup callback at \$(date +%H:%M:%S.%N)"
159
+ set -e
160
+ # VM runtime 0.7.28+ auto-mounts /workspace +
161
+ # /workspace/node_modules BEFORE warmup fires. Keep the
162
+ # defence-in-depth virtiofs check so a future auto-mount
163
+ # regression can't let rm-rf nuke the host bind.
164
+ NM_FS=\$(stat -f -c %T /workspace/node_modules 2>/dev/null || stat --file-system --format=%T /workspace/node_modules)
165
+ echo "[warmup] /workspace/node_modules FS type: \$NM_FS"
166
+ if [ "\$NM_FS" = "virtiofs" ] || [ "\$NM_FS" = "fuse.virtiofs" ]; then
167
+ echo "FATAL: /workspace/node_modules is \$NM_FS — auto-mount broken"
168
+ grep ' /workspace' /proc/mounts
169
+ exit 1
170
+ fi
171
+ chown -R postgres:postgres /var/lib/postgresql/data
172
+ chmod 700 /var/lib/postgresql/data
173
+ mkdir -p /var/run/postgresql
174
+ chown postgres:postgres /var/run/postgresql
175
+ chmod 775 /var/run/postgresql
176
+ cd /workspace
177
+ # Fresh install every rebake (tarball-manifest hash
178
+ # invalidates the snapshot when tarballs change). Wiping
179
+ # before install ensures stale tarballs can't linger.
180
+ rm -rf node_modules/* node_modules/.[!.]* 2>/dev/null || true
181
+ # Don't pipe npm to "tail" — the pipeline status is tail's,
182
+ # masking npm failures under "set -e", so a transient install
183
+ # error would bake a half-installed node_modules cache that
184
+ # warm restores then reuse. Check npm's own status so a failed
185
+ # install aborts the bake (no cache poisoned, next run rebakes).
186
+ if ! npm install --legacy-peer-deps --engine-strict=false > /tmp/npm-install.log 2>&1; then
187
+ echo "--- npm install FAILED - last 40 lines ---"
188
+ tail -40 /tmp/npm-install.log
189
+ exit 1
190
+ fi
191
+ tail -30 /tmp/npm-install.log
192
+ if ! grep -q "^127.0.0.1.*localhost" /etc/hosts; then
193
+ echo "127.0.0.1 localhost" >> /etc/hosts
194
+ echo "::1 localhost" >> /etc/hosts
195
+ fi
196
+ `,
197
+ ],
198
+ timeoutMs: 15 * 60 * 1000,
199
+ });
200
+ if (r.exitCode !== 0) {
201
+ console.error('[runVmAuth.warmup] failed:', r.stdout.toString(), r.stderr.toString());
202
+ throw new Error(`warmup failed (exit ${r.exitCode})`);
203
+ }
204
+ },
205
+ ...imageOpts,
206
+ });
207
+ console.error(`[runVmAuth] bake: ${((performance.now() - tBake) / 1000).toFixed(1)} s`);
208
+ const pool = await image.pool({ min: 1, max: 1, restoreOnRelease: false });
209
+ const vm = await pool.acquire();
210
+ // Loose typing so we can call signal/writeStdin/readStdout/etc.
211
+ // without re-importing the full @supermachine/core types tree (vendor name).
212
+ let forwarder = null;
213
+ let captureChild = null;
214
+ // Idempotent cleanup. Two design constraints:
215
+ // 1. SIGINT may fire multiple times (user hammers Ctrl-C), and
216
+ // cleanup() is async — a second invocation would otherwise
217
+ // race the first, calling signal/wait on already-disposed
218
+ // handles ("agent closed connection before sending EXIT").
219
+ // 2. Each step may throw on second call (already-closed sockets,
220
+ // already-released vm, etc.) — wrap individually so a later
221
+ // step still runs even if an earlier one's idempotency check
222
+ // threw something the catch missed.
223
+ // Implementation: a singleton promise — first caller does the
224
+ // work, every subsequent caller awaits the same promise.
225
+ let cleanupPromise = null;
226
+ const cleanup = () => {
227
+ if (cleanupPromise)
228
+ return cleanupPromise;
229
+ cleanupPromise = (async () => {
230
+ // Null each handle out after using it so a stray reference
231
+ // elsewhere can't be re-used.
232
+ const child = captureChild;
233
+ captureChild = null;
234
+ if (child)
235
+ await child.signal(15).catch(() => undefined);
236
+ const fwd = forwarder;
237
+ forwarder = null;
238
+ if (fwd)
239
+ await fwd.stop().catch(() => undefined);
240
+ await vm.release().catch(() => undefined);
241
+ await pool.shutdown().catch(() => undefined);
242
+ })();
243
+ return cleanupPromise;
244
+ };
245
+ // SIGINT / SIGTERM teardown — without these, Ctrl-C leaves the VM
246
+ // pinned and the next bake hits "snapshot in use" errors.
247
+ // First signal triggers cleanup + clean exit; second signal escalates
248
+ // to immediate process.exit so the user can always bail out.
249
+ let signalCount = 0;
250
+ const onSignal = (sig) => {
251
+ signalCount += 1;
252
+ if (signalCount >= 2) {
253
+ console.error(`\n[runVmAuth] received ${sig} again — forcing exit`);
254
+ process.exit(130);
255
+ }
256
+ console.error(`\n[runVmAuth] received ${sig}, cleaning up…`);
257
+ cleanup()
258
+ .catch(() => undefined)
259
+ .finally(() => process.exit(130));
260
+ };
261
+ process.on('SIGINT', onSignal);
262
+ process.on('SIGTERM', onSignal);
263
+ try {
264
+ // 0) Post-restore sanity. VM runtime 0.7.28+ captures the
265
+ // auto-mount tree in the snapshot, so /workspace and
266
+ // /workspace/node_modules are already mounted on restore.
267
+ // Assert + bail if anything's off.
268
+ const mountR = await vm.exec({
269
+ argv: ['sh', '-c', `
270
+ mountpoint -q /workspace || { echo "FATAL: /workspace not mounted"; exit 1; }
271
+ mountpoint -q /workspace/node_modules || { echo "FATAL: /workspace/node_modules not mounted"; exit 1; }
272
+ NM_FS=\$(stat -f -c %T /workspace/node_modules 2>/dev/null)
273
+ if [ "\$NM_FS" = "virtiofs" ] || [ "\$NM_FS" = "fuse.virtiofs" ]; then
274
+ echo "FATAL: /workspace/node_modules is \$NM_FS — auto-mount layering broken"
275
+ exit 1
276
+ fi
277
+ ls /workspace/node_modules/@essential-apps/shopify-test-runner/dist/scripts/captureAuth.js >/dev/null \
278
+ || { echo "FATAL: captureAuth.js missing in volume — snapshot/volume out of sync"; exit 1; }
279
+ `],
280
+ timeoutMs: 10_000,
281
+ });
282
+ if (mountR.exitCode !== 0) {
283
+ console.error(`[runVmAuth] mount failed:\n${mountR.stdout.toString()}${mountR.stderr.toString()}`);
284
+ throw new Error('mount setup failed');
285
+ }
286
+ // 1) Start x11vnc inside the guest. The image's entrypoint.sh
287
+ // has the same logic gated on TEST_ONLINE_VNC=1, but that env is
288
+ // bake-time only (already snapshotted). Running x11vnc here
289
+ // sidesteps the need for a separate baked snapshot.
290
+ console.error(`[runVmAuth] starting x11vnc on guest :5900…`);
291
+ const vncStart = await vm.exec({
292
+ argv: [
293
+ 'bash',
294
+ '-c',
295
+ `
296
+ # No set -e — too many of these commands have valid nonzero
297
+ # exits (pkill matching 0 procs, rm-of-missing-file, etc.) and
298
+ # masking them all with || true was both noisy and unreliable.
299
+ # We explicitly check exit conditions on the things that
300
+ # matter (Xvfb socket present, x11vnc listening).
301
+ # Restart Xvfb on :99 with -ac (disable X access control)
302
+ # so x11vnc — which runs in a fresh shell here, separate from
303
+ # the entrypoint shell that started the original Xvfb — can
304
+ # attach without an Xauthority cookie. The entrypoint's Xvfb
305
+ # is fine for Playwright (which sets DISPLAY=:99 and inherits
306
+ # the auth context from the same shell), but x11vnc launched
307
+ # via a separate vm.exec doesn't have that.
308
+ echo "[xvfb] stopping any existing Xvfb on :99…"
309
+ # IMPORTANT: do NOT use 'pkill -f' here — the -f flag matches
310
+ # the full command line, and our own bash script's argv
311
+ # contains the literal string we'd search for (it's an
312
+ # embedded heredoc), so pkill would kill its own parent
313
+ # shell. Match by process name only.
314
+ pkill -x Xvfb 2>/dev/null || true
315
+ rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock
316
+ sleep 0.3
317
+ # -ac: disable access control (no auth required). Safe inside
318
+ # the VM — only x11vnc here is going to connect, and x11vnc's
319
+ # own VNC auth (-rfbauth) gates external access.
320
+ # -nolisten tcp: still no TCP listener on Xvfb itself.
321
+ echo "[xvfb] starting Xvfb :99 -ac …"
322
+ nohup Xvfb :99 -screen 0 1600x1000x24 -nolisten tcp -ac \
323
+ >/var/log/xvfb.log 2>&1 &
324
+ for _ in $(seq 1 50); do
325
+ [ -e /tmp/.X11-unix/X99 ] && break
326
+ sleep 0.1
327
+ done
328
+ if [ ! -e /tmp/.X11-unix/X99 ]; then
329
+ echo "[xvfb] FAILED to bind /tmp/.X11-unix/X99 within 5s"
330
+ cat /var/log/xvfb.log
331
+ exit 1
332
+ fi
333
+ echo "[xvfb] up."
334
+
335
+ mkdir -p /root/.vnc
336
+ x11vnc -storepasswd "${vncPassword}" /root/.vnc/passwd >/dev/null 2>&1
337
+ # Background via shell (&) not x11vnc's -bg (which has been
338
+ # observed to fork before the accept loop binds). nohup so
339
+ # the listener survives this exec call returning.
340
+ echo "[x11vnc] starting on :${VNC_PORT}…"
341
+ nohup x11vnc -display :99 -forever -shared \
342
+ -rfbauth /root/.vnc/passwd -rfbport ${VNC_PORT} -quiet \
343
+ >/var/log/x11vnc.log 2>&1 &
344
+ VNC_PID=$!
345
+ echo "[x11vnc] pid $VNC_PID"
346
+ # Verify the listener actually bound. Use netstat (from
347
+ # net-tools — installed in both the vm and libkrun
348
+ # images per the Dockerfiles). bash /dev/tcp was tried first
349
+ # but ubuntu/jammy bash sometimes ships without the
350
+ # /dev/tcp/* virtual device enabled, leading to silent probe
351
+ # failures even when x11vnc IS listening.
352
+ for _ in $(seq 1 30); do
353
+ if netstat -ltn 2>/dev/null | grep -q ":${VNC_PORT} "; then
354
+ exit 0
355
+ fi
356
+ sleep 0.1
357
+ done
358
+ echo "x11vnc didn't bind :${VNC_PORT} within 3s"
359
+ echo "--- netstat output ---"
360
+ netstat -ltn 2>&1 || echo "(netstat unavailable)"
361
+ echo "--- x11vnc log ---"
362
+ cat /var/log/x11vnc.log
363
+ exit 1
364
+ `,
365
+ ],
366
+ timeoutMs: 15_000,
367
+ });
368
+ if (vncStart.exitCode !== 0) {
369
+ console.error('[runVmAuth] x11vnc failed:', vncStart.stdout.toString(), vncStart.stderr.toString());
370
+ throw new Error('x11vnc startup failed');
371
+ }
372
+ // 2) Forward host 127.0.0.1:5900 → guest :5900 so the macOS
373
+ // Screen Sharing client can reach the VNC server.
374
+ forwarder = await vm.exposeTcp(VNC_PORT, VNC_PORT);
375
+ console.error(`[runVmAuth] forwarding host 127.0.0.1:${VNC_PORT} → guest :${VNC_PORT}`);
376
+ // 3) Open macOS Screen Sharing pointed at the forwarder. Detach
377
+ // so the parent process can carry on.
378
+ if (osPlatform() === 'darwin') {
379
+ console.error(`[runVmAuth] VNC password (paste into Screen Sharing): ${vncPassword}`);
380
+ // Tiny delay so x11vnc accept-loop is warm before the client
381
+ // dials; otherwise Screen Sharing sometimes shows "connection
382
+ // refused" and the user has to retry.
383
+ await sleep(500);
384
+ // Embed the password in the URL (vnc://:<pw>@host) so macOS Screen
385
+ // Sharing connects WITHOUT prompting — prefilled, not typed. URL-encode
386
+ // in case TEST_ONLINE_VNC_PASSWORD has reserved chars.
387
+ const vncUrl = `vnc://:${encodeURIComponent(vncPassword)}@localhost:${VNC_PORT}`;
388
+ console.error(`[runVmAuth] Opening macOS Screen Sharing → vnc://localhost:${VNC_PORT} (password prefilled)`);
389
+ console.error(`[runVmAuth] (If nothing opens: open '${vncUrl}')`);
390
+ nodeSpawn('open', [vncUrl], {
391
+ stdio: 'ignore',
392
+ detached: true,
393
+ }).unref();
394
+ }
395
+ else {
396
+ console.error(`[runVmAuth] Connect any VNC viewer to localhost:${VNC_PORT} (password: ${vncPassword}).`);
397
+ }
398
+ // 4) Spawn captureAuth.js inside the guest. It opens Chrome on
399
+ // DISPLAY=:99, prompts for Enter on stdin, then writes
400
+ // storageState.json (which lands on host disk via the
401
+ // workspace mount). We bridge host stdin to the guest child
402
+ // so the user's Enter keystroke reaches captureAuth's
403
+ // readline prompt.
404
+ console.error('');
405
+ console.error('━'.repeat(72));
406
+ console.error('Inside Screen Sharing:');
407
+ console.error(' 1. Log in to Shopify Partners (accounts.shopify.com/lookup).');
408
+ console.error(' 2. Then visit your test store admin');
409
+ console.error(' (e.g. https://admin.shopify.com/store/<your-store>).');
410
+ console.error(' If a Cloudflare "Verify you are human" page appears,');
411
+ console.error(' click through it. Without this step, cf_clearance');
412
+ console.error(' never lands in storageState and tests will still hit');
413
+ console.error(' Turnstile.');
414
+ console.error(' 3. Return here and press Enter to save & exit.');
415
+ console.error('━'.repeat(72));
416
+ console.error('');
417
+ captureChild = await vm.spawn({
418
+ argv: [
419
+ 'sh',
420
+ '-c',
421
+ // tty=false here (no PTY) because we want the readline prompt
422
+ // to read from a plain stdin pipe — Chrome doesn't care, it
423
+ // reads DISPLAY from env.
424
+ `cd /workspace && DISPLAY=:99 TEST_IN_CONTAINER=true node ${envFileArgs(repoRoot)} node_modules/@essential-apps/shopify-test-runner/dist/scripts/captureAuth.js`,
425
+ ],
426
+ env: { DISPLAY: ':99', TEST_IN_CONTAINER: 'true' },
427
+ });
428
+ // Bridge host stdin → guest captureAuth stdin (for the Enter
429
+ // prompt). Forwarder runs until the guest child exits.
430
+ process.stdin.setEncoding('utf8');
431
+ process.stdin.on('data', (chunk) => {
432
+ const buf = typeof chunk === 'string' ? Buffer.from(chunk, 'utf8') : chunk;
433
+ captureChild.writeStdin(buf).catch(() => undefined);
434
+ });
435
+ process.stdin.resume();
436
+ // Stream guest stdout/stderr to host for visibility.
437
+ const streamGuest = async (reader, out) => {
438
+ if (!reader)
439
+ return;
440
+ // eslint-disable-next-line no-constant-condition
441
+ while (true) {
442
+ const chunk = await reader().catch(() => null);
443
+ if (!chunk || chunk.length === 0)
444
+ return;
445
+ out.write(chunk);
446
+ }
447
+ };
448
+ // captureChild has readStdout / readStderr — both Promise<Buffer>
449
+ // chunks until EOF (zero-length).
450
+ const childAny = captureChild;
451
+ void streamGuest(childAny.readStdout, process.stdout);
452
+ void streamGuest(childAny.readStderr, process.stderr);
453
+ const result = await (childAny.wait?.() ?? Promise.resolve({ exitCode: 0 }));
454
+ if (result.exitCode === 0) {
455
+ console.error('');
456
+ console.error('[runVmAuth] ✓ captureAuth completed successfully.');
457
+ console.error('[runVmAuth] storageState.json written via workspace mount.');
458
+ }
459
+ else {
460
+ console.error(`[runVmAuth] captureAuth exited with code ${result.exitCode}`);
461
+ }
462
+ await cleanup();
463
+ process.exit(result.exitCode);
464
+ }
465
+ catch (err) {
466
+ console.error('[runVmAuth] fatal:', err.message);
467
+ await cleanup();
468
+ process.exit(1);
469
+ }
470
+ }
471
+ main().catch(async (err) => {
472
+ console.error(err);
473
+ process.exit(1);
474
+ });
475
+ //# sourceMappingURL=runVmAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runVmAuth.js","sourceRoot":"","sources":["../../src/scripts/runVmAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=runVmScript.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runVmScript.d.ts","sourceRoot":"","sources":["../../src/scripts/runVmScript.ts"],"names":[],"mappings":""}