"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.ReadMe = exports.Template = exports.Pkg = void 0; var fs = require("fs"); var path = require("path"); var Pkg = /** @class */ (function () { function Pkg(pkg) { this.pkg = pkg; this.pkg = pkg; } Pkg.fileExists = function (fileName) { return __awaiter(this, void 0, void 0, function () { var stat, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, fs.promises.lstat(fileName)]; case 1: stat = _a.sent(); return [2 /*return*/, stat.isFile()]; case 2: e_1 = _a.sent(); return [2 /*return*/, false]; case 3: return [2 /*return*/]; } }); }); }; Pkg.load = function (process) { return __awaiter(this, void 0, void 0, function () { var pkgLocation, found, pkgContent, pkg; return __generator(this, function (_a) { switch (_a.label) { case 0: pkgLocation = path.join(process.cwd(), 'package.json'); return [4 /*yield*/, Pkg.fileExists(pkgLocation)]; case 1: found = _a.sent(); if (!found) { throw new Error('no package.json found in the root of this directory'); } return [4 /*yield*/, fs.promises.readFile(pkgLocation, 'utf-8')]; case 2: pkgContent = _a.sent(); try { pkg = JSON.parse(pkgContent); return [2 /*return*/, new Pkg(pkg)]; } catch (e) { throw new Error('there was an issue parsing the package.json file'); } return [2 /*return*/]; } }); }); }; Pkg.prototype.parseRepo = function () { var _a; var url = ((_a = this.pkg.repository) === null || _a === void 0 ? void 0 : _a.url) || ''; var result = url.match('https?://github.com/(.+)/(.+).git') || []; var repository = result[0], githubUser = result[1], repoName = result[2]; return { githubUser: githubUser, repoName: repoName, repository: repository }; }; Object.defineProperty(Pkg.prototype, "npmName", { get: function () { return this.pkg.name; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "repoName", { get: function () { return this.parseRepo().repoName; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "githubUser", { get: function () { return this.parseRepo().githubUser; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "description", { get: function () { return this.pkg.description; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "heading", { get: function () { return this.repoName || this.npmName; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "isScoped", { get: function () { return this.pkg.name && this.pkg.name.split('/').length === 2; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "npxExecutable", { get: function () { if (typeof this.pkg.bin === 'undefined') return undefined; if (typeof this.pkg.bin === 'string') { if (this.isScoped) return "" + this.pkg.name; return this.pkg.name; } var primary = Object.keys(this.pkg.bin)[0]; if (this.isScoped) return "-p " + this.pkg.name + " " + primary; if (this.pkg.name === primary) return this.pkg.name; return this.pkg.name + " " + primary; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "globalExecutable", { get: function () { if (typeof this.pkg.bin === 'undefined') return undefined; if (typeof this.pkg.bin === 'string' && this.pkg.name) { var split = this.pkg.name.split('/'); if (split.length === 2) return split[1]; return split[0]; } var primary = Object.keys(this.pkg.bin)[0]; return primary; }, enumerable: false, configurable: true }); Object.defineProperty(Pkg.prototype, "usage", { get: function () { var _this = this; return function (command) { var usage = _this.pkg.usage; if (command && usage) return usage.replace('CMD', command); return command; }; }, enumerable: false, configurable: true }); Pkg.info = function (process) { return __awaiter(this, void 0, void 0, function () { var pkg, i; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Pkg.load(process)]; case 1: pkg = _a.sent(); i = { npmName: pkg.npmName, repoName: pkg.repoName, githubUser: pkg.githubUser, usage: pkg.usage.bind(pkg), description: pkg.description, heading: pkg.heading, npxExecutable: pkg.npxExecutable, globalExecutable: pkg.globalExecutable, }; return [2 /*return*/, i]; } }); }); }; return Pkg; }()); exports.Pkg = Pkg; var Template = /** @class */ (function () { function Template() { } Template.info = function (info) { var x = info; x.info = info; return x; }; Template.readFile = function (filePath) { return __awaiter(this, void 0, void 0, function () { var e_2; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, fs.promises.readFile(filePath, 'utf-8')]; case 1: return [2 /*return*/, _a.sent()]; case 2: e_2 = _a.sent(); return [2 /*return*/, '']; case 3: return [2 /*return*/]; } }); }); }; Template.load = function (fileName, process) { return __awaiter(this, void 0, void 0, function () { var filePath, fileContent, pkg, info, update; return __generator(this, function (_a) { switch (_a.label) { case 0: filePath = path.join(process.cwd(), fileName); return [4 /*yield*/, Template.readFile(filePath)]; case 1: fileContent = _a.sent(); return [4 /*yield*/, Pkg.info(process)]; case 2: pkg = _a.sent(); info = Template.info(__assign(__assign({}, pkg), { fileName: fileName, filePath: filePath, fileContent: fileContent })); update = function (content) { return Template.update(filePath, content); }; return [2 /*return*/, { info: info, update: update }]; } }); }); }; Template.update = function (filePath, content) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, fs.promises.writeFile(filePath, content, 'utf-8')]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; return Template; }()); exports.Template = Template; var ReadMe = /** @class */ (function () { function ReadMe() { } ReadMe.badges = function (_a) { var repoName = _a.repoName, npmName = _a.npmName, githubUser = _a.githubUser; var badges = {}; if (githubUser && repoName) { badges['semantic release'] = { image: "https://github.com/" + githubUser + "/" + repoName + "/workflows/semantic%20release/badge.svg", link: "https://github.com/" + githubUser + "/" + repoName + "/actions?query=workflow%3A%22semantic+release%22", }; badges['coverage'] = { image: "https://github.com/" + githubUser + "/" + repoName + "/workflows/coverage/badge.svg", link: "https://" + githubUser + ".github.io/" + repoName + "/", }; } if (npmName) { badges['npm'] = { image: "https://badge.fury.io/js/" + encodeURIComponent(npmName) + ".svg", link: "https://www.npmjs.com/package/" + npmName, }; } return badges; }; ReadMe.badgeMarkdown = function (info) { var badges = ReadMe.badges(info); return Object.keys(badges).map(function (alt) { var badge = badges[alt]; return "[![" + alt + "](" + badge.image + ")](" + badge.link + ")"; }); }; ReadMe.npmInstall = function (_a) { var npmName = _a.npmName, globalExecutable = _a.globalExecutable, usage = _a.usage; return npmName ? __spreadArrays([ '## Install', '', '```', "npm install " + npmName + (globalExecutable ? ' -g' : '') ], (globalExecutable ? ["" + usage(globalExecutable)] : []), [ '```', ]) : []; }; ReadMe.npxRun = function (_a) { var npxExecutable = _a.npxExecutable, usage = _a.usage; return npxExecutable ? [ '## Use directly via `npx`', '', '```', "npx " + usage(npxExecutable), '```', ] : []; }; ReadMe.transform = function (_a) { var heading = _a.heading, fileContent = _a.fileContent, info = _a.info, description = _a.description; var marker = ''; var keep = (fileContent && fileContent.split(marker)[1]) || ''; var badge = ReadMe.badgeMarkdown(info); var npm = ReadMe.npmInstall(info); var npx = ReadMe.npxRun(info); var template = __spreadArrays([ "# " + (heading || 'untitled') ], (badge.length ? [badge.join(' ')] : []), (description ? [description] : []), (npm.length ? [npm.join('\n')] : []), (npx.length ? [npx.join('\n')] : []), [ marker, ]); return template.join('\n\n') + keep; }; ReadMe.update = function (process) { return __awaiter(this, void 0, void 0, function () { var _a, info, update, content; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, Template.load('README.md', process)]; case 1: _a = _b.sent(), info = _a.info, update = _a.update; content = ReadMe.transform(info); return [2 /*return*/, update(content)]; } }); }); }; ReadMe.cli = function (process) { return __awaiter(this, void 0, void 0, function () { var e_3; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4 /*yield*/, ReadMe.update(process)]; case 1: _a.sent(); process.exit(0); return [3 /*break*/, 3]; case 2: e_3 = _a.sent(); process.stderr.write(e_3.message + '\n'); process.exit(1); return [3 /*break*/, 3]; case 3: return [2 /*return*/]; } }); }); }; return ReadMe; }()); exports.ReadMe = ReadMe; //# sourceMappingURL=readme.js.map