2017-09-07 20:49:11 +03:00
|
|
|
const chalk = require("chalk")
|
|
|
|
const fse = require("fs-extra")
|
|
|
|
|
|
|
|
const capitalize = require("./lib/capitalize")
|
|
|
|
const stripPrimerPrefix = require("./lib/strip-prefix")
|
|
|
|
|
|
|
|
const META_PACKAGES = [
|
|
|
|
"primer-css",
|
|
|
|
"primer-core",
|
|
|
|
"primer-product",
|
|
|
|
"primer-marketing",
|
|
|
|
]
|
|
|
|
|
|
|
|
const MODULE_TYPES = [
|
|
|
|
"components",
|
|
|
|
"objects",
|
|
|
|
"utilities",
|
|
|
|
"meta",
|
|
|
|
"tools",
|
|
|
|
]
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Primer module options
|
|
|
|
*
|
|
|
|
* Each key is the name of the option in the generator's
|
|
|
|
* `this.options` hash, and should be an object with one or more
|
|
|
|
* of the following keys:
|
|
|
|
*
|
|
|
|
* - "argument" indicates that this option is a positional
|
|
|
|
* argument to the `yo` CLI.
|
|
|
|
*
|
|
|
|
* - "option" indicates that this option an be passed via a
|
2017-09-07 21:00:10 +03:00
|
|
|
* `--name` flag to `yo`. For UNIX-y consistency, options
|
|
|
|
* containing "_" characters are aliased to the version with
|
|
|
|
* hyphens, so you can pass either "--module_type" or
|
|
|
|
* "--module-type".
|
2017-09-07 20:49:11 +03:00
|
|
|
*
|
|
|
|
* - "prompt" will trigger a prompt for this option if it was not
|
|
|
|
* already set via positional argument or CLI option.
|
|
|
|
*/
|
|
|
|
module.exports = {
|
|
|
|
|
|
|
|
// the module name in npm
|
|
|
|
"module": {
|
|
|
|
argument: {
|
|
|
|
desc: "The name of your module (on npm)",
|
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
},
|
|
|
|
prompt: {
|
|
|
|
name: "module",
|
|
|
|
message: "What should the module name be (on npm)?",
|
|
|
|
type: "input",
|
|
|
|
// the name must include primer somewhere
|
|
|
|
// FIXME: this should be validate in configuring()
|
|
|
|
validate: (name) => name.includes("primer")
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
// the module type (currently only CSS is supported)
|
|
|
|
"type": {
|
|
|
|
option: {
|
2017-09-07 21:00:10 +03:00
|
|
|
desc: "The Primer module type (currently only CSS is supported)",
|
2017-09-07 20:49:11 +03:00
|
|
|
type: String,
|
|
|
|
default: "css",
|
2017-09-07 21:00:10 +03:00
|
|
|
// reject anything other than "css" for now
|
|
|
|
validate: type => type === "css",
|
2017-09-07 20:49:11 +03:00
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
// the human-readable title of the module
|
|
|
|
"title": {
|
|
|
|
option: {
|
2017-09-07 21:19:54 +03:00
|
|
|
desc: "The module's human-readable title",
|
2017-09-07 20:49:11 +03:00
|
|
|
type: String,
|
|
|
|
alias: "t",
|
|
|
|
},
|
|
|
|
prompt: {
|
|
|
|
message: "What should the title be (for humans)?",
|
|
|
|
type: "input",
|
2017-09-07 21:19:54 +03:00
|
|
|
default: function({module}) {
|
2017-09-07 20:49:11 +03:00
|
|
|
return capitalize(
|
|
|
|
stripPrimerPrefix(module || this.options.module)
|
|
|
|
)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"description": {
|
|
|
|
option: {type: String},
|
|
|
|
prompt: {
|
|
|
|
message: [
|
|
|
|
"Describe your module in a single sentence.",
|
|
|
|
chalk.yellow("(This will go into the package.json and README.md.)"),
|
|
|
|
].join("\n"),
|
|
|
|
type: "input",
|
|
|
|
default: "TODO: fill in this description later",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"category": {
|
|
|
|
option: {type: String},
|
|
|
|
prompt: {
|
2017-09-12 01:23:49 +03:00
|
|
|
message: "What category of package is this?",
|
2017-09-07 20:49:11 +03:00
|
|
|
type: "list",
|
|
|
|
choices: [
|
|
|
|
"core",
|
|
|
|
"product",
|
|
|
|
"marketing",
|
|
|
|
"meta",
|
|
|
|
""
|
|
|
|
],
|
|
|
|
default: "core"
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"module_type": {
|
2017-09-07 21:00:10 +03:00
|
|
|
option: {
|
|
|
|
type: String,
|
|
|
|
alias: "m",
|
|
|
|
},
|
2017-09-07 20:49:11 +03:00
|
|
|
prompt: {
|
2017-09-12 01:23:49 +03:00
|
|
|
message: "What type/kind of module is this?",
|
2017-09-07 20:49:11 +03:00
|
|
|
type: "list",
|
|
|
|
choices: MODULE_TYPES,
|
|
|
|
default: 0
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"dependents": {
|
|
|
|
// This allows users (and our tests) to pass --no-dependents
|
|
|
|
// to disable updating dependent packages. XXX Note that the
|
|
|
|
// prompt will be skipped if --dependents is passed!
|
|
|
|
option: {
|
|
|
|
desc: "Update dependent package.json files (use --no-dependents to disable)",
|
|
|
|
type: Boolean,
|
|
|
|
},
|
|
|
|
prompt: {
|
|
|
|
message: "Which meta-package(s) should we add this to?",
|
|
|
|
type: "checkbox",
|
2017-09-07 21:58:25 +03:00
|
|
|
when: function() {
|
|
|
|
return this.options.dependents !== false
|
|
|
|
},
|
2017-09-07 20:49:11 +03:00
|
|
|
choices: META_PACKAGES,
|
2017-09-12 01:23:49 +03:00
|
|
|
default: function({category}) {
|
2017-09-07 20:49:11 +03:00
|
|
|
const pkgs = ["primer-css"]
|
2017-09-12 01:23:49 +03:00
|
|
|
category = category || this.options.category
|
2017-09-07 20:49:11 +03:00
|
|
|
return (category === "meta")
|
|
|
|
? pkgs
|
|
|
|
: pkgs.concat(`primer-${category}`)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"docs": {
|
|
|
|
option: {
|
|
|
|
type: String,
|
|
|
|
},
|
|
|
|
prompt: {
|
|
|
|
type: "input",
|
|
|
|
message: [
|
|
|
|
"Where can we find the docs?",
|
|
|
|
chalk.yellow("(We'll read this file from the path you provide.)"),
|
|
|
|
].join("\n"),
|
|
|
|
validate: (filePath) => {
|
|
|
|
if (!filePath) {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
return fse.exists(filePath)
|
|
|
|
.then(exists => {
|
|
|
|
return exists ||
|
|
|
|
`No such file: "${filePath}" in ${process.cwd()}`
|
|
|
|
})
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"status": {
|
|
|
|
option: {
|
|
|
|
type: String,
|
|
|
|
default: "Experimental",
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"todo": {
|
|
|
|
option: {
|
|
|
|
desc: "Output TODO reminders (use --no-todo to disable)",
|
|
|
|
type: Boolean,
|
|
|
|
default: true,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
"verbose": {
|
|
|
|
option: {
|
|
|
|
desc: "Ouput more useful debugging info",
|
|
|
|
type: Boolean,
|
|
|
|
alias: "v",
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|