botpress
Version:
The world's first CMS for bots. Easily create, manage and extend chatbots.
174 lines (128 loc) • 5.38 kB
JavaScript
;
var _child_process = require('child_process');
var _prompt = require('prompt');
var _prompt2 = _interopRequireDefault(_prompt);
var _chalk = require('chalk');
var _chalk2 = _interopRequireDefault(_chalk);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _mkdirp = require('mkdirp');
var _mkdirp2 = _interopRequireDefault(_mkdirp);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _glob = require('glob');
var _glob2 = _interopRequireDefault(_glob);
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
var _stats = require('../stats');
var _stats2 = _interopRequireDefault(_stats);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new _bluebird2.default(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return _bluebird2.default.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
const introductionText = _chalk2.default`
{dim ---------------}
This tool will bootstrap a new {bold Botpress} module for you.
For more information or help, please visit {underline https://botpress.io/docs}
{dim ---------------}`;
const nextStepText = _chalk2.default`
{green 🎉 Your module was successfully bootstraped!}
{yellow Next steps:}
{yellow 1)} Install the dependencies by running {bold npm install} (or {bold yarn install})
{yellow 2)} Compile the module using {bold npm run compile} (or {bold yarn run compile})
{yellow 3)} Link the module to ease development and testing using {bold npm link}
{yellow 4)} Install the module in your testing bot using {bold npm install --save path/to/the/module}
{yellow 5)} Link the module using {bold npm link MODULE-NAME}
{bold Enjoy Botpress!}
`;
const invalidDirectoryError = _chalk2.default`
{red Fatal Error} You need to run this command in an empty directory.
`;
const templateNotFoundError = template => _chalk2.default`
{red Fatal Error} Template {bold ${template}} not found.
`;
const copyingFile = name => _chalk2.default`{dim -> Copying ${name}}`;
const assertDoesntExist = file => {
if (_fs2.default.existsSync(file)) {
console.log(invalidDirectoryError);
process.exit(1);
}
};
/**
* Loads a template a returns a map of files and content
* @param {string} name The name of the template to load
* @return {object} A map of files `{ path: content }``
* @private
*/
const loadTemplate = (() => {
var _ref = _asyncToGenerator(function* (name) {
const templatePath = _path2.default.join(__dirname, 'templates', name);
if (!_fs2.default.existsSync) {
console.log(templateNotFoundError(name));
process.exit(1);
}
const files = yield _bluebird2.default.fromCallback(function (cb) {
return (0, _glob2.default)('**/*.*', { cwd: templatePath, dot: true }, cb);
});
return _lodash2.default.reduce(files, function (obj, file) {
const filePath = _path2.default.join(templatePath, file);
obj[file] = _fs2.default.readFileSync(filePath).toString();
return obj;
}, {});
});
return function loadTemplate(_x) {
return _ref.apply(this, arguments);
};
})();
const generate = (() => {
var _ref2 = _asyncToGenerator(function* (result) {
const files = yield loadTemplate('create-default');
for (const [name, content] of Object.entries(files)) {
console.log(copyingFile(name));
const compiled = _lodash2.default.template(content, { interpolate: /<%=([\s\S]+?)%>/g });
const directory = _path2.default.dirname(name);
if (directory.length) {
_mkdirp2.default.sync(directory);
}
_fs2.default.writeFileSync(name, compiled(result));
}
console.log(nextStepText);
});
return function generate(_x2) {
return _ref2.apply(this, arguments);
};
})();
module.exports = () => {
console.log(introductionText);
const moduleDirectory = _path2.default.resolve('.');
const dirname = _path2.default.basename(moduleDirectory);
(0, _stats2.default)({}).track('cli', 'modules', 'create');
_lodash2.default.each(['package.json', 'botfile.js', 'index.js'], assertDoesntExist);
const schema = {
properties: {
name: {
description: _chalk2.default.white('module name:'),
pattern: /^(\@botpress\/|botpress-)[a-z0-9][a-z0-9-_\.]+$/,
message: `Name must be only lowercase letters, digits, dashes, underscores and dots.
It must also start with "@botpress/" or "botpress-"`,
required: true,
default: dirname
},
description: {
required: false,
description: _chalk2.default.white('description:')
},
author: {
required: false,
description: _chalk2.default.white('author:')
}
}
};
_prompt2.default.message = '';
_prompt2.default.delimiter = '';
_prompt2.default.start();
_prompt2.default.get(schema, (err, result) => {
generate(result);
});
};
//# sourceMappingURL=create.js.map