UNPKG

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
"use strict"; 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