Merge pull request #3840 from bobgeorgethe3rd/newpluginscript
Add functionality for yarn new plugin
This commit is contained in:
commit
ccf2ff3931
3 changed files with 147 additions and 9 deletions
12
config/templates/plugin/package.json.mustache
Normal file
12
config/templates/plugin/package.json.mustache
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
{
|
||||||
|
"name": "{{pluginName}}",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"description": "{{description}}",
|
||||||
|
"author": "Joost De Cock <joost@joost.at> (https://github.com/joostdecock)",
|
||||||
|
"homepage": "https://freesewing.org/",
|
||||||
|
"repository": "github:freesewing/freesewing",
|
||||||
|
"license": "MIT",
|
||||||
|
"main": "dist/index.mjs",
|
||||||
|
"module": "dist/index.mjs",
|
||||||
|
"scripts": {}
|
||||||
|
}
|
21
config/templates/plugin/src/index.mjs.mustache
Normal file
21
config/templates/plugin/src/index.mjs.mustache
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
import { name, version } from '../data.mjs'
|
||||||
|
|
||||||
|
export const plugin = {
|
||||||
|
name,
|
||||||
|
version,
|
||||||
|
macros: {
|
||||||
|
{{name}}: function (so, {points, paths, Path}) { //Example shorthand, you may wish to add other elements like utils
|
||||||
|
const defaults = {
|
||||||
|
//note these are common examples and can be removed
|
||||||
|
scale: 1,
|
||||||
|
rotation: 0,
|
||||||
|
}
|
||||||
|
so = { ...defaults, ...so }
|
||||||
|
//write plugin here
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
// More specifically named exports
|
||||||
|
export const {{name}}Plugin = plugin
|
||||||
|
export const plugin{{capitalized_name}} = plugin
|
|
@ -7,6 +7,7 @@ import mustache from 'mustache'
|
||||||
import { execSync } from 'child_process'
|
import { execSync } from 'child_process'
|
||||||
// Software
|
// Software
|
||||||
import designs from '../config/software/designs.json' assert { type: 'json' }
|
import designs from '../config/software/designs.json' assert { type: 'json' }
|
||||||
|
import plugins from '../config/software/plugins.json' assert { type: 'json' }
|
||||||
|
|
||||||
const type = process.argv[2]
|
const type = process.argv[2]
|
||||||
|
|
||||||
|
@ -85,7 +86,7 @@ async function addDesign() {
|
||||||
type: 'text',
|
type: 'text',
|
||||||
name: 'name',
|
name: 'name',
|
||||||
message: 'What name would you like the design to have? ([a-z] only)',
|
message: 'What name would you like the design to have? ([a-z] only)',
|
||||||
validate: validateName,
|
validate: validateDesignName,
|
||||||
})
|
})
|
||||||
|
|
||||||
if (name && type) {
|
if (name && type) {
|
||||||
|
@ -101,7 +102,7 @@ async function addDesign() {
|
||||||
${chalk.gray('≡≡≡≡≡≡≡≡≡≡')}
|
${chalk.gray('≡≡≡≡≡≡≡≡≡≡')}
|
||||||
|
|
||||||
👉 We've created your design skeleton at ${chalk.green('designs/' + name)}
|
👉 We've created your design skeleton at ${chalk.green('designs/' + name)}
|
||||||
👉 We've configured the packages via the ${chalk.green('pacakge.json')} file
|
👉 We've configured the packages via the ${chalk.green('package.json')} file
|
||||||
👉 We've added ${chalk.green('designs/' + name)} to the lab
|
👉 We've added ${chalk.green('designs/' + name)} to the lab
|
||||||
|
|
||||||
|
|
||||||
|
@ -119,7 +120,7 @@ async function addDesign() {
|
||||||
👉 ${chalk.yellow(
|
👉 ${chalk.yellow(
|
||||||
'Dependencies'
|
'Dependencies'
|
||||||
)}: If you need additional plugins or patterns to extend, update ${chalk.green(
|
)}: If you need additional plugins or patterns to extend, update ${chalk.green(
|
||||||
'config/dependecies.yaml'
|
'config/dependencies.yaml'
|
||||||
)}
|
)}
|
||||||
|
|
||||||
If you change any of these, run ${chalk.blue('yarn reconfigure')} to update the package(s).
|
If you change any of these, run ${chalk.blue('yarn reconfigure')} to update the package(s).
|
||||||
|
@ -142,17 +143,76 @@ async function addDesign() {
|
||||||
async function addPlugin() {
|
async function addPlugin() {
|
||||||
console.log(`
|
console.log(`
|
||||||
|
|
||||||
${chalk.bold.yellow('🙈 Oh no; You called our bluf!')}
|
${chalk.bold.yellow('👕 Add a new plugin')}
|
||||||
${chalk.gray('≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡')}
|
${chalk.gray('≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡')}
|
||||||
|
|
||||||
Adding plugins is not (yet) implemented 😬
|
We're going to add a new plugin to this repository. That's awesome 🎉
|
||||||
|
Let's start by picking the name for this plugin 🏷️
|
||||||
Sorry 🤥
|
Try to keep it to one word that explains what the plugin does e.g. ${chalk.green(
|
||||||
|
'flip'
|
||||||
|
)}, ${chalk.green('mirror')},
|
||||||
|
${chalk.green('round')}.
|
||||||
|
|
||||||
`)
|
`)
|
||||||
|
|
||||||
|
const { name } = await prompts({
|
||||||
|
type: 'text',
|
||||||
|
name: 'name',
|
||||||
|
message: 'What name would you like the plugin to have? ([a-z] only)',
|
||||||
|
validate: validatePluginName,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (name) {
|
||||||
|
console.log('\n' + ` Alright, let's add ${chalk.green(name)} to plugins 🪄`)
|
||||||
|
createPlugin(name)
|
||||||
|
execSync('npm run reconfigure')
|
||||||
|
console.log(` All done 🎉`)
|
||||||
|
|
||||||
|
try {
|
||||||
|
console.log(`
|
||||||
|
|
||||||
|
${chalk.bold.yellow('✨ Summary')}
|
||||||
|
${chalk.gray('≡≡≡≡≡≡≡≡≡≡')}
|
||||||
|
|
||||||
|
👉 We've created your plugin skeleton at ${chalk.green('plugins/plugin-' + name)}
|
||||||
|
👉 We've configured the packages via the ${chalk.green('package.json')} file
|
||||||
|
|
||||||
|
|
||||||
|
${chalk.bold.yellow('✏️ Make it your own')}
|
||||||
|
${chalk.gray('≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡')}
|
||||||
|
|
||||||
|
Hhere's a few other things you can configure:
|
||||||
|
|
||||||
|
👉 ${chalk.yellow('Author')}: Credit where credit is due; Add yourself as author in ${chalk.green(
|
||||||
|
'config/exceptions.yaml'
|
||||||
|
)}
|
||||||
|
👉 ${chalk.yellow('Description')}: We used a placeholder description; Update it in ${chalk.green(
|
||||||
|
'config/software/plugins.json'
|
||||||
|
)}
|
||||||
|
👉 ${chalk.yellow(
|
||||||
|
'Dependencies'
|
||||||
|
)}: If you need additional plugins or patterns to extend, update ${chalk.green(
|
||||||
|
'config/dependencies.yaml'
|
||||||
|
)}
|
||||||
|
|
||||||
|
If you change any of these, run ${chalk.blue('yarn reconfigure')} to update the package(s).
|
||||||
|
|
||||||
|
|
||||||
|
${chalk.bold.yellow('👷 Get to work')}
|
||||||
|
${chalk.gray('≡≡≡≡≡≡≡≡≡≡≡≡≡≡')}
|
||||||
|
|
||||||
|
🛠️ You can now start the development environment with ${chalk.blue('yarn lab')}
|
||||||
|
📖 Documentation is available at ${chalk.green('https://freesewing.dev/')}
|
||||||
|
🤓 Happy hacking
|
||||||
|
|
||||||
|
`)
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function validateName(name) {
|
function validateDesignName(name) {
|
||||||
if (
|
if (
|
||||||
[
|
[
|
||||||
...Object.keys(designs.accessories),
|
...Object.keys(designs.accessories),
|
||||||
|
@ -167,6 +227,15 @@ function validateName(name) {
|
||||||
else return ' 🙈 Please use only [a-z], no spaces, no capitals, no nothing 🤷'
|
else return ' 🙈 Please use only [a-z], no spaces, no capitals, no nothing 🤷'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function validatePluginName(name) {
|
||||||
|
const pluginName = 'plugin-' + name
|
||||||
|
if ([...Object.keys(plugins)].indexOf(pluginName) !== -1)
|
||||||
|
return `Sorry but ${pluginName} is already taken so you'll need to pick something else`
|
||||||
|
|
||||||
|
if (/^([a-z]+)$/.test(name)) return true
|
||||||
|
else return ' 🙈 Please use only [a-z], no spaces, no capitals, no nothing 🤷'
|
||||||
|
}
|
||||||
|
|
||||||
function createDesign(name, type) {
|
function createDesign(name, type) {
|
||||||
const template = ['config', 'templates', 'design']
|
const template = ['config', 'templates', 'design']
|
||||||
const design = ['designs', name]
|
const design = ['designs', name]
|
||||||
|
@ -207,6 +276,33 @@ function createDesign(name, type) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function createPlugin(name) {
|
||||||
|
const pluginName = 'plugin-' + name
|
||||||
|
const template = ['config', 'templates', 'plugin']
|
||||||
|
const description = 'A FreeSewing plugin that needs a description'
|
||||||
|
const plugin = ['plugins', pluginName]
|
||||||
|
const capitalized_name = name.charAt(0).toUpperCase() + name.slice(1)
|
||||||
|
|
||||||
|
// Create folders
|
||||||
|
mkdir([...plugin, 'src'])
|
||||||
|
mkdir([...plugin, 'tests'])
|
||||||
|
|
||||||
|
// Create package.json
|
||||||
|
templateOut([...template, 'package.json.mustache'], [...plugin, 'package.json'], {
|
||||||
|
pluginName,
|
||||||
|
description,
|
||||||
|
})
|
||||||
|
|
||||||
|
plugins[pluginName] = description
|
||||||
|
write(['config', 'software', 'plugins.json'], JSON.stringify(orderPlugins(plugins), null, 2))
|
||||||
|
|
||||||
|
// Create index.mjs
|
||||||
|
templateOut([...template, 'src', 'index.mjs.mustache'], [...plugin, 'src', 'index.mjs'], {
|
||||||
|
name,
|
||||||
|
capitalized_name,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
function templateOut(from, to, data) {
|
function templateOut(from, to, data) {
|
||||||
try {
|
try {
|
||||||
fs.writeFileSync(
|
fs.writeFileSync(
|
||||||
|
@ -262,3 +358,12 @@ function orderDesigns(designs) {
|
||||||
|
|
||||||
return newDesigns
|
return newDesigns
|
||||||
}
|
}
|
||||||
|
function orderPlugins(plugins) {
|
||||||
|
// Ensure plugins are listed alphabetically
|
||||||
|
const newPlugins = {}
|
||||||
|
for (const plugin of Object.keys(plugins).sort()) {
|
||||||
|
newPlugins[plugin] = plugins[plugin]
|
||||||
|
}
|
||||||
|
|
||||||
|
return newPlugins
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue