@wp-tester/config 0.0.4 → 0.1.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 (38) hide show
  1. package/dist/auto-mount.d.ts.map +1 -1
  2. package/dist/auto-mount.js +10 -1
  3. package/dist/auto-mount.js.map +1 -1
  4. package/dist/config.d.ts +15 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +298 -21
  7. package/dist/config.js.map +1 -1
  8. package/dist/index.d.ts +3 -4
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -2
  11. package/dist/index.js.map +1 -1
  12. package/dist/options/phpunit.js +11 -11
  13. package/dist/options/phpunit.js.map +1 -1
  14. package/dist/options/project-root.d.ts.map +1 -1
  15. package/dist/options/project-root.js +3 -2
  16. package/dist/options/project-root.js.map +1 -1
  17. package/dist/options/project-type-detect.d.ts +1 -1
  18. package/dist/options/project-type-detect.d.ts.map +1 -1
  19. package/dist/options/project-type-detect.js +2 -2
  20. package/dist/options/project-type-detect.js.map +1 -1
  21. package/dist/options/project-type.d.ts.map +1 -1
  22. package/dist/options/project-type.js +29 -5
  23. package/dist/options/project-type.js.map +1 -1
  24. package/dist/options/smoke-tests.d.ts.map +1 -1
  25. package/dist/options/smoke-tests.js +18 -6
  26. package/dist/options/smoke-tests.js.map +1 -1
  27. package/dist/phpunit.d.ts.map +1 -1
  28. package/dist/phpunit.js +14 -8
  29. package/dist/phpunit.js.map +1 -1
  30. package/dist/resolved-types.d.ts +22 -6
  31. package/dist/resolved-types.d.ts.map +1 -1
  32. package/dist/schema.json +1157 -1005
  33. package/dist/tsconfig.tsbuildinfo +1 -1
  34. package/dist/types.d.ts +1 -1
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/wp-tester-config.d.ts +153 -12
  37. package/dist/wp-tester-config.d.ts.map +1 -1
  38. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"auto-mount.d.ts","sourceRoot":"","sources":["../src/auto-mount.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,GACvB,KAAK,GAAG,IAAI,CAkBd"}
1
+ {"version":3,"file":"auto-mount.d.ts","sourceRoot":"","sources":["../src/auto-mount.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,GACvB,KAAK,GAAG,IAAI,CA2Bd"}
@@ -23,8 +23,17 @@ export function getProjectRootMount(projectDir, projectType) {
23
23
  hostPath: projectDir,
24
24
  vfsPath: `/wordpress/wp-content/themes/${dirName}`,
25
25
  };
26
+ case "wp-content":
27
+ return {
28
+ hostPath: projectDir,
29
+ vfsPath: "/wordpress/wp-content",
30
+ };
31
+ case "wordpress":
32
+ return {
33
+ hostPath: projectDir,
34
+ vfsPath: "/wordpress",
35
+ };
26
36
  default:
27
- // For wp-content, wordpress-install, or unknown types, no mount
28
37
  return null;
29
38
  }
30
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"auto-mount.js","sourceRoot":"","sources":["../src/auto-mount.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,mEAAmE;AACnE,gCAAgC;AAChC,qGAAqG;AAErG,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIhC;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,WAAwB;IAExB,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErC,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,iCAAiC,OAAO,EAAE;aACpD,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,gCAAgC,OAAO,EAAE;aACnD,CAAC;QACJ;YACE,gEAAgE;YAChE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"auto-mount.js","sourceRoot":"","sources":["../src/auto-mount.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,mEAAmE;AACnE,gCAAgC;AAChC,qGAAqG;AAErG,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAIhC;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,WAAwB;IAExB,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;IAErC,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,iCAAiC,OAAO,EAAE;aACpD,CAAC;QACJ,KAAK,OAAO;YACV,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,gCAAgC,OAAO,EAAE;aACnD,CAAC;QACJ,KAAK,YAAY;YACf,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,uBAAuB;aACjC,CAAC;QACJ,KAAK,WAAW;YACd,OAAO;gBACL,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,YAAY;aACtB,CAAC;QACJ;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
package/dist/config.d.ts CHANGED
@@ -1,6 +1,11 @@
1
1
  import type { WPTesterConfig } from "./wp-tester-config.js";
2
2
  import type { ResolvedWPTesterConfig } from "./resolved-types.js";
3
3
  export type { WPTesterConfig } from "./wp-tester-config.js";
4
+ /**
5
+ * Get the actual working directory, accounting for tools like tsx that may change process.cwd()
6
+ * When running via npx or tsx, INIT_CWD contains the original directory where the command was invoked
7
+ */
8
+ export declare function getWorkingDirectory(): string;
4
9
  /**
5
10
  * Resolve a path to an absolute path.
6
11
  * If the path is already absolute, return it as-is.
@@ -24,6 +29,16 @@ export declare function writeConfigFile(config: WPTesterConfig, path?: string):
24
29
  * @returns Absolute path to the config file
25
30
  */
26
31
  export declare function getConfigPath(config: string): string;
32
+ /**
33
+ * Normalize a config path to ensure it points to a file, not a directory.
34
+ * If the path is a directory, appends 'wp-tester.json' to it.
35
+ * Used by readConfigFile, resolveConfig, and the test watcher to handle
36
+ * directory paths passed via --config flag.
37
+ *
38
+ * @param configPath - Path to config file or directory (relative or absolute)
39
+ * @returns Absolute path to the config file
40
+ */
41
+ export declare function normalizeConfigPath(configPath: string): string;
27
42
  /**
28
43
  * Get the config file directory path.
29
44
  *
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAS,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,sBAAsB,EAA6D,MAAM,kBAAkB,CAAC;AAS1H,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B5D;AAED,wBAAgB,gBAAgB,IAAI,cAAc,CAgBjD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOzD;AAED,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAM3E;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAWjF;AA4CD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,GAAG,MAAM,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAqFjC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAsB,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,sBAAsB,EAAmG,MAAM,kBAAkB,CAAC;AAoBhK,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAErE;AAED,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,aAAa,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CA+B5D;AAED,wBAAgB,gBAAgB,IAAI,cAAc,CAiBjD;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAOzD;AAED,wBAAsB,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAU3E;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,cAAc,EACtB,IAAI,CAAC,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAc9D;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,cAAc,EACtB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,CAWR;AA4MD;;;;GAIG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,cAAc,GAAG,MAAM,GAC9B,OAAO,CAAC,sBAAsB,CAAC,CAyMjC"}
package/dist/config.js CHANGED
@@ -1,9 +1,16 @@
1
1
  import { readFile, writeFile, access, constants as fsConstants } from "fs/promises";
2
- import { existsSync } from "fs";
2
+ import { existsSync, statSync } from "fs";
3
3
  import { join, dirname, resolve, isAbsolute } from "path";
4
4
  import { fileURLToPath } from "url";
5
5
  import { getProjectRootMount } from "./auto-mount.js";
6
6
  import { detectProjectType } from "./options/project-type-detect.js";
7
+ /**
8
+ * Get the actual working directory, accounting for tools like tsx that may change process.cwd()
9
+ * When running via npx or tsx, INIT_CWD contains the original directory where the command was invoked
10
+ */
11
+ export function getWorkingDirectory() {
12
+ return process.env.INIT_CWD || process.cwd();
13
+ }
7
14
  /**
8
15
  * Resolve a path to an absolute path.
9
16
  * If the path is already absolute, return it as-is.
@@ -17,7 +24,7 @@ export function resolveAbsolute(path, baseDir) {
17
24
  return isAbsolute(path) ? path : resolve(baseDir, path);
18
25
  }
19
26
  export function configPath() {
20
- return join(process.cwd(), "wp-tester.json");
27
+ return join(getWorkingDirectory(), "wp-tester.json");
21
28
  }
22
29
  export function getSchemaPath(importMetaUrl) {
23
30
  // For ESM in production (built files)
@@ -49,6 +56,7 @@ export function getSchemaPath(importMetaUrl) {
49
56
  }
50
57
  export function getDefaultConfig() {
51
58
  return {
59
+ $schema: "https://raw.githubusercontent.com/bgrgicak/wp-tester/trunk/packages/config/src/schema.json",
52
60
  environments: [
53
61
  {
54
62
  name: "Latest WordPress and PHP",
@@ -61,7 +69,6 @@ export function getDefaultConfig() {
61
69
  },
62
70
  ],
63
71
  tests: {},
64
- reporters: ["default"],
65
72
  };
66
73
  }
67
74
  export async function isConfigWritable() {
@@ -77,6 +84,8 @@ export async function readConfigFile(path) {
77
84
  if (!path) {
78
85
  path = configPath();
79
86
  }
87
+ // Normalize the path (handles directory paths)
88
+ path = normalizeConfigPath(path);
80
89
  const content = await readFile(path, "utf8");
81
90
  return JSON.parse(content);
82
91
  }
@@ -93,7 +102,38 @@ export async function writeConfigFile(config, path) {
93
102
  * @returns Absolute path to the config file
94
103
  */
95
104
  export function getConfigPath(config) {
96
- return isAbsolute(config) ? config : resolve(process.cwd(), config);
105
+ // Expand tilde (~) to home directory
106
+ if (config.startsWith('~/') || config === '~') {
107
+ const homeDir = process.env.HOME || process.env.USERPROFILE;
108
+ if (!homeDir) {
109
+ throw new Error('Unable to resolve home directory');
110
+ }
111
+ config = config === '~' ? homeDir : join(homeDir, config.slice(2));
112
+ }
113
+ return isAbsolute(config) ? config : resolve(getWorkingDirectory(), config);
114
+ }
115
+ /**
116
+ * Normalize a config path to ensure it points to a file, not a directory.
117
+ * If the path is a directory, appends 'wp-tester.json' to it.
118
+ * Used by readConfigFile, resolveConfig, and the test watcher to handle
119
+ * directory paths passed via --config flag.
120
+ *
121
+ * @param configPath - Path to config file or directory (relative or absolute)
122
+ * @returns Absolute path to the config file
123
+ */
124
+ export function normalizeConfigPath(configPath) {
125
+ const absolutePath = getConfigPath(configPath);
126
+ // Check if path is a directory (synchronous)
127
+ try {
128
+ const stats = statSync(absolutePath);
129
+ if (stats.isDirectory()) {
130
+ return join(absolutePath, 'wp-tester.json');
131
+ }
132
+ }
133
+ catch {
134
+ // If stat fails, assume it's a file path
135
+ }
136
+ return absolutePath;
97
137
  }
98
138
  /**
99
139
  * Get the config file directory path.
@@ -116,7 +156,7 @@ export function getConfigDir(configPath) {
116
156
  */
117
157
  export function getProjectDir(config, configPath) {
118
158
  // Get base directory: config file location or cwd
119
- const baseDir = configPath ? getConfigDir(configPath) : process.cwd();
159
+ const baseDir = configPath ? getConfigDir(configPath) : getWorkingDirectory();
120
160
  // If projectHostPath is specified, resolve it relative to base directory
121
161
  if (config.projectHostPath) {
122
162
  return resolveAbsolute(config.projectHostPath, baseDir);
@@ -124,6 +164,134 @@ export function getProjectDir(config, configPath) {
124
164
  // No projectHostPath specified, return base directory
125
165
  return baseDir;
126
166
  }
167
+ /**
168
+ * Normalize a version spec (string or array) to an array of versions.
169
+ * @param spec - Version specification (single string or array)
170
+ * @returns Array of version strings
171
+ */
172
+ function normalizeVersionSpec(spec) {
173
+ if (!spec) {
174
+ return [];
175
+ }
176
+ return Array.isArray(spec) ? spec : [spec];
177
+ }
178
+ /**
179
+ * Generate a name for an expanded environment based on the original name
180
+ * and the specific PHP/WP versions.
181
+ * @param baseName - Original environment name (if any)
182
+ * @param phpVersion - PHP version for this combination (only if from matrix)
183
+ * @param wpVersion - WordPress version for this combination (only if from matrix)
184
+ * @param phpIsFromMatrix - Whether PHP version is from matrix expansion (not blueprint)
185
+ * @param wpIsFromMatrix - Whether WP version is from matrix expansion (not blueprint)
186
+ * @param isMatrix - Whether this is part of a matrix (multiple combinations)
187
+ * @returns Generated environment name
188
+ */
189
+ function generateExpandedName(baseName, phpVersion, wpVersion, phpIsFromMatrix, wpIsFromMatrix, isMatrix) {
190
+ // If not a matrix expansion, keep the original name
191
+ if (!isMatrix) {
192
+ return baseName;
193
+ }
194
+ // Build version suffix - only include versions that are from the matrix
195
+ const parts = [];
196
+ if (phpVersion && phpIsFromMatrix) {
197
+ parts.push(`PHP ${phpVersion}`);
198
+ }
199
+ if (wpVersion && wpIsFromMatrix) {
200
+ parts.push(`WP ${wpVersion}`);
201
+ }
202
+ if (parts.length === 0) {
203
+ return baseName;
204
+ }
205
+ const versionSuffix = parts.join(", ");
206
+ return baseName ? `${baseName} (${versionSuffix})` : versionSuffix;
207
+ }
208
+ /**
209
+ * Expand environments with version arrays into multiple environments,
210
+ * one for each combination of PHP and WP versions.
211
+ *
212
+ * Rules:
213
+ * - If blueprint.preferredVersions.php is set, it overrides env.php (no matrix for PHP)
214
+ * - If blueprint.preferredVersions.wp is set, it overrides env.wp (no matrix for WP)
215
+ * - When arrays are provided for both php and wp, creates a full matrix of combinations
216
+ *
217
+ * @param environments - Original environments array
218
+ * @param projectDir - Project directory for resolving blueprint paths
219
+ * @returns Expanded environments array
220
+ */
221
+ async function expandEnvironments(environments, projectDir) {
222
+ const expanded = [];
223
+ for (const env of environments) {
224
+ // Load blueprint if it's a string path (needed to check preferredVersions)
225
+ // If no blueprint is provided, use an empty object (defaults will be applied later)
226
+ let blueprint;
227
+ if (!env.blueprint) {
228
+ blueprint = {};
229
+ }
230
+ else if (typeof env.blueprint === "string") {
231
+ const blueprintPath = resolveAbsolute(env.blueprint, projectDir);
232
+ const blueprintContent = await readFile(blueprintPath, "utf-8");
233
+ blueprint = JSON.parse(blueprintContent);
234
+ }
235
+ else {
236
+ blueprint = env.blueprint;
237
+ }
238
+ // Determine PHP versions to use
239
+ // Blueprint preferredVersions.php overrides environment-level php
240
+ // However, "latest" is treated as unspecified, allowing matrix expansion
241
+ const blueprintPhp = blueprint.preferredVersions?.php;
242
+ let phpVersions;
243
+ let phpIsFromMatrix;
244
+ if (blueprintPhp && blueprintPhp !== "latest") {
245
+ // Blueprint takes precedence - use only the blueprint version
246
+ phpVersions = [blueprintPhp];
247
+ phpIsFromMatrix = false; // Not from matrix, from blueprint
248
+ }
249
+ else {
250
+ // Use environment-level versions
251
+ phpVersions = normalizeVersionSpec(env.php);
252
+ phpIsFromMatrix = true; // From matrix (env-level config)
253
+ }
254
+ // Determine WP versions to use
255
+ // Blueprint preferredVersions.wp overrides environment-level wp
256
+ // However, "latest" is treated as unspecified, allowing matrix expansion
257
+ const blueprintWp = blueprint.preferredVersions?.wp;
258
+ let wpVersions;
259
+ let wpIsFromMatrix;
260
+ if (blueprintWp && blueprintWp !== "latest") {
261
+ // Blueprint takes precedence - use only the blueprint version
262
+ wpVersions = [blueprintWp];
263
+ wpIsFromMatrix = false; // Not from matrix, from blueprint
264
+ }
265
+ else {
266
+ // Use environment-level versions
267
+ wpVersions = normalizeVersionSpec(env.wp);
268
+ wpIsFromMatrix = true; // From matrix (env-level config)
269
+ }
270
+ // If no versions specified at either level, create a single environment
271
+ if (phpVersions.length === 0 && wpVersions.length === 0) {
272
+ expanded.push({ ...env });
273
+ continue;
274
+ }
275
+ // Ensure at least one version for each dimension (use empty string as placeholder for "not specified")
276
+ const phpList = phpVersions.length > 0 ? phpVersions : [""];
277
+ const wpList = wpVersions.length > 0 ? wpVersions : [""];
278
+ // Determine if this is a matrix (multiple combinations)
279
+ const isMatrix = phpList.length > 1 || wpList.length > 1;
280
+ // Create combinations
281
+ for (const phpVersion of phpList) {
282
+ for (const wpVersion of wpList) {
283
+ const expandedEnv = {
284
+ ...env,
285
+ name: generateExpandedName(env.name, phpVersion || undefined, wpVersion || undefined, phpIsFromMatrix, wpIsFromMatrix, isMatrix),
286
+ _phpVersion: phpVersion || undefined,
287
+ _wpVersion: wpVersion || undefined,
288
+ };
289
+ expanded.push(expandedEnv);
290
+ }
291
+ }
292
+ }
293
+ return expanded;
294
+ }
127
295
  /**
128
296
  * Resolve PHPUnit config paths and set default testMode
129
297
  * @param tests - Tests configuration
@@ -137,6 +305,7 @@ function resolveTests(tests, projectDir) {
137
305
  plugin: tests.plugin,
138
306
  theme: tests.theme,
139
307
  wp: tests.wp,
308
+ passWithNoTests: tests.passWithNoTests,
140
309
  };
141
310
  }
142
311
  // Resolve PHPUnit config with absolute paths and default testMode
@@ -159,6 +328,7 @@ function resolveTests(tests, projectDir) {
159
328
  theme: tests.theme,
160
329
  wp: tests.wp,
161
330
  phpunit: resolvedPhpunit,
331
+ passWithNoTests: tests.passWithNoTests,
162
332
  };
163
333
  }
164
334
  /**
@@ -170,7 +340,8 @@ export async function resolveConfig(config) {
170
340
  let resolvedConfig;
171
341
  let configPath;
172
342
  if (typeof config === "string") {
173
- configPath = getConfigPath(config);
343
+ // Normalize the path (handles directory paths)
344
+ configPath = normalizeConfigPath(config);
174
345
  const content = await readFile(configPath, "utf8");
175
346
  resolvedConfig = JSON.parse(content);
176
347
  }
@@ -182,14 +353,65 @@ export async function resolveConfig(config) {
182
353
  // Get the project root directory (respects projectHostPath config option)
183
354
  const projectDir = getProjectDir(resolvedConfig, configPath);
184
355
  // Ensure projectType is set (detect if not provided)
185
- const projectType = resolvedConfig.projectType || detectProjectType(projectDir);
186
- // Ensure reporters is set
187
- const reporters = resolvedConfig.reporters || ["default"];
188
- // Resolve environments: convert Environment[] to ResolvedEnvironment[]
189
- const resolvedEnvironments = await Promise.all(resolvedConfig.environments.map(async (env) => {
356
+ // Skip detection if directory doesn't exist to avoid filesystem errors in tests
357
+ // that intentionally use invalid paths for error handling
358
+ let projectType = resolvedConfig.projectType;
359
+ if (!projectType && existsSync(projectDir)) {
360
+ try {
361
+ projectType = detectProjectType(projectDir);
362
+ }
363
+ catch {
364
+ // If detection fails (e.g., permission errors), default to 'other'
365
+ projectType = 'other';
366
+ }
367
+ }
368
+ else if (!projectType) {
369
+ // Directory doesn't exist, default to 'other'
370
+ projectType = 'other';
371
+ }
372
+ // Ensure reporters is set with defaults
373
+ // If no reporters configured, default to showing all test statuses
374
+ const defaultReporterOptions = {
375
+ passed: true,
376
+ failed: true,
377
+ skipped: true,
378
+ pending: true,
379
+ other: true,
380
+ };
381
+ const reporters = {
382
+ ...(resolvedConfig.reporters ?? {}),
383
+ default: undefined, // Will be set below
384
+ };
385
+ // Normalize default reporter:
386
+ // - `true` or empty object `{}` -> apply default options (show all)
387
+ // - `false` -> disable default reporter (remove it)
388
+ // - object with options -> use as-is
389
+ const inputDefault = resolvedConfig.reporters?.default;
390
+ if (inputDefault === true || inputDefault === undefined || (typeof inputDefault === 'object' && Object.keys(inputDefault).length === 0)) {
391
+ // true, undefined, or empty object -> use defaults (show all)
392
+ if (inputDefault !== undefined || !resolvedConfig.reporters?.json) {
393
+ reporters.default = defaultReporterOptions;
394
+ }
395
+ }
396
+ else if (inputDefault === false) {
397
+ // false -> disable default reporter
398
+ reporters.default = undefined;
399
+ }
400
+ else {
401
+ // Object with specific options -> use as-is
402
+ reporters.default = inputDefault;
403
+ }
404
+ // Expand environments with version arrays into multiple environments
405
+ const expandedEnvironments = await expandEnvironments(resolvedConfig.environments, projectDir);
406
+ // Resolve environments: convert ExpandedEnvironment[] to ResolvedEnvironment[]
407
+ const resolvedEnvironments = await Promise.all(expandedEnvironments.map(async (env) => {
190
408
  // Resolve blueprint from string to BlueprintV1Declaration if needed
409
+ // If no blueprint is provided, use an empty object (defaults will be applied later)
191
410
  let blueprint;
192
- if (typeof env.blueprint === "string") {
411
+ if (!env.blueprint) {
412
+ blueprint = {};
413
+ }
414
+ else if (typeof env.blueprint === "string") {
193
415
  const blueprintPath = resolveAbsolute(env.blueprint, projectDir);
194
416
  const blueprintContent = await readFile(blueprintPath, "utf-8");
195
417
  blueprint = JSON.parse(blueprintContent);
@@ -197,20 +419,44 @@ export async function resolveConfig(config) {
197
419
  else {
198
420
  blueprint = env.blueprint;
199
421
  }
200
- // Ensure preferredVersions exists with defaults to create a ResolvedBlueprint
422
+ // Determine PHP version:
423
+ // 1. Use the expanded version from matrix (_phpVersion) if set
424
+ // 2. Otherwise use blueprint preferredVersions.php if set
425
+ // 3. Otherwise default to "latest"
426
+ const phpVersion = env._phpVersion || blueprint.preferredVersions?.php || "latest";
427
+ // Determine WP version:
428
+ // 1. Use the expanded version from matrix (_wpVersion) if set
429
+ // 2. Otherwise use blueprint preferredVersions.wp if set
430
+ // 3. Otherwise default to "latest"
431
+ const wpVersion = env._wpVersion || blueprint.preferredVersions?.wp || "latest";
432
+ // Create resolved blueprint with determined versions
433
+ // Type assertion is needed because the versions come from user config
434
+ // and TypeScript can't verify at compile time that they're valid.
435
+ // Invalid versions will be caught by WordPress Playground at runtime.
201
436
  const resolvedBlueprint = {
202
437
  ...blueprint,
203
438
  preferredVersions: {
204
- php: blueprint.preferredVersions?.php || "latest",
205
- wp: blueprint.preferredVersions?.wp || "latest",
439
+ php: phpVersion,
440
+ wp: wpVersion,
206
441
  },
207
442
  };
208
443
  // Auto-detect and add mounts if needed
209
- let mounts = env.mounts || [];
210
- if (mounts.length === 0 && resolvedConfig.projectHostPath) {
444
+ let mounts = env.mounts ? [...env.mounts] : []; // Create a copy to avoid mutating original
445
+ // If projectHostPath is specified, always add the project root mount
446
+ // This ensures the project root is accessible even when custom mounts are specified
447
+ // Only create the mount if the directory exists to avoid mount errors with invalid paths
448
+ if (resolvedConfig.projectHostPath && existsSync(projectDir)) {
211
449
  const mount = getProjectRootMount(projectDir, projectType);
212
450
  if (mount) {
213
- mounts = [mount];
451
+ // Check if this mount already exists (by vfsPath) to avoid duplicates
452
+ // Normalize paths by removing trailing slashes for comparison
453
+ const normalizeVfsPath = (path) => path.replace(/\/+$/, '');
454
+ const mountVfsPath = normalizeVfsPath(mount.vfsPath);
455
+ const existingMount = mounts.find(m => normalizeVfsPath(m.vfsPath) === mountVfsPath);
456
+ if (!existingMount) {
457
+ // Prepend auto-mount so custom mounts can override if needed
458
+ mounts = [mount, ...mounts];
459
+ }
214
460
  }
215
461
  }
216
462
  // Resolve relative mount paths to absolute paths
@@ -218,17 +464,48 @@ export async function resolveConfig(config) {
218
464
  ...mount,
219
465
  hostPath: resolveAbsolute(mount.hostPath, projectDir),
220
466
  }));
467
+ // Sort mounts by VFS path depth (shallowest first, deepest last).
468
+ // WordPress Playground applies mounts in order, with later mounts taking precedence.
469
+ // By mounting parent paths first and child paths last, child mounts can override
470
+ // parent mounts when paths overlap.
471
+ // Example: /wordpress/wp-content/plugins should come before /wordpress/wp-content/plugins/foo
472
+ resolvedMounts.sort((a, b) => {
473
+ const depthA = a.vfsPath.split('/').filter(Boolean).length;
474
+ const depthB = b.vfsPath.split('/').filter(Boolean).length;
475
+ return depthA - depthB; // Sort ascending (shallowest first)
476
+ });
221
477
  return {
222
478
  name: env.name,
223
479
  blueprint: resolvedBlueprint,
224
480
  mounts: resolvedMounts,
481
+ env: env.env || {},
482
+ skip: env.skip ?? false,
225
483
  };
226
484
  }));
227
485
  // Resolve PHPUnit paths to absolute paths and ensure testMode has a default
228
486
  const resolvedTests = resolveTests(resolvedConfig.tests, projectDir);
229
- // Get project VFS path from the mount
230
- const mount = getProjectRootMount(projectDir, projectType);
231
- const projectVFSPath = mount?.vfsPath || projectDir;
487
+ // Determine project VFS path
488
+ let projectVFSPath;
489
+ if (resolvedConfig.projectVFSPath !== undefined) {
490
+ // Explicitly specified in config
491
+ projectVFSPath = resolvedConfig.projectVFSPath;
492
+ }
493
+ else {
494
+ // Auto-detect from projectType
495
+ const mount = getProjectRootMount(projectDir, projectType);
496
+ if (mount?.vfsPath) {
497
+ projectVFSPath = mount.vfsPath;
498
+ }
499
+ else {
500
+ // For "other" project types without explicit projectVFSPath,
501
+ // fall back to projectDir but validate it looks like a path
502
+ if (projectType === "other" && !projectDir.startsWith("/")) {
503
+ throw new Error(`Cannot auto-detect mount path for projectType "other". ` +
504
+ `Please specify "projectVFSPath" in your config to indicate where your project directory should be mounted (e.g., "/project", "/wordpress/wp-content/mu-plugins/my-plugin").`);
505
+ }
506
+ projectVFSPath = projectDir;
507
+ }
508
+ }
232
509
  // Return fully resolved config with all required fields
233
510
  return {
234
511
  ...resolvedConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,6 @@
1
- export type { WPTesterConfig, Environment, Tests, PHPUnitConfig, TestType, Reporter, Mount, Blueprint, JsonReporterOptions, } from './types.js';
2
- export type { ResolvedEnvironment, ResolvedWPTesterConfig, ResolvedPHPUnitConfig, ResolvedTests, ResolvedBlueprint, } from './resolved-types.js';
3
- export { readConfigFile, writeConfigFile, configPath, getSchemaPath, getDefaultConfig, isConfigWritable, resolveConfig, getProjectDir, getConfigDir, getConfigPath, resolveAbsolute, } from "./config.js";
4
- export { mergePhpunitArgs } from './phpunit.js';
1
+ export type { WPTesterConfig, EnvironmentVariables, Environment, Tests, PHPUnitConfig, TestType, Reporters, BaseReporterOptions, DefaultReporterOptions, Mount, Blueprint, JsonReporterOptions, WatchConfig, } from "./types.js";
2
+ export type { ResolvedEnvironment, ResolvedWPTesterConfig, ResolvedPHPUnitConfig, ResolvedTests, ResolvedBlueprint, ResolvedReporters, } from './resolved-types.js';
3
+ export { readConfigFile, writeConfigFile, configPath, getSchemaPath, getDefaultConfig, isConfigWritable, resolveConfig, getProjectDir, getConfigDir, getConfigPath, normalizeConfigPath, resolveAbsolute, getWorkingDirectory, } from "./config.js";
5
4
  export { getProjectRootMount } from './auto-mount.js';
6
5
  export { hostToVfs, vfsToHost } from './path-mappers.js';
7
6
  export type { ProjectType } from './options/project-type-detect.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,cAAc,EACd,WAAW,EACX,KAAK,EACL,aAAa,EACb,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,SAAS,EACT,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,cAAc,EACd,oBAAoB,EACpB,WAAW,EACX,KAAK,EACL,aAAa,EACb,QAAQ,EACR,SAAS,EACT,mBAAmB,EACnB,sBAAsB,EACtB,KAAK,EACL,SAAS,EACT,mBAAmB,EACnB,WAAW,GACZ,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAGjE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,UAAU,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,6 +1,5 @@
1
1
  // Functions
2
- export { readConfigFile, writeConfigFile, configPath, getSchemaPath, getDefaultConfig, isConfigWritable, resolveConfig, getProjectDir, getConfigDir, getConfigPath, resolveAbsolute, } from "./config.js";
3
- export { mergePhpunitArgs } from './phpunit.js';
2
+ export { readConfigFile, writeConfigFile, configPath, getSchemaPath, getDefaultConfig, isConfigWritable, resolveConfig, getProjectDir, getConfigDir, getConfigPath, normalizeConfigPath, resolveAbsolute, getWorkingDirectory, } from "./config.js";
4
3
  export { getProjectRootMount } from './auto-mount.js';
5
4
  export { hostToVfs, vfsToHost } from './path-mappers.js';
6
5
  // Options
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAsBA,YAAY;AACZ,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGtD,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAgE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAA8B,MAAM,0BAA0B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA2BA,YAAY;AACZ,OAAO,EACL,cAAc,EACd,eAAe,EACf,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,eAAe,EACf,mBAAmB,GACpB,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGtD,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAgE,MAAM,iBAAiB,CAAC;AACrI,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,mBAAmB,EAA8B,MAAM,0BAA0B,CAAC"}
@@ -13,13 +13,13 @@ async function promptForTestMode() {
13
13
  options: [
14
14
  {
15
15
  value: "unit",
16
- label: "Unit tests (without WordPress)",
17
- hint: "Fast tests for isolated PHP logic, pure functions, classes without WordPress dependencies"
16
+ label: "Unit tests",
17
+ hint: "Uses WP Test library mocks - won't break existing tests"
18
18
  },
19
19
  {
20
20
  value: "integration",
21
- label: "Integration tests (with WordPress)",
22
- hint: "Tests that interact with WordPress APIs, hooks, database, plugins/themes"
21
+ label: "Integration tests",
22
+ hint: "Runs inside WordPress - call WP functions, test plugin compatibility, make HTTP requests"
23
23
  }
24
24
  ],
25
25
  initialValue: "unit"
@@ -147,11 +147,11 @@ async function handleFullDetection(config, projectHostPath, configFile, executab
147
147
  clack.note(configNote, "Detected PHPUnit Configuration");
148
148
  // Ask user to confirm or customize
149
149
  const action = await clack.select({
150
- message: "PHPUnit tests detected. What would you like to do?",
150
+ message: "PHPUnit configuration detected. What would you like to do?",
151
151
  options: [
152
- { value: "use", label: "Use detected configuration" },
153
- { value: "customize", label: "Customize configuration" },
154
- { value: "skip", label: "Skip PHPUnit tests" },
152
+ { value: "use", label: "Use detected configuration", hint: "Recommended" },
153
+ { value: "customize", label: "Customize configuration", hint: "Specify different paths" },
154
+ { value: "skip", label: "Skip PHPUnit tests", hint: "Configure later" },
155
155
  ],
156
156
  initialValue: "use",
157
157
  });
@@ -205,9 +205,9 @@ async function handlePartialDetection(config, projectHostPath, configFile) {
205
205
  const action = await clack.select({
206
206
  message: "What would you like to do?",
207
207
  options: [
208
- { value: "retry", label: "I've installed it, try again" },
209
- { value: "custom", label: "Specify custom path" },
210
- { value: "skip", label: "Skip for now" },
208
+ { value: "retry", label: "Try again", hint: "After running composer install" },
209
+ { value: "custom", label: "Specify custom path", hint: "PHPUnit is in a different location" },
210
+ { value: "skip", label: "Skip for now", hint: "Configure later" },
211
211
  ],
212
212
  initialValue: "retry",
213
213
  });