wp-plugin-builder
Version:
A CLI tool to create WordPress plugins and modules using the PSR-4 model
105 lines (90 loc) • 4.8 kB
JavaScript
const inquirer = require('inquirer');
const fs = require('fs-extra');
const path = require('path');
const { exec } = require('child_process');
const templatesDir = path.join(__dirname, '../templates');
// Validate the plugin name to ensure it follows WordPress standards
const validatePluginName = (name) => {
const slug = name.replace(/ /g, '-').toLowerCase();
const valid = /^[a-z0-9\-]+$/.test(slug);
return valid ? true : 'Plugin name should only contain lowercase letters, numbers, and hyphens.';
};
const createPlugin = async (pluginName) => {
// Validate plugin name
const validName = validatePluginName(pluginName);
if (validName !== true) {
console.error(validName);
process.exit(1);
}
const pluginSlug = pluginName.replace(/ /g, '-').toLowerCase();
const pluginDir = path.join(process.cwd(), pluginSlug);
// Check if the plugin directory already exists
if (await fs.pathExists(pluginDir)) {
console.error(`Plugin directory '${pluginSlug}' already exists.`);
process.exit(1);
}
const { vendorName, projectDescription, pluginUrl, authorName, authorUrl, requirePackageJson } = await inquirer.prompt([
{ type: 'input', name: 'vendorName', message: 'Vendor Name', default: 'src' },
{ type: 'input', name: 'projectDescription', message: 'Project Description', default: 'A WordPress Plugin' },
{ type: 'input', name: 'pluginUrl', message: 'Plugin URL' },
{ type: 'input', name: 'authorName', message: 'Author Name' },
{ type: 'input', name: 'authorUrl', message: 'Author URL' },
{ type: 'confirm', name: 'requirePackageJson', message: 'Is required package.json?', default: false },
]);
// Create plugin directory structure
await fs.ensureDir(path.join(pluginDir, 'src'));
await fs.ensureDir(path.join(pluginDir, 'vendor'));
await fs.ensureDir(path.join(pluginDir, 'languages'));
await fs.ensureDir(path.join(pluginDir, 'assets/css'));
await fs.ensureDir(path.join(pluginDir, 'assets/js'));
await fs.ensureDir(path.join(pluginDir, 'assets/images'));
await fs.ensureDir(path.join(pluginDir, 'templates'));
await fs.ensureDir(path.join(pluginDir, 'tests'));
// Read and write the main plugin file
let mainPluginFile = await fs.readFile(path.join(templatesDir, 'main_plugin_file.template'), 'utf8');
mainPluginFile = mainPluginFile.replace(/{{PLUGIN_NAME}}/g, pluginName)
.replace(/{{PROJECT_DESCRIPTION}}/g, projectDescription)
.replace(/{{PLUGIN_URL}}/g, pluginUrl)
.replace(/{{AUTHOR_NAME}}/g, authorName)
.replace(/{{AUTHOR_URL}}/g, authorUrl)
.replace(/{{PLUGIN_SLUG}}/g, pluginSlug)
.replace(/{{VENDOR_NAME}}/g, vendorName);
await fs.outputFile(path.join(pluginDir, `${pluginSlug}.php`), mainPluginFile);
// Read and write the Core Main class file
let coreMainClass = await fs.readFile(path.join(templatesDir, 'core_main_class.template'), 'utf8');
coreMainClass = coreMainClass.replace(/{{VENDOR_NAME}}/g, vendorName);
await fs.outputFile(path.join(pluginDir, 'src/Core/Main.php'), coreMainClass);
// Create composer.json
let composerJson = await fs.readFile(path.join(templatesDir, 'composer_json.template'), 'utf8');
composerJson = composerJson.replace(/{{PLUGIN_SLUG}}/g, pluginSlug)
.replace(/{{PROJECT_DESCRIPTION}}/g, projectDescription)
.replace(/{{AUTHOR_NAME}}/g, authorName)
.replace(/{{AUTHOR_URL}}/g, authorUrl)
.replace(/{{VENDOR_NAME}}/g, vendorName);
await fs.outputFile(path.join(pluginDir, 'composer.json'), composerJson);
// Create package.json if required
if (requirePackageJson) {
let packageJson = await fs.readFile(path.join(templatesDir, 'package_json.template'), 'utf8');
packageJson = packageJson.replace(/{{PLUGIN_SLUG}}/g, pluginSlug)
.replace(/{{PROJECT_DESCRIPTION}}/g, projectDescription)
.replace(/{{AUTHOR_NAME}}/g, authorName)
.replace(/{{AUTHOR_URL}}/g, authorUrl)
.replace(/{{VENDOR_NAME}}/g, vendorName);
await fs.outputFile(path.join(pluginDir, 'package.json'), packageJson);
}
// Run composer install
console.log('Running composer install...');
exec('composer install', { cwd: pluginDir }, (error, stdout, stderr) => {
if (error) {
console.error(`Error running composer install: ${error.message}`);
return;
}
if (stderr) {
console.error(`composer install stderr: ${stderr}`);
return;
}
console.log(`composer install stdout: ${stdout}`);
});
console.log(`WordPress plugin '${pluginName}' created successfully.`);
};
module.exports = { createPlugin };