From 655e265964a823f6b2696461987b1ef70661ae1e Mon Sep 17 00:00:00 2001 From: Guillaume Chau Date: Sat, 27 Jul 2019 14:40:15 +0200 Subject: [PATCH] feat: guijs plugin & refactor to `defaultTemplate` --- packages/@nodepack/cli/src/bin/commands.js | 2 + .../@nodepack/cli/src/lib/ProjectCreateJob.js | 99 ++------- .../cli/src/lib/createModules/babel.js | 3 + .../cli/src/lib/createModules/typescript.js | 34 ++- packages/@nodepack/cli/src/util/getPresets.js | 9 + .../@nodepack/cli/src/util/resolvePreset.js | 86 +++++++ packages/@nodepack/guijs-plugin/logo.png | Bin 0 -> 1879 bytes packages/@nodepack/guijs-plugin/package.json | 31 +++ .../guijs-plugin/src/create-project.js | 83 +++++++ packages/@nodepack/guijs-plugin/src/index.js | 209 ++++++++++++++++++ .../guijs-plugin/ui-public/nodepack.png | Bin 0 -> 1879 bytes .../src/app-migrations/index.js | 6 +- .../default/tsconfig.json | 0 .../default/tslint.json | 0 .../service/src/app-migrations/index.js | 6 +- .../default/_gitignore | 0 .../default/nodepack.config.js | 0 .../default/src/index.js | 0 18 files changed, 475 insertions(+), 93 deletions(-) create mode 100644 packages/@nodepack/cli/src/util/getPresets.js create mode 100644 packages/@nodepack/cli/src/util/resolvePreset.js create mode 100644 packages/@nodepack/guijs-plugin/logo.png create mode 100644 packages/@nodepack/guijs-plugin/package.json create mode 100644 packages/@nodepack/guijs-plugin/src/create-project.js create mode 100644 packages/@nodepack/guijs-plugin/src/index.js create mode 100644 packages/@nodepack/guijs-plugin/ui-public/nodepack.png rename packages/@nodepack/plugin-typescript/src/app-migrations/{templates-0.0.1 => templates}/default/tsconfig.json (100%) rename packages/@nodepack/plugin-typescript/src/app-migrations/{templates-0.0.1 => templates}/default/tslint.json (100%) rename packages/@nodepack/service/src/app-migrations/{templates-0.0.1 => templates}/default/_gitignore (100%) rename packages/@nodepack/service/src/app-migrations/{templates-0.0.1 => templates}/default/nodepack.config.js (100%) rename packages/@nodepack/service/src/app-migrations/{templates-0.0.1 => templates}/default/src/index.js (100%) diff --git a/packages/@nodepack/cli/src/bin/commands.js b/packages/@nodepack/cli/src/bin/commands.js index 22ef15f..ca3fb91 100644 --- a/packages/@nodepack/cli/src/bin/commands.js +++ b/packages/@nodepack/cli/src/bin/commands.js @@ -29,6 +29,8 @@ program .option('-n, --no-git', 'Skip git initialization') // Folder .option('-f, --force', 'Overwrite target directory if it exists') + // Misc + .option('--skipGetStarted', 'Skip displaying "Get started" instructions') .action((appName, cmd) => { const options = cleanArgs(cmd) // --no-git makes commander to default git to true diff --git a/packages/@nodepack/cli/src/lib/ProjectCreateJob.js b/packages/@nodepack/cli/src/lib/ProjectCreateJob.js index 3aa47b7..5fb9f52 100644 --- a/packages/@nodepack/cli/src/lib/ProjectCreateJob.js +++ b/packages/@nodepack/cli/src/lib/ProjectCreateJob.js @@ -9,13 +9,11 @@ const CreateModuleAPI = require('./CreateModuleAPI') // Utils const { runMaintenance } = require('@nodepack/maintenance') -const path = require('path') const inquirer = require('inquirer') const cloneDeep = require('lodash.clonedeep') const { loadGlobalOptions, saveGlobalOptions, - defaultGlobalOptions, clearConsole, logWithSpinner, stopSpinner, @@ -33,9 +31,9 @@ const { } = require('@nodepack/utils') const { MigrationOperationFile, writeFileTree } = require('@nodepack/app-migrator') const generateReadme = require('../util/generateReadme') -const loadLocalPreset = require('../util/loadLocalPreset') -const loadRemotePreset = require('../util/loadRemotePreset') const { formatFeatures } = require('../util/features') +const { getPresets } = require('../util/getPresets') +const { resolvePreset, getPresetFromAnswers } = require('../util/resolvePreset') const isManualMode = answers => answers.preset === '__manual__' @@ -137,14 +135,16 @@ module.exports = class ProjectCreateJob { } // log instructions - log() - log(`🎉 Successfully created project ${chalk.yellow(projectName)}.`) - log( - `👉 Get started with the following commands:\n\n` + - (cwd === process.cwd() ? `` : chalk.cyan(` ${chalk.gray('$')} cd ${projectName}\n`)) + - chalk.cyan(` ${chalk.gray('$')} nodepack`) - ) - log() + if (!cliOptions.skipGetStarted) { + log() + log(`🎉 Successfully created project ${chalk.yellow(projectName)}.`) + log( + `👉 Get started with the following commands:\n\n` + + (cwd === process.cwd() ? `` : chalk.cyan(` ${chalk.gray('$')} cd ${projectName}\n`)) + + chalk.cyan(` ${chalk.gray('$')} nodepack`) + ) + log() + } if (!gitCommitSuccess) { warn( @@ -164,7 +164,7 @@ module.exports = class ProjectCreateJob { let preset = null if (cliOptions.preset) { // nodepack create foo --preset bar - preset = await this.resolvePreset(cliOptions.preset, cliOptions.clone) + preset = await resolvePreset(cliOptions.preset, cliOptions.clone) } else if (cliOptions.default) { // nodepack create foo --default preset = defaultPreset @@ -192,28 +192,7 @@ module.exports = class ProjectCreateJob { answers = await inquirer.prompt(this.resolveFinalPrompts()) } - if (answers.packageManager) { - saveGlobalOptions({ - packageManager: answers.packageManager, - }) - } - - /** @type {Preset?} */ - let preset - if (answers.preset && answers.preset !== '__manual__') { - preset = await this.resolvePreset(answers.preset) - } else { - // manual - preset = { - useConfigFiles: answers.useConfigFiles === 'files', - plugins: {}, - } - answers.features = answers.features || [] - // run cb registered by prompt modules to finalize the preset - for (const cb of this.promptCompleteCbs) { - await cb(answers, preset) - } - } + const preset = await getPresetFromAnswers(answers, this.promptCompleteCbs) // validate // TODO @@ -223,56 +202,8 @@ module.exports = class ProjectCreateJob { return preset } - /** - * @param {string} presetName - * @param {boolean} clone - */ - async resolvePreset (presetName, clone = false) { - let preset = null - const savedPresets = loadGlobalOptions().presets || {} - - if (presetName in savedPresets) { - preset = savedPresets[presetName] - } else if (presetName.endsWith('.json') || /^\./.test(presetName) || path.isAbsolute(presetName)) { - preset = await loadLocalPreset(path.resolve(presetName)) - } else if (presetName.includes('/')) { - logWithSpinner(`Fetching remote preset ${chalk.cyan(presetName)}...`) - try { - preset = await loadRemotePreset(presetName, clone) - stopSpinner() - } catch (e) { - stopSpinner() - error(`Failed fetching remote preset ${chalk.cyan(presetName)}:`) - throw e - } - } - - // use default preset if user has not overwritten it - if (presetName === 'default' && !preset) { - preset = defaultPreset - } - if (!preset) { - error(`preset "${presetName}" not found.`) - const presets = Object.keys(savedPresets) - if (presets.length) { - log() - log(`available presets:\n${presets.join(`\n`)}`) - } else { - log(`you don't seem to have any saved preset.`) - log(`run 'nodepack create' in manual mode to create a preset.`) - } - process.exit(1) - } - return preset - } - - getPresets () { - const savedOptions = loadGlobalOptions() - return Object.assign({}, savedOptions.presets, defaultGlobalOptions.presets) - } - resolveIntroPrompts () { - const presets = this.getPresets() + const presets = getPresets() const presetChoices = Object.keys(presets).map(name => { return { name: `${name} (${formatFeatures(presets[name])})`, diff --git a/packages/@nodepack/cli/src/lib/createModules/babel.js b/packages/@nodepack/cli/src/lib/createModules/babel.js index 1b7b250..5c46c60 100644 --- a/packages/@nodepack/cli/src/lib/createModules/babel.js +++ b/packages/@nodepack/cli/src/lib/createModules/babel.js @@ -3,6 +3,9 @@ module.exports = api => { api.injectFeature({ name: 'Babel', value: 'babel', + // @ts-ignore + description: 'Transpile modern JavaScript to older versions (for compatibility)', + link: 'https://babeljs.io/', checked: true, }) diff --git a/packages/@nodepack/cli/src/lib/createModules/typescript.js b/packages/@nodepack/cli/src/lib/createModules/typescript.js index e493f72..d30e596 100644 --- a/packages/@nodepack/cli/src/lib/createModules/typescript.js +++ b/packages/@nodepack/cli/src/lib/createModules/typescript.js @@ -1,16 +1,37 @@ /** @type {import('../ProjectCreateJob').CreateModule} */ module.exports = api => { + const featureName = 'Typescript' + api.injectFeature({ - name: 'Typescript', + name: featureName, value: 'ts', + // @ts-ignore + description: 'Add support for the TypeScript language', + link: 'https://github.com/Akryum/nodepack/tree/dev/packages/%40nodepack/plugin-typescript', }) api.injectPrompt({ name: 'useTsWithBabel', - when: answers => answers.features.includes('ts'), + when: answers => answers.features.includes('ts') && answers.features.includes('babel'), type: 'confirm', message: 'Use Babel alongside TypeScript for auto-detected polyfills?', - default: answers => answers.features.includes('babel'), + // @ts-ignore + description: 'It will output ES2015 and delegate the rest to Babel for auto polyfill based on compilation targets.', + default: true, + // @ts-ignore + group: featureName, + }) + + api.injectPrompt({ + name: 'useTsLint', + when: answers => answers.features.includes('ts'), + type: 'confirm', + message: 'Use TS Lint', + // @ts-ignore + description: 'Checks for code quality and style.', + default: true, + // @ts-ignore + group: featureName, }) api.onPromptComplete((answers, preset) => { @@ -18,5 +39,12 @@ module.exports = api => { // @ts-ignore preset.plugins['@nodepack/plugin-typescript'] = '' } + + const appMigrations = preset.appMigrations['@nodepack/plugin-typescript'] = { + defaultTemplate: {}, + } + if (answers.useTsLint) { + appMigrations.defaultTemplate.tslint = true + } }) } diff --git a/packages/@nodepack/cli/src/util/getPresets.js b/packages/@nodepack/cli/src/util/getPresets.js new file mode 100644 index 0000000..6642314 --- /dev/null +++ b/packages/@nodepack/cli/src/util/getPresets.js @@ -0,0 +1,9 @@ +const { + loadGlobalOptions, + defaultGlobalOptions, +} = require('@nodepack/utils') + +exports.getPresets = function () { + const savedOptions = loadGlobalOptions() + return Object.assign({}, savedOptions.presets, defaultGlobalOptions.presets) +} diff --git a/packages/@nodepack/cli/src/util/resolvePreset.js b/packages/@nodepack/cli/src/util/resolvePreset.js new file mode 100644 index 0000000..be23ddd --- /dev/null +++ b/packages/@nodepack/cli/src/util/resolvePreset.js @@ -0,0 +1,86 @@ +/** @typedef {import('@nodepack/utils').Preset} Preset */ + +const path = require('path') +const loadLocalPreset = require('./loadLocalPreset') +const loadRemotePreset = require('./loadRemotePreset') +const { + loadGlobalOptions, + saveGlobalOptions, + logWithSpinner, + stopSpinner, + log, + error, + chalk, + defaultPreset, +} = require('@nodepack/utils') + +/** +* @param {string} presetName +* @param {boolean} clone +*/ +exports.resolvePreset = async function (presetName, clone = false) { + let preset = null + const savedPresets = loadGlobalOptions().presets || {} + + if (presetName in savedPresets) { + preset = savedPresets[presetName] + } else if (presetName.endsWith('.json') || /^\./.test(presetName) || path.isAbsolute(presetName)) { + preset = await loadLocalPreset(path.resolve(presetName)) + } else if (presetName.includes('/')) { + logWithSpinner(`Fetching remote preset ${chalk.cyan(presetName)}...`) + try { + preset = await loadRemotePreset(presetName, clone) + stopSpinner() + } catch (e) { + stopSpinner() + error(`Failed fetching remote preset ${chalk.cyan(presetName)}:`) + throw e + } + } + + // use default preset if user has not overwritten it + if (presetName === 'default' && !preset) { + preset = defaultPreset + } + if (!preset) { + error(`preset "${presetName}" not found.`) + const presets = Object.keys(savedPresets) + if (presets.length) { + log() + log(`available presets:\n${presets.join(`\n`)}`) + } else { + log(`you don't seem to have any saved preset.`) + log(`run 'nodepack create' in manual mode to create a preset.`) + } + process.exit(1) + } + return preset +} + +exports.getPresetFromAnswers = async function (answers, promptCompleteCbs) { + if (answers.packageManager) { + saveGlobalOptions({ + packageManager: answers.packageManager, + }) + } + + /** @type {Preset?} */ + let preset + if (answers.preset && answers.preset !== '__manual__') { + preset = await exports.resolvePreset(answers.preset) + } else { + // manual + preset = { + useConfigFiles: answers.useConfigFiles === 'files', + plugins: {}, + appMigrations: {}, + } + answers.features = answers.features || [] + // run cb registered by prompt modules to finalize the preset + for (const cb of promptCompleteCbs) { + await cb(answers, preset) + } + } + + return preset +} diff --git a/packages/@nodepack/guijs-plugin/logo.png b/packages/@nodepack/guijs-plugin/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6fb60f1292c7b59d7dc3043c119d82e6dff8cd GIT binary patch literal 1879 zcmV-d2dMaoP)002t}1^@s6I8J)%00004b3#c}2nYxW zd>Qb#yDeAHJKc8 zNL5ntA-DW>sobV=NDeuqQmJ7kcAT+im?0hugUuq)hS1(xyI&6A4YM_BEw1$ENYTIk z>0AAN@3*`sE!_Wuz~o%W?RMZp!W2sfrdT>K#nOQ(mJUp@bYP0515+#=m}2R`6iWxD zSUTu9v4l+~H#2~+b)0Kh+wH*H6ej}27H6pS^B?NZgr3v)Rt^ghXa`klb_#-;+(ek6$9ITGRbJO3TGkM*4{_ z&QkF@bw8_FEF?dkBs()e;K3Sw>+vRdcrq;$tLp6~`RNS#u|VUt+`a7l>IROT6rrV6 zx>5xLJUpAGi=}qk*uOPS`lC@a+1PZTIOOBy@9*Gwx{LqeI+k+PQ2R$|o>&s(W(P@p zI!)c)-L%&TNhUovOl~?v;6E>L{}4ganiJ2OB9=1jC9yb5xxcR&=8r|~wh_BGOZwU{ z!LPzNHdBVb!%(s6PCI)GQ)FfbjWnx^ipRnBuW!+}nIyOr#+EG^X4??4gw?|St#MNG z&UD?L}?{(x#yWr7daaIMDP`$6_(p3y&lLt#8Xd~ueV>-B6wJQXoSVAbqr3y!BYPs_| zo>?tmv0zW;2rY%_iC(-nWi3{?^!F7!-*1ul`4vhbH= zsW4`chiB9J=ARH~Y8^?E4>kf_j|$59EahSzp|!p*-?p~05E?=iNV0scrCBW&QSuqI zqp3g(hZ$`iScrqAiG(c6$EF(fY854yre0}Z@BI}WG2H=yrm65&JkwMaC6}hEC~fxb z4ILuZA&2p-Rw<)o(`|`Mr_mYxlq0CsYR3r$9V%9*Vv3~$Q!E{rV(Fk|VrgB?*?2|w zdB*?7&@!=f%V-I_jq%kr$QOo`#Ytxz2H62Ch|#qGGbtzw11N)-3jzJVT|P0N!~ zMU8XZv^+V={K z{dJkbxS!aeqKLAXzbYP0515+#=m}2R`6iWxDSUNDp(t#", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/Akryum/nodepack.git" + }, + "bugs": { + "url": "https://github.com/Akryum/nodepack/issues" + }, + "homepage": "https://github.com/Akryum/nodepack#readme", + "main": "./src/index.js", + "publishConfig": { + "access": "public" + }, + "engines": { + "node": ">=8.12" + }, + "scripts": { + "test": "yarn test:lint", + "test:lint": "eslint src" + }, + "dependencies": { + "@nodepack/cli": "^0.2.0", + "@nodepack/utils": "^0.2.0", + "execa": "^1.0.0" + } +} diff --git a/packages/@nodepack/guijs-plugin/src/create-project.js b/packages/@nodepack/guijs-plugin/src/create-project.js new file mode 100644 index 0000000..7273332 --- /dev/null +++ b/packages/@nodepack/guijs-plugin/src/create-project.js @@ -0,0 +1,83 @@ +const execa = require('execa') +const { resolvePreset, getPresetFromAnswers } = require('@nodepack/cli/src/util/resolvePreset') +const { defaultPreset } = require('@nodepack/utils') + +exports.createProject = async function ({ + cwd, + answers, + setProgress, + addLog, +}, promptCompleteCbs) { + // Config files + let index + if ((index = answers.features.indexOf('use-config-files')) !== -1) { + answers.features.splice(index, 1) + answers.useConfigFiles = 'files' + } + + // Preset + if (answers.presetName) { + answers.save = true + answers.saveName = answers.presetName + } + + setProgress({ + info: 'Resolving preset...', + }) + let preset + if (answers.preset === '__remote__' && answers.remotePreset) { + // vue create foo --preset bar + preset = await resolvePreset(answers.remotePreset.url, answers.remotePreset.clone) + } else if (answers.preset === 'default') { + // vue create foo --default + preset = defaultPreset + } else { + preset = await getPresetFromAnswers(answers, promptCompleteCbs) + } + setProgress({ + info: null, + }) + + // Create + const args = [ + '--skipGetStarted', + ] + if (answers.packageManager) args.push('--packageManager', answers.packageManager) + if (answers.registryUrl) args.push('--registry', answers.registryUrl) + if (answers.proxy) args.push('--proxy', answers.proxy) + if (answers.force) args.push('--force') + // Git + if (!answers.useGit) { + args.push('--no-git') + } else if (answers.commitMessage) { + args.push('--git', answers.commitMessage) + } + // Preset + args.push('--inlinePreset', JSON.stringify(preset)) + + const cmd = execa('nodepack', [ + 'create', + answers.projectName, + ...args, + ], { + cwd, + stdio: ['inherit', 'pipe', 'inherit'], + }) + + const onData = buffer => { + const text = buffer.toString().trim() + if (text) { + setProgress({ + info: text, + }) + addLog({ + type: 'info', + message: text, + }) + } + } + + cmd.stdout.on('data', onData) + + await cmd +} diff --git a/packages/@nodepack/guijs-plugin/src/index.js b/packages/@nodepack/guijs-plugin/src/index.js new file mode 100644 index 0000000..27cd265 --- /dev/null +++ b/packages/@nodepack/guijs-plugin/src/index.js @@ -0,0 +1,209 @@ +const { getPresets } = require('@nodepack/cli/src/util/getPresets') +const { formatFeatures } = require('@nodepack/cli/src/util/features') +const { getPromptModules } = require('@nodepack/cli/src/lib/createModules') +const CreateModuleAPI = require('@nodepack/cli/src/lib/CreateModuleAPI') +const { createProject } = require('./create-project') + +module.exports = globalApi => { + globalApi.addProjectType('nodepack', 'Nodepack', (projectType) => { + projectType.logo = '/_plugin/@nodepack%2Fguijs-plugin/nodepack.png' + + // Detect nodepack projects + projectType.filterProject = ({ pkg }) => ({ ...pkg.dependencies, ...pkg.devDependencies })['@nodepack/service'] + + // Project creation + projectType.onCreate(onCreate) + }) +} + +async function onCreate ({ wizard }) { + wizard.extendGeneralStep({ + prompts: [ + { + name: 'force', + type: 'confirm', + message: 'Overwrite target directory if it exists', + }, + { + name: 'packageManager', + type: 'list', + message: 'Package manager', + group: 'Dependencies', + description: 'Use specified npm client when installing dependencies', + default: null, + choices: [ + { + name: 'Use previous', + value: null, + }, + { + name: 'Npm', + value: 'npm', + }, + { + name: 'Yarn', + value: 'yarn', + }, + { + name: 'Pnpm', + value: 'pnpm', + }, + ], + skin: 'buttongroup', + }, + { + name: 'registryUrl', + type: 'input', + message: 'Registry URL', + group: 'Dependencies', + description: 'Use specified npm registry when installing dependencies', + }, + { + name: 'proxy', + type: 'input', + message: 'Proxy', + group: 'Dependencies', + description: 'Use specified proxy when creating project', + }, + { + name: 'useGit', + type: 'confirm', + message: 'Initialize git repository (recommended)', + group: 'Git', + default: true, + }, + { + name: 'commitMessage', + type: 'input', + message: 'First commit message', + group: 'Git', + when: answers => answers.useGit, + }, + ], + }) + + // Presets + const presetsData = getPresets() + wizard.addSelectStep('preset', 'org.vue.views.project-create.tabs.presets.title', { + icon: 'check_circle', + description: 'org.vue.views.project-create.tabs.presets.description', + message: 'org.vue.views.project-create.tabs.presets.message', + choices: [ + ...Object.keys(presetsData).map(key => { + const preset = presetsData[key] + const info = { + name: key === 'default' ? 'org.vue.views.project-create.tabs.presets.default-preset' : key, + description: formatFeatures(preset), + value: key, + raw: preset, + } + return info + }), + { + name: 'org.vue.views.project-create.tabs.presets.manual.name', + value: '__manual__', + description: 'org.vue.views.project-create.tabs.presets.manual.description', + }, + { + name: 'org.vue.views.project-create.tabs.presets.remote.name', + value: '__remote__', + description: 'org.vue.views.project-create.tabs.presets.remote.description', + }, + ], + }) + + const isManualPreset = answers => answers.preset && answers.preset === '__manual__' + + // Features + const createModules = getPromptModules() + const createModuleData = { + featurePrompt: { + choices: [], + }, + injectedPrompts: [], + promptCompleteCbs: [], + } + // @ts-ignore + const createModuleAPI = new CreateModuleAPI(createModuleData) + for (const createModule of createModules) { + await createModule(createModuleAPI) + } + wizard.addStep('features', 'org.vue.views.project-create.tabs.features.title', { + icon: 'device_hub', + description: 'org.vue.views.project-create.tabs.features.description', + prompts: createModuleData.featurePrompt.choices.map( + data => ({ + name: `featureMap.${data.value}`, + type: 'confirm', + message: data.name, + description: data.description, + link: data.link, + default: !!data.checked, + }) + ), + }, isManualPreset) + + // Additional configuration + wizard.addStep('config', 'org.vue.views.project-create.tabs.configuration.title', { + icon: 'settings_applications', + prompts: [ + { + name: 'useConfigFiles', + type: 'confirm', + message: 'org.vue.views.project-create.tabs.features.userConfigFiles.name', + description: 'org.vue.views.project-create.tabs.features.userConfigFiles.description', + }, + ...createModuleData.injectedPrompts.map(prompt => ({ + ...prompt, + when: withAnswers(prompt.when, () => ({ + features: getFeatureList(wizard.answers.featureMap), + })), + choices: withAnswers(prompt.choices, () => ({ + features: getFeatureList(wizard.answers.featureMap), + })), + default: withAnswers(prompt.default, () => ({ + features: getFeatureList(wizard.answers.featureMap), + })), + })), + ], + }, isManualPreset) + + // Save preset modal + wizard.addModalStep('savePreset', 'org.vue.views.project-create.tabs.configuration.modal.title', { + prompts: [ + { + name: 'presetName', + type: 'input', + message: 'org.vue.views.project-create.tabs.configuration.modal.body.title', + description: 'org.vue.views.project-create.tabs.configuration.modal.body.subtitle', + validate: value => !!value, + }, + ], + canSkip: true, + }, isManualPreset) + + // Submit + wizard.onSubmit(options => createProject({ + ...options, + answers: { + ...options.answers, + features: getFeatureList(options.answers.featureMap), + }, + }, createModuleData.promptCompleteCbs)) +} + +function getFeatureList (answers) { + if (answers == null) return [] + return Object.keys(answers).filter(key => answers[key]) +} + +function withAnswers (option, overrides) { + if (typeof option === 'function') { + return (answers) => option({ + ...answers, + ...overrides(), + }) + } else { + return option + } +} diff --git a/packages/@nodepack/guijs-plugin/ui-public/nodepack.png b/packages/@nodepack/guijs-plugin/ui-public/nodepack.png new file mode 100644 index 0000000000000000000000000000000000000000..4d6fb60f1292c7b59d7dc3043c119d82e6dff8cd GIT binary patch literal 1879 zcmV-d2dMaoP)002t}1^@s6I8J)%00004b3#c}2nYxW zd>Qb#yDeAHJKc8 zNL5ntA-DW>sobV=NDeuqQmJ7kcAT+im?0hugUuq)hS1(xyI&6A4YM_BEw1$ENYTIk z>0AAN@3*`sE!_Wuz~o%W?RMZp!W2sfrdT>K#nOQ(mJUp@bYP0515+#=m}2R`6iWxD zSUTu9v4l+~H#2~+b)0Kh+wH*H6ej}27H6pS^B?NZgr3v)Rt^ghXa`klb_#-;+(ek6$9ITGRbJO3TGkM*4{_ z&QkF@bw8_FEF?dkBs()e;K3Sw>+vRdcrq;$tLp6~`RNS#u|VUt+`a7l>IROT6rrV6 zx>5xLJUpAGi=}qk*uOPS`lC@a+1PZTIOOBy@9*Gwx{LqeI+k+PQ2R$|o>&s(W(P@p zI!)c)-L%&TNhUovOl~?v;6E>L{}4ganiJ2OB9=1jC9yb5xxcR&=8r|~wh_BGOZwU{ z!LPzNHdBVb!%(s6PCI)GQ)FfbjWnx^ipRnBuW!+}nIyOr#+EG^X4??4gw?|St#MNG z&UD?L}?{(x#yWr7daaIMDP`$6_(p3y&lLt#8Xd~ueV>-B6wJQXoSVAbqr3y!BYPs_| zo>?tmv0zW;2rY%_iC(-nWi3{?^!F7!-*1ul`4vhbH= zsW4`chiB9J=ARH~Y8^?E4>kf_j|$59EahSzp|!p*-?p~05E?=iNV0scrCBW&QSuqI zqp3g(hZ$`iScrqAiG(c6$EF(fY854yre0}Z@BI}WG2H=yrm65&JkwMaC6}hEC~fxb z4ILuZA&2p-Rw<)o(`|`Mr_mYxlq0CsYR3r$9V%9*Vv3~$Q!E{rV(Fk|VrgB?*?2|w zdB*?7&@!=f%V-I_jq%kr$QOo`#Ytxz2H62Ch|#qGGbtzw11N)-3jzJVT|P0N!~ zMU8XZv^+V={K z{dJkbxS!aeqKLAXzbYP0515+#=m}2R`6iWxDSUNDp(t# { api.register({ - id: 'default-template@0.0.1', + id: 'defaultTemplate', title: 'Template: Render default template', // when: api => api.fromVersion('<0.0.1') || api.isFirstInstall, prompts: () => [ @@ -12,7 +12,7 @@ module.exports = api => { }, ], migrate: (api, options) => { - api.render('./templates-0.0.1/default', options) + api.render('./templates/default', options) api.move('src/**/*.js', file => `${file.path}${file.name}.ts`) if (options.tslint) { @@ -24,7 +24,7 @@ module.exports = api => { } }, rollback: (api, options) => { - api.unrender('./templates-0.0.1/default') + api.unrender('./templates/default') api.move('src/**/*.ts', file => `${file.path}${file.name}.js`) if (options.tslint) { diff --git a/packages/@nodepack/plugin-typescript/src/app-migrations/templates-0.0.1/default/tsconfig.json b/packages/@nodepack/plugin-typescript/src/app-migrations/templates/default/tsconfig.json similarity index 100% rename from packages/@nodepack/plugin-typescript/src/app-migrations/templates-0.0.1/default/tsconfig.json rename to packages/@nodepack/plugin-typescript/src/app-migrations/templates/default/tsconfig.json diff --git a/packages/@nodepack/plugin-typescript/src/app-migrations/templates-0.0.1/default/tslint.json b/packages/@nodepack/plugin-typescript/src/app-migrations/templates/default/tslint.json similarity index 100% rename from packages/@nodepack/plugin-typescript/src/app-migrations/templates-0.0.1/default/tslint.json rename to packages/@nodepack/plugin-typescript/src/app-migrations/templates/default/tslint.json diff --git a/packages/@nodepack/service/src/app-migrations/index.js b/packages/@nodepack/service/src/app-migrations/index.js index 30553f5..790f096 100644 --- a/packages/@nodepack/service/src/app-migrations/index.js +++ b/packages/@nodepack/service/src/app-migrations/index.js @@ -1,10 +1,10 @@ /** @type {import('@nodepack/service').MigrationPlugin} */ module.exports = api => { api.register({ - id: 'default-template@0.0.1', + id: 'defaultTemplate', title: 'Template: Render default template', migrate: (api, options) => { - api.render('./templates-0.0.1/default') + api.render('./templates/default') // Add scripts api.extendPackage({ @@ -16,7 +16,7 @@ module.exports = api => { }) }, rollback: (api, options) => { - api.unrender('./templates-0.0.1/default') + api.unrender('./templates/default') // Remove scripts api.modifyFile('package.json', content => { diff --git a/packages/@nodepack/service/src/app-migrations/templates-0.0.1/default/_gitignore b/packages/@nodepack/service/src/app-migrations/templates/default/_gitignore similarity index 100% rename from packages/@nodepack/service/src/app-migrations/templates-0.0.1/default/_gitignore rename to packages/@nodepack/service/src/app-migrations/templates/default/_gitignore diff --git a/packages/@nodepack/service/src/app-migrations/templates-0.0.1/default/nodepack.config.js b/packages/@nodepack/service/src/app-migrations/templates/default/nodepack.config.js similarity index 100% rename from packages/@nodepack/service/src/app-migrations/templates-0.0.1/default/nodepack.config.js rename to packages/@nodepack/service/src/app-migrations/templates/default/nodepack.config.js diff --git a/packages/@nodepack/service/src/app-migrations/templates-0.0.1/default/src/index.js b/packages/@nodepack/service/src/app-migrations/templates/default/src/index.js similarity index 100% rename from packages/@nodepack/service/src/app-migrations/templates-0.0.1/default/src/index.js rename to packages/@nodepack/service/src/app-migrations/templates/default/src/index.js