@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,108 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * One-time interactive Shopify auth capture inside the test container.
4
+ *
5
+ * Why a separate script: tests run with the chromium browser invisible
6
+ * inside Xvfb, which means there's no way to interactively log in.
7
+ * This script starts the same container, exposes the Xvfb display via
8
+ * x11vnc on host port 5900, and opens macOS's built-in Screen Sharing
9
+ * (`vnc://localhost:5900`) so a developer can log in once. The
10
+ * resulting tests/test-online/.auth/storageState.json is bind-mounted into
11
+ * the project, so subsequent test runs use the captured cookies —
12
+ * bound to the container's Linux Chrome fingerprint, which is what
13
+ * Cloudflare expects to see during automated runs.
14
+ *
15
+ * Usage (one-time per developer machine, or whenever cookies expire):
16
+ * npm run test:online:capture-auth
17
+ *
18
+ * macOS Screen Sharing.app opens automatically; just log in to
19
+ * Shopify, wait until you see the Partner Dashboard, then hit Enter
20
+ * back in the terminal where this script is running.
21
+ */
22
+ import { spawn } from 'node:child_process';
23
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
24
+ import { homedir, platform } from 'node:os';
25
+ import { resolve } from 'node:path';
26
+ import { setTimeout as sleep } from 'node:timers/promises';
27
+ import { envFileArgs } from '@essential-apps/shopify-test-core';
28
+ const repoRoot = process.cwd();
29
+ const VNC_PORT = 5900;
30
+ function readAppName() {
31
+ const pkgPath = resolve(repoRoot, 'package.json');
32
+ if (!existsSync(pkgPath)) {
33
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
34
+ }
35
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
36
+ if (!pkg.name)
37
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
38
+ return pkg.name.replace(/^@[^/]+\//, '');
39
+ }
40
+ async function main() {
41
+ const appName = readAppName();
42
+ const image = process.env['TEST_IMAGE'] ?? `${appName}-test:latest`;
43
+ const linuxModules = process.env['TEST_LINUX_NODE_MODULES'] ??
44
+ resolve(homedir(), `.cache/${appName}-test/node_modules`);
45
+ const vncPassword = process.env['TEST_ONLINE_VNC_PASSWORD'] ?? 'test';
46
+ mkdirSync(linuxModules, { recursive: true });
47
+ const args = [
48
+ 'run',
49
+ '--rm',
50
+ '--arch',
51
+ 'amd64',
52
+ '--memory',
53
+ '4096M',
54
+ '--cpus',
55
+ '2',
56
+ '--publish',
57
+ `127.0.0.1:${VNC_PORT}:${VNC_PORT}`,
58
+ '--env',
59
+ 'TEST_ONLINE_VNC=1',
60
+ '--env',
61
+ `TEST_ONLINE_VNC_PASSWORD=${vncPassword}`,
62
+ '--mount',
63
+ `type=bind,source=${repoRoot},target=/workspace`,
64
+ '--mount',
65
+ `type=bind,source=${linuxModules},target=/workspace/node_modules`,
66
+ '-w',
67
+ '/workspace',
68
+ image,
69
+ 'bash',
70
+ '-c',
71
+ [
72
+ 'sleep 1',
73
+ `echo "[runDockerAuth] Container ready. VNC server should be on 127.0.0.1:${VNC_PORT}."`,
74
+ 'echo ""',
75
+ // captureAuth is now in @essential-apps/shopify-test-runner.
76
+ `node ${envFileArgs(repoRoot)} node_modules/@essential-apps/shopify-test-runner/dist/scripts/captureAuth.js`,
77
+ ].join(' && '),
78
+ ];
79
+ console.log(`[runDockerAuth] Starting container with VNC on 127.0.0.1:${VNC_PORT}…`);
80
+ console.log(`[runDockerAuth] VNC password (paste into Screen Sharing): ${vncPassword}`);
81
+ console.log('');
82
+ const p = spawn('container', args, { stdio: 'inherit' });
83
+ if (platform() === 'darwin') {
84
+ void (async () => {
85
+ await sleep(4_000);
86
+ // Embed the password in the URL (vnc://:<pw>@host) so Screen Sharing
87
+ // connects WITHOUT prompting — prefilled, not typed.
88
+ const vncUrl = `vnc://:${encodeURIComponent(vncPassword)}@localhost:${VNC_PORT}`;
89
+ console.log(`[runDockerAuth] Opening macOS Screen Sharing → vnc://localhost:${VNC_PORT} (password prefilled)`);
90
+ console.log(`[runDockerAuth] (If nothing opens, run manually: open '${vncUrl}')`);
91
+ spawn('open', [vncUrl], {
92
+ stdio: 'ignore',
93
+ detached: true,
94
+ }).unref();
95
+ })();
96
+ }
97
+ else {
98
+ console.log(`[runDockerAuth] Connect any VNC viewer to localhost:${VNC_PORT}.`);
99
+ }
100
+ p.on('exit', (code) => process.exit(code ?? 0));
101
+ process.on('SIGINT', () => p.kill('SIGINT'));
102
+ process.on('SIGTERM', () => p.kill('SIGTERM'));
103
+ }
104
+ main().catch((err) => {
105
+ console.error(err);
106
+ process.exit(1);
107
+ });
108
+ //# sourceMappingURL=runDockerAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDockerAuth.js","sourceRoot":"","sources":["../../src/scripts/runDockerAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=runDockerOffline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDockerOffline.d.ts","sourceRoot":"","sources":["../../src/scripts/runDockerOffline.ts"],"names":[],"mappings":""}
@@ -0,0 +1,129 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Run the OFFLINE-FULL test suite inside Apple's `container`
4
+ * (libkrun-based microVM) — same image as `runDocker.ts`, different
5
+ * entrypoint.
6
+ *
7
+ * Why a separate script vs. `runDocker`:
8
+ * - runDocker invokes `runTests.js` (live tests against real cloud Shopify)
9
+ * - runDockerOffline invokes `runOfflineFullTests.js` (mock stack, no internet)
10
+ *
11
+ * Why offline tests in a container at all (vs. running host-native,
12
+ * which also works):
13
+ * - /etc/hosts + system CA trust eliminate three layers of bypass
14
+ * we'd otherwise need on host: --host-resolver-rules,
15
+ * --ignore-certificate-errors, and the Node socket shim.
16
+ * - Production-shape DNS + TLS: real getaddrinfo, real cert trust
17
+ * chain, real port 443 binding. Closer to "1-to-1 production
18
+ * recreation" than the host-native approach.
19
+ * - Architectural consistency: live tests already run in this
20
+ * container, offline tests should too.
21
+ *
22
+ * Architecture mirrors runDocker.ts: bind-mount the app repo and a
23
+ * cached Linux node_modules, plus the shopify-test repo if it lives
24
+ * outside the app (for `file:`-symlink stability).
25
+ */
26
+ import { spawn } from 'node:child_process';
27
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
28
+ import { homedir } from 'node:os';
29
+ import { resolve } from 'node:path';
30
+ const repoRoot = process.cwd();
31
+ function readAppName() {
32
+ const pkgPath = resolve(repoRoot, 'package.json');
33
+ if (!existsSync(pkgPath)) {
34
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
35
+ }
36
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
37
+ if (!pkg.name) {
38
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
39
+ }
40
+ return pkg.name.replace(/^@[^/]+\//, '');
41
+ }
42
+ async function main() {
43
+ const appName = readAppName();
44
+ const image = process.env['E2E_IMAGE'] ?? `${appName}-e2e:latest`;
45
+ const linuxModules = process.env['E2E_LINUX_NODE_MODULES'] ??
46
+ resolve(homedir(), `.cache/${appName}-e2e/node_modules`);
47
+ mkdirSync(linuxModules, { recursive: true });
48
+ // Forward any extra args (e.g. `--grep "..."`) to the offline
49
+ // runner. The container's bash -c sees a single string; we
50
+ // JSON-escape each forwarded arg.
51
+ const forwarded = process.argv
52
+ .slice(2)
53
+ .map((a) => JSON.stringify(a))
54
+ .join(' ');
55
+ // Most envs flow through process.env naturally because of how
56
+ // `container run` inherits env. Two we explicitly set:
57
+ // - E2E_OFFLINE_EXTENSIONS_JSON: extensions to mount in storefront
58
+ // - E2E_OFFLINE_POST_PURCHASE_EXT: post-purchase extension JS path
59
+ // The consuming app provides these in its `npm run e2e:offline-full`
60
+ // script; we forward them so the equivalent docker run picks them up.
61
+ const passthroughEnv = [
62
+ 'E2E_OFFLINE_EXTENSIONS_JSON',
63
+ 'E2E_OFFLINE_POST_PURCHASE_EXT',
64
+ 'E2E_OFFLINE_WORKERS',
65
+ 'E2E_OFFLINE_FIXTURE_DEBUG',
66
+ 'E2E_OFFLINE_EDGE_DEBUG',
67
+ 'E2E_OFFLINE_SHIM_DEBUG',
68
+ 'E2E_OFFLINE_SKIP_LEAK_CHECK',
69
+ 'E2E_OFFLINE_STRICT_GRAPHQL',
70
+ // Contract-conformance toggles (see docs/CONTRACTS.md). The
71
+ // capture mode for Liquid contracts is driven by an env var
72
+ // because Playwright specs don't otherwise take CLI flags;
73
+ // `LIQUID_CONTRACTS_CAPTURE=true npm run e2e:offline-full`
74
+ // does a one-time bootstrap write.
75
+ 'LIQUID_CONTRACTS_CAPTURE',
76
+ 'CONTRACTS_LIVE_ENDPOINT',
77
+ 'CONTRACTS_LIVE_ACCESS_TOKEN',
78
+ 'CONTRACTS_LIVE_SHOP',
79
+ ]
80
+ .flatMap((k) => process.env[k] !== undefined ? ['--env', `${k}=${process.env[k]}`] : []);
81
+ const args = [
82
+ 'run',
83
+ '--rm',
84
+ '--arch',
85
+ 'amd64',
86
+ '--memory',
87
+ '8192M',
88
+ '--cpus',
89
+ '4',
90
+ ...passthroughEnv,
91
+ '--mount',
92
+ `type=bind,source=${repoRoot},target=/workspace`,
93
+ '--mount',
94
+ `type=bind,source=${linuxModules},target=/workspace/node_modules`,
95
+ '-w',
96
+ '/workspace',
97
+ image,
98
+ 'bash',
99
+ '-c',
100
+ [
101
+ // Run `npm install` if node_modules looks empty OR partial.
102
+ // A previous failed install can leave package dirs without
103
+ // their package.json — ESM resolution then crashes on import.
104
+ // Use `node_modules/.package-lock.json` as the "install
105
+ // completed cleanly" signal (npm writes this after success),
106
+ // and hono's package.json as a sentinel for transitively-
107
+ // required deps.
108
+ 'if [ ! -f node_modules/.package-lock.json ] || [ ! -f node_modules/hono/package.json ]; then ' +
109
+ 'echo "[runDockerOffline] node_modules empty/partial — running fresh npm install…"; ' +
110
+ 'rm -rf node_modules; ' +
111
+ 'npm install --legacy-peer-deps --engine-strict=false; ' +
112
+ 'fi',
113
+ // The offline runner uses TSX-compiled source for stack-trace
114
+ // fidelity. Inside the container we have the same node_modules
115
+ // layout as the host, so the same `--import tsx` works.
116
+ `node --env-file=.env.test --import tsx node_modules/@essential-apps/shopify-test-runner/src/scripts/runOfflineFullTests.ts ${forwarded}`,
117
+ ].join(' && '),
118
+ ];
119
+ console.log('[runDockerOffline] container run', args.slice(0, 14).join(' '), '…');
120
+ const p = spawn('container', args, { stdio: 'inherit' });
121
+ p.on('exit', (code) => process.exit(code ?? 0));
122
+ process.on('SIGINT', () => p.kill('SIGINT'));
123
+ process.on('SIGTERM', () => p.kill('SIGTERM'));
124
+ }
125
+ main().catch((err) => {
126
+ console.error(err);
127
+ process.exit(1);
128
+ });
129
+ //# sourceMappingURL=runDockerOffline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDockerOffline.js","sourceRoot":"","sources":["../../src/scripts/runDockerOffline.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=runDockerOfflineExplore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDockerOfflineExplore.d.ts","sourceRoot":"","sources":["../../src/scripts/runDockerOfflineExplore.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Spawn the offline e2e container in EXPLORE mode — interactive
4
+ * "click around the offline Shopify dev store" workflow.
5
+ *
6
+ * What this gets you:
7
+ * - The full offline stack (Postgres + Remix backend + mocks +
8
+ * edge proxy) running inside the container, same as the test
9
+ * runner.
10
+ * - A non-headless Chrome instance inside the container, pointed
11
+ * at the admin app's URL.
12
+ * - The container's Xvfb display exposed via VNC on
13
+ * 127.0.0.1:5900 (password: `e2e`).
14
+ *
15
+ * Connect: `open vnc://localhost:5900` on macOS, or any VNC client
16
+ * elsewhere. You'll see a desktop with Chrome open at the admin
17
+ * URL — click anywhere, mutate state via the app, navigate to
18
+ * https://test-shop.myshopify.com/ to see the storefront, etc.
19
+ *
20
+ * Stop: Ctrl-C in the terminal where this script runs (or close
21
+ * Chrome).
22
+ *
23
+ * Mirrors `runDockerOffline.ts` (the test runner inside the
24
+ * container) but with three differences:
25
+ * 1. `E2E_VNC=1` to make the entrypoint start x11vnc
26
+ * 2. `--publish 127.0.0.1:5900:5900` to expose VNC to the host
27
+ * 3. `E2E_OFFLINE_EXPLORE=true` to make the orchestrator skip
28
+ * Playwright and launch Chrome instead
29
+ */
30
+ import { spawn } from 'node:child_process';
31
+ import { existsSync, mkdirSync, readFileSync } from 'node:fs';
32
+ import { homedir } from 'node:os';
33
+ import { resolve } from 'node:path';
34
+ const repoRoot = process.cwd();
35
+ function readAppName() {
36
+ const pkgPath = resolve(repoRoot, 'package.json');
37
+ if (!existsSync(pkgPath)) {
38
+ throw new Error(`No package.json at ${pkgPath}. Run this from the consuming app's repo root.`);
39
+ }
40
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
41
+ if (!pkg.name) {
42
+ throw new Error(`package.json at ${pkgPath} has no \`name\` field.`);
43
+ }
44
+ return pkg.name.replace(/^@[^/]+\//, '');
45
+ }
46
+ async function main() {
47
+ const appName = readAppName();
48
+ const image = process.env['E2E_IMAGE'] ?? `${appName}-e2e:latest`;
49
+ const linuxModules = process.env['E2E_LINUX_NODE_MODULES'] ??
50
+ resolve(homedir(), `.cache/${appName}-e2e/node_modules`);
51
+ mkdirSync(linuxModules, { recursive: true });
52
+ const passthroughEnv = [
53
+ 'E2E_OFFLINE_EXTENSIONS_JSON',
54
+ 'E2E_OFFLINE_POST_PURCHASE_EXT',
55
+ 'E2E_OFFLINE_FIXTURE_DEBUG',
56
+ 'E2E_OFFLINE_EDGE_DEBUG',
57
+ 'E2E_OFFLINE_EXPLORE_URL',
58
+ ].flatMap((k) => process.env[k] !== undefined ? ['--env', `${k}=${process.env[k]}`] : []);
59
+ const args = [
60
+ 'run',
61
+ '--rm',
62
+ '--arch',
63
+ 'amd64',
64
+ '--memory',
65
+ '8192M',
66
+ '--cpus',
67
+ '4',
68
+ // Expose Xvfb display via VNC to the host. The entrypoint starts
69
+ // x11vnc when E2E_VNC=1 is set (see tests/e2e/docker/entrypoint.sh).
70
+ '--publish',
71
+ '127.0.0.1:5900:5900',
72
+ '--env',
73
+ 'E2E_VNC=1',
74
+ '--env',
75
+ 'E2E_OFFLINE_EXPLORE=true',
76
+ ...passthroughEnv,
77
+ '--mount',
78
+ `type=bind,source=${repoRoot},target=/workspace`,
79
+ '--mount',
80
+ `type=bind,source=${linuxModules},target=/workspace/node_modules`,
81
+ '-w',
82
+ '/workspace',
83
+ image,
84
+ 'bash',
85
+ '-c',
86
+ [
87
+ // Run `npm install` if node_modules looks empty OR partial.
88
+ // A previous failed install can leave package dirs without
89
+ // their package.json — ESM resolution then crashes on import.
90
+ // Use `node_modules/.package-lock.json` as the "install
91
+ // completed cleanly" signal (npm writes this after success).
92
+ 'if [ ! -f node_modules/.package-lock.json ] || [ ! -f node_modules/hono/package.json ]; then ' +
93
+ 'echo "[explore] node_modules empty/partial — running fresh npm install…"; ' +
94
+ 'rm -rf node_modules; ' +
95
+ 'npm install --legacy-peer-deps --engine-strict=false; ' +
96
+ 'fi',
97
+ // Boot the orchestrator. The E2E_OFFLINE_EXPLORE=true env we
98
+ // set above makes it launch Chrome instead of Playwright.
99
+ 'node --env-file=.env.test --import tsx node_modules/@essential-apps/shopify-test-runner/src/scripts/runOfflineFullTests.ts',
100
+ ].join(' && '),
101
+ ];
102
+ console.log('[runDockerOfflineExplore] starting interactive offline e2e container…');
103
+ console.log('[runDockerOfflineExplore] once you see "explore mode — launching Chrome",');
104
+ console.log('[runDockerOfflineExplore] connect with: open vnc://localhost:5900');
105
+ console.log('[runDockerOfflineExplore] password: e2e');
106
+ console.log('');
107
+ const p = spawn('container', args, { stdio: 'inherit' });
108
+ p.on('exit', (code) => process.exit(code ?? 0));
109
+ process.on('SIGINT', () => p.kill('SIGINT'));
110
+ process.on('SIGTERM', () => p.kill('SIGTERM'));
111
+ }
112
+ main().catch((err) => {
113
+ console.error(err);
114
+ process.exit(1);
115
+ });
116
+ //# sourceMappingURL=runDockerOfflineExplore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runDockerOfflineExplore.js","sourceRoot":"","sources":["../../src/scripts/runDockerOfflineExplore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=runIsolatedDockerOffline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runIsolatedDockerOffline.d.ts","sourceRoot":"","sources":["../../src/scripts/runIsolatedDockerOffline.ts"],"names":[],"mappings":""}