Skip to content

Commit

Permalink
feat: guijs plugin & refactor to defaultTemplate
Browse files Browse the repository at this point in the history
  • Loading branch information
Guillaume Chau committed Jul 27, 2019
1 parent 400ebed commit 655e265
Show file tree
Hide file tree
Showing 18 changed files with 475 additions and 93 deletions.
2 changes: 2 additions & 0 deletions packages/@nodepack/cli/src/bin/commands.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
99 changes: 15 additions & 84 deletions packages/@nodepack/cli/src/lib/ProjectCreateJob.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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__'

Expand Down Expand Up @@ -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(
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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])})`,
Expand Down
3 changes: 3 additions & 0 deletions packages/@nodepack/cli/src/lib/createModules/babel.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
})

Expand Down
34 changes: 31 additions & 3 deletions packages/@nodepack/cli/src/lib/createModules/typescript.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,50 @@
/** @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) => {
if (answers.features.includes('ts')) {
// @ts-ignore
preset.plugins['@nodepack/plugin-typescript'] = ''
}

const appMigrations = preset.appMigrations['@nodepack/plugin-typescript'] = {
defaultTemplate: {},
}
if (answers.useTsLint) {
appMigrations.defaultTemplate.tslint = true
}
})
}
9 changes: 9 additions & 0 deletions packages/@nodepack/cli/src/util/getPresets.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const {
loadGlobalOptions,
defaultGlobalOptions,
} = require('@nodepack/utils')

exports.getPresets = function () {
const savedOptions = loadGlobalOptions()
return Object.assign({}, savedOptions.presets, defaultGlobalOptions.presets)
}
86 changes: 86 additions & 0 deletions packages/@nodepack/cli/src/util/resolvePreset.js
Original file line number Diff line number Diff line change
@@ -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
}
Binary file added packages/@nodepack/guijs-plugin/logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 31 additions & 0 deletions packages/@nodepack/guijs-plugin/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "@nodepack/guijs-plugin",
"version": "0.2.0",
"description": "Nodepack plugin for guijs",
"author": "Guillaume Chau <[email protected]>",
"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"
}
}
Loading

0 comments on commit 655e265

Please sign in to comment.