@essential-apps/shopify-test-runner 1.0.9 → 1.0.10

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.
@@ -0,0 +1,16 @@
1
+ export interface BuildExtensionsOptions {
2
+ /** Consuming app repo root (the dir containing `app_extensions/`). */
3
+ repoRoot: string;
4
+ /** Rebuild every extension regardless of the source-hash cache. */
5
+ force?: boolean;
6
+ }
7
+ /**
8
+ * Build all discoverable theme / post-purchase / function extensions
9
+ * from source (CLI-free), each gated by a per-extension source hash.
10
+ * Unhandled extension types (e.g. checkout_ui, admin) are skipped.
11
+ *
12
+ * Throws if a handled extension fails to build — a silent skip would
13
+ * surface later as a baffling "widget never rendered" test failure.
14
+ */
15
+ export declare function buildExtensions(opts: BuildExtensionsOptions): Promise<void>;
16
+ //# sourceMappingURL=buildExtensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildExtensions.d.ts","sourceRoot":"","sources":["../../src/lib/buildExtensions.ts"],"names":[],"mappings":"AA4KA,MAAM,WAAW,sBAAsB;IACrC,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkDjF"}
@@ -0,0 +1,219 @@
1
+ /**
2
+ * Build the consuming app's theme / post-purchase / function extensions
3
+ * from source — WITHOUT the Shopify CLI — so a fresh clone has the
4
+ * bundles the offline storefront + orchestrator need.
5
+ *
6
+ * Why this exists
7
+ * ---------------
8
+ * The offline storefront renders a theme app extension's
9
+ * `blocks/*.liquid` + its built `assets/`, runs the post-purchase
10
+ * extension's JS bundle, and executes the discount function's `.wasm`.
11
+ * All three are BUILD OUTPUTS — gitignored, absent on a fresh clone —
12
+ * so without this step every storefront-widget, post-purchase, and
13
+ * discount-function test fails on a clone-and-go run (the extension
14
+ * never injects / the wasm is missing).
15
+ *
16
+ * The Shopify CLI is forbidden in tests (binary + version drift,
17
+ * interactive prompts, auth). Each extension type has a CLI-free build:
18
+ *
19
+ * - theme → the extension's own `npm run build`
20
+ * (vite + vite-plugin-shopify → assets/ +
21
+ * snippets/vite-tag.liquid)
22
+ * - checkout_post_purchase → esbuild bundle of src/index.{tsx,…} as an
23
+ * IIFE. The @shopify/post-purchase-ui-
24
+ * extensions runtime registers handlers via
25
+ * `self.shopify.{extend,render}`, which the
26
+ * mock post-purchase host shim collects.
27
+ * - function → buildFunctionWasm (esbuild + stock javy +
28
+ * Shopify's javy plugin; see functionBuild.ts)
29
+ *
30
+ * Outputs land in each extension's own gitignored output dir (theme:
31
+ * `assets/` + `snippets/vite-tag.liquid`; others: `dist/`), which the VM
32
+ * reads via the existing `/workspace` bind mount — no extra mounts, no
33
+ * staging. Building into the gitignored dirs mirrors the app build
34
+ * (which writes `build/`): it never dirties `git status`. The only
35
+ * interference window is running `shopify app dev` AND an offline test
36
+ * concurrently — sequential use is fine.
37
+ *
38
+ * Gated by a per-extension source hash (cached in the gitignored
39
+ * `build/.test-ext-build-cache`), so a rebuild happens only when that
40
+ * extension's source actually changes — same philosophy as the app
41
+ * build's `build/.test-build-cache`.
42
+ */
43
+ import { createHash } from 'node:crypto';
44
+ import { existsSync, mkdirSync, readdirSync, readFileSync, statSync, writeFileSync, } from 'node:fs';
45
+ import { execFileSync } from 'node:child_process';
46
+ import { dirname, join, relative, resolve } from 'node:path';
47
+ import * as esbuild from 'esbuild';
48
+ import { buildFunctionWasm } from './functionBuild.js';
49
+ /** Directory names never hashed and never traversed (build outputs +
50
+ * deps + tool caches). Keeps the source hash stable across rebuilds. */
51
+ const IGNORE_DIRS = new Set(['node_modules', 'dist', 'assets', '.vite', '.turbo']);
52
+ /** Source entry candidates for a post-purchase extension, in priority order. */
53
+ const POST_PURCHASE_ENTRIES = ['src/index.tsx', 'src/index.ts', 'src/index.jsx', 'src/index.js'];
54
+ /**
55
+ * Read a top-level (or nested) `key = "value"` string from a
56
+ * `shopify.extension.toml`. Intentionally forgiving — the extension
57
+ * toml shapes we care about (`type`, `name`) declare these as plain
58
+ * string assignments, whether top-level (theme / post-purchase) or
59
+ * inside an `[[extensions]]` block (function).
60
+ */
61
+ function readTomlString(tomlText, key) {
62
+ const m = tomlText.match(new RegExp(`^\\s*${key}\\s*=\\s*["']([^"']+)["']`, 'm'));
63
+ return m ? m[1] : null;
64
+ }
65
+ /**
66
+ * Content + structure hash of an extension's source tree. Mirrors
67
+ * computeBuildHash's `(relpath, size, mtime)` strategy (fast, and
68
+ * nothing in a test run mutates source), skipping build-output and
69
+ * dependency dirs so the hash only moves when source moves.
70
+ */
71
+ function hashExtensionSource(dir) {
72
+ const hash = createHash('sha256');
73
+ const walk = (cur) => {
74
+ let entries;
75
+ try {
76
+ entries = readdirSync(cur, { withFileTypes: true });
77
+ }
78
+ catch {
79
+ return;
80
+ }
81
+ entries.sort((a, b) => a.name.localeCompare(b.name));
82
+ for (const ent of entries) {
83
+ if (ent.name.startsWith('.'))
84
+ continue;
85
+ if (IGNORE_DIRS.has(ent.name))
86
+ continue;
87
+ const full = join(cur, ent.name);
88
+ if (ent.isDirectory()) {
89
+ walk(full);
90
+ }
91
+ else if (ent.isFile()) {
92
+ const s = statSync(full);
93
+ hash.update(`${relative(dir, full)}|${s.size}|${s.mtimeMs}\n`);
94
+ }
95
+ }
96
+ };
97
+ walk(dir);
98
+ return hash.digest('hex');
99
+ }
100
+ /** Discover extension dirs under `<repoRoot>/app_extensions/*` that
101
+ * carry a `shopify.extension.toml`. */
102
+ function discoverExtensionDirs(repoRoot) {
103
+ const base = resolve(repoRoot, 'app_extensions');
104
+ if (!existsSync(base))
105
+ return [];
106
+ const out = [];
107
+ for (const ent of readdirSync(base, { withFileTypes: true })) {
108
+ if (!ent.isDirectory())
109
+ continue;
110
+ const dir = join(base, ent.name);
111
+ if (existsSync(join(dir, 'shopify.extension.toml')))
112
+ out.push(dir);
113
+ }
114
+ return out.sort();
115
+ }
116
+ /** Build a theme app extension via its own `npm run build`. */
117
+ function buildThemeExtension(dir) {
118
+ const pkgPath = join(dir, 'package.json');
119
+ if (!existsSync(pkgPath)) {
120
+ console.error(`[buildExtensions] theme ${dir}: no package.json — skipping (pure-liquid?)`);
121
+ return;
122
+ }
123
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
124
+ if (!pkg.scripts?.['build']) {
125
+ console.error(`[buildExtensions] theme ${dir}: no \`build\` script — skipping (pure-liquid?)`);
126
+ return;
127
+ }
128
+ // The extension's deps are installed via the consuming app's
129
+ // workspaces (root `npm install` covers `app_extensions/*`). vite is
130
+ // non-interactive; inherit stdio so build errors surface in the run log.
131
+ execFileSync('npm', ['run', 'build'], { cwd: dir, stdio: 'inherit', env: process.env });
132
+ }
133
+ /** Bundle a checkout_post_purchase extension to `dist/<name>.js`. */
134
+ async function buildPostPurchaseExtension(dir, tomlText) {
135
+ const entryRel = POST_PURCHASE_ENTRIES.find((c) => existsSync(join(dir, c)));
136
+ if (!entryRel) {
137
+ throw new Error(`[buildExtensions] post-purchase extension at ${dir} has no entry — expected one of ${POST_PURCHASE_ENTRIES.join(', ')}`);
138
+ }
139
+ // Output name = the extension's toml `name` (matches what the Shopify
140
+ // CLI emits and what `.apps.json`'s `postPurchaseBundle` references,
141
+ // e.g. dist/post-purchase-ui.js).
142
+ const name = readTomlString(tomlText, 'name') ?? 'post-purchase-ui';
143
+ const outfile = join(dir, 'dist', `${name}.js`);
144
+ const tsconfig = join(dir, 'tsconfig.json');
145
+ await esbuild.build({
146
+ entryPoints: [join(dir, entryRel)],
147
+ bundle: true,
148
+ // IIFE so loading the script self-executes and registers handlers
149
+ // via the post-purchase runtime's `self.shopify.{extend,render}`.
150
+ format: 'iife',
151
+ platform: 'browser',
152
+ target: 'es2020',
153
+ // React 17 automatic runtime (`react/jsx-runtime`); the extensions
154
+ // set `"jsx": "react-jsx"` in tsconfig.
155
+ jsx: 'automatic',
156
+ // Resolve the extensions' `#/…` path aliases from their tsconfig.
157
+ ...(existsSync(tsconfig) ? { tsconfig } : {}),
158
+ define: { 'process.env.NODE_ENV': '"production"' },
159
+ legalComments: 'none',
160
+ outfile,
161
+ });
162
+ }
163
+ /**
164
+ * Build all discoverable theme / post-purchase / function extensions
165
+ * from source (CLI-free), each gated by a per-extension source hash.
166
+ * Unhandled extension types (e.g. checkout_ui, admin) are skipped.
167
+ *
168
+ * Throws if a handled extension fails to build — a silent skip would
169
+ * surface later as a baffling "widget never rendered" test failure.
170
+ */
171
+ export async function buildExtensions(opts) {
172
+ const { repoRoot, force } = opts;
173
+ const dirs = discoverExtensionDirs(repoRoot);
174
+ if (dirs.length === 0)
175
+ return;
176
+ const cachePath = resolve(repoRoot, 'build/.test-ext-build-cache');
177
+ let cache = {};
178
+ if (!force && existsSync(cachePath)) {
179
+ try {
180
+ cache = JSON.parse(readFileSync(cachePath, 'utf8'));
181
+ }
182
+ catch {
183
+ cache = {};
184
+ }
185
+ }
186
+ for (const dir of dirs) {
187
+ const tomlPath = join(dir, 'shopify.extension.toml');
188
+ const tomlText = readFileSync(tomlPath, 'utf8');
189
+ const type = readTomlString(tomlText, 'type');
190
+ if (type !== 'theme' && type !== 'checkout_post_purchase' && type !== 'function') {
191
+ // Not an extension the offline storefront builds/injects.
192
+ continue;
193
+ }
194
+ const key = relative(repoRoot, dir);
195
+ const srcHash = hashExtensionSource(dir);
196
+ if (!force && cache[key] === srcHash) {
197
+ console.error(`[buildExtensions] ${key} (${type}) cache HIT — skipping.`);
198
+ continue;
199
+ }
200
+ const t0 = performance.now();
201
+ console.error(`[buildExtensions] ${key} (${type}) building…`);
202
+ if (type === 'theme') {
203
+ buildThemeExtension(dir);
204
+ }
205
+ else if (type === 'checkout_post_purchase') {
206
+ await buildPostPurchaseExtension(dir, tomlText);
207
+ }
208
+ else {
209
+ // function — buildFunctionWasm writes <dir>/dist/function.wasm.
210
+ mkdirSync(join(dir, 'dist'), { recursive: true });
211
+ await buildFunctionWasm({ functionDir: dir });
212
+ }
213
+ cache[key] = srcHash;
214
+ console.error(`[buildExtensions] ${key} built in ${((performance.now() - t0) / 1000).toFixed(1)} s`);
215
+ }
216
+ mkdirSync(dirname(cachePath), { recursive: true });
217
+ writeFileSync(cachePath, JSON.stringify(cache, null, 2));
218
+ }
219
+ //# sourceMappingURL=buildExtensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildExtensions.js","sourceRoot":"","sources":["../../src/lib/buildExtensions.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,7 @@ import { homedir } from 'node:os';
55
55
  import { dirname, resolve } from 'node:path';
56
56
  import { fileURLToPath } from 'node:url';
57
57
  import { pickApp, prepareOciArchive, envFileArgs, computeBuildHash } from '@essential-apps/shopify-test-core';
58
+ import { buildExtensions } from '../lib/buildExtensions.js';
58
59
  const repoRoot = process.cwd();
59
60
  function readAppName() {
60
61
  const pkgPath = resolve(repoRoot, 'package.json');
@@ -233,6 +234,18 @@ async function main() {
233
234
  writeFileSync(buildCachePath, currentBuildHash);
234
235
  console.error(`[runOffline] host build: ${((performance.now() - tBuild) / 1000).toFixed(1)} s`);
235
236
  }
237
+ // ── Extension builds (theme / post-purchase / function) ──────
238
+ // Build the consuming app's theme app extension(s), post-purchase
239
+ // bundle, and discount function wasm FROM SOURCE — CLI-free — so a
240
+ // fresh clone has the artifacts the offline storefront + orchestrator
241
+ // inject (the widget's app-embed assets, the post-purchase bundle, the
242
+ // function .wasm). Without this, those are absent on a fresh clone and
243
+ // every storefront-widget / post-purchase / discount-function test
244
+ // fails. Same model as the app build above: builds into each
245
+ // extension's own gitignored output dir (read by the VM via the
246
+ // /workspace bind mount), per-extension source-hash gated. See
247
+ // buildExtensions.ts.
248
+ await buildExtensions({ repoRoot, force: forceBuild });
236
249
  // Tarball-manifest written by `scripts/pack-into.sh` — a hash list
237
250
  // of the vendored @essential-apps/* tarballs. Passed as an
238
251
  // `extraFile` so its bytes fold into the snapshot's bake input-hash:
@@ -1 +1 @@
1
- {"version":3,"file":"runOffline.js","sourceRoot":"","sources":["../../src/scripts/runOffline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runOffline.js","sourceRoot":"","sources":["../../src/scripts/runOffline.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@essential-apps/shopify-test-runner",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
4
4
  "description": "Orchestration scripts (container, auth capture, install) and Playwright config preset for Essential Apps' Shopify test suites. Internal use only.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -57,11 +57,11 @@
57
57
  "clean": "rm -rf dist"
58
58
  },
59
59
  "dependencies": {
60
- "@essential-apps/shopify-test-core": "^1.0.9",
61
- "@essential-apps/shopify-test-mock-admin": "^1.0.9",
62
- "@essential-apps/shopify-test-shopify-api": "^1.0.9",
63
- "@essential-apps/shopify-test-storefront": "^1.0.9",
64
- "@essential-apps/shopify-test-themes": "^1.0.9",
60
+ "@essential-apps/shopify-test-core": "^1.0.10",
61
+ "@essential-apps/shopify-test-mock-admin": "^1.0.10",
62
+ "@essential-apps/shopify-test-shopify-api": "^1.0.10",
63
+ "@essential-apps/shopify-test-storefront": "^1.0.10",
64
+ "@essential-apps/shopify-test-themes": "^1.0.10",
65
65
  "@playwright/test": "^1.49.0",
66
66
  "@types/node": "^20.19.40",
67
67
  "@types/tar-stream": "^3.1.4",
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Build the consuming app's theme / post-purchase / function extensions
3
+ * from source — WITHOUT the Shopify CLI — so a fresh clone has the
4
+ * bundles the offline storefront + orchestrator need.
5
+ *
6
+ * Why this exists
7
+ * ---------------
8
+ * The offline storefront renders a theme app extension's
9
+ * `blocks/*.liquid` + its built `assets/`, runs the post-purchase
10
+ * extension's JS bundle, and executes the discount function's `.wasm`.
11
+ * All three are BUILD OUTPUTS — gitignored, absent on a fresh clone —
12
+ * so without this step every storefront-widget, post-purchase, and
13
+ * discount-function test fails on a clone-and-go run (the extension
14
+ * never injects / the wasm is missing).
15
+ *
16
+ * The Shopify CLI is forbidden in tests (binary + version drift,
17
+ * interactive prompts, auth). Each extension type has a CLI-free build:
18
+ *
19
+ * - theme → the extension's own `npm run build`
20
+ * (vite + vite-plugin-shopify → assets/ +
21
+ * snippets/vite-tag.liquid)
22
+ * - checkout_post_purchase → esbuild bundle of src/index.{tsx,…} as an
23
+ * IIFE. The @shopify/post-purchase-ui-
24
+ * extensions runtime registers handlers via
25
+ * `self.shopify.{extend,render}`, which the
26
+ * mock post-purchase host shim collects.
27
+ * - function → buildFunctionWasm (esbuild + stock javy +
28
+ * Shopify's javy plugin; see functionBuild.ts)
29
+ *
30
+ * Outputs land in each extension's own gitignored output dir (theme:
31
+ * `assets/` + `snippets/vite-tag.liquid`; others: `dist/`), which the VM
32
+ * reads via the existing `/workspace` bind mount — no extra mounts, no
33
+ * staging. Building into the gitignored dirs mirrors the app build
34
+ * (which writes `build/`): it never dirties `git status`. The only
35
+ * interference window is running `shopify app dev` AND an offline test
36
+ * concurrently — sequential use is fine.
37
+ *
38
+ * Gated by a per-extension source hash (cached in the gitignored
39
+ * `build/.test-ext-build-cache`), so a rebuild happens only when that
40
+ * extension's source actually changes — same philosophy as the app
41
+ * build's `build/.test-build-cache`.
42
+ */
43
+ import { createHash } from 'node:crypto';
44
+ import {
45
+ existsSync,
46
+ mkdirSync,
47
+ readdirSync,
48
+ readFileSync,
49
+ statSync,
50
+ writeFileSync,
51
+ } from 'node:fs';
52
+ import { execFileSync } from 'node:child_process';
53
+ import { dirname, join, relative, resolve } from 'node:path';
54
+ import * as esbuild from 'esbuild';
55
+ import { buildFunctionWasm } from './functionBuild.js';
56
+
57
+ /** Directory names never hashed and never traversed (build outputs +
58
+ * deps + tool caches). Keeps the source hash stable across rebuilds. */
59
+ const IGNORE_DIRS = new Set(['node_modules', 'dist', 'assets', '.vite', '.turbo']);
60
+
61
+ /** Source entry candidates for a post-purchase extension, in priority order. */
62
+ const POST_PURCHASE_ENTRIES = ['src/index.tsx', 'src/index.ts', 'src/index.jsx', 'src/index.js'];
63
+
64
+ /**
65
+ * Read a top-level (or nested) `key = "value"` string from a
66
+ * `shopify.extension.toml`. Intentionally forgiving — the extension
67
+ * toml shapes we care about (`type`, `name`) declare these as plain
68
+ * string assignments, whether top-level (theme / post-purchase) or
69
+ * inside an `[[extensions]]` block (function).
70
+ */
71
+ function readTomlString(tomlText: string, key: string): string | null {
72
+ const m = tomlText.match(new RegExp(`^\\s*${key}\\s*=\\s*["']([^"']+)["']`, 'm'));
73
+ return m ? m[1]! : null;
74
+ }
75
+
76
+ /**
77
+ * Content + structure hash of an extension's source tree. Mirrors
78
+ * computeBuildHash's `(relpath, size, mtime)` strategy (fast, and
79
+ * nothing in a test run mutates source), skipping build-output and
80
+ * dependency dirs so the hash only moves when source moves.
81
+ */
82
+ function hashExtensionSource(dir: string): string {
83
+ const hash = createHash('sha256');
84
+ const walk = (cur: string): void => {
85
+ let entries: import('node:fs').Dirent[];
86
+ try {
87
+ entries = readdirSync(cur, { withFileTypes: true });
88
+ } catch {
89
+ return;
90
+ }
91
+ entries.sort((a, b) => a.name.localeCompare(b.name));
92
+ for (const ent of entries) {
93
+ if (ent.name.startsWith('.')) continue;
94
+ if (IGNORE_DIRS.has(ent.name)) continue;
95
+ const full = join(cur, ent.name);
96
+ if (ent.isDirectory()) {
97
+ walk(full);
98
+ } else if (ent.isFile()) {
99
+ const s = statSync(full);
100
+ hash.update(`${relative(dir, full)}|${s.size}|${s.mtimeMs}\n`);
101
+ }
102
+ }
103
+ };
104
+ walk(dir);
105
+ return hash.digest('hex');
106
+ }
107
+
108
+ /** Discover extension dirs under `<repoRoot>/app_extensions/*` that
109
+ * carry a `shopify.extension.toml`. */
110
+ function discoverExtensionDirs(repoRoot: string): string[] {
111
+ const base = resolve(repoRoot, 'app_extensions');
112
+ if (!existsSync(base)) return [];
113
+ const out: string[] = [];
114
+ for (const ent of readdirSync(base, { withFileTypes: true })) {
115
+ if (!ent.isDirectory()) continue;
116
+ const dir = join(base, ent.name);
117
+ if (existsSync(join(dir, 'shopify.extension.toml'))) out.push(dir);
118
+ }
119
+ return out.sort();
120
+ }
121
+
122
+ /** Build a theme app extension via its own `npm run build`. */
123
+ function buildThemeExtension(dir: string): void {
124
+ const pkgPath = join(dir, 'package.json');
125
+ if (!existsSync(pkgPath)) {
126
+ console.error(`[buildExtensions] theme ${dir}: no package.json — skipping (pure-liquid?)`);
127
+ return;
128
+ }
129
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as { scripts?: Record<string, string> };
130
+ if (!pkg.scripts?.['build']) {
131
+ console.error(`[buildExtensions] theme ${dir}: no \`build\` script — skipping (pure-liquid?)`);
132
+ return;
133
+ }
134
+ // The extension's deps are installed via the consuming app's
135
+ // workspaces (root `npm install` covers `app_extensions/*`). vite is
136
+ // non-interactive; inherit stdio so build errors surface in the run log.
137
+ execFileSync('npm', ['run', 'build'], { cwd: dir, stdio: 'inherit', env: process.env });
138
+ }
139
+
140
+ /** Bundle a checkout_post_purchase extension to `dist/<name>.js`. */
141
+ async function buildPostPurchaseExtension(dir: string, tomlText: string): Promise<void> {
142
+ const entryRel = POST_PURCHASE_ENTRIES.find((c) => existsSync(join(dir, c)));
143
+ if (!entryRel) {
144
+ throw new Error(
145
+ `[buildExtensions] post-purchase extension at ${dir} has no entry — expected one of ${POST_PURCHASE_ENTRIES.join(', ')}`,
146
+ );
147
+ }
148
+ // Output name = the extension's toml `name` (matches what the Shopify
149
+ // CLI emits and what `.apps.json`'s `postPurchaseBundle` references,
150
+ // e.g. dist/post-purchase-ui.js).
151
+ const name = readTomlString(tomlText, 'name') ?? 'post-purchase-ui';
152
+ const outfile = join(dir, 'dist', `${name}.js`);
153
+ const tsconfig = join(dir, 'tsconfig.json');
154
+ await esbuild.build({
155
+ entryPoints: [join(dir, entryRel)],
156
+ bundle: true,
157
+ // IIFE so loading the script self-executes and registers handlers
158
+ // via the post-purchase runtime's `self.shopify.{extend,render}`.
159
+ format: 'iife',
160
+ platform: 'browser',
161
+ target: 'es2020',
162
+ // React 17 automatic runtime (`react/jsx-runtime`); the extensions
163
+ // set `"jsx": "react-jsx"` in tsconfig.
164
+ jsx: 'automatic',
165
+ // Resolve the extensions' `#/…` path aliases from their tsconfig.
166
+ ...(existsSync(tsconfig) ? { tsconfig } : {}),
167
+ define: { 'process.env.NODE_ENV': '"production"' },
168
+ legalComments: 'none',
169
+ outfile,
170
+ });
171
+ }
172
+
173
+ export interface BuildExtensionsOptions {
174
+ /** Consuming app repo root (the dir containing `app_extensions/`). */
175
+ repoRoot: string;
176
+ /** Rebuild every extension regardless of the source-hash cache. */
177
+ force?: boolean;
178
+ }
179
+
180
+ /**
181
+ * Build all discoverable theme / post-purchase / function extensions
182
+ * from source (CLI-free), each gated by a per-extension source hash.
183
+ * Unhandled extension types (e.g. checkout_ui, admin) are skipped.
184
+ *
185
+ * Throws if a handled extension fails to build — a silent skip would
186
+ * surface later as a baffling "widget never rendered" test failure.
187
+ */
188
+ export async function buildExtensions(opts: BuildExtensionsOptions): Promise<void> {
189
+ const { repoRoot, force } = opts;
190
+ const dirs = discoverExtensionDirs(repoRoot);
191
+ if (dirs.length === 0) return;
192
+
193
+ const cachePath = resolve(repoRoot, 'build/.test-ext-build-cache');
194
+ let cache: Record<string, string> = {};
195
+ if (!force && existsSync(cachePath)) {
196
+ try {
197
+ cache = JSON.parse(readFileSync(cachePath, 'utf8')) as Record<string, string>;
198
+ } catch {
199
+ cache = {};
200
+ }
201
+ }
202
+
203
+ for (const dir of dirs) {
204
+ const tomlPath = join(dir, 'shopify.extension.toml');
205
+ const tomlText = readFileSync(tomlPath, 'utf8');
206
+ const type = readTomlString(tomlText, 'type');
207
+ if (type !== 'theme' && type !== 'checkout_post_purchase' && type !== 'function') {
208
+ // Not an extension the offline storefront builds/injects.
209
+ continue;
210
+ }
211
+
212
+ const key = relative(repoRoot, dir);
213
+ const srcHash = hashExtensionSource(dir);
214
+ if (!force && cache[key] === srcHash) {
215
+ console.error(`[buildExtensions] ${key} (${type}) cache HIT — skipping.`);
216
+ continue;
217
+ }
218
+
219
+ const t0 = performance.now();
220
+ console.error(`[buildExtensions] ${key} (${type}) building…`);
221
+ if (type === 'theme') {
222
+ buildThemeExtension(dir);
223
+ } else if (type === 'checkout_post_purchase') {
224
+ await buildPostPurchaseExtension(dir, tomlText);
225
+ } else {
226
+ // function — buildFunctionWasm writes <dir>/dist/function.wasm.
227
+ mkdirSync(join(dir, 'dist'), { recursive: true });
228
+ await buildFunctionWasm({ functionDir: dir });
229
+ }
230
+ cache[key] = srcHash;
231
+ console.error(
232
+ `[buildExtensions] ${key} built in ${((performance.now() - t0) / 1000).toFixed(1)} s`,
233
+ );
234
+ }
235
+
236
+ mkdirSync(dirname(cachePath), { recursive: true });
237
+ writeFileSync(cachePath, JSON.stringify(cache, null, 2));
238
+ }
@@ -55,6 +55,7 @@ import { homedir } from 'node:os';
55
55
  import { dirname, resolve } from 'node:path';
56
56
  import { fileURLToPath } from 'node:url';
57
57
  import { pickApp, prepareOciArchive, envFileArgs, computeBuildHash } from '@essential-apps/shopify-test-core';
58
+ import { buildExtensions } from '../lib/buildExtensions.js';
58
59
 
59
60
  const repoRoot = process.cwd();
60
61
 
@@ -271,6 +272,19 @@ async function main(): Promise<void> {
271
272
  );
272
273
  }
273
274
 
275
+ // ── Extension builds (theme / post-purchase / function) ──────
276
+ // Build the consuming app's theme app extension(s), post-purchase
277
+ // bundle, and discount function wasm FROM SOURCE — CLI-free — so a
278
+ // fresh clone has the artifacts the offline storefront + orchestrator
279
+ // inject (the widget's app-embed assets, the post-purchase bundle, the
280
+ // function .wasm). Without this, those are absent on a fresh clone and
281
+ // every storefront-widget / post-purchase / discount-function test
282
+ // fails. Same model as the app build above: builds into each
283
+ // extension's own gitignored output dir (read by the VM via the
284
+ // /workspace bind mount), per-extension source-hash gated. See
285
+ // buildExtensions.ts.
286
+ await buildExtensions({ repoRoot, force: forceBuild });
287
+
274
288
  // Tarball-manifest written by `scripts/pack-into.sh` — a hash list
275
289
  // of the vendored @essential-apps/* tarballs. Passed as an
276
290
  // `extraFile` so its bytes fold into the snapshot's bake input-hash: