better-npm-init
Version:
A better version of npm init, with templates and more. Usage: better-npm-init <template> [--yarn] [--install] [--git] [--yes] [--help]
119 lines (87 loc) • 14 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.BaseTemplate = void 0;
require("source-map-support/register");
var _asyncOra = require("@electron-forge/async-ora");
var _debug = _interopRequireDefault(require("debug"));
var _fsExtra = _interopRequireDefault(require("fs-extra"));
var _path = _interopRequireDefault(require("path"));
var _determineAuthor = _interopRequireDefault(require("./determine-author"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
// eslint-disable-next-line @typescript-eslint/no-var-requires
const currentForgeVersion = require('../package.json').version;
const d = (0, _debug.default)('electron-forge:template:base');
const tmplDir = _path.default.resolve(__dirname, '../tmpl');
class BaseTemplate {
constructor() {
_defineProperty(this, "templateDir", tmplDir);
_defineProperty(this, "requiredForgeVersion", currentForgeVersion);
}
get devDependencies() {
const packageJSONPath = _path.default.join(this.templateDir, 'package.json');
if (_fsExtra.default.pathExistsSync(packageJSONPath)) {
const packageDevDeps = _fsExtra.default.readJsonSync(packageJSONPath).devDependencies;
if (packageDevDeps) {
return Object.entries(packageDevDeps).map(([packageName, version]) => {
if (version === 'ELECTRON_FORGE/VERSION') {
version = currentForgeVersion;
}
return `${packageName}@${version}`;
});
}
}
return [];
}
async initializeTemplate(directory, {
copyCIFiles
}) {
await (0, _asyncOra.asyncOra)('Copying Starter Files', async () => {
d('creating directory:', _path.default.resolve(directory, 'src'));
await _fsExtra.default.mkdirs(_path.default.resolve(directory, 'src'));
const rootFiles = ['_gitignore'];
if (copyCIFiles) rootFiles.push(...['_travis.yml', '_appveyor.yml']);
const srcFiles = ['index.css', 'index.js', 'index.html'];
for (const file of rootFiles) {
await this.copy(_path.default.resolve(tmplDir, file), _path.default.resolve(directory, file.replace(/^_/, '.')));
}
for (const file of srcFiles) {
await this.copy(_path.default.resolve(tmplDir, file), _path.default.resolve(directory, 'src', file));
}
});
await this.initializePackageJSON(directory);
}
async copy(source, target) {
d(`copying "${source}" --> "${target}"`);
await _fsExtra.default.copy(source, target);
}
async copyTemplateFile(destDir, basename) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
await this.copy(_path.default.join(this.templateDir, basename), _path.default.resolve(destDir, basename));
}
async initializePackageJSON(directory) {
await (0, _asyncOra.asyncOra)('Initializing NPM Module', async () => {
const packageJSON = await _fsExtra.default.readJson(_path.default.resolve(__dirname, '../tmpl/package.json')); // eslint-disable-next-line no-multi-assign
packageJSON.productName = packageJSON.name = _path.default.basename(directory).toLowerCase();
packageJSON.author = await (0, _determineAuthor.default)(directory);
packageJSON.scripts.lint = 'echo "No linting configured"';
d('writing package.json to:', directory);
await _fsExtra.default.writeJson(_path.default.resolve(directory, 'package.json'), packageJSON, {
spaces: 2
});
});
}
async updateFileByLine(inputPath, lineHandler, outputPath) {
const fileContents = (await _fsExtra.default.readFile(inputPath, 'utf8')).split('\n').map(lineHandler).join('\n');
await _fsExtra.default.writeFile(outputPath || inputPath, fileContents);
if (outputPath !== undefined) {
await _fsExtra.default.remove(inputPath);
}
}
}
exports.BaseTemplate = BaseTemplate;
var _default = new BaseTemplate();
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9CYXNlVGVtcGxhdGUudHMiXSwibmFtZXMiOlsiY3VycmVudEZvcmdlVmVyc2lvbiIsInJlcXVpcmUiLCJ2ZXJzaW9uIiwiZCIsInRtcGxEaXIiLCJwYXRoIiwicmVzb2x2ZSIsIl9fZGlybmFtZSIsIkJhc2VUZW1wbGF0ZSIsImRldkRlcGVuZGVuY2llcyIsInBhY2thZ2VKU09OUGF0aCIsImpvaW4iLCJ0ZW1wbGF0ZURpciIsImZzIiwicGF0aEV4aXN0c1N5bmMiLCJwYWNrYWdlRGV2RGVwcyIsInJlYWRKc29uU3luYyIsIk9iamVjdCIsImVudHJpZXMiLCJtYXAiLCJwYWNrYWdlTmFtZSIsImluaXRpYWxpemVUZW1wbGF0ZSIsImRpcmVjdG9yeSIsImNvcHlDSUZpbGVzIiwibWtkaXJzIiwicm9vdEZpbGVzIiwicHVzaCIsInNyY0ZpbGVzIiwiZmlsZSIsImNvcHkiLCJyZXBsYWNlIiwiaW5pdGlhbGl6ZVBhY2thZ2VKU09OIiwic291cmNlIiwidGFyZ2V0IiwiY29weVRlbXBsYXRlRmlsZSIsImRlc3REaXIiLCJiYXNlbmFtZSIsInBhY2thZ2VKU09OIiwicmVhZEpzb24iLCJwcm9kdWN0TmFtZSIsIm5hbWUiLCJ0b0xvd2VyQ2FzZSIsImF1dGhvciIsInNjcmlwdHMiLCJsaW50Iiwid3JpdGVKc29uIiwic3BhY2VzIiwidXBkYXRlRmlsZUJ5TGluZSIsImlucHV0UGF0aCIsImxpbmVIYW5kbGVyIiwib3V0cHV0UGF0aCIsImZpbGVDb250ZW50cyIsInJlYWRGaWxlIiwic3BsaXQiLCJ3cml0ZUZpbGUiLCJ1bmRlZmluZWQiLCJyZW1vdmUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUVBOztBQUNBOztBQUVBOzs7Ozs7QUFFQTtBQUNBLE1BQU1BLG1CQUFtQixHQUFHQyxPQUFPLENBQUMsaUJBQUQsQ0FBUCxDQUEyQkMsT0FBdkQ7O0FBRUEsTUFBTUMsQ0FBQyxHQUFHLG9CQUFNLDhCQUFOLENBQVY7O0FBQ0EsTUFB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QUlGLFNBQTNCLEVBQXNDRyxZQUF0QyxDQUFOOztBQUNBLFFBQUlELFVBQVUsS0FBS0ssU0FBbkIsRUFBOEI7QUFDNUIsWUFBTTFDLGlCQUFHMkMsTUFBSCxDQUFVUixTQUFWLENBQU47QUFDRDtBQUNGOztBQXZFZ0Q7Ozs7ZUEwRXBDLElBQUl4QyxZQUFKLEUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhc3luY09yYSB9IGZyb20gJ0BlbGVjdHJvbi1mb3JnZS9hc3luYy1vcmEnO1xuaW1wb3J0IGRlYnVnIGZyb20gJ2RlYnVnJztcbmltcG9ydCB7IEZvcmdlVGVtcGxhdGUsIEluaXRUZW1wbGF0ZU9wdGlvbnMgfSBmcm9tICdAZWxlY3Ryb24tZm9yZ2Uvc2hhcmVkLXR5cGVzJztcbmltcG9ydCBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IGRldGVybWluZUF1dGhvciBmcm9tICcuL2RldGVybWluZS1hdXRob3InO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXZhci1yZXF1aXJlc1xuY29uc3QgY3VycmVudEZvcmdlVmVyc2lvbiA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpLnZlcnNpb247XG5cbmNvbnN0IGQgPSBkZWJ1ZygnZWxlY3Ryb24tZm9yZ2U6dGVtcGxhdGU6YmFzZScpO1xuY29uc3QgdG1wbERpciA9IHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi90bXBsJyk7XG5cbmV4cG9ydCBjbGFzcyBCYXNlVGVtcGxhdGUgaW1wbGVtZW50cyBGb3JnZVRlbXBsYXRlIHtcbiAgcHVibGljIHRlbXBsYXRlRGlyID0gdG1wbERpcjtcblxuICBwdWJsaWMgcmVxdWlyZWRGb3JnZVZlcnNpb24gPSBjdXJyZW50Rm9yZ2VWZXJzaW9uO1xuXG4gIGdldCBkZXZEZXBlbmRlbmNpZXMoKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhY2thZ2VKU09OUGF0aCA9IHBhdGguam9pbih0aGlzLnRlbXBsYXRlRGlyLCAncGFja2FnZS5qc29uJyk7XG4gICAgaWYgKGZzLnBhdGhFeGlzdHNTeW5jKHBhY2thZ2VKU09OUGF0aCkpIHtcbiAgICAgIGNvbnN0IHBhY2thZ2VEZXZEZXBzID0gZnMucmVhZEpzb25TeW5jKHBhY2thZ2VKU09OUGF0aCkuZGV2RGVwZW5kZW5jaWVzO1xuICAgICAgaWYgKHBhY2thZ2VEZXZEZXBzKSB7XG4gICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyhwYWNrYWdlRGV2RGVwcykubWFwKChbcGFja2FnZU5hbWUsIHZlcnNpb25dKSA9PiB7XG4gICAgICAgICAgaWYgKHZlcnNpb24gPT09ICdFTEVDVFJPTl9GT1JHRS9WRVJTSU9OJykge1xuICAgICAgICAgICAgdmVyc2lvbiA9IGN1cnJlbnRGb3JnZVZlcnNpb247XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBgJHtwYWNrYWdlTmFtZX1AJHt2ZXJzaW9ufWA7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBpbml0aWFsaXplVGVtcGxhdGUoZGlyZWN0b3J5OiBzdHJpbmcsIHsgY29weUNJRmlsZXMgfTogSW5pdFRlbXBsYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGFzeW5jT3JhKCdDb3B5aW5nIFN0YXJ0ZXIgRmlsZXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBkKCdjcmVhdGluZyBkaXJlY3Rvcnk6JywgcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSwgJ3NyYycpKTtcbiAgICAgIGF3YWl0IGZzLm1rZGlycyhwYXRoLnJlc29sdmUoZGlyZWN0b3J5LCAnc3JjJykpO1xuICAgICAgY29uc3Qgcm9vdEZpbGVzID0gWydfZ2l0aWdub3JlJ107XG4gICAgICBpZiAoY29weUNJRmlsZXMpIHJvb3RGaWxlcy5wdXNoKC4uLlsnX3RyYXZpcy55bWwnLCAnX2FwcHZleW9yLnltbCddKTtcbiAgICAgIGNvbnN0IHNyY0ZpbGVzID0gWydpbmRleC5jc3MnLCAnaW5kZXguanMnLCAnaW5kZXguaHRtbCddO1xuXG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygcm9vdEZpbGVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY29weShwYXRoLnJlc29sdmUodG1wbERpciwgZmlsZSksIHBhdGgucmVzb2x2ZShkaXJlY3RvcnksIGZpbGUucmVwbGFjZSgvXl8vLCAnLicpKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGZpbGUgb2Ygc3JjRmlsZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5jb3B5KHBhdGgucmVzb2x2ZSh0bXBsRGlyLCBmaWxlKSwgcGF0aC5yZXNvbHZlKGRpcmVjdG9yeSwgJ3NyYycsIGZpbGUpKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZVBhY2thZ2VKU09OKGRpcmVjdG9yeSk7XG4gIH1cblxuICBhc3luYyBjb3B5KHNvdXJjZTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGQoYGNvcHlpbmcgXCIke3NvdXJjZX1cIiAtLT4gXCIke3RhcmdldH1cImApO1xuICAgIGF3YWl0IGZzLmNvcHkoc291cmNlLCB0YXJnZXQpO1xuICB9XG5cbiAgYXN5bmMgY29weVRlbXBsYXRlRmlsZShkZXN0RGlyOiBzdHJpbmcsIGJhc2VuYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLW5vbi1udWxsLWFzc2VydGlvblxuICAgIGF3YWl0IHRoaXMuY29weShwYXRoLmpvaW4odGhpcy50ZW1wbGF0ZURpciEsIGJhc2VuYW1lKSwgcGF0aC5yZXNvbHZlKGRlc3REaXIsIGJhc2VuYW1lKSk7XG4gIH1cblxuICBhc3luYyBpbml0aWFsaXplUGFja2FnZUpTT04oZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBhc3luY09yYSgnSW5pdGlhbGl6aW5nIE5QTSBNb2R1bGUnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBwYWNrYWdlSlNPTiA9IGF3YWl0IGZzLnJlYWRKc29uKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICcuLi90bXBsL3BhY2thZ2UuanNvbicpKTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1tdWx0aS1hc3NpZ25cbiAgICAgIHBhY2thZ2VKU09OLnByb2R1Y3ROYW1lID0gcGFja2FnZUpTT04ubmFtZSA9IHBhdGguYmFzZW5hbWUoZGlyZWN0b3J5KS50b0xvd2VyQ2FzZSgpO1xuICAgICAgcGFja2FnZUpTT04uYXV0aG9yID0gYXdhaXQgZGV0ZXJtaW5lQXV0aG9yKGRpcmVjdG9yeSk7XG5cbiAgICAgIHBhY2thZ2VKU09OLnNjcmlwdHMubGludCA9ICdlY2hvIFwiTm8gbGludGluZyBjb25maWd1cmVkXCInO1xuXG4gICAgICBkKCd3cml0aW5nIHBhY2thZ2UuanNvbiB0bzonLCBkaXJlY3RvcnkpO1xuICAgICAgYXdhaXQgZnMud3JpdGVKc29uKHBhdGgucmVzb2x2ZShkaXJlY3RvcnksICdwYWNrYWdlLmpzb24nKSwgcGFja2FnZUpTT04sIHsgc3BhY2VzOiAyIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRmlsZUJ5TGluZShpbnB1dFBhdGg6IHN0cmluZywgbGluZUhhbmRsZXI6IChsaW5lOiBzdHJpbmcpID0+IHN0cmluZywgb3V0cHV0UGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGZpbGVDb250ZW50cyA9IChhd2FpdCBmcy5yZWFkRmlsZShpbnB1dFBhdGgsICd1dGY4JykpLnNwbGl0KCdcXG4nKS5tYXAobGluZUhhbmRsZXIpLmpvaW4oJ1xcbicpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShvdXRwdXRQYXRoIHx8IGlucHV0UGF0aCwgZmlsZUNvbnRlbnRzKTtcbiAgICBpZiAob3V0cHV0UGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCBmcy5yZW1vdmUoaW5wdXRQYXRoKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgbmV3IEJhc2VUZW1wbGF0ZSgpO1xuIl19