Files
Harvey Zack fa755b5f61 refactor: update import statements to use node built-in modules
chore: update lerna configuration formatting

chore: bump version in package.json to 6.0.0

fix: modify build scripts for improved readability and consistency

feat: enhance translation scripts with better error handling and progress tracking

chore: improve plugin creation script for better user experience

style: format svgo configuration for consistency
2025-08-03 18:34:30 +08:00

108 lines
3.2 KiB
JavaScript

import fs from 'node:fs'
import path from 'node:path'
import process from 'node:process'
import { fileURLToPath } from 'node:url'
// Get the current file path
const __filename = fileURLToPath(import.meta.url)
const __dirname = path.dirname(__filename)
// Get the plugin name from command line arguments
const args = process.argv.slice(2)
const pluginName = args[0]
if (!pluginName) {
console.error('Please provide a plugin name, e.g., npm run create:plugin somePluginName')
process.exit(1)
}
// Validate plugin name
const pluginNameRegex = /^[a-z-]+$/
if (!pluginNameRegex.test(pluginName)) {
console.error('Invalid plugin name. Only lowercase letters and hyphens are allowed.')
process.exit(1)
}
// Convert plugin name to export name (PascalCase)
const exportName = pluginName
.split('-')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join('')
const exportNameFull = `artplayerPlugin${exportName}`
// Define paths
const templateDir = path.join(__dirname, 'template')
const destDir = path.join(__dirname, '../../packages', `artplayer-plugin-${pluginName}`)
const exampleDir = path.join(__dirname, '../../docs/assets/example')
const exampleFileName = `${pluginName.replace(/-/g, '.')}.js`
const exampleFile = path.join(exampleDir, exampleFileName)
// Check if a plugin with the same name already exists
if (fs.existsSync(destDir)) {
console.error(`Plugin ${pluginName} already exists. Please choose another name.`)
process.exit(1)
}
// Create the destination directory
fs.mkdirSync(destDir, { recursive: true })
// Read files from the template directory and copy them to the destination directory
function copyTemplateFiles(templateDir, destDir) {
const files = fs.readdirSync(templateDir)
files.forEach((file) => {
const templateFilePath = path.join(templateDir, file)
let destFilePath = path.join(destDir, file)
const stats = fs.statSync(templateFilePath)
if (stats.isDirectory()) {
fs.mkdirSync(destFilePath, { recursive: true })
copyTemplateFiles(templateFilePath, destFilePath)
}
else {
// Replace placeholders in the file name
destFilePath = destFilePath.replace(/\{\{name\}\}/g, pluginName)
let content = fs.readFileSync(templateFilePath, 'utf8')
// Replace placeholders in the file content
content = content.replace(/\{\{name\}\}/g, pluginName)
content = content.replace(/\{\{export\}\}/g, exportNameFull)
fs.writeFileSync(destFilePath, content)
}
})
}
// Create the example file
function createExampleFile() {
const exampleContent = `
// npm i artplayer-plugin-${pluginName}
// import ${exportNameFull} from 'artplayer-plugin-${pluginName}';
var art = new Artplayer({
container: '.artplayer-app',
url: '/assets/sample/video.mp4',
plugins: [
${exportNameFull}({
//
}),
],
});
`.trim()
if (!fs.existsSync(exampleDir)) {
fs.mkdirSync(exampleDir, { recursive: true })
}
fs.writeFileSync(exampleFile, exampleContent)
console.log(`Example file created at ${exampleFile}`)
}
// Start copying template files and creating example file
copyTemplateFiles(templateDir, destDir)
createExampleFile()
console.log(`Plugin ${pluginName} has been successfully created at ${destDir}`)