@wp-playground/cli 3.0.43 → 3.0.45

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.
@@ -1,22 +1,22 @@
1
- import { logger as H, errorLogPath as A } from "@php-wasm/logger";
2
- import { createNodeFsMountHandler as x, loadNodeRuntime as $ } from "@php-wasm/node";
3
- import { EmscriptenDownloadMonitor as M } from "@php-wasm/progress";
4
- import { exposeAPI as _, PHPWorker as B, consumeAPI as T, consumeAPISync as S, sandboxedSpawnHandlerFactory as g, PHPResponse as E, PHPExecutionFailureError as F } from "@php-wasm/universal";
5
- import { sprintf as L } from "@php-wasm/util";
6
- import { runBlueprintV2 as q } from "@wp-playground/blueprints";
7
- import { bootRequestHandler as C } from "@wp-playground/wordpress";
8
- import { existsSync as O } from "fs";
9
- import y from "path";
10
- import { rootCertificates as D } from "tls";
11
- import { MessageChannel as N, parentPort as j } from "worker_threads";
12
- import { jspi as U } from "wasm-feature-detect";
13
- import { s as V, a as G } from "./run-cli-NcKUE5gJ.js";
1
+ import { logger as $, errorLogPath as M } from "@php-wasm/logger";
2
+ import { createNodeFsMountHandler as T, loadNodeRuntime as S } from "@php-wasm/node";
3
+ import { EmscriptenDownloadMonitor as F } from "@php-wasm/progress";
4
+ import { exposeAPI as B, PHPWorker as _, consumeAPI as R, consumeAPISync as L, sandboxedSpawnHandlerFactory as g, PHPResponse as q, PHPExecutionFailureError as E } from "@php-wasm/universal";
5
+ import { sprintf as C } from "@php-wasm/util";
6
+ import { runBlueprintV2 as N } from "@wp-playground/blueprints";
7
+ import { bootRequestHandler as O } from "@wp-playground/wordpress";
8
+ import { existsSync as j } from "fs";
9
+ import W from "path";
10
+ import { rootCertificates as V } from "tls";
11
+ import { MessageChannel as D, parentPort as U } from "worker_threads";
12
+ import { jspi as Y } from "wasm-feature-detect";
13
+ import { s as z, b as K } from "./run-cli-BK0MGgcU.js";
14
14
  async function m(s, e) {
15
15
  for (const r of e)
16
16
  try {
17
17
  s.mkdir(r.vfsPath), await s.mount(
18
18
  r.vfsPath,
19
- x(r.hostPath)
19
+ T(r.hostPath)
20
20
  );
21
21
  } catch {
22
22
  i.stderr(
@@ -25,11 +25,11 @@ async function m(s, e) {
25
25
  ), process.exit(1);
26
26
  }
27
27
  }
28
- function Y(s, e, ...r) {
28
+ function G(s, e, ...r) {
29
29
  console.log(
30
30
  performance.now().toFixed(6).padStart(15, "0"),
31
31
  s.toString().padStart(16, "0"),
32
- L(e, ...r)
32
+ C(e, ...r)
33
33
  );
34
34
  }
35
35
  Object.defineProperty(process.stdout, "isTTY", { value: !0 });
@@ -37,7 +37,7 @@ Object.defineProperty(process.stderr, "isTTY", { value: !0 });
37
37
  const i = {
38
38
  lastWriteWasProgress: !1,
39
39
  progress(s) {
40
- G(process.stdout) && (process.stdout.isTTY ? (i.lastWriteWasProgress || process.stdout.write(`
40
+ K(process.stdout) && (process.stdout.isTTY ? (i.lastWriteWasProgress || process.stdout.write(`
41
41
  `), process.stdout.write("\r\x1B[K" + s), i.lastWriteWasProgress = !0) : console.log(s));
42
42
  },
43
43
  stdout(s) {
@@ -53,7 +53,7 @@ const i = {
53
53
  `), i.lastWriteWasProgress && (i.lastWriteWasProgress = !1), process.stderr.write(s);
54
54
  }
55
55
  };
56
- class z extends B {
56
+ class J extends _ {
57
57
  constructor(e) {
58
58
  super(void 0, e), this.booted = !1, this.blueprintTargetResolved = !1, this.phpInstancesThatNeedMountsAfterTargetResolved = /* @__PURE__ */ new Set();
59
59
  }
@@ -67,17 +67,15 @@ class z extends B {
67
67
  * @see phpwasm-emscripten-library-file-locking-for-node.js
68
68
  */
69
69
  async useFileLockManager(e) {
70
- await U() ? this.fileLockManager = T(e) : this.fileLockManager = await S(e);
70
+ await Y() ? this.fileLockManager = R(e) : this.fileLockManager = await L(e);
71
71
  }
72
72
  async bootAndSetUpInitialWorker(e) {
73
73
  const r = {
74
- WP_DEBUG: !0,
75
- WP_DEBUG_LOG: !0,
76
- WP_DEBUG_DISPLAY: !1
77
- }, p = {
74
+ ...e.constants || {}
75
+ }, c = {
78
76
  ...e,
79
77
  createFiles: {
80
- "/internal/shared/ca-bundle.crt": D.join(`
78
+ "/internal/shared/ca-bundle.crt": V.join(`
81
79
  `)
82
80
  },
83
81
  constants: r,
@@ -92,13 +90,13 @@ class z extends B {
92
90
  }));
93
91
  },
94
92
  spawnHandler: () => g(
95
- () => k(e, this.fileLockManager)
93
+ () => x(e, this.fileLockManager)
96
94
  )
97
95
  };
98
- await this.bootRequestHandler(p);
99
- const u = this.__internal_getPHP();
96
+ await this.bootRequestHandler(c);
97
+ const p = this.__internal_getPHP();
100
98
  if (e.mode === "mount-only") {
101
- await m(u, e.mountsAfterWpInstall || []);
99
+ await m(p, e.mountsAfterWpInstall || []);
102
100
  return;
103
101
  }
104
102
  await this.runBlueprintV2({
@@ -119,24 +117,24 @@ class z extends B {
119
117
  );
120
118
  },
121
119
  spawnHandler: () => g(
122
- () => k(e, this.fileLockManager)
120
+ () => x(e, this.fileLockManager)
123
121
  )
124
122
  });
125
123
  }
126
124
  async runBlueprintV2(e) {
127
- const r = this.__internal_getRequestHandler(), { php: p, reap: u } = await r.instanceManager.acquirePHPInstance({
125
+ const r = this.__internal_getRequestHandler(), { php: c, reap: p } = await r.instanceManager.acquirePHPInstance({
128
126
  considerPrimary: !1
129
127
  }), o = this.__internal_getPHP();
130
- let w = () => {
128
+ let u = () => {
131
129
  };
132
130
  if (typeof e.blueprint == "string") {
133
- const n = y.resolve(process.cwd(), e.blueprint);
134
- O(n) && (o.mkdir("/internal/shared/cwd"), w = await o.mount(
131
+ const n = W.resolve(process.cwd(), e.blueprint);
132
+ j(n) && (o.mkdir("/internal/shared/cwd"), u = await o.mount(
135
133
  "/internal/shared/cwd",
136
- x(y.dirname(n))
137
- ), e.blueprint = y.join(
134
+ T(W.dirname(n))
135
+ ), e.blueprint = W.join(
138
136
  "/internal/shared/cwd",
139
- y.basename(e.blueprint)
137
+ W.basename(e.blueprint)
140
138
  ));
141
139
  }
142
140
  try {
@@ -152,8 +150,8 @@ class z extends B {
152
150
  "allow"
153
151
  ].filter((t) => t in e).map((t) => `--${t}=${e[t]}`);
154
152
  l.push(`--site-url=${e.siteUrl}`);
155
- const d = await q({
156
- php: p,
153
+ const d = await N({
154
+ php: c,
157
155
  blueprint: e.blueprint,
158
156
  blueprintOverrides: {
159
157
  additionalSteps: e["additional-blueprint-steps"],
@@ -183,14 +181,14 @@ class z extends B {
183
181
  break;
184
182
  }
185
183
  case "blueprint.error": {
186
- const a = "\x1B[31m", f = "\x1B[1m", h = "\x1B[0m";
184
+ const a = "\x1B[31m", w = "\x1B[1m", f = "\x1B[0m";
187
185
  e.verbosity === "debug" && t.details ? i.stderr(
188
- `${a}${f}Fatal error:${h} Uncaught ${t.details.exception}: ${t.details.message}
186
+ `${a}${w}Fatal error:${f} Uncaught ${t.details.exception}: ${t.details.message}
189
187
  at ${t.details.file}:${t.details.line}
190
188
  ` + (t.details.trace ? t.details.trace + `
191
189
  ` : "")
192
190
  ) : i.stderr(
193
- `${a}${f}Error:${h} ${t.message}
191
+ `${a}${w}Error:${f} ${t.message}
194
192
  `
195
193
  );
196
194
  break;
@@ -211,8 +209,8 @@ class z extends B {
211
209
  }
212
210
  })
213
211
  )), await d.finished, await d.exitCode !== 0) {
214
- const t = await E.fromStreamedResponse(d);
215
- throw new F(
212
+ const t = await q.fromStreamedResponse(d);
213
+ throw new E(
216
214
  `PHP.run() failed with exit code ${t.exitCode}. ${t.errors} ${t.text}`,
217
215
  t,
218
216
  "request"
@@ -221,45 +219,47 @@ class z extends B {
221
219
  } catch (n) {
222
220
  let l = "";
223
221
  try {
224
- l = p.readFileAsText(A);
222
+ l = c.readFileAsText(M);
225
223
  } catch {
226
224
  }
227
225
  throw n.phpLogs = l, n;
228
226
  } finally {
229
- u(), w();
227
+ p(), u();
230
228
  }
231
229
  }
232
230
  async bootRequestHandler({
233
231
  siteUrl: e,
234
232
  allow: r,
235
- phpVersion: p,
236
- createFiles: u,
233
+ phpVersion: c,
234
+ createFiles: p,
237
235
  constants: o,
238
- phpIniEntries: w,
236
+ phpIniEntries: u,
239
237
  firstProcessId: n,
240
238
  processIdSpaceLength: l,
241
239
  trace: d,
242
240
  nativeInternalDirPath: t,
243
241
  withIntl: a,
244
- withXdebug: f,
242
+ withRedis: w,
243
+ withMemcached: f,
244
+ withXdebug: b,
245
245
  onPHPInstanceCreated: h,
246
- spawnHandler: b
246
+ spawnHandler: I
247
247
  }) {
248
248
  if (this.booted)
249
249
  throw new Error("Playground already booted");
250
250
  this.booted = !0;
251
- let c = n;
252
- const I = n + l - 1;
251
+ let y = n;
252
+ const v = n + l - 1;
253
253
  try {
254
- const P = await C({
254
+ const P = await O({
255
255
  siteUrl: e,
256
256
  createPhpRuntime: async () => {
257
- const v = c;
258
- return c < I ? c++ : c = n, await $(p, {
257
+ const A = y;
258
+ return y < v ? y++ : y = n, await S(c, {
259
259
  emscriptenOptions: {
260
260
  fileLockManager: this.fileLockManager,
261
- processId: v,
262
- trace: d ? Y : void 0,
261
+ processId: A,
262
+ trace: d ? G : void 0,
263
263
  ENV: {
264
264
  DOCROOT: "/wordpress"
265
265
  },
@@ -267,23 +267,25 @@ class z extends B {
267
267
  },
268
268
  followSymlinks: r?.includes("follow-symlinks"),
269
269
  withIntl: a,
270
- withXdebug: f
270
+ withRedis: w,
271
+ withMemcached: f,
272
+ withXdebug: b
271
273
  });
272
274
  },
273
275
  maxPhpInstances: 1,
274
276
  onPHPInstanceCreated: h,
275
277
  sapiName: "cli",
276
- createFiles: u,
278
+ createFiles: p,
277
279
  constants: o,
278
- phpIniEntries: w,
280
+ phpIniEntries: u,
279
281
  cookieStore: !1,
280
- spawnHandler: b
282
+ spawnHandler: I
281
283
  });
282
284
  this.__internal_setRequestHandler(P);
283
- const R = await P.getPrimaryPhp();
284
- await this.setPrimaryPHP(R), K();
285
+ const H = await P.getPrimaryPhp();
286
+ await this.setPrimaryPHP(H), Q();
285
287
  } catch (P) {
286
- throw J(P), P;
288
+ throw X(P), P;
287
289
  }
288
290
  }
289
291
  // Provide a named disposal method that can be invoked via comlink.
@@ -291,43 +293,43 @@ class z extends B {
291
293
  await this[Symbol.asyncDispose]();
292
294
  }
293
295
  }
294
- async function k({
296
+ async function x({
295
297
  siteUrl: s,
296
298
  allow: e,
297
299
  phpVersion: r,
298
- createFiles: p,
299
- constants: u,
300
+ createFiles: c,
301
+ constants: p,
300
302
  phpIniEntries: o,
301
- firstProcessId: w,
303
+ firstProcessId: u,
302
304
  processIdSpaceLength: n,
303
305
  trace: l,
304
306
  nativeInternalDirPath: d,
305
307
  withXdebug: t,
306
308
  mountsBeforeWpInstall: a,
307
- mountsAfterWpInstall: f
308
- }, h) {
309
- const b = await V("v2"), c = T(
309
+ mountsAfterWpInstall: w
310
+ }, f) {
311
+ const b = await z("v2"), h = R(
310
312
  b.phpPort
311
313
  );
312
- return c.useFileLockManager(h), await c.bootWorker({
314
+ return h.useFileLockManager(f), await h.bootWorker({
313
315
  siteUrl: s,
314
316
  allow: e,
315
317
  phpVersion: r,
316
- createFiles: p,
317
- constants: u,
318
+ createFiles: c,
319
+ constants: p,
318
320
  phpIniEntries: o,
319
- firstProcessId: w,
321
+ firstProcessId: u,
320
322
  processIdSpaceLength: n,
321
323
  trace: l,
322
324
  nativeInternalDirPath: d,
323
325
  withXdebug: t,
324
326
  mountsBeforeWpInstall: a,
325
- mountsAfterWpInstall: f
327
+ mountsAfterWpInstall: w
326
328
  }), {
327
- php: c,
329
+ php: h,
328
330
  reap: () => {
329
331
  try {
330
- c.dispose();
332
+ h.dispose();
331
333
  } catch {
332
334
  }
333
335
  try {
@@ -338,21 +340,21 @@ async function k({
338
340
  };
339
341
  }
340
342
  process.on("unhandledRejection", (s) => {
341
- H.error("Unhandled rejection:", s);
343
+ $.error("Unhandled rejection:", s);
342
344
  });
343
- const W = new N(), [K, J] = _(
344
- new z(new M()),
345
+ const k = new D(), [Q, X] = B(
346
+ new J(new F()),
345
347
  void 0,
346
- W.port1
348
+ k.port1
347
349
  );
348
- j?.postMessage(
350
+ U?.postMessage(
349
351
  {
350
352
  command: "worker-script-initialized",
351
- phpPort: W.port2
353
+ phpPort: k.port2
352
354
  },
353
- [W.port2]
355
+ [k.port2]
354
356
  );
355
357
  export {
356
- z as PlaygroundCliBlueprintV2Worker
358
+ J as PlaygroundCliBlueprintV2Worker
357
359
  };
358
360
  //# sourceMappingURL=worker-thread-v2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"worker-thread-v2.js","sources":["../../../../packages/playground/cli/src/blueprints-v2/worker-thread-v2.ts"],"sourcesContent":["import { errorLogPath, logger } from '@php-wasm/logger';\nimport type { FileLockManager } from '@php-wasm/node';\nimport { createNodeFsMountHandler, loadNodeRuntime } from '@php-wasm/node';\nimport { EmscriptenDownloadMonitor } from '@php-wasm/progress';\nimport type {\n\tPHP,\n\tFileTree,\n\tRemoteAPI,\n\tSupportedPHPVersion,\n\tSpawnHandler,\n} from '@php-wasm/universal';\nimport {\n\tPHPExecutionFailureError,\n\tPHPResponse,\n\tPHPWorker,\n\tconsumeAPI,\n\tconsumeAPISync,\n\texposeAPI,\n\tsandboxedSpawnHandlerFactory,\n} from '@php-wasm/universal';\nimport { sprintf } from '@php-wasm/util';\nimport {\n\ttype BlueprintMessage,\n\trunBlueprintV2,\n\ttype BlueprintV1Declaration,\n} from '@wp-playground/blueprints';\nimport {\n\ttype ParsedBlueprintV2String,\n\ttype RawBlueprintV2Data,\n} from '@wp-playground/blueprints';\nimport { bootRequestHandler } from '@wp-playground/wordpress';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { rootCertificates } from 'tls';\nimport { MessageChannel, type MessagePort, parentPort } from 'worker_threads';\nimport { jspi } from 'wasm-feature-detect';\nimport { spawnWorkerThread, type RunCLIArgs } from '../run-cli';\nimport type {\n\tPhpIniOptions,\n\tPHPInstanceCreatedHook,\n} from '@wp-playground/wordpress';\nimport { shouldRenderProgress } from '../utils/progress';\nimport type { Mount } from '@php-wasm/cli-util';\n\nasync function mountResources(php: PHP, mounts: Mount[]) {\n\tfor (const mount of mounts) {\n\t\ttry {\n\t\t\tphp.mkdir(mount.vfsPath);\n\t\t\tawait php.mount(\n\t\t\t\tmount.vfsPath,\n\t\t\t\tcreateNodeFsMountHandler(mount.hostPath)\n\t\t\t);\n\t\t} catch {\n\t\t\toutput.stderr(\n\t\t\t\t`\\x1b[31m\\x1b[1mError mounting path ${mount.hostPath} at ${mount.vfsPath}\\x1b[0m\\n`\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n}\n\n/**\n * Print trace messages from PHP-WASM.\n *\n * @param {number} processId - The process ID.\n * @param {string} format - The format string.\n * @param {...any} args - The arguments.\n */\nfunction tracePhpWasm(processId: number, format: string, ...args: any[]) {\n\t// eslint-disable-next-line no-console\n\tconsole.log(\n\t\tperformance.now().toFixed(6).padStart(15, '0'),\n\t\tprocessId.toString().padStart(16, '0'),\n\t\tsprintf(format, ...args)\n\t);\n}\n\n/**\n * Force TTY status to preserve ANSI control codes in the output\n * when the environment is interactive.\n *\n * This script is spawned as `new Worker()` and process.stdout and process.stderr are\n * WritableWorkerStdio objects. By default, they strip ANSI control codes from the output\n * causing every progress bar update to be printed in a new line instead of updating the\n * same line.\n */\nObject.defineProperty(process.stdout, 'isTTY', { value: true });\nObject.defineProperty(process.stderr, 'isTTY', { value: true });\n\n/**\n * Output writer that ensures that progress bars are not printed on the same line as other output.\n */\nconst output = {\n\tlastWriteWasProgress: false,\n\tprogress(data: string) {\n\t\tif (!shouldRenderProgress(process.stdout)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!process.stdout.isTTY) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(data);\n\t\t} else {\n\t\t\tif (!output.lastWriteWasProgress) {\n\t\t\t\tprocess.stdout.write('\\n');\n\t\t\t}\n\t\t\tprocess.stdout.write('\\r\\x1b[K' + data);\n\t\t\toutput.lastWriteWasProgress = true;\n\t\t}\n\t},\n\tstdout(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stdout.write(data);\n\t},\n\tstderr(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stderr.write(data);\n\t},\n};\n\nexport type PrimaryWorkerBootArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tphpVersion: SupportedPHPVersion;\n\tsiteUrl: string;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tnativeInternalDirPath: string;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\ntype WorkerRunBlueprintArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tsiteUrl: string;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type SecondaryWorkerBootArgs = {\n\tsiteUrl: string;\n\tallow?: string;\n\tphpVersion: SupportedPHPVersion;\n\tphpIniEntries?: PhpIniOptions;\n\tconstants?: Record<string, string | number | boolean | null>;\n\tcreateFiles?: FileTree;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tnativeInternalDirPath: string;\n\twithIntl?: boolean;\n\twithXdebug?: boolean;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type WorkerBootRequestHandlerOptions = Omit<\n\tSecondaryWorkerBootArgs,\n\t'mountsBeforeWpInstall' | 'mountsAfterWpInstall'\n> & {\n\tonPHPInstanceCreated: PHPInstanceCreatedHook;\n\tspawnHandler: () => SpawnHandler;\n};\n\nexport class PlaygroundCliBlueprintV2Worker extends PHPWorker {\n\tbooted = false;\n\tblueprintTargetResolved = false;\n\tphpInstancesThatNeedMountsAfterTargetResolved = new Set<PHP>();\n\tfileLockManager: RemoteAPI<FileLockManager> | FileLockManager | undefined;\n\n\tconstructor(monitor: EmscriptenDownloadMonitor) {\n\t\tsuper(undefined, monitor);\n\t}\n\n\t/**\n\t * Call this method before boot() to use file locking.\n\t *\n\t * This method is separate from boot() to simplify the related Comlink.transferHandlers\n\t * setup – if an argument is a MessagePort, we're transferring it, not copying it.\n\t *\n\t * @see comlink-sync.ts\n\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t */\n\tasync useFileLockManager(port: MessagePort) {\n\t\tif (await jspi()) {\n\t\t\t/**\n\t\t\t * If JSPI is available, php.js supports both synchronous and asynchronous locking syscalls.\n\t\t\t * Web browsers, however, only support asynchronous message passing so let's use the\n\t\t\t * asynchronous API. Every method call will return a promise.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = consumeAPI<FileLockManager>(port);\n\t\t} else {\n\t\t\t/**\n\t\t\t * If JSPI is not available, php.js only supports synchronous locking syscalls.\n\t\t\t * Let's use the synchronous API. Every method call will block this thread\n\t\t\t * until the result is available.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = await consumeAPISync<FileLockManager>(port);\n\t\t}\n\t}\n\n\tasync bootAndSetUpInitialWorker(args: PrimaryWorkerBootArgs) {\n\t\tconst constants = {\n\t\t\tWP_DEBUG: true,\n\t\t\tWP_DEBUG_LOG: true,\n\t\t\tWP_DEBUG_DISPLAY: false,\n\t\t};\n\t\tconst requestHandlerOptions: WorkerBootRequestHandlerOptions = {\n\t\t\t...args,\n\t\t\tcreateFiles: {\n\t\t\t\t'/internal/shared/ca-bundle.crt': rootCertificates.join('\\n'),\n\t\t\t},\n\t\t\tconstants,\n\t\t\tphpIniEntries: {\n\t\t\t\t'openssl.cafile': '/internal/shared/ca-bundle.crt',\n\t\t\t},\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tif (this.blueprintTargetResolved) {\n\t\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\t\t\t\t} else {\n\t\t\t\t\t// NOTE: Today (2025-09-11), during boot with a plugin auto-mount,\n\t\t\t\t\t// the Blueprint runner fails unless post-resolution mounts are\n\t\t\t\t\t// added to existing PHP instances. So we track them here so they\n\t\t\t\t\t// can be mounted at the necessary time.\n\t\t\t\t\t// Only plugin auto-mounts seem to need this, so perhaps there\n\t\t\t\t\t// is a change we can make to the Blueprint runner so such\n\t\t\t\t\t// a dance is unnecessary.\n\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.add(php);\n\t\t\t\t\tphp.addEventListener('runtime.beforeExit', () => {\n\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t};\n\t\tawait this.bootRequestHandler(requestHandlerOptions);\n\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\n\t\tif (args.mode === 'mount-only') {\n\t\t\tawait mountResources(primaryPhp, args.mountsAfterWpInstall || []);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBlueprintV2({\n\t\t\t...args,\n\t\t\tmountsAfterWpInstall: args.mountsAfterWpInstall || [],\n\t\t});\n\t}\n\n\tasync bootWorker(args: SecondaryWorkerBootArgs) {\n\t\tawait this.bootRequestHandler({\n\t\t\t...args,\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\n\t\t\t\t// Temporary workaround for LOCK_EX in sqlite-database-integration.\n\t\t\t\t// Creation of these files results in this error:\n\t\t\t\t// PHP Warning: file_put_contents(): Exclusive locks are not supported for this stream\n\t\t\t\t// in\n\t\t\t\t// /wordpress/wp-content/plugins/sqlite-database-integration/wp-includes/sqlite/class-wp-sqlite-db.php\n\t\t\t\t// on line 670\n\t\t\t\tif (!php.isDir('/wordpress/wp-content')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content');\n\t\t\t\t}\n\t\t\t\tif (!php.isDir('/wordpress/wp-content/database')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content/database');\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/.htaccess')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/.htaccess',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/index.php')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/index.php',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t});\n\t}\n\n\tasync runBlueprintV2(args: WorkerRunBlueprintArgs) {\n\t\tconst requestHandler = this.__internal_getRequestHandler()!;\n\t\tconst { php, reap } =\n\t\t\tawait requestHandler.instanceManager.acquirePHPInstance({\n\t\t\t\tconsiderPrimary: false,\n\t\t\t});\n\n\t\t// Mount the current working directory to the PHP runtime for the purposes of\n\t\t// Blueprint resolution.\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\t\tlet unmountCwd = () => {};\n\t\tif (typeof args.blueprint === 'string') {\n\t\t\tconst blueprintPath = path.resolve(process.cwd(), args.blueprint);\n\t\t\tif (existsSync(blueprintPath)) {\n\t\t\t\tprimaryPhp.mkdir('/internal/shared/cwd');\n\t\t\t\tunmountCwd = await primaryPhp.mount(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tcreateNodeFsMountHandler(path.dirname(blueprintPath))\n\t\t\t\t);\n\t\t\t\targs.blueprint = path.join(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tpath.basename(args.blueprint)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst cliArgsToPass: (keyof WorkerRunBlueprintArgs)[] = [\n\t\t\t\t'mode',\n\t\t\t\t'db-engine',\n\t\t\t\t'db-host',\n\t\t\t\t'db-user',\n\t\t\t\t'db-pass',\n\t\t\t\t'db-name',\n\t\t\t\t'db-path',\n\t\t\t\t'truncate-new-site-directory',\n\t\t\t\t'allow',\n\t\t\t];\n\t\t\tconst cliArgs = cliArgsToPass\n\t\t\t\t.filter((arg) => arg in args)\n\t\t\t\t.map((arg) => `--${arg}=${args[arg]}`);\n\t\t\tcliArgs.push(`--site-url=${args.siteUrl}`);\n\n\t\t\tconst streamedResponse = await runBlueprintV2({\n\t\t\t\tphp,\n\t\t\t\tblueprint: args.blueprint,\n\t\t\t\tblueprintOverrides: {\n\t\t\t\t\tadditionalSteps: args['additional-blueprint-steps'],\n\t\t\t\t\twordpressVersion: args.wp,\n\t\t\t\t},\n\t\t\t\tcliArgs,\n\t\t\t\tonMessage: async (message: BlueprintMessage) => {\n\t\t\t\t\tswitch (message.type) {\n\t\t\t\t\t\tcase 'blueprint.target_resolved': {\n\t\t\t\t\t\t\tif (!this.blueprintTargetResolved) {\n\t\t\t\t\t\t\t\tthis.blueprintTargetResolved = true;\n\t\t\t\t\t\t\t\tfor (const php of this\n\t\t\t\t\t\t\t\t\t.phpInstancesThatNeedMountsAfterTargetResolved) {\n\t\t\t\t\t\t\t\t\t// console.log('mounting resources for php', php);\n\t\t\t\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tawait mountResources(\n\t\t\t\t\t\t\t\t\t\tphp,\n\t\t\t\t\t\t\t\t\t\targs.mountsAfterWpInstall || []\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.progress': {\n\t\t\t\t\t\t\tconst progressMessage = `${message.caption.trim()} – ${message.progress.toFixed(\n\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t)}%`;\n\t\t\t\t\t\t\toutput.progress(progressMessage);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.error': {\n\t\t\t\t\t\t\tconst red = '\\x1b[31m';\n\t\t\t\t\t\t\tconst bold = '\\x1b[1m';\n\t\t\t\t\t\t\tconst reset = '\\x1b[0m';\n\t\t\t\t\t\t\tif (args.verbosity === 'debug' && message.details) {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Fatal error:${reset} Uncaught ${message.details.exception}: ${message.details.message}\\n` +\n\t\t\t\t\t\t\t\t\t\t` at ${message.details.file}:${message.details.line}\\n` +\n\t\t\t\t\t\t\t\t\t\t(message.details.trace\n\t\t\t\t\t\t\t\t\t\t\t? message.details.trace + '\\n'\n\t\t\t\t\t\t\t\t\t\t\t: '')\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Error:${reset} ${message.message}\\n`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\t/**\n\t\t\t * When we're debugging, every bit of information matters – let's immediately output\n\t\t\t * everything we get from the PHP output streams.\n\t\t\t */\n\t\t\tif (args.verbosity === 'debug') {\n\t\t\t\tstreamedResponse!.stdout.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stdout.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\tstreamedResponse!.stderr.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stderr.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait streamedResponse!.finished;\n\t\t\tif ((await streamedResponse!.exitCode) !== 0) {\n\t\t\t\t// exitCode != 1 means the blueprint execution failed. Let's throw an error.\n\t\t\t\t// and clean up.\n\t\t\t\tconst syncResponse =\n\t\t\t\t\tawait PHPResponse.fromStreamedResponse(streamedResponse);\n\t\t\t\tthrow new PHPExecutionFailureError(\n\t\t\t\t\t`PHP.run() failed with exit code ${syncResponse.exitCode}. ${syncResponse.errors} ${syncResponse.text}`,\n\t\t\t\t\tsyncResponse,\n\t\t\t\t\t'request'\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Capture the PHP error log details to provide more context for debugging.\n\t\t\tlet phpLogs = '';\n\t\t\ttry {\n\t\t\t\t// @TODO: Don't assume errorLogPath starts with /wordpress/\n\t\t\t\t// ...or maybe we can assume that in Playground CLI?\n\t\t\t\tphpLogs = php.readFileAsText(errorLogPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore errors reading the PHP error log.\n\t\t\t}\n\t\t\t(error as any).phpLogs = phpLogs;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\treap();\n\t\t\tunmountCwd();\n\t\t}\n\t}\n\n\tasync bootRequestHandler({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithIntl,\n\t\twithXdebug,\n\t\tonPHPInstanceCreated,\n\t\tspawnHandler,\n\t}: WorkerBootRequestHandlerOptions) {\n\t\tif (this.booted) {\n\t\t\tthrow new Error('Playground already booted');\n\t\t}\n\t\tthis.booted = true;\n\n\t\tlet nextProcessId = firstProcessId;\n\t\tconst lastProcessId = firstProcessId + processIdSpaceLength - 1;\n\n\t\ttry {\n\t\t\tconst requestHandler = await bootRequestHandler({\n\t\t\t\tsiteUrl,\n\t\t\t\tcreatePhpRuntime: async () => {\n\t\t\t\t\tconst processId = nextProcessId;\n\n\t\t\t\t\tif (nextProcessId < lastProcessId) {\n\t\t\t\t\t\tnextProcessId++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We've reached the end of the process ID space. Start over.\n\t\t\t\t\t\tnextProcessId = firstProcessId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn await loadNodeRuntime(phpVersion, {\n\t\t\t\t\t\temscriptenOptions: {\n\t\t\t\t\t\t\tfileLockManager: this.fileLockManager!,\n\t\t\t\t\t\t\tprocessId,\n\t\t\t\t\t\t\ttrace: trace ? tracePhpWasm : undefined,\n\t\t\t\t\t\t\tENV: {\n\t\t\t\t\t\t\t\tDOCROOT: '/wordpress',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tphpWasmInitOptions: { nativeInternalDirPath },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfollowSymlinks: allow?.includes('follow-symlinks'),\n\t\t\t\t\t\twithIntl: withIntl,\n\t\t\t\t\t\twithXdebug,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmaxPhpInstances: 1,\n\t\t\t\tonPHPInstanceCreated,\n\t\t\t\tsapiName: 'cli',\n\t\t\t\tcreateFiles,\n\t\t\t\tconstants,\n\t\t\t\tphpIniEntries,\n\t\t\t\tcookieStore: false,\n\t\t\t\tspawnHandler,\n\t\t\t});\n\t\t\tthis.__internal_setRequestHandler(requestHandler);\n\n\t\t\tconst primaryPhp = await requestHandler.getPrimaryPhp();\n\t\t\tawait this.setPrimaryPHP(primaryPhp);\n\n\t\t\tsetApiReady();\n\t\t} catch (e) {\n\t\t\tsetAPIError(e as Error);\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Provide a named disposal method that can be invoked via comlink.\n\tasync dispose() {\n\t\tawait this[Symbol.asyncDispose]();\n\t}\n}\n\n/**\n * Spawns a new PHP process to be used in the PHP spawn handler (in proc_open() etc. calls).\n * It boots from this worker-thread-v1.ts file, but is a separate process.\n *\n * We explicitly avoid using PHPProcessManager.acquirePHPInstance() here.\n *\n * Why?\n *\n * Because each PHP instance acquires actual OS-level file locks via fcntl() and LockFileEx()\n * syscalls. Running multiple PHP instances from the same OS process would allow them to\n * acquire overlapping locks. Running every PHP instance in a separate OS process ensures\n * any locks that overlap between PHP instances conflict with each other as expected.\n *\n * @param options - The options for the worker.\n * @param fileLockManager - The file lock manager to use.\n * @returns A promise that resolves to the PHP worker.\n */\nasync function createPHPWorker(\n\t{\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t}: SecondaryWorkerBootArgs,\n\tfileLockManager: FileLockManager | RemoteAPI<FileLockManager>\n) {\n\tconst spawnedWorker = await spawnWorkerThread('v2');\n\n\tconst handler = consumeAPI<PlaygroundCliBlueprintV2Worker>(\n\t\tspawnedWorker.phpPort\n\t);\n\thandler.useFileLockManager(fileLockManager as any);\n\tawait handler.bootWorker({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t});\n\n\treturn {\n\t\tphp: handler,\n\t\treap: () => {\n\t\t\ttry {\n\t\t\t\thandler.dispose();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tspawnedWorker.worker.terminate();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t},\n\t};\n}\n\nprocess.on('unhandledRejection', (e: any) => {\n\tlogger.error('Unhandled rejection:', e);\n});\n\nconst phpChannel = new MessageChannel();\n\nconst [setApiReady, setAPIError] = exposeAPI(\n\tnew PlaygroundCliBlueprintV2Worker(new EmscriptenDownloadMonitor()),\n\tundefined,\n\tphpChannel.port1\n);\n\nparentPort?.postMessage(\n\t{\n\t\tcommand: 'worker-script-initialized',\n\t\tphpPort: phpChannel.port2,\n\t},\n\t[phpChannel.port2 as any]\n);\n"],"names":["mountResources","php","mounts","mount","createNodeFsMountHandler","output","tracePhpWasm","processId","format","args","sprintf","data","shouldRenderProgress","PlaygroundCliBlueprintV2Worker","PHPWorker","monitor","port","jspi","consumeAPI","consumeAPISync","constants","requestHandlerOptions","rootCertificates","sandboxedSpawnHandlerFactory","createPHPWorker","primaryPhp","requestHandler","reap","unmountCwd","blueprintPath","path","existsSync","cliArgs","arg","streamedResponse","runBlueprintV2","message","progressMessage","red","bold","reset","chunk","syncResponse","PHPResponse","PHPExecutionFailureError","error","phpLogs","errorLogPath","siteUrl","allow","phpVersion","createFiles","phpIniEntries","firstProcessId","processIdSpaceLength","trace","nativeInternalDirPath","withIntl","withXdebug","onPHPInstanceCreated","spawnHandler","nextProcessId","lastProcessId","bootRequestHandler","loadNodeRuntime","setApiReady","e","setAPIError","mountsBeforeWpInstall","mountsAfterWpInstall","fileLockManager","spawnedWorker","spawnWorkerThread","handler","logger","phpChannel","MessageChannel","exposeAPI","EmscriptenDownloadMonitor","parentPort"],"mappings":"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"}
1
+ {"version":3,"file":"worker-thread-v2.js","sources":["../../../../packages/playground/cli/src/blueprints-v2/worker-thread-v2.ts"],"sourcesContent":["import { errorLogPath, logger } from '@php-wasm/logger';\nimport type { FileLockManager } from '@php-wasm/node';\nimport { createNodeFsMountHandler, loadNodeRuntime } from '@php-wasm/node';\nimport { EmscriptenDownloadMonitor } from '@php-wasm/progress';\nimport type {\n\tPHP,\n\tFileTree,\n\tRemoteAPI,\n\tSupportedPHPVersion,\n\tSpawnHandler,\n} from '@php-wasm/universal';\nimport {\n\tPHPExecutionFailureError,\n\tPHPResponse,\n\tPHPWorker,\n\tconsumeAPI,\n\tconsumeAPISync,\n\texposeAPI,\n\tsandboxedSpawnHandlerFactory,\n} from '@php-wasm/universal';\nimport { sprintf } from '@php-wasm/util';\nimport {\n\ttype BlueprintMessage,\n\trunBlueprintV2,\n\ttype BlueprintV1Declaration,\n} from '@wp-playground/blueprints';\nimport {\n\ttype ParsedBlueprintV2String,\n\ttype RawBlueprintV2Data,\n} from '@wp-playground/blueprints';\nimport { bootRequestHandler } from '@wp-playground/wordpress';\nimport { existsSync } from 'fs';\nimport path from 'path';\nimport { rootCertificates } from 'tls';\nimport { MessageChannel, type MessagePort, parentPort } from 'worker_threads';\nimport { jspi } from 'wasm-feature-detect';\nimport { spawnWorkerThread, type RunCLIArgs } from '../run-cli';\nimport type {\n\tPhpIniOptions,\n\tPHPInstanceCreatedHook,\n} from '@wp-playground/wordpress';\nimport { shouldRenderProgress } from '../utils/progress';\nimport type { Mount } from '@php-wasm/cli-util';\n\nasync function mountResources(php: PHP, mounts: Mount[]) {\n\tfor (const mount of mounts) {\n\t\ttry {\n\t\t\tphp.mkdir(mount.vfsPath);\n\t\t\tawait php.mount(\n\t\t\t\tmount.vfsPath,\n\t\t\t\tcreateNodeFsMountHandler(mount.hostPath)\n\t\t\t);\n\t\t} catch {\n\t\t\toutput.stderr(\n\t\t\t\t`\\x1b[31m\\x1b[1mError mounting path ${mount.hostPath} at ${mount.vfsPath}\\x1b[0m\\n`\n\t\t\t);\n\t\t\tprocess.exit(1);\n\t\t}\n\t}\n}\n\n/**\n * Print trace messages from PHP-WASM.\n *\n * @param {number} processId - The process ID.\n * @param {string} format - The format string.\n * @param {...any} args - The arguments.\n */\nfunction tracePhpWasm(processId: number, format: string, ...args: any[]) {\n\t// eslint-disable-next-line no-console\n\tconsole.log(\n\t\tperformance.now().toFixed(6).padStart(15, '0'),\n\t\tprocessId.toString().padStart(16, '0'),\n\t\tsprintf(format, ...args)\n\t);\n}\n\n/**\n * Force TTY status to preserve ANSI control codes in the output\n * when the environment is interactive.\n *\n * This script is spawned as `new Worker()` and process.stdout and process.stderr are\n * WritableWorkerStdio objects. By default, they strip ANSI control codes from the output\n * causing every progress bar update to be printed in a new line instead of updating the\n * same line.\n */\nObject.defineProperty(process.stdout, 'isTTY', { value: true });\nObject.defineProperty(process.stderr, 'isTTY', { value: true });\n\n/**\n * Output writer that ensures that progress bars are not printed on the same line as other output.\n */\nconst output = {\n\tlastWriteWasProgress: false,\n\tprogress(data: string) {\n\t\tif (!shouldRenderProgress(process.stdout)) {\n\t\t\treturn;\n\t\t}\n\t\tif (!process.stdout.isTTY) {\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.log(data);\n\t\t} else {\n\t\t\tif (!output.lastWriteWasProgress) {\n\t\t\t\tprocess.stdout.write('\\n');\n\t\t\t}\n\t\t\tprocess.stdout.write('\\r\\x1b[K' + data);\n\t\t\toutput.lastWriteWasProgress = true;\n\t\t}\n\t},\n\tstdout(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stdout.write(data);\n\t},\n\tstderr(data: string) {\n\t\tprocess.stdout.write('\\n\\n\\n');\n\t\tif (output.lastWriteWasProgress) {\n\t\t\toutput.lastWriteWasProgress = false;\n\t\t}\n\t\tprocess.stderr.write(data);\n\t},\n};\n\nexport type PrimaryWorkerBootArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tphpVersion: SupportedPHPVersion;\n\tsiteUrl: string;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tnativeInternalDirPath: string;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n\t/**\n\t * PHP constants to define via php.defineConstant().\n\t * Process-specific, set for each PHP instance.\n\t */\n\tconstants?: Record<string, string | number | boolean | null>;\n};\n\ntype WorkerRunBlueprintArgs = Omit<\n\tRunCLIArgs,\n\t'mount-before-install' | 'mount'\n> & {\n\tsiteUrl: string;\n\tblueprint:\n\t\t| RawBlueprintV2Data\n\t\t| ParsedBlueprintV2String\n\t\t| BlueprintV1Declaration;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type SecondaryWorkerBootArgs = {\n\tsiteUrl: string;\n\tallow?: string;\n\tphpVersion: SupportedPHPVersion;\n\tphpIniEntries?: PhpIniOptions;\n\tconstants?: Record<string, string | number | boolean | null>;\n\tcreateFiles?: FileTree;\n\tfirstProcessId: number;\n\tprocessIdSpaceLength: number;\n\ttrace: boolean;\n\tnativeInternalDirPath: string;\n\twithIntl?: boolean;\n\twithRedis?: boolean;\n\twithMemcached?: boolean;\n\twithXdebug?: boolean;\n\tmountsBeforeWpInstall?: Array<Mount>;\n\tmountsAfterWpInstall?: Array<Mount>;\n};\n\nexport type WorkerBootRequestHandlerOptions = Omit<\n\tSecondaryWorkerBootArgs,\n\t'mountsBeforeWpInstall' | 'mountsAfterWpInstall'\n> & {\n\tonPHPInstanceCreated: PHPInstanceCreatedHook;\n\tspawnHandler: () => SpawnHandler;\n};\n\nexport class PlaygroundCliBlueprintV2Worker extends PHPWorker {\n\tbooted = false;\n\tblueprintTargetResolved = false;\n\tphpInstancesThatNeedMountsAfterTargetResolved = new Set<PHP>();\n\tfileLockManager: RemoteAPI<FileLockManager> | FileLockManager | undefined;\n\n\tconstructor(monitor: EmscriptenDownloadMonitor) {\n\t\tsuper(undefined, monitor);\n\t}\n\n\t/**\n\t * Call this method before boot() to use file locking.\n\t *\n\t * This method is separate from boot() to simplify the related Comlink.transferHandlers\n\t * setup – if an argument is a MessagePort, we're transferring it, not copying it.\n\t *\n\t * @see comlink-sync.ts\n\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t */\n\tasync useFileLockManager(port: MessagePort) {\n\t\tif (await jspi()) {\n\t\t\t/**\n\t\t\t * If JSPI is available, php.js supports both synchronous and asynchronous locking syscalls.\n\t\t\t * Web browsers, however, only support asynchronous message passing so let's use the\n\t\t\t * asynchronous API. Every method call will return a promise.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = consumeAPI<FileLockManager>(port);\n\t\t} else {\n\t\t\t/**\n\t\t\t * If JSPI is not available, php.js only supports synchronous locking syscalls.\n\t\t\t * Let's use the synchronous API. Every method call will block this thread\n\t\t\t * until the result is available.\n\t\t\t *\n\t\t\t * @see comlink-sync.ts\n\t\t\t * @see phpwasm-emscripten-library-file-locking-for-node.js\n\t\t\t */\n\t\t\tthis.fileLockManager = await consumeAPISync<FileLockManager>(port);\n\t\t}\n\t}\n\n\tasync bootAndSetUpInitialWorker(args: PrimaryWorkerBootArgs) {\n\t\t// Start with CLI-provided constants (if any)\n\t\tconst constants = {\n\t\t\t...(args.constants || {}),\n\t\t};\n\t\tconst requestHandlerOptions: WorkerBootRequestHandlerOptions = {\n\t\t\t...args,\n\t\t\tcreateFiles: {\n\t\t\t\t'/internal/shared/ca-bundle.crt': rootCertificates.join('\\n'),\n\t\t\t},\n\t\t\tconstants,\n\t\t\tphpIniEntries: {\n\t\t\t\t'openssl.cafile': '/internal/shared/ca-bundle.crt',\n\t\t\t},\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tif (this.blueprintTargetResolved) {\n\t\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\t\t\t\t} else {\n\t\t\t\t\t// NOTE: Today (2025-09-11), during boot with a plugin auto-mount,\n\t\t\t\t\t// the Blueprint runner fails unless post-resolution mounts are\n\t\t\t\t\t// added to existing PHP instances. So we track them here so they\n\t\t\t\t\t// can be mounted at the necessary time.\n\t\t\t\t\t// Only plugin auto-mounts seem to need this, so perhaps there\n\t\t\t\t\t// is a change we can make to the Blueprint runner so such\n\t\t\t\t\t// a dance is unnecessary.\n\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.add(php);\n\t\t\t\t\tphp.addEventListener('runtime.beforeExit', () => {\n\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t};\n\t\tawait this.bootRequestHandler(requestHandlerOptions);\n\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\n\t\tif (args.mode === 'mount-only') {\n\t\t\tawait mountResources(primaryPhp, args.mountsAfterWpInstall || []);\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.runBlueprintV2({\n\t\t\t...args,\n\t\t\tmountsAfterWpInstall: args.mountsAfterWpInstall || [],\n\t\t});\n\t}\n\n\tasync bootWorker(args: SecondaryWorkerBootArgs) {\n\t\tawait this.bootRequestHandler({\n\t\t\t...args,\n\t\t\tonPHPInstanceCreated: async (php: PHP) => {\n\t\t\t\tawait mountResources(php, args.mountsBeforeWpInstall || []);\n\t\t\t\tawait mountResources(php, args.mountsAfterWpInstall || []);\n\n\t\t\t\t// Temporary workaround for LOCK_EX in sqlite-database-integration.\n\t\t\t\t// Creation of these files results in this error:\n\t\t\t\t// PHP Warning: file_put_contents(): Exclusive locks are not supported for this stream\n\t\t\t\t// in\n\t\t\t\t// /wordpress/wp-content/plugins/sqlite-database-integration/wp-includes/sqlite/class-wp-sqlite-db.php\n\t\t\t\t// on line 670\n\t\t\t\tif (!php.isDir('/wordpress/wp-content')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content');\n\t\t\t\t}\n\t\t\t\tif (!php.isDir('/wordpress/wp-content/database')) {\n\t\t\t\t\tphp.mkdir('/wordpress/wp-content/database');\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/.htaccess')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/.htaccess',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (!php.isFile('/wordpress/wp-content/database/index.php')) {\n\t\t\t\t\tphp.writeFile(\n\t\t\t\t\t\t'/wordpress/wp-content/database/index.php',\n\t\t\t\t\t\t'deny from all'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t},\n\t\t\tspawnHandler: () =>\n\t\t\t\tsandboxedSpawnHandlerFactory(() =>\n\t\t\t\t\tcreatePHPWorker(args, this.fileLockManager!)\n\t\t\t\t),\n\t\t});\n\t}\n\n\tasync runBlueprintV2(args: WorkerRunBlueprintArgs) {\n\t\tconst requestHandler = this.__internal_getRequestHandler()!;\n\t\tconst { php, reap } =\n\t\t\tawait requestHandler.instanceManager.acquirePHPInstance({\n\t\t\t\tconsiderPrimary: false,\n\t\t\t});\n\n\t\t// Mount the current working directory to the PHP runtime for the purposes of\n\t\t// Blueprint resolution.\n\t\tconst primaryPhp = this.__internal_getPHP()!;\n\t\tlet unmountCwd = () => {};\n\t\tif (typeof args.blueprint === 'string') {\n\t\t\tconst blueprintPath = path.resolve(process.cwd(), args.blueprint);\n\t\t\tif (existsSync(blueprintPath)) {\n\t\t\t\tprimaryPhp.mkdir('/internal/shared/cwd');\n\t\t\t\tunmountCwd = await primaryPhp.mount(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tcreateNodeFsMountHandler(path.dirname(blueprintPath))\n\t\t\t\t);\n\t\t\t\targs.blueprint = path.join(\n\t\t\t\t\t'/internal/shared/cwd',\n\t\t\t\t\tpath.basename(args.blueprint)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst cliArgsToPass: (keyof WorkerRunBlueprintArgs)[] = [\n\t\t\t\t'mode',\n\t\t\t\t'db-engine',\n\t\t\t\t'db-host',\n\t\t\t\t'db-user',\n\t\t\t\t'db-pass',\n\t\t\t\t'db-name',\n\t\t\t\t'db-path',\n\t\t\t\t'truncate-new-site-directory',\n\t\t\t\t'allow',\n\t\t\t];\n\t\t\tconst cliArgs = cliArgsToPass\n\t\t\t\t.filter((arg) => arg in args)\n\t\t\t\t.map((arg) => `--${arg}=${args[arg]}`);\n\t\t\tcliArgs.push(`--site-url=${args.siteUrl}`);\n\n\t\t\tconst streamedResponse = await runBlueprintV2({\n\t\t\t\tphp,\n\t\t\t\tblueprint: args.blueprint,\n\t\t\t\tblueprintOverrides: {\n\t\t\t\t\tadditionalSteps: args['additional-blueprint-steps'],\n\t\t\t\t\twordpressVersion: args.wp,\n\t\t\t\t},\n\t\t\t\tcliArgs,\n\t\t\t\tonMessage: async (message: BlueprintMessage) => {\n\t\t\t\t\tswitch (message.type) {\n\t\t\t\t\t\tcase 'blueprint.target_resolved': {\n\t\t\t\t\t\t\tif (!this.blueprintTargetResolved) {\n\t\t\t\t\t\t\t\tthis.blueprintTargetResolved = true;\n\t\t\t\t\t\t\t\tfor (const php of this\n\t\t\t\t\t\t\t\t\t.phpInstancesThatNeedMountsAfterTargetResolved) {\n\t\t\t\t\t\t\t\t\t// console.log('mounting resources for php', php);\n\t\t\t\t\t\t\t\t\tthis.phpInstancesThatNeedMountsAfterTargetResolved.delete(\n\t\t\t\t\t\t\t\t\t\tphp\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tawait mountResources(\n\t\t\t\t\t\t\t\t\t\tphp,\n\t\t\t\t\t\t\t\t\t\targs.mountsAfterWpInstall || []\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.progress': {\n\t\t\t\t\t\t\tconst progressMessage = `${message.caption.trim()} – ${message.progress.toFixed(\n\t\t\t\t\t\t\t\t2\n\t\t\t\t\t\t\t)}%`;\n\t\t\t\t\t\t\toutput.progress(progressMessage);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcase 'blueprint.error': {\n\t\t\t\t\t\t\tconst red = '\\x1b[31m';\n\t\t\t\t\t\t\tconst bold = '\\x1b[1m';\n\t\t\t\t\t\t\tconst reset = '\\x1b[0m';\n\t\t\t\t\t\t\tif (args.verbosity === 'debug' && message.details) {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Fatal error:${reset} Uncaught ${message.details.exception}: ${message.details.message}\\n` +\n\t\t\t\t\t\t\t\t\t\t` at ${message.details.file}:${message.details.line}\\n` +\n\t\t\t\t\t\t\t\t\t\t(message.details.trace\n\t\t\t\t\t\t\t\t\t\t\t? message.details.trace + '\\n'\n\t\t\t\t\t\t\t\t\t\t\t: '')\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\toutput.stderr(\n\t\t\t\t\t\t\t\t\t`${red}${bold}Error:${reset} ${message.message}\\n`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t});\n\t\t\t/**\n\t\t\t * When we're debugging, every bit of information matters – let's immediately output\n\t\t\t * everything we get from the PHP output streams.\n\t\t\t */\n\t\t\tif (args.verbosity === 'debug') {\n\t\t\t\tstreamedResponse!.stdout.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stdout.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t\tstreamedResponse!.stderr.pipeTo(\n\t\t\t\t\tnew WritableStream({\n\t\t\t\t\t\twrite(chunk) {\n\t\t\t\t\t\t\tprocess.stderr.write(chunk);\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\t\t\tawait streamedResponse!.finished;\n\t\t\tif ((await streamedResponse!.exitCode) !== 0) {\n\t\t\t\t// exitCode != 1 means the blueprint execution failed. Let's throw an error.\n\t\t\t\t// and clean up.\n\t\t\t\tconst syncResponse =\n\t\t\t\t\tawait PHPResponse.fromStreamedResponse(streamedResponse);\n\t\t\t\tthrow new PHPExecutionFailureError(\n\t\t\t\t\t`PHP.run() failed with exit code ${syncResponse.exitCode}. ${syncResponse.errors} ${syncResponse.text}`,\n\t\t\t\t\tsyncResponse,\n\t\t\t\t\t'request'\n\t\t\t\t);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\t// Capture the PHP error log details to provide more context for debugging.\n\t\t\tlet phpLogs = '';\n\t\t\ttry {\n\t\t\t\t// @TODO: Don't assume errorLogPath starts with /wordpress/\n\t\t\t\t// ...or maybe we can assume that in Playground CLI?\n\t\t\t\tphpLogs = php.readFileAsText(errorLogPath);\n\t\t\t} catch {\n\t\t\t\t// Ignore errors reading the PHP error log.\n\t\t\t}\n\t\t\t(error as any).phpLogs = phpLogs;\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\treap();\n\t\t\tunmountCwd();\n\t\t}\n\t}\n\n\tasync bootRequestHandler({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithIntl,\n\t\twithRedis,\n\t\twithMemcached,\n\t\twithXdebug,\n\t\tonPHPInstanceCreated,\n\t\tspawnHandler,\n\t}: WorkerBootRequestHandlerOptions) {\n\t\tif (this.booted) {\n\t\t\tthrow new Error('Playground already booted');\n\t\t}\n\t\tthis.booted = true;\n\n\t\tlet nextProcessId = firstProcessId;\n\t\tconst lastProcessId = firstProcessId + processIdSpaceLength - 1;\n\n\t\ttry {\n\t\t\tconst requestHandler = await bootRequestHandler({\n\t\t\t\tsiteUrl,\n\t\t\t\tcreatePhpRuntime: async () => {\n\t\t\t\t\tconst processId = nextProcessId;\n\n\t\t\t\t\tif (nextProcessId < lastProcessId) {\n\t\t\t\t\t\tnextProcessId++;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We've reached the end of the process ID space. Start over.\n\t\t\t\t\t\tnextProcessId = firstProcessId;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn await loadNodeRuntime(phpVersion, {\n\t\t\t\t\t\temscriptenOptions: {\n\t\t\t\t\t\t\tfileLockManager: this.fileLockManager!,\n\t\t\t\t\t\t\tprocessId,\n\t\t\t\t\t\t\ttrace: trace ? tracePhpWasm : undefined,\n\t\t\t\t\t\t\tENV: {\n\t\t\t\t\t\t\t\tDOCROOT: '/wordpress',\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tphpWasmInitOptions: { nativeInternalDirPath },\n\t\t\t\t\t\t},\n\t\t\t\t\t\tfollowSymlinks: allow?.includes('follow-symlinks'),\n\t\t\t\t\t\twithIntl: withIntl,\n\t\t\t\t\t\twithRedis,\n\t\t\t\t\t\twithMemcached,\n\t\t\t\t\t\twithXdebug,\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tmaxPhpInstances: 1,\n\t\t\t\tonPHPInstanceCreated,\n\t\t\t\tsapiName: 'cli',\n\t\t\t\tcreateFiles,\n\t\t\t\tconstants,\n\t\t\t\tphpIniEntries,\n\t\t\t\tcookieStore: false,\n\t\t\t\tspawnHandler,\n\t\t\t});\n\t\t\tthis.__internal_setRequestHandler(requestHandler);\n\n\t\t\tconst primaryPhp = await requestHandler.getPrimaryPhp();\n\t\t\tawait this.setPrimaryPHP(primaryPhp);\n\n\t\t\tsetApiReady();\n\t\t} catch (e) {\n\t\t\tsetAPIError(e as Error);\n\t\t\tthrow e;\n\t\t}\n\t}\n\n\t// Provide a named disposal method that can be invoked via comlink.\n\tasync dispose() {\n\t\tawait this[Symbol.asyncDispose]();\n\t}\n}\n\n/**\n * Spawns a new PHP process to be used in the PHP spawn handler (in proc_open() etc. calls).\n * It boots from this worker-thread-v1.ts file, but is a separate process.\n *\n * We explicitly avoid using PHPProcessManager.acquirePHPInstance() here.\n *\n * Why?\n *\n * Because each PHP instance acquires actual OS-level file locks via fcntl() and LockFileEx()\n * syscalls. Running multiple PHP instances from the same OS process would allow them to\n * acquire overlapping locks. Running every PHP instance in a separate OS process ensures\n * any locks that overlap between PHP instances conflict with each other as expected.\n *\n * @param options - The options for the worker.\n * @param fileLockManager - The file lock manager to use.\n * @returns A promise that resolves to the PHP worker.\n */\nasync function createPHPWorker(\n\t{\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t}: SecondaryWorkerBootArgs,\n\tfileLockManager: FileLockManager | RemoteAPI<FileLockManager>\n) {\n\tconst spawnedWorker = await spawnWorkerThread('v2');\n\n\tconst handler = consumeAPI<PlaygroundCliBlueprintV2Worker>(\n\t\tspawnedWorker.phpPort\n\t);\n\thandler.useFileLockManager(fileLockManager as any);\n\tawait handler.bootWorker({\n\t\tsiteUrl,\n\t\tallow,\n\t\tphpVersion,\n\t\tcreateFiles,\n\t\tconstants,\n\t\tphpIniEntries,\n\t\tfirstProcessId,\n\t\tprocessIdSpaceLength,\n\t\ttrace,\n\t\tnativeInternalDirPath,\n\t\twithXdebug,\n\t\tmountsBeforeWpInstall,\n\t\tmountsAfterWpInstall,\n\t});\n\n\treturn {\n\t\tphp: handler,\n\t\treap: () => {\n\t\t\ttry {\n\t\t\t\thandler.dispose();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tspawnedWorker.worker.terminate();\n\t\t\t} catch {\n\t\t\t\t/** */\n\t\t\t}\n\t\t},\n\t};\n}\n\nprocess.on('unhandledRejection', (e: any) => {\n\tlogger.error('Unhandled rejection:', e);\n});\n\nconst phpChannel = new MessageChannel();\n\nconst [setApiReady, setAPIError] = exposeAPI(\n\tnew PlaygroundCliBlueprintV2Worker(new EmscriptenDownloadMonitor()),\n\tundefined,\n\tphpChannel.port1\n);\n\nparentPort?.postMessage(\n\t{\n\t\tcommand: 'worker-script-initialized',\n\t\tphpPort: phpChannel.port2,\n\t},\n\t[phpChannel.port2 as any]\n);\n"],"names":["mountResources","php","mounts","mount","createNodeFsMountHandler","output","tracePhpWasm","processId","format","args","sprintf","data","shouldRenderProgress","PlaygroundCliBlueprintV2Worker","PHPWorker","monitor","port","jspi","consumeAPI","consumeAPISync","constants","requestHandlerOptions","rootCertificates","sandboxedSpawnHandlerFactory","createPHPWorker","primaryPhp","requestHandler","reap","unmountCwd","blueprintPath","path","existsSync","cliArgs","arg","streamedResponse","runBlueprintV2","message","progressMessage","red","bold","reset","chunk","syncResponse","PHPResponse","PHPExecutionFailureError","error","phpLogs","errorLogPath","siteUrl","allow","phpVersion","createFiles","phpIniEntries","firstProcessId","processIdSpaceLength","trace","nativeInternalDirPath","withIntl","withRedis","withMemcached","withXdebug","onPHPInstanceCreated","spawnHandler","nextProcessId","lastProcessId","bootRequestHandler","loadNodeRuntime","setApiReady","e","setAPIError","mountsBeforeWpInstall","mountsAfterWpInstall","fileLockManager","spawnedWorker","spawnWorkerThread","handler","logger","phpChannel","MessageChannel","exposeAPI","EmscriptenDownloadMonitor","parentPort"],"mappings":"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"}