gluegun
Version:
A delightful toolkit for building Node-powered CLIs.
191 lines • 11 kB
JavaScript
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [op[0] & 2, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
Object.defineProperty(exports, "__esModule", { value: true });
var NewCommand = {
name: 'new',
alias: ['n', 'create'],
description: 'Creates a new gluegun cli',
hidden: false,
run: function (toolbox) { return __awaiter(void 0, void 0, void 0, function () {
var parameters, generate, filesystem, _a, error, info, colors, kebabCase, system, meta, prompt, o, ts, js, props, validName, answer, answer, lang, active, files, ext, yarnOrNpm;
return __generator(this, function (_b) {
switch (_b.label) {
case 0:
parameters = toolbox.parameters, generate = toolbox.template.generate, filesystem = toolbox.filesystem, _a = toolbox.print, error = _a.error, info = _a.info, colors = _a.colors, kebabCase = toolbox.strings.kebabCase, system = toolbox.system, meta = toolbox.meta, prompt = toolbox.prompt;
o = parameters.options;
ts = Boolean(o.typescript || o.ts || o.t);
js = Boolean(o.javascript || o.js || o.j);
props = {
name: parameters.first,
language: ts ? 'typescript' : js ? 'javascript' : 'ask',
extension: undefined,
};
// sanity checks
if (!props.name || props.name.length === 0) {
error('You must provide a valid CLI name.');
error('Example: gluegun new movies');
return [2 /*return*/, undefined];
}
else if (!/^[a-z0-9-]+$/.test(props.name)) {
validName = kebabCase(props.name);
error("".concat(props.name, " is not a valid name. Use lower-case and dashes only."));
error("Suggested: gluegun new ".concat(validName));
return [2 /*return*/, undefined];
}
if (!filesystem.exists(props.name)) return [3 /*break*/, 2];
info("");
error("There's already a folder named ".concat(props.name, " here."));
return [4 /*yield*/, prompt.confirm("Do you want to overwrite it?")];
case 1:
answer = _b.sent();
if (answer) {
filesystem.remove(props.name);
}
else {
return [2 /*return*/, undefined];
}
_b.label = 2;
case 2:
if (!(props.language === 'ask')) return [3 /*break*/, 4];
info("");
return [4 /*yield*/, prompt.ask({
type: 'select',
name: 'answer',
message: 'Which language would you like to use?',
choices: [
'TypeScript - Gives you a build pipeline out of the box (default)',
'Modern JavaScript - Node 8.2+ and ES2016+ (https://node.green/)',
],
})
// we default to TypeScript if they just press "enter"
];
case 3:
answer = (_b.sent()).answer;
lang = (answer && answer.toLowerCase()) || 'typescript';
props.language = lang.includes('typescript') ? 'typescript' : 'javascript';
info("Language used: ".concat(props.language === 'typescript' ? 'TypeScript' : 'Modern JavaScript'));
_b.label = 4;
case 4:
props.extension = props.language === 'typescript' ? 'ts' : 'js';
// create the directory
filesystem.dir(props.name);
active = [];
// executable is treated specially
active.push(generate({
template: "cli/bin/cli-executable.ejs",
target: "./".concat(props.name, "/bin/").concat(props.name),
props: props,
}));
files = [
'__tests__/cli-integration.test.js.ejs',
'docs/commands.md.ejs',
'docs/plugins.md.ejs',
'src/commands/generate.js.ejs',
'src/commands/default.js.ejs',
'src/extensions/cli-extension.js.ejs',
'src/templates/model.js.ejs.ejs',
'src/cli.js.ejs',
'LICENSE.ejs',
'package.json.ejs',
'readme.md.ejs',
'.gitignore.ejs',
'.eslintrc.js.ejs',
];
if (props.language === 'typescript') {
files.push('src/types.js.ejs');
files.push('tsconfig.json.ejs');
}
// rename js files to ts
active = files.reduce(function (prev, file) {
var template = "cli/".concat(file);
var target = "".concat(props.name, "/") +
(props.language === 'typescript' && file.includes('.js.ejs') && !file.startsWith('.')
? file.replace('.js.ejs', '.ts')
: file.replace('.ejs', ''));
var gen = generate({ template: template, target: target, props: props });
return prev.concat([gen]);
}, active);
// let all generator calls run in parallel
return [4 /*yield*/, Promise.all(active)
// make bin executable
];
case 5:
// let all generator calls run in parallel
_b.sent();
// make bin executable
filesystem.chmodSync("".concat(props.name, "/bin/").concat(props.name), '755');
ext = props.language === 'typescript' ? 'ts' : 'js';
filesystem.rename("".concat(props.name, "/src/commands/default.").concat(ext), "".concat(props.name, ".").concat(ext));
yarnOrNpm = system.which('yarn') ? 'yarn' : 'npm';
return [4 /*yield*/, system.spawn("cd ".concat(props.name, " && ").concat(yarnOrNpm, " install --silent && ").concat(yarnOrNpm, " run --quiet format"), {
shell: true,
stdio: 'inherit',
})
// we're done, so show what to do next
];
case 6:
_b.sent();
// we're done, so show what to do next
info("");
info(colors.green("Generated ".concat(props.name, " CLI with Gluegun ").concat(meta.version(), ".")));
if (props.language === 'typescript')
info(colors.gray("Using TypeScript"));
info("");
info("Next:");
info(" $ cd ".concat(props.name));
info(" $ ".concat(yarnOrNpm, " test"));
info(" $ ".concat(yarnOrNpm, " link"));
info(" $ ".concat(props.name));
info("");
if (props.language === 'typescript') {
info(colors.gray("Since you generated a TypeScript project, we've included a build script."));
info(colors.gray("When you link and run the project, it will use ts-node locally to test."));
info(colors.gray("However, you can test the generated JavaScript locally like this:"));
info("");
info(" $ ".concat(yarnOrNpm, " build"));
info(" $ ".concat(props.name, " --compiled-build"));
info("");
}
// for tests
return [2 /*return*/, "new ".concat(toolbox.parameters.first)];
}
});
}); },
};
exports.default = NewCommand;
//# sourceMappingURL=new.js.map
;