diff --git a/.gitignore b/.gitignore index 0bd8f148..0c0bdf85 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ # compiled output /dist +/test tmp var /out-tsc diff --git a/packages/wp-now/src/config.ts b/packages/wp-now/src/config.ts index 76dd4f80..77ae8834 100644 --- a/packages/wp-now/src/config.ts +++ b/packages/wp-now/src/config.ts @@ -29,6 +29,7 @@ export const enum WPNowMode { WORDPRESS_DEVELOP = 'wordpress-develop', INDEX = 'index', WP_CONTENT = 'wp-content', + WP_PR = 'wp-pr', PLAYGROUND = 'playground', AUTO = 'auto', } diff --git a/packages/wp-now/src/run-cli.ts b/packages/wp-now/src/run-cli.ts index df18d3c4..b12d0e96 100644 --- a/packages/wp-now/src/run-cli.ts +++ b/packages/wp-now/src/run-cli.ts @@ -6,6 +6,7 @@ import { SupportedPHPVersion } from '@php-wasm/universal'; import getWpNowConfig, { CliOptions } from './config'; import { spawn, SpawnOptionsWithoutStdio } from 'child_process'; import { executePHP } from './execute-php'; +import { executeWPCli } from './execute-wp-cli'; import { output } from './output'; import { isGitHubCodespace } from './github-codespaces'; @@ -63,6 +64,7 @@ export async function runCli() { describe: "WordPress version to use: e.g. '--wp=6.2'", type: 'string', }); + yargs.option('port', { describe: 'Server port', type: 'number', @@ -152,6 +154,29 @@ export async function runCli() { } } ) + .command( + 'wp [..args]', + 'run a wp-cli command', + (yargs) => { + commonParameters(yargs); + yargs.strict(false); + }, + async (argv) => { + try { + // 0: node, 1: wp-now, 2: php, ...args + const args = process.argv.slice(3); + const phpArgs = args.includes('--') + ? (argv._ as string[]) + : args; + // 0: php, ...args + await executeWPCli(phpArgs); + process.exit(0); + } catch (error) { + console.error(error); + process.exit(error.status || -1); + } + } + ) .demandCommand(1, 'You must provide a valid command') .help() .alias('h', 'help') diff --git a/packages/wp-now/src/wp-now.ts b/packages/wp-now/src/wp-now.ts index 18f86a28..7123f5b4 100644 --- a/packages/wp-now/src/wp-now.ts +++ b/packages/wp-now/src/wp-now.ts @@ -22,6 +22,7 @@ import { isPluginDirectory, isThemeDirectory, isWpContentDirectory, + isWpPRDirectory, isWordPressDirectory, isWordPressDevelopDirectory, getPluginFile, @@ -95,6 +96,9 @@ export default async function startWPNow( case WPNowMode.WP_CONTENT: await runWpContentMode(_php, options); break; + case WPNowMode.WP_PR: + await runWpPrMode(_php, options); + break; case WPNowMode.WORDPRESS_DEVELOP: await runWordPressDevelopMode(_php, options); break; @@ -175,6 +179,46 @@ async function runWpContentMode( mountMuPlugins(php, documentRoot); } +async function runWpPrMode( + php: NodePHP, + { + documentRoot, + wordPressVersion, + wpContentPath, + projectPath, + absoluteUrl, + }: WPNowOptions +) { + const wordPressPath = path.join( + getWordpressVersionsPath(), + wordPressVersion + ); + php.mount(wordPressPath, documentRoot); + await initWordPress(php, wordPressVersion, documentRoot, absoluteUrl); + fs.ensureDirSync(wpContentPath); + + php.mount(`${projectPath}/wp-content`, `${documentRoot}/wp-content`); + + if (!fs.existsSync(`${projectPath}/wp-content/db.php`)) { + await fs.promises.copyFile( + `${getSqlitePath()}/db.copy`, + `${projectPath}/wp-content/db.php` + ); + } + // need a dist folder for output + if (!fs.existsSync(`${projectPath}/dist`)) { + await fs.promises.mkdir('dist'); + } + php.mount(`${projectPath}/dist`, `${documentRoot}/dist`); + + mountSqliteDatabaseDirectory( + php, + documentRoot, + `${projectPath}/wp-content` + ); + mountMuPlugins(php, documentRoot); +} + async function runWordPressDevelopMode( php: NodePHP, { documentRoot, projectPath, absoluteUrl }: WPNowOptions @@ -397,6 +441,8 @@ export function inferMode( return WPNowMode.WORDPRESS; } else if (isWpContentDirectory(projectPath)) { return WPNowMode.WP_CONTENT; + } else if (isWpPRDirectory(projectPath)) { + return WPNowMode.WP_PR; } else if (isPluginDirectory(projectPath)) { return WPNowMode.PLUGIN; } else if (isThemeDirectory(projectPath)) { diff --git a/packages/wp-now/src/wp-playground-wordpress/is-wp-content-directory.ts b/packages/wp-now/src/wp-playground-wordpress/is-wp-content-directory.ts index aeb39b5a..3c92e470 100644 --- a/packages/wp-now/src/wp-playground-wordpress/is-wp-content-directory.ts +++ b/packages/wp-now/src/wp-playground-wordpress/is-wp-content-directory.ts @@ -16,3 +16,12 @@ export function isWpContentDirectory(projectPath: string): Boolean { } return false; } + +export function isWpPRDirectory(projectPath: string): Boolean { + const wpContentExists = fs.existsSync(path.join(projectPath, 'wp-content')); + const wpIncludeExists = fs.existsSync(path.join(projectPath, 'wp-include')); + if (wpContentExists && !wpIncludeExists) { + return true; + } + return false; +}