botpress
Version:
The world's first CMS for bots. Easily create, manage and extend chatbots.
244 lines (188 loc) • 7.18 kB
JavaScript
;
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