@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,524 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Run online tests inside an HVF microVM (via supermachine HVF).
4
+ *
5
+ * Drop-in replacement for `runDocker.ts`. Same workflow, same test
6
+ * outputs, but uses the VM runtime's arm64 microVM with virtio-fs DAX
7
+ * bind mounts instead of Apple `container`'s libkrun:
8
+ *
9
+ * libkrun vm
10
+ * ───────── ────────────
11
+ * amd64 image (Rosetta) arm64 image (native)
12
+ * ~10 s cold boot ~5 s cold bake / ~1 s warm restore
13
+ * ~30 s/test wall-clock ~3× faster end-to-end on offline-full
14
+ * Google Chrome amd64 in Xvfb Playwright bundled chromium in
15
+ * Xvfb (patchright stealth still works)
16
+ *
17
+ * Architecture:
18
+ * - Image: `essential-apps/shopify-test-vm:latest` baked
19
+ * via `tests/test-offline/docker/Dockerfile.vm` in the consuming
20
+ * app (the equivalent of `Dockerfile` for libkrun). Auto-saved as
21
+ * a local OCI archive on first invocation via `prepareOciArchive`.
22
+ * - Bind mounts (virtio-fs DAX):
23
+ * - consuming app repo → /workspace
24
+ * - linux node_modules cache → /workspace/node_modules
25
+ * Both writable in-VM, host changes reflected immediately.
26
+ * - Postgres autostarted in the warmup callback (folded into the
27
+ * snapshot so warm restores skip the cost).
28
+ * - `runTests.js` invoked inside the VM; its localhost:5432 points
29
+ * at the in-VM postgres started by the warmup.
30
+ *
31
+ * Override env vars (all match the conformance package's conventions
32
+ * so users only learn one set):
33
+ * TEST_ONLINE_VM_IMAGE ref to bake/restore. Default:
34
+ * `essential-apps/shopify-test-vm:latest`
35
+ * TEST_ONLINE_VM_IMAGE_SOURCE oci-archive | oci-layout | registry. Default: oci-archive.
36
+ * TEST_ONLINE_VM_IMAGE_LAYOUT_PATH required when source=oci-layout.
37
+ * TEST_ONLINE_VM_MEMORY_MIB guest RAM. Default: 8192.
38
+ * TEST_ONLINE_VM_VCPUS guest vCPUs. Default: 4.
39
+ * TEST_LINUX_NODE_MODULES_VOLUME host path for the Linux node_modules
40
+ * sparse-file volume.
41
+ * Default: ~/.cache/${appName}-test/node_modules.img
42
+ * TEST_ONLINE_VM_TIMEOUT_MS overall guard for runTests.js. Default: 10 min.
43
+ */
44
+ import { createHash } from 'node:crypto';
45
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
46
+ import { createRequire } from 'node:module';
47
+ import { homedir } from 'node:os';
48
+ import { resolve } from 'node:path';
49
+ import { prepareOciArchive, envFileArgs } from '@essential-apps/shopify-test-core';
50
+ const repoRoot = process.cwd();
51
+ function readAppName() {
52
+ const pkgPath = resolve(repoRoot, 'package.json');
53
+ if (!existsSync(pkgPath)) {
54
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
55
+ }
56
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
57
+ if (!pkg.name) {
58
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
59
+ }
60
+ return pkg.name.replace(/^@[^/]+\//, '');
61
+ }
62
+ /**
63
+ * Resolve the VM image source the same way the conformance
64
+ * runner does. Duplicated here intentionally — extracting into a
65
+ * shared helper would create a runner→conformance dep cycle (runner
66
+ * is allowed to depend on conformance, but in practice this is the
67
+ * single use-site and the indirection isn't worth a new dep).
68
+ */
69
+ async function imageSourceOptions() {
70
+ const mode = process.env['TEST_ONLINE_VM_IMAGE_SOURCE'] ?? 'oci-archive';
71
+ if (mode === 'registry')
72
+ return {};
73
+ const ref = process.env['TEST_ONLINE_VM_IMAGE'] ??
74
+ // Must match the default in main() below — otherwise the OCI
75
+ // archive's recorded ref won't match what Image.build expects.
76
+ 'essential-apps/shopify-test-vm:latest';
77
+ if (mode === 'oci-archive') {
78
+ const prep = await prepareOciArchive(ref);
79
+ if (prep.freshlySaved) {
80
+ console.error(`[runVm] saved ${ref} → ${prep.archivePath} (${(prep.sizeBytes / 1024 / 1024).toFixed(1)} MB)`);
81
+ }
82
+ return { source: 'oci-archive', sourcePath: prep.archivePath };
83
+ }
84
+ if (mode === 'oci-layout') {
85
+ const sourcePath = process.env['TEST_ONLINE_VM_IMAGE_LAYOUT_PATH'];
86
+ if (!sourcePath) {
87
+ throw new Error(`TEST_ONLINE_VM_IMAGE_SOURCE=oci-layout requires TEST_ONLINE_VM_IMAGE_LAYOUT_PATH`);
88
+ }
89
+ return { source: 'oci-layout', sourcePath };
90
+ }
91
+ throw new Error(`TEST_ONLINE_VM_IMAGE_SOURCE=${mode} not recognised. Valid: oci-archive | oci-layout | registry`);
92
+ }
93
+ async function main() {
94
+ const appName = readAppName();
95
+ // node_modules now lives in a virtio-blk VOLUME (sparse host file)
96
+ // instead of a virtio-fs bind mount. Three wins:
97
+ // 1. ~native disk speed for the many-small-files workload that
98
+ // npm install actually is (10-30s vs 3-6 min on a virtio-fs
99
+ // mount per the VM runtime's example 07).
100
+ // 2. State semantics make sense: node_modules is VM-private
101
+ // (produced by in-VM npm install), not shared with the host.
102
+ // 3. Cache invalidation via `extraFiles` on the tarball manifest
103
+ // (see below) handles "tarballs changed → rebake" properly,
104
+ // so pack-into no longer needs the wipe-host-cache hack.
105
+ // Path defaults stay namespaced by appName so multi-app dev works.
106
+ const linuxModulesVolume = process.env['TEST_LINUX_NODE_MODULES_VOLUME'] ??
107
+ resolve(homedir(), `.cache/${appName}-test/node_modules.img`);
108
+ mkdirSync(resolve(linuxModulesVolume, '..'), { recursive: true });
109
+ // Tarball-manifest file written by `scripts/pack-into.sh`. We pass
110
+ // it as an extraFile so its bytes are folded into the snapshot's
111
+ // input hash — any tarball change re-bakes automatically. Optional
112
+ // (consumer might not use pack-into); we just skip the extraFile if
113
+ // it's missing.
114
+ const tarballManifest = resolve(repoRoot, 'vendor/essential-apps-shopify-test/.tarball-manifest');
115
+ const tarballManifestExists = existsSync(tarballManifest);
116
+ // Fold the manifest hash into the warmupTag. The `extraFiles` entry
117
+ // below does NOT reliably re-key the snapshot in this VM-runtime
118
+ // version (verified on the offline runner: manifest changed, bake
119
+ // was still 0.0s warm). The warmupTag DOES definitively key it, so
120
+ // hash the manifest (a sha256 list of the vendored tarballs) into
121
+ // the tag: tarball change → manifest change → tag change → rebake →
122
+ // warmup reinstalls, with no manual bump. `v15` is the warmup-SCRIPT
123
+ // version — bump only for warmup-step changes (v15: a failed
124
+ // npm install now aborts the bake instead of caching a half-
125
+ // installed node_modules volume).
126
+ const manifestHash = tarballManifestExists
127
+ ? createHash('sha256').update(readFileSync(tarballManifest)).digest('hex').slice(0, 12)
128
+ : 'no-manifest';
129
+ // Fold the @supermachine/core (VM runtime) version into the snapshot
130
+ // key too: the bake hash keys on GUEST inputs (image + tarballs), not
131
+ // the host VMM, so a runtime bump would otherwise warm-restore a stale
132
+ // snapshot baked by the old runtime. Key on the installed version so a
133
+ // bump auto-rebakes — same philosophy as the manifest hash. Resolved
134
+ // from the consumer root; degrades to a stable bucket if unreadable.
135
+ const runtimeVersion = (() => {
136
+ try {
137
+ const requirePkg = createRequire(resolve(repoRoot, 'package.json'));
138
+ return requirePkg('@supermachine/core/package.json').version;
139
+ }
140
+ catch {
141
+ return 'unknown';
142
+ }
143
+ })();
144
+ const runtimeTag = `sm${runtimeVersion.replace(/[^0-9a-z]+/gi, '')}`;
145
+ // Scope the snapshot to the consuming app — see runOffline.ts. Warm
146
+ // snapshots are keyed (image + warmupTag) and the image is shared, so
147
+ // two apps vendoring the same shopify-test build would otherwise
148
+ // collide on one warm snapshot (which captures the app's npm install).
149
+ const warmupTag = `online-v15-${appName}-${runtimeTag}-${manifestHash}`;
150
+ // Dynamic import — @supermachine/core is heavy and only needed
151
+ // when actually running tests, not for `--help` etc.
152
+ const { Image } = await import('@supermachine/core');
153
+ const imageOpts = await imageSourceOptions();
154
+ console.error(`[runVm] baking image… (warmupTag=${warmupTag})`);
155
+ const tBake = performance.now();
156
+ // arm64 native — no Rosetta translation tax. Storepool +
157
+ // captureAuth use patchright's bundled chromium (arm64 build
158
+ // ships with the package), so we no longer need amd64+Rosetta
159
+ // for real Google Chrome.
160
+ const platform = process.env['TEST_ONLINE_VM_PLATFORM'] ?? 'linux/arm64';
161
+ // `cmd` overrides only the image's CMD; VM runtime 0.7.16+
162
+ // auto-prepends the image's ENTRYPOINT (Docker-like semantics).
163
+ // The amd64 image's entrypoint.sh starts Xvfb + Postgres +
164
+ // /etc/hosts seed before exec-ing the cmd args; those services
165
+ // are preserved across snapshot/restore as background processes.
166
+ const image = await Image.build({
167
+ ref: process.env['TEST_ONLINE_VM_IMAGE'] ??
168
+ // arm64-native conformance image (Dockerfile.vm).
169
+ // We switched the browser to patchright-only (storePool +
170
+ // captureAuth both use the bundled chromium with stealth
171
+ // patches), so we no longer need the amd64 image to host
172
+ // google-chrome-stable amd64 — arm64 native is faster
173
+ // (no Rosetta translation) and uses less memory.
174
+ 'essential-apps/shopify-test-vm:latest',
175
+ // 12 GiB ceiling — patchright chromium + postgres + Vite/Remix
176
+ // (Prisma + esbuild + 2k+ packages loaded) + npm-install warmup
177
+ // all live concurrently. 8 GiB OOM-killed Vite during Playwright
178
+ // startup. Lazy CoW means host phys_footprint is far smaller;
179
+ // bump via TEST_ONLINE_VM_MEMORY_MIB for memory-hungry suites.
180
+ memoryMib: Number(process.env['TEST_ONLINE_VM_MEMORY_MIB'] ?? 12288),
181
+ vcpus: Number(process.env['TEST_ONLINE_VM_VCPUS'] ?? 4),
182
+ cmd: ['sleep', 'infinity'],
183
+ // SKIP_OFFLINE_HOST_HIJACK=1 — image's entrypoint.sh would
184
+ // otherwise redirect *.shopify.com → 127.0.0.1 for offline-mode
185
+ // wiring. Online hits REAL Shopify endpoints; need real DNS.
186
+ env: { SKIP_OFFLINE_HOST_HIJACK: '1' },
187
+ ...(platform ? { platform } : {}),
188
+ mounts: [
189
+ // Workspace stays a virtio-fs MOUNT — host edits live in
190
+ // the guest. node_modules moved to a volume below.
191
+ // `guestPath` is required in the VM runtime 0.7.28+; init-oci
192
+ // auto-mounts at this path in declared order BEFORE warmup
193
+ // fires, so we no longer mount manually in the warmup script.
194
+ { hostPath: repoRoot, guestTag: 'workspace', guestPath: '/workspace' },
195
+ ],
196
+ volumes: [
197
+ // node_modules: virtio-blk volume mounted at /workspace/node_modules.
198
+ // The first volume → /dev/vdb (root is /dev/vda). Warmup formats
199
+ // it on first bake; subsequent restores re-mount it as-is.
200
+ // 4 GiB cap (sparse, only uses what's actually written).
201
+ {
202
+ hostPath: linuxModulesVolume,
203
+ guestPath: '/workspace/node_modules',
204
+ sizeMib: 4096,
205
+ },
206
+ ],
207
+ extraFiles: tarballManifestExists
208
+ ? [
209
+ // Folded into bake input-hash; any tarball change → manifest
210
+ // bytes change → new snapshot. Guest path is irrelevant
211
+ // beyond not colliding with anything else.
212
+ { hostPath: tarballManifest, guestPath: '/etc/.shopify-test-tarball-manifest' },
213
+ ]
214
+ : [],
215
+ // Snapshot key — computed from the tarball-manifest hash (see
216
+ // above) so a tarball refresh auto-rebakes without a manual bump.
217
+ // Warmup runs ONCE per bake; warm acquires skip it.
218
+ warmupTag,
219
+ // @ts-expect-error — @supermachine/core's BuildOptions type
220
+ // doesn't declare `warmup`, but the runtime accepts it. Tracked
221
+ // upstream; fix-or-augment when the types catch up.
222
+ warmup: async (vm) => {
223
+ const r = await vm.exec({
224
+ argv: ['sh', '-c', `
225
+ set -e
226
+
227
+ # VM runtime 0.7.28+ auto-mounts both /workspace
228
+ # (virtio-fs) and /workspace/node_modules (virtio-blk ext4
229
+ # volume) BEFORE warmup fires — no manual mount/format
230
+ # needed here. We keep one defence-in-depth check though:
231
+ # assert /workspace/node_modules is NOT virtiofs. If the
232
+ # volume auto-mount silently failed, /workspace/node_modules
233
+ # would surface the HOST's repo node_modules via the
234
+ # workspace bind, and the rm-rf below would corrupt the
235
+ # @supermachine binary and many other things mid-bake.
236
+ NM_FS=\$(stat -f -c %T /workspace/node_modules 2>/dev/null || stat --file-system --format=%T /workspace/node_modules)
237
+ echo "[volume] /workspace/node_modules filesystem type: \$NM_FS"
238
+ if [ "\$NM_FS" = "virtiofs" ] || [ "\$NM_FS" = "fuse.virtiofs" ]; then
239
+ echo "FATAL: /workspace/node_modules is \$NM_FS — auto-mount broken"
240
+ echo "/proc/mounts:"; grep ' /workspace' /proc/mounts || echo " (no /workspace entries)"
241
+ exit 1
242
+ fi
243
+
244
+ echo "--- repair perms for postgres ---"
245
+ chown -R postgres:postgres /var/lib/postgresql/data
246
+ chmod 700 /var/lib/postgresql/data
247
+ mkdir -p /var/run/postgresql
248
+ chown postgres:postgres /var/run/postgresql
249
+ chmod 775 /var/run/postgresql
250
+
251
+ echo "--- npm install (fresh per rebake) ---"
252
+ # Warmup runs exactly when the snapshot is rebaked — which
253
+ # happens only when the tarball-manifest extraFile changes
254
+ # (= someone ran pack-into.sh) or the warmupTag bumps.
255
+ # Either way we want a fresh install: wipe the volume's
256
+ # node_modules dir first so npm can't reuse stale tarballs.
257
+ cd /workspace
258
+ rm -rf node_modules/* node_modules/.[!.]* 2>/dev/null || true
259
+ # npm gates optionalDependencies by os/cpu automatically,
260
+ # so darwin-arm64-only natives (e.g. @supermachine/core-darwin-arm64)
261
+ # are skipped on Linux without needing --no-optional. Any
262
+ # "notsup os/cpu" failure here means a darwin-only package
263
+ # has snuck into hard "dependencies" — fix it in package.json
264
+ # rather than papering over with --no-optional, since that
265
+ # would also skip genuinely-needed Linux optionals.
266
+ # NB: do not pipe npm to "tail" — the pipeline exit status is
267
+ # tail's (0), which masks npm failures under "set -e", so a
268
+ # transient install error (e.g. ECONNRESET fetching prisma
269
+ # engines) would bake a snapshot with a half-installed
270
+ # node_modules volume that every warm restore then reuses.
271
+ # Capture to a file and check npm's own status: a failed
272
+ # install aborts the bake (no snapshot cached, next run
273
+ # rebakes), so a flaky-network blip self-heals.
274
+ if ! npm install --legacy-peer-deps --engine-strict=false > /tmp/npm-install.log 2>&1; then
275
+ echo "--- npm install FAILED - last 40 lines ---"
276
+ tail -40 /tmp/npm-install.log
277
+ exit 1
278
+ fi
279
+ tail -30 /tmp/npm-install.log
280
+
281
+ echo "--- patch /etc/hosts for localhost ---"
282
+ if ! grep -q "^127.0.0.1.*localhost" /etc/hosts; then
283
+ echo "127.0.0.1 localhost" >> /etc/hosts
284
+ echo "::1 localhost" >> /etc/hosts
285
+ fi
286
+
287
+ echo "--- warmup done ---"
288
+ `],
289
+ timeoutMs: 15 * 60 * 1000,
290
+ });
291
+ // Always print warmup output so silent failures (npm install
292
+ // writing to wrong dir, mounts attaching wrong tag, etc.) are
293
+ // visible.
294
+ console.error(`[runVm.warmup] stdout (${r.stdout.length} bytes):\n${r.stdout.toString()}`);
295
+ if (r.stderr.length > 0) {
296
+ console.error(`[runVm.warmup] stderr (${r.stderr.length} bytes):\n${r.stderr.toString()}`);
297
+ }
298
+ if (r.exitCode !== 0) {
299
+ throw new Error(`warmup failed (exit ${r.exitCode}) — see output above`);
300
+ }
301
+ },
302
+ ...imageOpts,
303
+ });
304
+ console.error(`[runVm] bake: ${((performance.now() - tBake) / 1000).toFixed(1)} s`);
305
+ const pool = await image.pool({ min: 1, max: 1, restoreOnRelease: false });
306
+ const vm = await pool.acquire();
307
+ try {
308
+ // Post-restore sanity. VM runtime 0.7.28+ captures the
309
+ // auto-mount tree in the snapshot, so /workspace and
310
+ // /workspace/node_modules are already mounted on restore. We
311
+ // just assert + bail if anything's off; same defence-in-depth
312
+ // virtiofs check as the warmup to prevent rm-by-accident if
313
+ // auto-mount layering ever breaks.
314
+ const tMount = performance.now();
315
+ const mountR = await vm.exec({
316
+ argv: ['sh', '-c', `
317
+ mountpoint -q /workspace || { echo "FATAL: /workspace not mounted"; exit 1; }
318
+ mountpoint -q /workspace/node_modules || { echo "FATAL: /workspace/node_modules not mounted"; exit 1; }
319
+ NM_FS=\$(stat -f -c %T /workspace/node_modules 2>/dev/null)
320
+ if [ "\$NM_FS" = "virtiofs" ] || [ "\$NM_FS" = "fuse.virtiofs" ]; then
321
+ echo "FATAL: /workspace/node_modules is \$NM_FS — auto-mount layering broken"
322
+ exit 1
323
+ fi
324
+ ls /workspace/node_modules/@essential-apps/shopify-test-runner/dist/scripts/runTests.js >/dev/null \
325
+ || { echo "FATAL: runTests.js missing in volume — snapshot/volume out of sync"; ls /workspace/node_modules/@essential-apps 2>&1 | head; exit 1; }
326
+ `],
327
+ timeoutMs: 10_000,
328
+ });
329
+ if (mountR.exitCode !== 0) {
330
+ console.error(`[runVm] mount failed:\n${mountR.stdout.toString()}${mountR.stderr.toString()}`);
331
+ process.exit(1);
332
+ }
333
+ console.error(`[runVm] mounts: ${((performance.now() - tMount) / 1000).toFixed(2)} s`);
334
+ // Postgres startup — fast because warmup already chowned the data dir.
335
+ const tPg = performance.now();
336
+ const pgR = await vm.exec({
337
+ argv: ['sh', '-c', `
338
+ export PGDATA=/var/lib/postgresql/data
339
+ export PG_BIN=/usr/lib/postgresql/14/bin
340
+ # Use pg_isready (actually checks ACCEPT-CONNECTIONS) rather
341
+ # than pg_ctl status (which just checks postmaster.pid exists).
342
+ # The snapshot can capture a stale postmaster.pid file from
343
+ # the bake-time postgres that didn't survive restore, so
344
+ # pg_ctl status returns 0 but pg_isready / actual connections
345
+ # both fail. Always prefer the real readiness probe.
346
+ if su postgres -c "\${PG_BIN}/pg_isready -h 127.0.0.1 -p 5432 -q" >/dev/null 2>&1; then exit 0; fi
347
+ # Postgres isn't actually serving — clean up any stale state
348
+ # from the snapshot and start fresh.
349
+ rm -f \${PGDATA}/postmaster.pid 2>/dev/null || true
350
+ if [ -z "$(ls -A \${PGDATA} 2>/dev/null)" ]; then su postgres -c "\${PG_BIN}/initdb -D \${PGDATA} -A trust" >/dev/null; fi
351
+ su postgres -c "\${PG_BIN}/pg_ctl -D \${PGDATA} -l /tmp/pg.log -o '-h 127.0.0.1 -p 5432' start" >/dev/null
352
+ for _ in $(seq 1 50); do
353
+ if su postgres -c "\${PG_BIN}/pg_isready -h 127.0.0.1 -p 5432" >/dev/null 2>&1; then
354
+ # Create 'root' superuser to match the libkrun image entrypoint
355
+ # — runTests.js connects as 'root'.
356
+ su postgres -c "\${PG_BIN}/createuser -h 127.0.0.1 -p 5432 -s root" 2>&1 | grep -v 'already exists' || true
357
+ exit 0
358
+ fi
359
+ sleep 0.1
360
+ done
361
+ cat /tmp/pg.log
362
+ exit 1
363
+ `],
364
+ timeoutMs: 30_000,
365
+ });
366
+ if (pgR.exitCode !== 0) {
367
+ console.error('[runVm] postgres start failed:', pgR.stderr.toString());
368
+ process.exit(1);
369
+ }
370
+ console.error(`[runVm] postgres: ${((performance.now() - tPg) / 1000).toFixed(2)} s`);
371
+ // Xvfb: snapshot/restore preserves /tmp/.X11-unix/X99 (socket
372
+ // file) AND /tmp/.X99-lock (lock file). After restore, the
373
+ // entrypoint's `Xvfb :99 &` call refuses to start ("server :99
374
+ // already in use") because the stale lock is present — but the
375
+ // STALE SOCKET file is also there, so a `[ -e socket ]` check
376
+ // passes spuriously and Chrome gets "Missing X server or
377
+ // $DISPLAY" when it tries to actually connect. Same failure
378
+ // mode we hit in runVmAuth.ts; same fix: kill any
379
+ // existing Xvfb, remove the stale lock/socket, start fresh.
380
+ // Always start Xvfb — storePool launches HEADED chromium (matches
381
+ // captureAuth's fingerprint for cf_clearance carryover), and
382
+ // headed chromium needs an X server regardless of arch.
383
+ const needsXvfb = true;
384
+ if (needsXvfb) {
385
+ const tXvfb = performance.now();
386
+ const xR = await vm.exec({
387
+ argv: ['bash', '-c', `
388
+ # pkill -x (process-name exact match) — NOT pkill -f, which
389
+ # would also match the script's own argv and kill ourselves.
390
+ pkill -x Xvfb 2>/dev/null || true
391
+ rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock
392
+ # -ac: no Xauthority required (other vm.exec / Playwright
393
+ # processes can connect without the cookie context from
394
+ # the start). Background via nohup + & so the daemon
395
+ # outlives this exec call.
396
+ nohup Xvfb :99 -screen 0 1600x1000x24 -nolisten tcp -ac \
397
+ >/var/log/xvfb.log 2>&1 &
398
+ for _ in $(seq 1 150); do
399
+ [ -e /tmp/.X11-unix/X99 ] && echo ready && exit 0
400
+ sleep 0.1
401
+ done
402
+ echo "Xvfb did not bind /tmp/.X11-unix/X99 within 15s"
403
+ cat /var/log/xvfb.log
404
+ exit 1
405
+ `],
406
+ timeoutMs: 30_000,
407
+ });
408
+ if (xR.exitCode !== 0) {
409
+ console.error(`[runVm] Xvfb wait failed: ${xR.stderr.toString()}`);
410
+ process.exit(1);
411
+ }
412
+ console.error(`[runVm] Xvfb: ${((performance.now() - tXvfb) / 1000).toFixed(2)} s (${xR.stdout.toString().trim()})`);
413
+ }
414
+ // Forward a curated env subset into the test process. Anything
415
+ // beyond this is intentionally not visible to the in-VM Node
416
+ // (hermetic, same policy as runTests.js itself).
417
+ const forwardEnv = {};
418
+ for (const k of [
419
+ 'TEST_VISIBLE',
420
+ 'TEST_WORKERS',
421
+ 'TEST_PRESERVE_DB',
422
+ // TEST_ONLINE_STORE_CLEANUP_URL / TEST_ONLINE_CLEANUP_SECRET intentionally not
423
+ // forwarded — runTests.ts generates the secret per-run and
424
+ // builds the URL from devAppUrl. Forwarding stale values from
425
+ // .env.test would override that.
426
+ 'TEST_OFFLINE_STRICT_GRAPHQL',
427
+ // TEST_FORCE_REAL_CHROME: storePool flips chromium.launch to
428
+ // `channel: 'chrome'` (real Google Chrome amd64 installed in
429
+ // the libkrun-style image). Set this together with
430
+ // TEST_ONLINE_VM_IMAGE=…shopify-test:latest +
431
+ // TEST_ONLINE_VM_PLATFORM=linux/amd64.
432
+ 'TEST_FORCE_REAL_CHROME',
433
+ // PLAYWRIGHT_GREP narrows the test set inside the VM. runTests.ts
434
+ // reads this and forwards as `playwright test --grep`. Without
435
+ // this passthrough, an env var the user sets on the host invocation
436
+ // would silently get dropped and the whole suite would run.
437
+ 'PLAYWRIGHT_GREP',
438
+ 'CI',
439
+ 'DEBUG',
440
+ ]) {
441
+ const v = process.env[k];
442
+ if (v !== undefined)
443
+ forwardEnv[k] = v;
444
+ }
445
+ // Mark we're inside the test container — storePool reads this to
446
+ // adjust chromium launch flags.
447
+ forwardEnv['TEST_IN_CONTAINER'] = 'true';
448
+ // Wire DISPLAY for headed Chrome. Matches the Xvfb start above.
449
+ if (needsXvfb)
450
+ forwardEnv['DISPLAY'] = ':99';
451
+ // Spawn the test runner. Streaming stdout/stderr via spawn so
452
+ // the user sees Playwright output as it lands rather than at end.
453
+ console.error('[runVm] launching runTests.js…');
454
+ const tTests = performance.now();
455
+ const testProc = await vm.spawn({
456
+ argv: ['sh', '-c', `
457
+ cd /workspace
458
+ # node_modules/.bin on PATH so test code can shell out to
459
+ # local CLIs (shopify, prisma, playwright). Matches the
460
+ # libkrun image's entrypoint.sh.
461
+ export PATH=/workspace/node_modules/.bin:$PATH
462
+ # Merge stderr → stdout so the stall guard sees Node errors
463
+ # (which Node writes to stderr) and surfaces them to the
464
+ # operator instead of dying silently after the stall timeout.
465
+ exec node ${envFileArgs(repoRoot)} node_modules/@essential-apps/shopify-test-runner/dist/scripts/runTests.js 2>&1
466
+ `],
467
+ env: forwardEnv,
468
+ });
469
+ // Stream + collect output. Hard 10-min cap by default, with a
470
+ // 60 s no-output stall guard (mirrors the offline-full bench's
471
+ // proven pattern for live processes).
472
+ const maxMs = Number(process.env['TEST_ONLINE_VM_TIMEOUT_MS'] ?? 10 * 60 * 1000);
473
+ // Stall guard: kill the test process if no output for N seconds.
474
+ // Default 60s; bump via TEST_ONLINE_VM_STALL_MS. amd64+Rosetta
475
+ // can take >60s for Vite/Remix initial compile so bump for that
476
+ // path explicitly.
477
+ const stallMs = Number(process.env['TEST_ONLINE_VM_STALL_MS'] ??
478
+ (platform === 'linux/amd64' ? 300_000 : 60_000));
479
+ const start = Date.now();
480
+ let lastByteAt = Date.now();
481
+ while (true) {
482
+ const out = await testProc.readStdout(64 * 1024);
483
+ const now = Date.now();
484
+ if (out.length === 0) {
485
+ if (now - start > maxMs) {
486
+ console.error(`\n[runVm] HARD TIMEOUT ${maxMs / 1000}s — killing`);
487
+ await testProc.signal(15).catch(() => { });
488
+ break;
489
+ }
490
+ if (now - lastByteAt > stallMs) {
491
+ console.error(`\n[runVm] no output for ${stallMs / 1000}s — killing`);
492
+ await testProc.signal(15).catch(() => { });
493
+ break;
494
+ }
495
+ await new Promise((r) => setTimeout(r, 200));
496
+ continue;
497
+ }
498
+ lastByteAt = now;
499
+ process.stdout.write(out);
500
+ // Playwright summary lines look like " 17 passed (45.6s)" or
501
+ // " 3 failed". Once we see one, drain the tail and break.
502
+ if (/\b\d+ (passed|failed)\b/.test(out.toString())) {
503
+ await new Promise((r) => setTimeout(r, 500));
504
+ const tail = await testProc.readStdout(64 * 1024);
505
+ if (tail.length > 0)
506
+ process.stdout.write(tail);
507
+ break;
508
+ }
509
+ }
510
+ const wait = await testProc.wait();
511
+ console.error(`[runVm] tests: ${((performance.now() - tTests) / 1000).toFixed(1)} s`);
512
+ console.error(`[runVm] grand: ${((performance.now() - tBake) / 1000).toFixed(1)} s`);
513
+ process.exit(wait.exitCode ?? 0);
514
+ }
515
+ finally {
516
+ await vm.release().catch(() => { });
517
+ await pool.shutdown().catch(() => { });
518
+ }
519
+ }
520
+ main().catch((err) => {
521
+ console.error(err);
522
+ process.exit(1);
523
+ });
524
+ //# sourceMappingURL=runVm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runVm.js","sourceRoot":"","sources":["../../src/scripts/runVm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=runVmAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runVmAuth.d.ts","sourceRoot":"","sources":["../../src/scripts/runVmAuth.ts"],"names":[],"mappings":""}