From 752b7d0c6af6820c1920b8f41d757cc41862d701 Mon Sep 17 00:00:00 2001 From: Brandon Payton Date: Wed, 27 Nov 2024 21:38:29 -0500 Subject: [PATCH] Add installPlugin support for single plugin files --- .../src/lib/steps/install-plugin.spec.ts | 23 +++++++- .../src/lib/steps/install-plugin.ts | 54 +++++++++++++------ 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/packages/playground/blueprints/src/lib/steps/install-plugin.spec.ts b/packages/playground/blueprints/src/lib/steps/install-plugin.spec.ts index f6d7ad1051..134ee9966f 100644 --- a/packages/playground/blueprints/src/lib/steps/install-plugin.spec.ts +++ b/packages/playground/blueprints/src/lib/steps/install-plugin.spec.ts @@ -68,6 +68,7 @@ describe('Blueprint step installPlugin', () => { let php: PHP; // Create plugins folder let rootPath = ''; + let pluginsPath = ''; let installedPluginPath = ''; const pluginName = 'test-plugin'; const zipFileName = `${pluginName}-0.0.1.zip`; @@ -80,8 +81,9 @@ describe('Blueprint step installPlugin', () => { php = await handler.getPrimaryPhp(); rootPath = php.documentRoot; - php.mkdir(`${rootPath}/wp-content/plugins`); - installedPluginPath = `${rootPath}/wp-content/plugins/${pluginName}`; + pluginsPath = `${rootPath}/wp-content/plugins`; + php.mkdir(pluginsPath); + installedPluginPath = `${pluginsPath}/${pluginName}`; }); it('should install a plugin', async () => { @@ -97,6 +99,23 @@ describe('Blueprint step installPlugin', () => { expect(php.fileExists(installedPluginPath)).toBe(true); }); + it('should install a single PHP file as a plugin', async () => { + const rawPluginContent = ` { // @ts-ignore await installPlugin(php, { diff --git a/packages/playground/blueprints/src/lib/steps/install-plugin.ts b/packages/playground/blueprints/src/lib/steps/install-plugin.ts index 4a8f72882d..5a97d19eb0 100644 --- a/packages/playground/blueprints/src/lib/steps/install-plugin.ts +++ b/packages/playground/blueprints/src/lib/steps/install-plugin.ts @@ -1,6 +1,7 @@ import { StepHandler } from '.'; import { InstallAssetOptions, installAsset } from './install-asset'; import { activatePlugin } from './activate-plugin'; +import { writeFile } from './write-file'; import { zipNameToHumanName } from '../utils/zip-name-to-human-name'; import { Directory } from '../resources'; import { joinPaths } from '@php-wasm/util'; @@ -99,31 +100,52 @@ export const installPlugin: StepHandler< ); } - const targetFolderName = 'targetFolderName' in options ? options.targetFolderName : ''; + const pluginsDirectoryPath = joinPaths( + await playground.documentRoot, + 'wp-content', + 'plugins' + ); + const targetFolderName = + 'targetFolderName' in options ? options.targetFolderName : ''; let assetFolderPath = ''; let assetNiceName = ''; if (pluginData instanceof File) { - // @TODO: Consider validating whether this is a zip file? - const zipFileName = pluginData.name.split('/').pop() || 'plugin.zip'; - assetNiceName = zipNameToHumanName(zipFileName); + if (pluginData.name.endsWith('.php')) { + const destinationFilePath = joinPaths( + pluginsDirectoryPath, + pluginData.name + ); + await writeFile(playground, { + path: destinationFilePath, + data: pluginData, + }); + assetFolderPath = pluginsDirectoryPath; + assetNiceName = pluginData.name; + } else { + // Assume any other file is a zip file + // @TODO: Consider validating whether this is a zip file? + const zipFileName = + pluginData.name.split('/').pop() || 'plugin.zip'; + assetNiceName = zipNameToHumanName(zipFileName); - progress?.tracker.setCaption(`Installing the ${assetNiceName} plugin`); - const assetResult = await installAsset(playground, { - ifAlreadyInstalled, - zipFile: pluginData, - targetPath: `${await playground.documentRoot}/wp-content/plugins`, - targetFolderName: targetFolderName - }); - assetFolderPath = assetResult.assetFolderPath; - assetNiceName = assetResult.assetFolderName; + progress?.tracker.setCaption( + `Installing the ${assetNiceName} plugin` + ); + const assetResult = await installAsset(playground, { + ifAlreadyInstalled, + zipFile: pluginData, + targetPath: `${await playground.documentRoot}/wp-content/plugins`, + targetFolderName: targetFolderName, + }); + assetFolderPath = assetResult.assetFolderPath; + assetNiceName = assetResult.assetFolderName; + } } else if (pluginData) { assetNiceName = pluginData.name; progress?.tracker.setCaption(`Installing the ${assetNiceName} plugin`); const pluginDirectoryPath = joinPaths( - await playground.documentRoot, - 'wp-content', - 'plugins', + pluginsDirectoryPath, targetFolderName || pluginData.name ); await writeFiles(playground, pluginDirectoryPath, pluginData.files, {