UNPKG

botpress

Version:

The world's first CMS for bots. Easily create, manage and extend chatbots.

244 lines (188 loc) 7.18 kB
'use strict'; 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 ---------------} Hey there 👋, thanks for using {bold Botpress}! We'll walk you through the creation of your new bot. For more information or help, please visit {underline https://botpress.io/docs} {dim ---------------}`; const nextStepText = _chalk2.default` {green 🎉 Your bot was initialized succesfully!} {yellow Next steps:} {yellow 1)} Install bot dependencies by running {bold npm install} (or {bold yarn install}) {yellow 2)} Start the bot by running {bold npm start} (or {bold yarn start}) {bold Enjoy Botpress!} `; const invalidDirectoryError = _chalk2.default` {red Fatal Error} You need to run this command in an empty directory. `; const dirExistsError = dir => _chalk2.default` {red Fatal Error} Directory {bold ${dir}} already exists. `; const templateNotFoundError = template => _chalk2.default` {red Fatal Error} Template {bold ${template}} not found. `; const showTemplateInfo = info => _chalk2.default` {dim =============================} Template: {bold ${info.name}} Author: {dim ${info.author}} Description: {dim ${info.description}} Channels: {yellow ${info.channels.join(', ')}} {dim =============================} `; const copyingFile = name => _chalk2.default`{dim -> Copying ${name}}`; const assertDoesntExist = file => { if (_fs2.default.existsSync(file)) { console.log(invalidDirectoryError); process.exit(1); } }; // Show template description // Say more templates coming up // Ask questions // Copy files, replacing variables // Show "success, now run `yarn install`" /** * 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('init-default'); const hasNpmignore = files['.npmignore']; const info = JSON.parse(files['info.json']); delete files['info.json']; if (hasNpmignore) { // Npm renames .gitignore into .npmignore while publishing package which we need to revert // See https://github.com/npm/npm/wiki/Files-and-Ignores#details-1 for more details files['.gitignore'] = hasNpmignore; delete files['.npmignore']; } console.log(showTemplateInfo(info)); 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 = (() => { var _ref3 = _asyncToGenerator(function* (dirName, { yes }) { console.log(introductionText); // People can optionally provide the directory of the bot // Like "bp init my-bot" if (dirName) { if (!_fs2.default.existsSync(dirName)) { _fs2.default.mkdirSync(dirName); process.chdir(dirName); } else { console.log(dirExistsError(dirName)); return process.exit(1); } } // Loaded by Webpack at bundle time const botpressVersion = require('../../package.json').version; (0, _stats2.default)({}).track('cli', 'bot', 'init'); _lodash2.default.each(['package.json', 'botfile.js', 'index.js'], assertDoesntExist); // The name of the current directory const defaultBotName = _path2.default.basename(_path2.default.resolve('./')); const schema = { properties: { name: { description: _chalk2.default.white('name:'), pattern: /^[a-z0-9][a-z0-9-_\.]+$/, message: 'name must be only lowercase letters, ' + 'digits, dashes, underscores and dots.', required: true, default: defaultBotName }, version: { required: true, description: _chalk2.default.white('botpress version:'), default: botpressVersion }, description: { required: false, description: _chalk2.default.white('description:') }, author: { required: false, description: _chalk2.default.white('author:') } } }; if (yes) { generate({ name: defaultBotName, version: botpressVersion, description: '', author: '' }); } else { _prompt2.default.message = ''; _prompt2.default.delimiter = ''; _prompt2.default.start(); _prompt2.default.get(schema, function (err, result) { if (err) { if (err.message !== 'canceled') { console.error(err); } process.exit(1); } generate(result); }); } }); return function (_x3, _x4) { return _ref3.apply(this, arguments); }; })(); //# sourceMappingURL=init.js.map