@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,242 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Generic NON-interactive in-VM script runner.
4
+ *
5
+ * Boots the same VM the online suite uses and runs
6
+ * `dist/scripts/<name>.js [args]` inside it, headed under Xvfb :99 (the
7
+ * Cloudflare-passing config the tests use), with TEST_IN_CONTAINER=true.
8
+ * This is how the store-setup scripts that drive a browser — installApp,
9
+ * createStores — run: in the VM, never on the host. (For the INTERACTIVE
10
+ * human-login flow, see runVmAuth.ts, which adds VNC.)
11
+ *
12
+ * Usage (wired via package.json):
13
+ * node --import tsx .../runVmScript.ts <script-name> [-- <args…>]
14
+ * e.g.
15
+ * npm run test:online:install -- --shop my-store.myshopify.com
16
+ * → runVmScript installApp --shop my-store.myshopify.com
17
+ *
18
+ * Shares the node_modules volume + tarball-manifest extraFile with runVm /
19
+ * runVmAuth, and keys on a static warmupTag (rarely-run flow; bump on
20
+ * warmup-script or VM-runtime changes).
21
+ */
22
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
23
+ import { homedir } from 'node:os';
24
+ import { resolve } from 'node:path';
25
+ import { prepareOciArchive, envFileArgs } from '@essential-apps/shopify-test-core';
26
+ const repoRoot = process.cwd();
27
+ /** Resolve the VM image source the same way runVm.ts / runVmAuth.ts do. */
28
+ async function imageSourceOptions() {
29
+ const mode = process.env['TEST_ONLINE_VM_IMAGE_SOURCE'] ?? 'oci-archive';
30
+ if (mode === 'registry')
31
+ return {};
32
+ const ref = process.env['TEST_ONLINE_VM_IMAGE'] ?? 'essential-apps/shopify-test-vm:latest';
33
+ if (mode === 'oci-archive') {
34
+ const prep = await prepareOciArchive(ref);
35
+ if (prep.freshlySaved) {
36
+ console.error(`[runVmScript] saved ${ref} → ${prep.archivePath} (${(prep.sizeBytes / 1024 / 1024).toFixed(1)} MB)`);
37
+ }
38
+ return { source: 'oci-archive', sourcePath: prep.archivePath };
39
+ }
40
+ if (mode === 'oci-layout') {
41
+ const sourcePath = process.env['TEST_ONLINE_VM_IMAGE_LAYOUT_PATH'];
42
+ if (!sourcePath) {
43
+ throw new Error(`TEST_ONLINE_VM_IMAGE_SOURCE=oci-layout requires TEST_ONLINE_VM_IMAGE_LAYOUT_PATH`);
44
+ }
45
+ return { source: 'oci-layout', sourcePath };
46
+ }
47
+ throw new Error(`TEST_ONLINE_VM_IMAGE_SOURCE=${mode} not recognised. Valid: oci-archive | oci-layout | registry`);
48
+ }
49
+ function readAppName() {
50
+ const pkgPath = resolve(repoRoot, 'package.json');
51
+ if (!existsSync(pkgPath)) {
52
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
53
+ }
54
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
55
+ if (!pkg.name)
56
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
57
+ return pkg.name.replace(/^@[^/]+\//, '');
58
+ }
59
+ /** Single-quote-escape an arg for safe interpolation into `sh -c`. */
60
+ function shq(arg) {
61
+ return `'${arg.replace(/'/g, `'\\''`)}'`;
62
+ }
63
+ async function main() {
64
+ const scriptName = process.argv[2];
65
+ const scriptArgs = process.argv.slice(3);
66
+ if (!scriptName || !/^[a-zA-Z][a-zA-Z0-9]*$/.test(scriptName)) {
67
+ console.error(`Usage: runVmScript <script-name> [args…]\n` +
68
+ ` <script-name> must be a bare script name (e.g. installApp), no path.`);
69
+ process.exit(1);
70
+ }
71
+ const appName = readAppName();
72
+ const linuxModulesVolume = process.env['TEST_LINUX_NODE_MODULES_VOLUME'] ??
73
+ resolve(homedir(), `.cache/${appName}-test/node_modules.img`);
74
+ mkdirSync(resolve(linuxModulesVolume, '..'), { recursive: true });
75
+ const tarballManifest = resolve(repoRoot, 'vendor/essential-apps-shopify-test/.tarball-manifest');
76
+ const tarballManifestExists = existsSync(tarballManifest);
77
+ const ref = process.env['TEST_ONLINE_VM_IMAGE'] ?? 'essential-apps/shopify-test-vm:latest';
78
+ const platform = process.env['TEST_ONLINE_VM_PLATFORM'] ?? 'linux/arm64';
79
+ console.error(`[runVmScript] baking image…`);
80
+ const tBake = performance.now();
81
+ const { Image } = await import('@supermachine/core');
82
+ const imageOpts = await imageSourceOptions();
83
+ const image = await Image.build({
84
+ ref,
85
+ memoryMib: Number(process.env['TEST_ONLINE_VM_MEMORY_MIB'] ?? 8192),
86
+ vcpus: Number(process.env['TEST_ONLINE_VM_VCPUS'] ?? 4),
87
+ cmd: ['sleep', 'infinity'],
88
+ env: { SKIP_OFFLINE_HOST_HIJACK: '1' },
89
+ platform,
90
+ mounts: [{ hostPath: repoRoot, guestTag: 'workspace', guestPath: '/workspace' }],
91
+ volumes: [
92
+ {
93
+ hostPath: linuxModulesVolume,
94
+ guestPath: '/workspace/node_modules',
95
+ sizeMib: 4096,
96
+ },
97
+ ],
98
+ extraFiles: tarballManifestExists
99
+ ? [{ hostPath: tarballManifest, guestPath: '/etc/.shopify-test-tarball-manifest' }]
100
+ : [],
101
+ // Static tag (rarely-run setup flow). Bump on warmup-script / VM-runtime
102
+ // changes. Kept distinct from runVm's online-v15 (manifest-keyed) and
103
+ // runVmAuth's online-v4 so a tweak here can't disturb those snapshots.
104
+ warmupTag: 'online-script-v1',
105
+ // @ts-expect-error — @supermachine/core's BuildOptions type doesn't declare
106
+ // `warmup`, but the runtime accepts it (matches runVm/runVmAuth).
107
+ warmup: async (vm) => {
108
+ const r = await vm.exec({
109
+ argv: [
110
+ 'sh',
111
+ '-c',
112
+ `
113
+ set -e
114
+ NM_FS=\$(stat -f -c %T /workspace/node_modules 2>/dev/null || stat --file-system --format=%T /workspace/node_modules)
115
+ echo "[warmup] /workspace/node_modules FS type: \$NM_FS"
116
+ if [ "\$NM_FS" = "virtiofs" ] || [ "\$NM_FS" = "fuse.virtiofs" ]; then
117
+ echo "FATAL: /workspace/node_modules is \$NM_FS — auto-mount broken"
118
+ exit 1
119
+ fi
120
+ cd /workspace
121
+ rm -rf node_modules/* node_modules/.[!.]* 2>/dev/null || true
122
+ if ! npm install --legacy-peer-deps --engine-strict=false > /tmp/npm-install.log 2>&1; then
123
+ echo "--- npm install FAILED - last 40 lines ---"
124
+ tail -40 /tmp/npm-install.log
125
+ exit 1
126
+ fi
127
+ tail -10 /tmp/npm-install.log
128
+ if ! grep -q "^127.0.0.1.*localhost" /etc/hosts; then
129
+ echo "127.0.0.1 localhost" >> /etc/hosts
130
+ echo "::1 localhost" >> /etc/hosts
131
+ fi
132
+ `,
133
+ ],
134
+ timeoutMs: 15 * 60 * 1000,
135
+ });
136
+ if (r.exitCode !== 0) {
137
+ console.error('[runVmScript.warmup] failed:', r.stdout.toString(), r.stderr.toString());
138
+ throw new Error(`warmup failed (exit ${r.exitCode})`);
139
+ }
140
+ },
141
+ ...imageOpts,
142
+ });
143
+ console.error(`[runVmScript] bake: ${((performance.now() - tBake) / 1000).toFixed(1)} s`);
144
+ const pool = await image.pool({ min: 1, max: 1, restoreOnRelease: false });
145
+ const vm = await pool.acquire();
146
+ let cleanupPromise = null;
147
+ const cleanup = () => {
148
+ if (cleanupPromise)
149
+ return cleanupPromise;
150
+ cleanupPromise = (async () => {
151
+ await vm.release().catch(() => undefined);
152
+ await pool.shutdown().catch(() => undefined);
153
+ })();
154
+ return cleanupPromise;
155
+ };
156
+ let signalCount = 0;
157
+ const onSignal = (sig) => {
158
+ signalCount += 1;
159
+ if (signalCount >= 2)
160
+ process.exit(130);
161
+ console.error(`\n[runVmScript] received ${sig}, cleaning up…`);
162
+ cleanup()
163
+ .catch(() => undefined)
164
+ .finally(() => process.exit(130));
165
+ };
166
+ process.on('SIGINT', onSignal);
167
+ process.on('SIGTERM', onSignal);
168
+ try {
169
+ // Post-restore sanity + start Xvfb :99 so headed patchright (the
170
+ // CF-passing config) has a display. Browser launches in the guest
171
+ // still go through assertInVm(), which passes because we set
172
+ // TEST_IN_CONTAINER=true on the spawned process below.
173
+ const setup = await vm.exec({
174
+ argv: [
175
+ 'sh',
176
+ '-c',
177
+ `
178
+ mountpoint -q /workspace/node_modules || { echo "FATAL: /workspace/node_modules not mounted"; exit 1; }
179
+ BASE=/workspace/node_modules/@essential-apps/shopify-test-runner/dist
180
+ if [ -f "\$BASE/scripts/${scriptName}.js" ]; then S="\$BASE/scripts/${scriptName}.js"; else S="\$BASE/probes/${scriptName}.js"; fi
181
+ ls "\$S" >/dev/null \
182
+ || { echo "FATAL: ${scriptName}.js missing in volume (checked scripts/ and probes/) — snapshot/volume out of sync"; exit 1; }
183
+ pkill -x Xvfb 2>/dev/null || true
184
+ rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock
185
+ sleep 0.3
186
+ nohup Xvfb :99 -screen 0 1600x1000x24 -nolisten tcp -ac >/var/log/xvfb.log 2>&1 &
187
+ for _ in $(seq 1 50); do [ -e /tmp/.X11-unix/X99 ] && break; sleep 0.1; done
188
+ [ -e /tmp/.X11-unix/X99 ] || { echo "FATAL: Xvfb :99 did not start"; cat /var/log/xvfb.log; exit 1; }
189
+ echo "[runVmScript] Xvfb :99 up."
190
+ `,
191
+ ],
192
+ timeoutMs: 30_000,
193
+ });
194
+ if (setup.exitCode !== 0) {
195
+ console.error(`[runVmScript] setup failed:\n${setup.stdout.toString()}${setup.stderr.toString()}`);
196
+ throw new Error('VM setup failed');
197
+ }
198
+ const argsStr = scriptArgs.map(shq).join(' ');
199
+ console.error(`[runVmScript] running ${scriptName} ${argsStr} in the VM…`);
200
+ const child = await vm.spawn({
201
+ argv: [
202
+ 'sh',
203
+ '-c',
204
+ `cd /workspace && BASE=node_modules/@essential-apps/shopify-test-runner/dist; if [ -f "\$BASE/scripts/${scriptName}.js" ]; then S="\$BASE/scripts/${scriptName}.js"; else S="\$BASE/probes/${scriptName}.js"; fi; DISPLAY=:99 TEST_IN_CONTAINER=true node ${envFileArgs(repoRoot)} "\$S" ${argsStr}`,
205
+ ],
206
+ env: { DISPLAY: ':99', TEST_IN_CONTAINER: 'true' },
207
+ });
208
+ const childAny = child;
209
+ const streamGuest = async (reader, out) => {
210
+ if (!reader)
211
+ return;
212
+ // eslint-disable-next-line no-constant-condition
213
+ while (true) {
214
+ const chunk = await reader().catch(() => null);
215
+ if (!chunk || chunk.length === 0)
216
+ return;
217
+ out.write(chunk);
218
+ }
219
+ };
220
+ void streamGuest(childAny.readStdout, process.stdout);
221
+ void streamGuest(childAny.readStderr, process.stderr);
222
+ const result = await (childAny.wait?.() ?? Promise.resolve({ exitCode: 0 }));
223
+ await cleanup();
224
+ if (result.exitCode === 0) {
225
+ console.error(`[runVmScript] ✓ ${scriptName} completed.`);
226
+ }
227
+ else {
228
+ console.error(`[runVmScript] ${scriptName} exited with code ${result.exitCode}`);
229
+ }
230
+ process.exit(result.exitCode);
231
+ }
232
+ catch (err) {
233
+ console.error('[runVmScript] fatal:', err.message);
234
+ await cleanup();
235
+ process.exit(1);
236
+ }
237
+ }
238
+ main().catch(async (err) => {
239
+ console.error(err);
240
+ process.exit(1);
241
+ });
242
+ //# sourceMappingURL=runVmScript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runVmScript.js","sourceRoot":"","sources":["../../src/scripts/runVmScript.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAC;AAEnF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;AAE/B,2EAA2E;AAC3E,KAAK,UAAU,kBAAkB;IAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,IAAI,aAAa,CAAC;IACzE,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,uCAAuC,CAAC;IACjF,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,OAAO,CAAC,KAAK,CACX,uBAAuB,GAAG,MAAM,IAAI,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CACrG,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;QACnE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,IAAI,KAAK,CACb,+BAA+B,IAAI,6DAA6D,CACjG,CAAC;AACJ,CAAC;AAMD,SAAS,WAAW;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAClD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,sBAAsB,OAAO,gDAAgD,CAC9E,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAgB,CAAC;IACrE,IAAI,CAAC,GAAG,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,OAAO,yBAAyB,CAAC,CAAC;IACpF,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,sEAAsE;AACtE,SAAS,GAAG,CAAC,GAAW;IACtB,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9D,OAAO,CAAC,KAAK,CACX,4CAA4C;YAC1C,wEAAwE,CAC3E,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,kBAAkB,GACtB,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC;QAC7C,OAAO,CAAC,OAAO,EAAE,EAAE,UAAU,OAAO,wBAAwB,CAAC,CAAC;IAChE,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,eAAe,GAAG,OAAO,CAC7B,QAAQ,EACR,sDAAsD,CACvD,CAAC;IACF,MAAM,qBAAqB,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,GAAG,GACP,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,uCAAuC,CAAC;IACjF,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,aAAa,CAAC;IAEzE,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAChC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC;QAC9B,GAAG;QACH,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC;QACnE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC;QACvD,GAAG,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC;QAC1B,GAAG,EAAE,EAAE,wBAAwB,EAAE,GAAG,EAAE;QACtC,QAAQ;QACR,MAAM,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;QAChF,OAAO,EAAE;YACP;gBACE,QAAQ,EAAE,kBAAkB;gBAC5B,SAAS,EAAE,yBAAyB;gBACpC,OAAO,EAAE,IAAI;aACd;SACF;QACD,UAAU,EAAE,qBAAqB;YAC/B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,EAAE,SAAS,EAAE,qCAAqC,EAAE,CAAC;YACnF,CAAC,CAAC,EAAE;QACN,yEAAyE;QACzE,sEAAsE;QACtE,uEAAuE;QACvE,SAAS,EAAE,kBAAkB;QAC7B,4EAA4E;QAC5E,kEAAkE;QAClE,MAAM,EAAE,KAAK,EAAE,EAMd,EAAE,EAAE;YACH,MAAM,CAAC,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;gBACtB,IAAI,EAAE;oBACJ,IAAI;oBACJ,IAAI;oBACJ;;;;;;;;;;;;;;;;;;;;SAoBD;iBACA;gBACD,SAAS,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;aAC1B,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACxF,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;QACD,GAAG,SAAS;KACb,CAAC,CAAC;IACH,OAAO,CAAC,KAAK,CACX,uBAAuB,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAC3E,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,gBAAgB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3E,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IAEhC,IAAI,cAAc,GAAyB,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,GAAkB,EAAE;QAClC,IAAI,cAAc;YAAE,OAAO,cAAc,CAAC;QAC1C,cAAc,GAAG,CAAC,KAAK,IAAI,EAAE;YAC3B,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC,CAAC,EAAE,CAAC;QACL,OAAO,cAAc,CAAC;IACxB,CAAC,CAAC;IACF,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,MAAM,QAAQ,GAAG,CAAC,GAAmB,EAAQ,EAAE;QAC7C,WAAW,IAAI,CAAC,CAAC;QACjB,IAAI,WAAW,IAAI,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,gBAAgB,CAAC,CAAC;QAC/D,OAAO,EAAE;aACN,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;aACtB,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtC,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,IAAI,CAAC;QACH,iEAAiE;QACjE,kEAAkE;QAClE,6DAA6D;QAC7D,uDAAuD;QACvD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC;YAC1B,IAAI,EAAE;gBACJ,IAAI;gBACJ,IAAI;gBACJ;;;kCAG0B,UAAU,kCAAkC,UAAU,+BAA+B,UAAU;;8BAEnG,UAAU;;;;;;;;OAQjC;aACA;YACD,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QACH,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACnG,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACrC,CAAC;QAED,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,yBAAyB,UAAU,IAAI,OAAO,aAAa,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC;YAC3B,IAAI,EAAE;gBACJ,IAAI;gBACJ,IAAI;gBACJ,wGAAwG,UAAU,kCAAkC,UAAU,+BAA+B,UAAU,qDAAqD,WAAW,CAAC,QAAQ,CAAC,UAAU,OAAO,EAAE;aACrS;YACD,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE;SACnD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,KAIhB,CAAC;QACF,MAAM,WAAW,GAAG,KAAK,EACvB,MAA2C,EAC3C,GAAuB,EACR,EAAE;YACjB,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,iDAAiD;YACjD,OAAO,IAAI,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAO;gBACzC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,CAAC;QACH,CAAC,CAAC;QACF,KAAK,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACtD,KAAK,WAAW,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QAEtD,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,MAAM,OAAO,EAAE,CAAC;QAChB,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,KAAK,CAAC,mBAAmB,UAAU,aAAa,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,iBAAiB,UAAU,qBAAqB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,OAAO,EAAE,CAAC;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=setupTestDb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupTestDb.d.ts","sourceRoot":"","sources":["../../src/scripts/setupTestDb.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * One-time / on-demand local Postgres prep for tests.
4
+ *
5
+ * - Smoke-tests that local Postgres is reachable
6
+ * - Runs `prisma migrate deploy` against an ephemeral DB and drops it
7
+ *
8
+ * The actual test runner (runTests.ts) creates a fresh UUID-named DB
9
+ * per run and applies migrations there. This script is just for
10
+ * diagnostics — confirms the toolchain works before you try to run
11
+ * tests.
12
+ */
13
+ import { execSync } from 'node:child_process';
14
+ import { randomUUID } from 'node:crypto';
15
+ import { existsSync, readFileSync } from 'node:fs';
16
+ import { resolve } from 'node:path';
17
+ import { loadEnv, printEnvSummary } from '@essential-apps/shopify-test-core';
18
+ const PG_HOST = 'localhost';
19
+ const PG_PORT = '5432';
20
+ function readAppName() {
21
+ const pkgPath = resolve(process.cwd(), 'package.json');
22
+ if (!existsSync(pkgPath)) {
23
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
24
+ }
25
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
26
+ if (!pkg.name)
27
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
28
+ return pkg.name.replace(/^@[^/]+\//, '');
29
+ }
30
+ async function main() {
31
+ const env = loadEnv();
32
+ printEnvSummary(env);
33
+ console.log('[setup-db] checking local Postgres reachability…');
34
+ execSync(`pg_isready -h ${PG_HOST} -p ${PG_PORT}`, { stdio: 'inherit' });
35
+ const appName = readAppName();
36
+ const dbPrefix = (process.env['TEST_ONLINE_DB_NAME_PREFIX'] ?? `${appName}_online`)
37
+ .toLowerCase()
38
+ .replace(/[^a-z0-9_]/g, '_');
39
+ const dbName = `${dbPrefix}_smoke_${randomUUID().replace(/-/g, '_')}`;
40
+ const url = `postgresql://${PG_HOST}:${PG_PORT}/${dbName}`;
41
+ console.log(`[setup-db] creating throwaway DB: ${dbName}`);
42
+ execSync(`createdb -h ${PG_HOST} -p ${PG_PORT} ${dbName}`, { stdio: 'inherit' });
43
+ try {
44
+ console.log('[setup-db] running prisma migrate deploy…');
45
+ execSync('npx prisma migrate deploy', {
46
+ stdio: 'inherit',
47
+ env: { ...process.env, DATABASE_URL: url, DIRECT_URL: url, NODE_ENV: 'test' },
48
+ });
49
+ console.log('');
50
+ console.log('✓ Local Postgres + migrations work. You can now run: npm run test:online');
51
+ }
52
+ finally {
53
+ console.log(`[setup-db] dropping throwaway DB: ${dbName}`);
54
+ execSync(`dropdb -h ${PG_HOST} -p ${PG_PORT} ${dbName}`, { stdio: 'inherit' });
55
+ }
56
+ }
57
+ main().catch((err) => {
58
+ console.error(err);
59
+ process.exit(1);
60
+ });
61
+ //# sourceMappingURL=setupTestDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setupTestDb.js","sourceRoot":"","sources":["../../src/scripts/setupTestDb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=verifyContracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyContracts.d.ts","sourceRoot":"","sources":["../../src/scripts/verifyContracts.ts"],"names":[],"mappings":""}
@@ -0,0 +1,258 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * verifyContracts — the offline-side conformance check.
4
+ *
5
+ * Reads every vendored contract under `tests/test-offline/contracts/<api>/`,
6
+ * re-runs its operation against an in-process offline mock with the
7
+ * vendored `variables`, and asserts the response equals the
8
+ * vendored `response`. Any drift fails the check.
9
+ *
10
+ * See `docs/CONTRACTS.md` for the full architecture. This is one
11
+ * of three checks that together ensure the offline test suite
12
+ * cannot drift from real Shopify undetected:
13
+ *
14
+ * 1. check-operation-coverage — static: every prod root field has a resolver
15
+ * 2. verify-contracts — this script: mock matches vendored contracts
16
+ * 3. verify-contracts-from-live — (conformance suite) live matches vendored contracts
17
+ *
18
+ * Drift modes this catches:
19
+ * - A resolver was removed or its return shape changed.
20
+ * - A new field was added to a contract without the matching mock.
21
+ * - The mock's seeded ShopState shape diverged from the contract's
22
+ * expectation.
23
+ *
24
+ * What it doesn't catch (by design — owned by other checks):
25
+ * - The contract itself is wrong vs live Shopify. That's
26
+ * `verify-contracts-from-live`'s job.
27
+ * - Production code calls a field with no contract. That's
28
+ * `check-operation-coverage`.
29
+ *
30
+ * Run: `npm run test:online:verify-contracts`.
31
+ */
32
+ import { readdirSync, readFileSync, statSync } from 'node:fs';
33
+ import { resolve, relative } from 'node:path';
34
+ import { createAdminApi, createStorefrontApi, } from '@essential-apps/shopify-test-shopify-api';
35
+ import { ShopState } from '@essential-apps/shopify-test-storefront';
36
+ import { normaliseResponse } from '../contracts/normalize.js';
37
+ function parseArgs() {
38
+ const argv = process.argv.slice(2);
39
+ const out = {
40
+ api: 'admin',
41
+ contractsDir: '',
42
+ cwd: process.cwd(),
43
+ };
44
+ for (let i = 0; i < argv.length; i++) {
45
+ const a = argv[i] ?? '';
46
+ if (a === '--api' && i + 1 < argv.length) {
47
+ const next = argv[++i] ?? '';
48
+ if (next !== 'admin' && next !== 'storefront') {
49
+ console.error(`--api must be "admin" or "storefront"`);
50
+ process.exit(2);
51
+ }
52
+ out.api = next;
53
+ }
54
+ else if (a === '--dir' && i + 1 < argv.length) {
55
+ out.contractsDir = argv[++i] ?? '';
56
+ }
57
+ }
58
+ if (!out.contractsDir) {
59
+ out.contractsDir = resolve(out.cwd, 'tests/test-offline/contracts', out.api);
60
+ }
61
+ else {
62
+ out.contractsDir = resolve(out.cwd, out.contractsDir);
63
+ }
64
+ return out;
65
+ }
66
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any -- Hono types are loose
67
+ function buildOfflineExecutor(api, state) {
68
+ const app = api === 'admin' ? createAdminApi({ state }) : createStorefrontApi({ state });
69
+ const endpoint = api === 'admin'
70
+ ? '/admin/api/2025-07/graphql.json'
71
+ : '/api/2025-07/graphql.json';
72
+ return async (source, variables) => {
73
+ const resp = await app.request(endpoint, {
74
+ method: 'POST',
75
+ headers: {
76
+ 'Content-Type': 'application/json',
77
+ 'X-Shopify-Access-Token': 'mock-access-token',
78
+ },
79
+ body: JSON.stringify({ query: source, variables }),
80
+ });
81
+ return resp.json();
82
+ };
83
+ }
84
+ /**
85
+ * Same deterministic ShopState seed `captureContracts` uses. The
86
+ * contracts were captured against this state; verification must
87
+ * replay against the identical state for results to match.
88
+ *
89
+ * Keep this in lockstep with `captureContracts.ts`'s
90
+ * `buildSeededState`. If you change one, change the other.
91
+ */
92
+ function buildSeededState() {
93
+ const state = new ShopState({
94
+ shop: {
95
+ domain: 'test-shop.myshopify.com',
96
+ permanent_domain: 'test-shop.myshopify.com',
97
+ },
98
+ });
99
+ state.addProduct({
100
+ id: 900_000_001,
101
+ handle: 'sample-product',
102
+ title: 'Sample Product',
103
+ description: 'Used by contract capture as a deterministic fixture.',
104
+ price: 1000,
105
+ vendor: 'Sample Vendor',
106
+ type: 'Sample',
107
+ variants: [
108
+ {
109
+ id: 900_010_001,
110
+ title: 'Default Title',
111
+ price: 1000,
112
+ available: true,
113
+ sku: 'SAMPLE-1',
114
+ inventory_quantity: 100,
115
+ selected_options: ['Default Title'],
116
+ },
117
+ ],
118
+ tags: [],
119
+ });
120
+ state.addCollection({
121
+ id: 900_020_001,
122
+ handle: 'sample-collection',
123
+ title: 'Sample Collection',
124
+ productHandles: ['sample-product'],
125
+ });
126
+ return state;
127
+ }
128
+ /**
129
+ * Deep-equal that returns a human-readable diff path on the first
130
+ * mismatch. Not a perfect serialiser — sufficient for asserting
131
+ * captured JSON equals re-run JSON.
132
+ */
133
+ function diff(expected, actual, path = '$') {
134
+ if (expected === actual)
135
+ return null;
136
+ if (typeof expected !== typeof actual ||
137
+ expected === null ||
138
+ actual === null) {
139
+ return `${path}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`;
140
+ }
141
+ if (Array.isArray(expected)) {
142
+ if (!Array.isArray(actual))
143
+ return `${path}: expected array, got object`;
144
+ if (expected.length !== actual.length) {
145
+ return `${path}: expected length ${expected.length}, got ${actual.length}`;
146
+ }
147
+ for (let i = 0; i < expected.length; i++) {
148
+ const d = diff(expected[i], actual[i], `${path}[${i}]`);
149
+ if (d)
150
+ return d;
151
+ }
152
+ return null;
153
+ }
154
+ if (typeof expected === 'object') {
155
+ const e = expected;
156
+ const a = actual;
157
+ const allKeys = new Set([...Object.keys(e), ...Object.keys(a)]);
158
+ for (const k of allKeys) {
159
+ if (!(k in e))
160
+ return `${path}.${k}: unexpected key`;
161
+ if (!(k in a))
162
+ return `${path}.${k}: missing key`;
163
+ const d = diff(e[k], a[k], `${path}.${k}`);
164
+ if (d)
165
+ return d;
166
+ }
167
+ return null;
168
+ }
169
+ return `${path}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`;
170
+ }
171
+ async function main() {
172
+ const args = parseArgs();
173
+ let entries;
174
+ try {
175
+ entries = readdirSync(args.contractsDir);
176
+ }
177
+ catch {
178
+ console.error(`[verify-contracts] no contracts directory at ${args.contractsDir}. ` +
179
+ `Run \`npm run test:online:capture-contracts\` first.`);
180
+ process.exit(2);
181
+ }
182
+ const contractFiles = entries.filter((f) => f.endsWith('.json'));
183
+ if (contractFiles.length === 0) {
184
+ console.error(`[verify-contracts] no contracts found in ${args.contractsDir}`);
185
+ process.exit(2);
186
+ }
187
+ const state = buildSeededState();
188
+ const executor = buildOfflineExecutor(args.api, state);
189
+ let pass = 0;
190
+ let drift = 0;
191
+ let skipped = 0;
192
+ const failures = [];
193
+ for (const f of contractFiles) {
194
+ const path = resolve(args.contractsDir, f);
195
+ let st;
196
+ try {
197
+ st = statSync(path);
198
+ }
199
+ catch {
200
+ continue;
201
+ }
202
+ if (!st.isFile())
203
+ continue;
204
+ const contract = JSON.parse(readFileSync(path, 'utf8'));
205
+ // Contracts captured with a warning never executed cleanly;
206
+ // skip them in verify (they need fixtures.json before they can
207
+ // be verified).
208
+ if (contract.warning) {
209
+ skipped++;
210
+ continue;
211
+ }
212
+ let actual;
213
+ try {
214
+ actual = await executor(contract.source, contract.variables);
215
+ }
216
+ catch (err) {
217
+ drift++;
218
+ failures.push({
219
+ contract: f,
220
+ diff: `executor threw: ${err.message}`,
221
+ });
222
+ continue;
223
+ }
224
+ // Normalise both sides before diffing. Volatile values
225
+ // (Shopify GIDs, timestamps, CDN URLs, cursors) reduce to
226
+ // stable tokens so live verification doesn't drown in
227
+ // expected-vs-real-ID noise. Offline verification is also
228
+ // safe — deterministic values still normalise to the same
229
+ // tokens on both sides. Genuine structural drift survives.
230
+ const expectedNorm = normaliseResponse(contract.response);
231
+ const actualNorm = normaliseResponse(actual);
232
+ const d = diff(expectedNorm, actualNorm);
233
+ if (d === null) {
234
+ pass++;
235
+ }
236
+ else {
237
+ drift++;
238
+ failures.push({ contract: f, diff: d });
239
+ }
240
+ }
241
+ console.log(`[verify-contracts] api=${args.api}: ${pass} pass, ${drift} drift, ${skipped} skipped (fixtures needed)`);
242
+ if (failures.length > 0) {
243
+ console.log('');
244
+ console.log('[verify-contracts] drift:');
245
+ for (const f of failures) {
246
+ console.log(` ${relative(args.cwd, resolve(args.contractsDir, f.contract))}`);
247
+ console.log(` ${f.diff}`);
248
+ }
249
+ console.log('');
250
+ console.log('If the mock is correct and the contract is stale, regenerate with `npm run test:online:capture-contracts`.');
251
+ }
252
+ process.exit(drift === 0 ? 0 : 1);
253
+ }
254
+ main().catch((err) => {
255
+ console.error(err);
256
+ process.exit(2);
257
+ });
258
+ //# sourceMappingURL=verifyContracts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyContracts.js","sourceRoot":"","sources":["../../src/scripts/verifyContracts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=verifyRestContracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifyRestContracts.d.ts","sourceRoot":"","sources":["../../src/scripts/verifyRestContracts.ts"],"names":[],"mappings":""}