@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,591 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Deploys an app version to any Partner app via the App Management API.
4
+ *
5
+ * Generalization of `deployConformanceExtension.ts`. Where that script
6
+ * was hardcoded to the conformance Partner account / app / extension,
7
+ * this one is parameterized:
8
+ *
9
+ * --app-id numeric Partner-app ID (e.g. 366427176961)
10
+ * --workspace repo containing `shopify.app.<config>.toml` +
11
+ * `app_extensions/<name>/` dirs (e.g. essential-upsell)
12
+ * --config which toml variant (default: `test-online` →
13
+ * reads `shopify.app.test-online.toml`)
14
+ * --org-id Partner org ID (numeric). Required when
15
+ * deploying a function — `appRequestSourceUploadUrl`
16
+ * needs it. Defaults to env
17
+ * `SHOPIFY_ORGANIZATION_ID`.
18
+ *
19
+ * Token comes from env (`SHOPIFY_APP_AUTOMATION_TOKEN`, `atkn_…`),
20
+ * exchanged the same way as conformance.
21
+ *
22
+ * Why this exists when `shopify app deploy` works: tests must never
23
+ * depend on the Shopify CLI (binary mismatch across dev machines,
24
+ * interactive prompts, version drift). This script uses ONLY the
25
+ * App Management GraphQL endpoint — same one the CLI ultimately
26
+ * calls — but skips bundling/Vite/prompts so it's deterministic and
27
+ * scriptable from CI.
28
+ *
29
+ * Two deploy paths
30
+ * ----------------
31
+ * The script picks one of two paths based on what extensions are
32
+ * present:
33
+ *
34
+ * • **Inline `source` path** — fits the whole module list (theme
35
+ * files base64'd inline) into a single GraphQL request. Used
36
+ * when no function/post-purchase is being deployed.
37
+ *
38
+ * • **`sourceUrl` tar+brotli path** — bundles everything into a
39
+ * `.tar.br` archive, uploads to a signed GCS URL, then passes
40
+ * the URL to `appVersionCreate`. Required when a function or
41
+ * post-purchase extension is present.
42
+ *
43
+ * Both formats are accepted by App Management `/unstable/`. The
44
+ * sourceUrl path is what `shopify app deploy` itself uses — see
45
+ * `lib/buildSourceBundle.ts` for the byte-level details (it took
46
+ * a few iterations to discover: the archive format is tar+brotli
47
+ * NOT zip, the WASM is base64-encoded as text NOT raw binary,
48
+ * module entries need `assets`+`target` fields, and function
49
+ * config has specific required keys).
50
+ *
51
+ * Current support matrix:
52
+ * ✅ app_home — application_url + embedded, from the toml
53
+ * ✅ branding — display name, from the toml
54
+ * ✅ app_access — scopes, from the toml
55
+ * ✅ theme_app_extension — `app_extensions/upsells/` (or any
56
+ * `type = "theme"` extension)
57
+ * ✅ function — auto-built via Javy (see
58
+ * lib/functionBuild.ts) and deployed
59
+ * via the sourceUrl path. Requires
60
+ * --org-id and --include-function.
61
+ * ⚠️ checkout_post_purchase — Skipped with a warning (the esbuild
62
+ * step needs extension-specific config;
63
+ * not implemented yet).
64
+ *
65
+ * Usage:
66
+ * node --import tsx packages/runner/src/scripts/deployAppVersion.ts \\
67
+ * --app-id 366427176961 \\
68
+ * --workspace /Users/domas/Developer/supercorp/essential-upsell \\
69
+ * --config test-online \\
70
+ * --org-id 217838969 \\
71
+ * [--include-function]
72
+ */
73
+ import { createHash, randomUUID } from 'node:crypto';
74
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
75
+ import { resolve } from 'node:path';
76
+ import { appManagementGraphQL, exchangeAutomationToken, } from '@essential-apps/shopify-test-core';
77
+ import { tmpdir } from 'node:os';
78
+ import { join } from 'node:path';
79
+ import { buildSourceBundle, readExtensionFilesAsBuffers, } from '../lib/buildSourceBundle.js';
80
+ import { requestSourceUploadUrl, uploadSourceToSignedUrl, } from '../lib/sourceZipUpload.js';
81
+ // NOTE: buildFunctionWasm is imported dynamically inside main() so
82
+ // the script still typechecks/runs even on hosts without esbuild
83
+ // available (e.g. Docker images that don't ship the build deps).
84
+ /** UUID v5 of `subject` under the OID namespace. Stable across runs
85
+ * so re-deploying with the same handle reuses the same uid (Shopify
86
+ * treats uid as the stable per-module identity). Matches the
87
+ * algorithm used in `deployConformanceExtension.ts`. */
88
+ function stableUuid(subject) {
89
+ const namespace = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';
90
+ return createHash('sha1')
91
+ .update(Buffer.from(namespace.replace(/-/g, ''), 'hex'))
92
+ .update(subject)
93
+ .digest()
94
+ .toString('hex')
95
+ .replace(/(.{8})(.{4})(.{4})(.{4})(.{12})/, '$1-$2-$3-$4-$5');
96
+ }
97
+ function parseArgs(argv) {
98
+ const args = {
99
+ appId: '',
100
+ workspace: '',
101
+ config: 'test-online',
102
+ orgId: process.env['SHOPIFY_ORGANIZATION_ID'] ?? '',
103
+ nameOverride: null,
104
+ themeOnly: false,
105
+ includeFunction: false,
106
+ help: false,
107
+ };
108
+ for (let i = 0; i < argv.length; i++) {
109
+ const a = argv[i];
110
+ const next = () => {
111
+ const v = argv[++i];
112
+ if (v === undefined)
113
+ throw new Error(`${a} requires a value`);
114
+ return v;
115
+ };
116
+ switch (a) {
117
+ case '--app-id':
118
+ args.appId = next();
119
+ break;
120
+ case '--workspace':
121
+ args.workspace = next();
122
+ break;
123
+ case '--config':
124
+ args.config = next();
125
+ break;
126
+ case '--org-id':
127
+ args.orgId = next();
128
+ break;
129
+ case '--name':
130
+ args.nameOverride = next();
131
+ break;
132
+ case '--theme-only':
133
+ args.themeOnly = true;
134
+ break;
135
+ case '--include-function':
136
+ // Opt-in experimental flag. Currently runs the Javy build but
137
+ // does not attempt the deploy (server rejects with "Wasm file
138
+ // is not present" — undiscovered manifest convention).
139
+ args.includeFunction = true;
140
+ break;
141
+ case '--help':
142
+ case '-h':
143
+ args.help = true;
144
+ break;
145
+ }
146
+ }
147
+ return args;
148
+ }
149
+ const USAGE = `Usage: deployAppVersion --app-id <id> --workspace <path> [--config test-online] [--org-id <id>]
150
+
151
+ --app-id Numeric Partner-app ID (required). The token in
152
+ $SHOPIFY_APP_AUTOMATION_TOKEN must belong to this app.
153
+ --workspace Repo root containing shopify.app.<config>.toml +
154
+ app_extensions/<name>/ (required).
155
+ --config Which toml variant. Default: test-online → reads
156
+ shopify.app.test-online.toml from the workspace.
157
+ --org-id Numeric Partner-org ID. Required when deploying a
158
+ function (needed to mint a source-upload URL).
159
+ Defaults to $SHOPIFY_ORGANIZATION_ID.
160
+ --theme-only Skip app_home/branding/app_access — push only the
161
+ theme extension. Useful for iterating on storefront
162
+ blocks without touching backend config.
163
+ --skip-function Don't build/deploy the function module even if
164
+ app_extensions/discounts is present.
165
+ `;
166
+ // -----------------------------------------------------------------
167
+ // TOML helpers (top-level config, NOT extension toml — that's parsed
168
+ // in lib/functionBuild.ts).
169
+ // -----------------------------------------------------------------
170
+ /** Minimal TOML reader — handles the subset shopify.app.*.toml uses
171
+ * (top-level keys, [section.name] tables, arrays). Avoids a runtime
172
+ * dep; full TOML compliance not needed. */
173
+ function readShopifyAppToml(path) {
174
+ const txt = readFileSync(path, 'utf8');
175
+ const root = {};
176
+ let current = root;
177
+ for (const rawLine of txt.split('\n')) {
178
+ const line = rawLine.replace(/#.*$/, '').trim();
179
+ if (!line)
180
+ continue;
181
+ const tableMatch = line.match(/^\[([a-z0-9_.]+)\]$/i);
182
+ if (tableMatch) {
183
+ const segments = tableMatch[1].split('.');
184
+ current = root;
185
+ for (const seg of segments) {
186
+ current[seg] ??= {};
187
+ current = current[seg];
188
+ }
189
+ continue;
190
+ }
191
+ const kvMatch = line.match(/^([a-z0-9_]+)\s*=\s*(.+)$/i);
192
+ if (kvMatch) {
193
+ const key = kvMatch[1];
194
+ const rawVal = kvMatch[2].trim();
195
+ current[key] = parseTomlValue(rawVal);
196
+ }
197
+ }
198
+ return root;
199
+ }
200
+ function parseTomlValue(raw) {
201
+ if (raw.startsWith('"') && raw.endsWith('"'))
202
+ return raw.slice(1, -1);
203
+ if (raw === 'true')
204
+ return true;
205
+ if (raw === 'false')
206
+ return false;
207
+ if (/^-?\d+(\.\d+)?$/.test(raw))
208
+ return Number(raw);
209
+ if (raw.startsWith('[') && raw.endsWith(']')) {
210
+ const inner = raw.slice(1, -1).trim();
211
+ if (!inner)
212
+ return [];
213
+ return inner.split(',').map((s) => parseTomlValue(s.trim()));
214
+ }
215
+ return raw;
216
+ }
217
+ // -----------------------------------------------------------------
218
+ // Inline file reader for the theme extension (used in `source` path).
219
+ // -----------------------------------------------------------------
220
+ /** Read every file under `dir` recursively, return `{ rel: base64 }`. */
221
+ function readExtensionFilesBase64(extensionDir) {
222
+ const out = {};
223
+ const SKIP_DIRS = new Set([
224
+ 'node_modules',
225
+ '.git',
226
+ 'src',
227
+ 'dist',
228
+ 'frontend',
229
+ 'generated',
230
+ ]);
231
+ function walk(dir, rel) {
232
+ for (const name of readdirSync(dir)) {
233
+ const full = resolve(dir, name);
234
+ const relPath = rel ? `${rel}/${name}` : name;
235
+ const st = statSync(full);
236
+ if (st.isDirectory()) {
237
+ if (SKIP_DIRS.has(name) || name.startsWith('.'))
238
+ continue;
239
+ walk(full, relPath);
240
+ continue;
241
+ }
242
+ if (name === 'shopify.extension.toml')
243
+ continue;
244
+ if (name === 'package.json')
245
+ continue;
246
+ if (name === 'tsconfig.json')
247
+ continue;
248
+ if (name === '.shopifyignore' || name === '.gitignore')
249
+ continue;
250
+ if (name.endsWith('.config.ts') || name.endsWith('.config.mts'))
251
+ continue;
252
+ out[relPath] = readFileSync(full).toString('base64');
253
+ }
254
+ }
255
+ walk(extensionDir, '');
256
+ return out;
257
+ }
258
+ const CREATE_APP_VERSION_MUTATION = `
259
+ mutation CreateAppVersion(
260
+ $appId: ID!
261
+ $version: AppVersionInput!
262
+ $metadata: VersionMetadataInput
263
+ ) {
264
+ appVersionCreate(appId: $appId, version: $version, metadata: $metadata) {
265
+ version {
266
+ id
267
+ metadata { versionTag message }
268
+ appModules { uuid handle specification { identifier name } }
269
+ }
270
+ userErrors { field message category code on }
271
+ }
272
+ }
273
+ `;
274
+ const RELEASE_APP_VERSION_MUTATION = `
275
+ mutation ReleaseAppVersion($appId: ID!, $versionId: ID!) {
276
+ appReleaseCreate(appId: $appId, versionId: $versionId) {
277
+ userErrors { field message }
278
+ }
279
+ }
280
+ `;
281
+ async function main() {
282
+ const args = parseArgs(process.argv.slice(2));
283
+ if (args.help) {
284
+ console.log(USAGE);
285
+ return;
286
+ }
287
+ if (!args.appId || !args.workspace) {
288
+ console.error(USAGE);
289
+ throw new Error('--app-id and --workspace are required');
290
+ }
291
+ const token = process.env['SHOPIFY_APP_AUTOMATION_TOKEN'] ?? '';
292
+ if (!token) {
293
+ throw new Error(`SHOPIFY_APP_AUTOMATION_TOKEN env var is required. Mint one at:\n` +
294
+ ` Dev Dashboard → app → Settings → App automation tokens`);
295
+ }
296
+ const tomlPath = resolve(args.workspace, `shopify.app.${args.config}.toml`);
297
+ console.log(`\n› Reading app config from ${tomlPath}`);
298
+ const toml = readShopifyAppToml(tomlPath);
299
+ const name = args.nameOverride ?? toml['name'] ?? 'Untitled App';
300
+ const handle = toml['handle'] ?? 'untitled-app';
301
+ const applicationUrl = toml['application_url'] ?? '';
302
+ const embedded = toml['embedded'] !== false;
303
+ const scopes = toml['access_scopes']?.['scopes'] ?? '';
304
+ const redirectUrls = toml['auth']?.['redirect_urls'] ?? [];
305
+ console.log(` name : ${name}`);
306
+ console.log(` handle : ${handle}`);
307
+ console.log(` application_url : ${applicationUrl}`);
308
+ console.log(` embedded : ${embedded}`);
309
+ console.log(` scopes : ${scopes}`);
310
+ console.log(` redirect_urls : ${redirectUrls.length} entry(ies)`);
311
+ // -------------------------------------------------------------
312
+ // Detect what extensions are present in the workspace.
313
+ // -------------------------------------------------------------
314
+ const themeDir = resolve(args.workspace, 'app_extensions/upsells');
315
+ const functionDir = resolve(args.workspace, 'app_extensions/discounts');
316
+ const postPurchaseDir = resolve(args.workspace, 'app_extensions/post-purchase-ui');
317
+ const hasTheme = exists(themeDir);
318
+ const hasFunctionDir = exists(functionDir);
319
+ const hasPostPurchase = exists(postPurchaseDir);
320
+ const includeFunction = hasFunctionDir && args.includeFunction;
321
+ if (hasFunctionDir && !args.includeFunction) {
322
+ console.warn(`\n⚠ Function extension at ${functionDir} — SKIPPING the deploy.\n` +
323
+ ` Pass --include-function to build the WASM (via Javy) and deploy\n` +
324
+ ` it via the sourceUrl tar+brotli path.`);
325
+ }
326
+ if (hasPostPurchase) {
327
+ console.warn(`\n⚠ Post-purchase extension at ${postPurchaseDir} — SKIPPING (the\n` +
328
+ ` esbuild bundling step is extension-specific and not yet\n` +
329
+ ` implemented in this script).`);
330
+ }
331
+ // Function ⇒ must use sourceUrl tar+brotli path; the WASM doesn't
332
+ // fit cleanly into an inline source manifest. Theme alone can stay
333
+ // inline.
334
+ const useSourceUrl = includeFunction;
335
+ console.log(`\n› Deploy path: ${useSourceUrl ? 'sourceUrl (tar+brotli, signed-URL upload)' : 'inline source'}`);
336
+ if (useSourceUrl && !args.orgId) {
337
+ throw new Error(`--org-id (or SHOPIFY_ORGANIZATION_ID env) is required when deploying\n` +
338
+ ` a function — appRequestSourceUploadUrl needs the org ID.`);
339
+ }
340
+ // -------------------------------------------------------------
341
+ // Build the base module list (same in both paths).
342
+ // -------------------------------------------------------------
343
+ const baseModules = [];
344
+ if (!args.themeOnly) {
345
+ baseModules.push({
346
+ uid: stableUuid(`${handle}:app_home`),
347
+ type: 'app_home',
348
+ handle: 'app-home',
349
+ config: { app_url: applicationUrl, embedded },
350
+ });
351
+ baseModules.push({
352
+ uid: stableUuid(`${handle}:branding`),
353
+ type: 'branding',
354
+ handle: 'branding',
355
+ config: { name },
356
+ });
357
+ baseModules.push({
358
+ uid: stableUuid(`${handle}:app_access`),
359
+ type: 'app_access',
360
+ handle: 'app-access',
361
+ // ONLY `scopes` — `redirect_url_allowlist` and other nested
362
+ // keys are rejected by the App Management /unstable/ endpoint.
363
+ // See deployConformanceExtension.ts for the historical record.
364
+ config: { scopes },
365
+ });
366
+ }
367
+ // -------------------------------------------------------------
368
+ // Exchange the automation token. We need this regardless of path.
369
+ // -------------------------------------------------------------
370
+ console.log(`\n› Exchanging automation token for App Management bearer…`);
371
+ const { accessToken, expiresInSeconds, scope: tokenScope } = await exchangeAutomationToken(token);
372
+ console.log(` ✓ token (${expiresInSeconds}s, scope: ${tokenScope})`);
373
+ const versionInput = useSourceUrl
374
+ ? await prepareSourceUrlPath({
375
+ accessToken,
376
+ orgId: args.orgId,
377
+ appClientId: toml['client_id'] ?? '',
378
+ name,
379
+ handle,
380
+ baseModules,
381
+ themeDir: hasTheme ? themeDir : null,
382
+ functionDir,
383
+ })
384
+ : prepareInlineSourcePath({
385
+ name,
386
+ handle,
387
+ baseModules,
388
+ themeDir: hasTheme ? themeDir : null,
389
+ });
390
+ // -------------------------------------------------------------
391
+ // appVersionCreate + appReleaseCreate.
392
+ // -------------------------------------------------------------
393
+ const versionTag = `test-${new Date().toISOString().replace(/[:.]/g, '').slice(0, 15)}`;
394
+ console.log(`\n› Creating app version appId=gid://shopify/App/${args.appId} versionTag=${versionTag}`);
395
+ const createResp = await appManagementGraphQL(accessToken, CREATE_APP_VERSION_MUTATION, {
396
+ appId: `gid://shopify/App/${args.appId}`,
397
+ version: versionInput,
398
+ metadata: { versionTag, message: `Test-online deploy via deployAppVersion` },
399
+ });
400
+ const errs = createResp.appVersionCreate.userErrors ?? [];
401
+ if (errs.length > 0) {
402
+ throw new Error(`appVersionCreate userErrors:\n` +
403
+ errs
404
+ .map((e) => ` • ${(e.field ?? []).join('.')}: ${e.message}${e.category ? ` (${e.category})` : ''}`)
405
+ .join('\n'));
406
+ }
407
+ const versionId = createResp.appVersionCreate.version?.id;
408
+ if (!versionId)
409
+ throw new Error('appVersionCreate returned no version.id');
410
+ console.log(` ✓ version created: ${versionId} (${createResp.appVersionCreate.version.metadata.versionTag})`);
411
+ console.log(`\n› Releasing version ${versionId}…`);
412
+ const releaseResp = await appManagementGraphQL(accessToken, RELEASE_APP_VERSION_MUTATION, {
413
+ appId: `gid://shopify/App/${args.appId}`,
414
+ versionId,
415
+ });
416
+ const releaseErrs = releaseResp.appReleaseCreate.userErrors ?? [];
417
+ if (releaseErrs.length > 0) {
418
+ throw new Error(`appReleaseCreate userErrors:\n` +
419
+ releaseErrs.map((e) => ` • ${(e.field ?? []).join('.')}: ${e.message}`).join('\n'));
420
+ }
421
+ console.log(` ✓ released — version is now live for installed stores.`);
422
+ }
423
+ // -----------------------------------------------------------------
424
+ // Inline-source path: theme files base64'd into the manifest. No
425
+ // zip, no GCS round-trip.
426
+ // -----------------------------------------------------------------
427
+ function prepareInlineSourcePath(opts) {
428
+ const modules = [...opts.baseModules];
429
+ if (opts.themeDir) {
430
+ const themeFiles = readExtensionFilesBase64(opts.themeDir);
431
+ console.log(`\n› Bundling theme extension from ${opts.themeDir}`);
432
+ for (const [p, b64] of Object.entries(themeFiles)) {
433
+ console.log(` • ${p} (${Math.ceil((b64.length * 3) / 4 / 1024)}KB)`);
434
+ }
435
+ modules.push({
436
+ uid: stableUuid(`${opts.handle}:theme_app_extension:upsells`),
437
+ type: 'theme_app_extension',
438
+ handle: 'upsells',
439
+ config: { theme_extension: { files: themeFiles } },
440
+ });
441
+ }
442
+ if (modules.length === 0) {
443
+ throw new Error('No modules to deploy.');
444
+ }
445
+ return {
446
+ source: { name: opts.name, handle: '', modules },
447
+ };
448
+ }
449
+ // -----------------------------------------------------------------
450
+ // sourceUrl path: tar+brotli archive, signed-URL PUT to GCS,
451
+ // `appVersionCreate(version: { sourceUrl })`.
452
+ //
453
+ // Reverse-engineered from Shopify/cli's `bundle.ts` + `app.ts`. The
454
+ // key non-obvious bits:
455
+ // 1. The archive is tar+brotli (`.tar.br`), NOT zip.
456
+ // `appRequestSourceUploadUrl` is called with `sourceExtension: BR`.
457
+ // 2. Function WASM goes at `<module_uid>/dist/index.wasm` and the
458
+ // file contents are BASE64-ENCODED TEXT (not raw binary bytes).
459
+ // The CLI does this in `bundleFunctionExtension(path, path)`
460
+ // which is a base64-encode-in-place.
461
+ // 3. Manifest module entries for functions are
462
+ // { type: 'function', handle, uid, assets: uid,
463
+ // target: <singleTarget or ''>, config }
464
+ // where `config` MUST include `app_key` (= client_id), `title`,
465
+ // `module_id` (random UUID), `description`, `api_version`,
466
+ // `enable_creation_ui`, `targets: [{handle, export, input_query}]`.
467
+ // -----------------------------------------------------------------
468
+ async function prepareSourceUrlPath(opts) {
469
+ // 1. Build the function WASM via Javy.
470
+ const { buildFunctionWasm } = await import('../lib/functionBuild.js');
471
+ console.log(`\n› Building function WASM from ${opts.functionDir}`);
472
+ const fn = await buildFunctionWasm({ functionDir: opts.functionDir });
473
+ console.log(` ✓ ${fn.wasmPath}`);
474
+ // 2. Read the wasm + input-query files. WASM gets base64-encoded
475
+ // NOW (text content inside the tar). Input-query contents go
476
+ // inline in the manifest's config.targets[].input_query.
477
+ const wasmBytes = readFileSync(fn.wasmPath);
478
+ const wasmB64Text = wasmBytes.toString('base64');
479
+ // 3. Folder names inside the archive. Match the CLI: uid string IS
480
+ // the folder name (so `assets: uid` in the manifest points at it).
481
+ const functionUid = fn.parsedToml.uid;
482
+ const themeUid = opts.themeDir
483
+ ? stableUuid(`${opts.handle}:theme_app_extension:upsells`)
484
+ : null;
485
+ // 4. Assemble archive contents.
486
+ const files = {};
487
+ // WASM at <uid>/dist/index.wasm as base64 text.
488
+ files[`${functionUid}/dist/index.wasm`] = wasmB64Text;
489
+ // Theme files (raw bytes) under <theme_uid>/...
490
+ if (opts.themeDir && themeUid) {
491
+ const themeFiles = readExtensionFilesAsBuffers(opts.themeDir);
492
+ for (const [rel, buf] of Object.entries(themeFiles)) {
493
+ files[`${themeUid}/${rel}`] = buf;
494
+ }
495
+ }
496
+ // 5. Build the manifest's modules[] list.
497
+ const modules = [...opts.baseModules];
498
+ if (opts.themeDir && themeUid) {
499
+ // Theme module via sourceUrl: the server reads files from the
500
+ // <themeUid>/ folder inside the archive (similar to function
501
+ // module, no inline files in config).
502
+ modules.push({
503
+ type: 'theme_app_extension',
504
+ handle: 'upsells',
505
+ uid: themeUid,
506
+ assets: themeUid,
507
+ target: '',
508
+ config: {},
509
+ });
510
+ }
511
+ modules.push({
512
+ type: 'function',
513
+ handle: fn.parsedToml.handle,
514
+ uid: functionUid,
515
+ assets: functionUid,
516
+ // `target` is the singleTarget handle for single-target functions,
517
+ // '' for multi-target. We compute it from the toml.
518
+ target: fn.parsedToml.targets.length === 1 ? fn.parsedToml.targets[0].target : '',
519
+ config: {
520
+ // Mirrors the CLI's function.ts `deployConfig` output.
521
+ title: fn.parsedToml.handle, // toml has `name = "t:name"`; the
522
+ // i18n token isn't useful as the
523
+ // server-side title — use the handle.
524
+ module_id: randomUUID(),
525
+ description: `Function ${fn.parsedToml.handle}`,
526
+ app_key: opts.appClientId,
527
+ api_version: fn.parsedToml.apiVersion,
528
+ enable_creation_ui: true,
529
+ // Each target carries its own input_query content. The CLI
530
+ // reads each `input_query` file from the toml-declared path
531
+ // and inlines the contents here.
532
+ targets: fn.parsedToml.targets.map((t) => ({
533
+ handle: t.target,
534
+ export: t.export,
535
+ input_query: readFileSync(resolve(opts.functionDir, t.inputQueryPath), 'utf8'),
536
+ })),
537
+ },
538
+ });
539
+ // 6. Build the tar+brotli archive on disk.
540
+ const archivePath = join(tmpdir(), `essential-apps-source-${Date.now()}.tar.br`);
541
+ console.log(`\n› Building source archive at ${archivePath}`);
542
+ let totalBytes = 0;
543
+ for (const [p, content] of Object.entries(files)) {
544
+ const len = typeof content === 'string' ? Buffer.byteLength(content) : content.length;
545
+ console.log(` • ${p} (${Math.ceil(len / 1024)}KB)`);
546
+ totalBytes += len;
547
+ }
548
+ console.log(` Σ ${Math.ceil(totalBytes / 1024)}KB uncompressed`);
549
+ await buildSourceBundle({
550
+ name: opts.name,
551
+ modules,
552
+ files,
553
+ outPath: archivePath,
554
+ });
555
+ const archiveSize = statSync(archivePath).size;
556
+ console.log(` ✓ tar+br: ${Math.ceil(archiveSize / 1024)}KB compressed`);
557
+ // 7. Mint signed upload URL + PUT the archive.
558
+ console.log(`\n› Minting signed upload URL (org ${opts.orgId}, BR)…`);
559
+ const uploadUrl = await requestSourceUploadUrl({
560
+ accessToken: opts.accessToken,
561
+ organizationId: opts.orgId,
562
+ sourceExtension: 'BR',
563
+ });
564
+ // Log just the path component to avoid leaking the GCS signature
565
+ // in logs (CI artifacts often capture stdout).
566
+ console.log(` ✓ ${new URL(uploadUrl).pathname}`);
567
+ console.log(`\n› Uploading archive…`);
568
+ await uploadSourceToSignedUrl({ uploadUrl, archivePath });
569
+ console.log(` ✓ uploaded`);
570
+ return { sourceUrl: uploadUrl };
571
+ }
572
+ // -----------------------------------------------------------------
573
+ // Small utilities.
574
+ // -----------------------------------------------------------------
575
+ // -----------------------------------------------------------------
576
+ // Small utilities.
577
+ // -----------------------------------------------------------------
578
+ function exists(p) {
579
+ try {
580
+ statSync(p);
581
+ return true;
582
+ }
583
+ catch {
584
+ return false;
585
+ }
586
+ }
587
+ main().catch((err) => {
588
+ console.error(`\n✗ ${err.message}\n`);
589
+ process.exit(1);
590
+ });
591
+ //# sourceMappingURL=deployAppVersion.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployAppVersion.js","sourceRoot":"","sources":["../../src/scripts/deployAppVersion.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=devE2eBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"devE2eBackend.d.ts","sourceRoot":"","sources":["../../src/scripts/devE2eBackend.ts"],"names":[],"mappings":""}