From 3cec47787953821a31a226dc8f5f3a110eec7861 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ionic=C4=83=20Biz=C4=83u?= Date: Mon, 6 Jun 2022 23:40:52 +0300 Subject: [PATCH] Update dependencies, restructure the code --- lib/index.js | 1275 +++++++++++++++---------------- package-lock.json | 1842 ++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- 3 files changed, 2478 insertions(+), 642 deletions(-) diff --git a/lib/index.js b/lib/index.js index 3f724f4..353fcf8 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,21 +1,21 @@ "use strict"; -var Ul = require("ul") - , Abs = require("abs") - , ReadJson = require("r-json") - , WriteJson = require("w-json") - , Moment = require("moment") - , Gry = require("gry") - , IsThere = require("is-there") - , CliPie = require("cli-pie") - , CliGhCal = require("cli-gh-cal") - , GitLogParser = require("gitlog-parser").parse - , ChildProcess = require("child_process") - , Deffy = require("deffy") - , Typpy = require("typpy") - , Spawn = ChildProcess.spawn - , IterateObject = require("iterate-object") - ; +const Ul = require("ul") + , Abs = require("abs") + , ReadJson = require("r-json") + , WriteJson = require("w-json") + , Moment = require("moment") + , Gry = require("gry") + , IsThere = require("is-there") + , CliPie = require("cli-pie") + , CliGhCal = require("cli-gh-cal") + , GitLogParser = require("gitlog-parser").parse + , ChildProcess = require("child_process") + , Deffy = require("deffy") + , Typpy = require("typpy") + , Spawn = ChildProcess.spawn + , IterateObject = require("iterate-object") + ; // Constants const DATE_FORMAT = "MMM D, YYYY" @@ -26,17 +26,629 @@ const DATE_FORMAT = "MMM D, YYYY" , CONFIG_PATH = Abs("~/.git-stats-config.js") ; -/** - * GitStats - * - * @name GitStats - * @function - * @param {String} dataPath Path to the data file. - * @return {GitStats} The `GitStats` instance. - */ -function GitStats(dataPath) { - this.path = Abs(Deffy(dataPath, DEFAULT_STORE)); - this.config = {}; + +class GitStats { + /** + * GitStats + * + * @name GitStats + * @function + * @param {String} dataPath Path to the data file. + * @return {GitStats} The `GitStats` instance. + */ + constructor (dataPath) { + this.path = Abs(Deffy(dataPath, DEFAULT_STORE)); + this.config = {}; + } + + /** + * getConfig + * Fetches the configuration object from file (`~/.git-stats-config.js`). + * + * @name getConfig + * @function + * @param {Function} callback The callback function. + * @return {Object|Undefined} If no callback is provided, the configuration object will be returned. + */ + getConfig (callback) { + let data = {} + , err = null + ; + + try { + data = require(CONFIG_PATH); + } catch (err) { + if (err.code === "MODULE_NOT_FOUND") { + err = null; + data = {}; + } + } + + if (callback) { + return callback(err, data); + } else { + if (err) { + throw err; + } + } + + return data; + } + + /** + * initConfig + * Inits the configuration field (`this.config`). + * + * @name initConfig + * @function + * @param {Object|String} input The path to a custom git-stats configuration file or the configuration object. + * @param {Function} callback The callback function. + */ + initConfig (input, callback) { + + const self = this; + + if (Typpy(input, Function)) { + callback = input; + input = null; + } + + input = input || CONFIG_PATH; + + // Handle object input + if (Typpy(input, Object)) { + this.config = Ul.deepMerge(input, GitStats.DEFAULT_CONFIG); + callback && callback(null, this.config); + return this.config; + } + + if (callback) { + this.getConfig(function (err, data) { + if (err) { return callback(err); } + self.initConfig(data, callback); + }); + } else { + this.initConfig(this.getConfig()); + } + } + + /** + * record + * Records a new commit. + * + * @name record + * @function + * @param {Object} data The commit data containing: + * + * - `date` (String|Date): The date object or a string in a format that can be parsed. + * - `url` (String): The repository remote url. + * - `hash` (String): The commit hash. + * - `_data` (Object): If this field is provided, it should be the content of the git-stats data file as object. It will be modified in-memory and then returned. + * - `save` (Boolean): If `false`, the result will *not* be saved in the file. + * + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + record (data, callback) { + + const self = this; + + // Validate data + callback = callback || function (err) { if (err) throw err; }; + data = Object(data); + + if (typeof data.date === "string") { + data.date = new Moment(new Date(data.date)); + } + + if (!/^moment|date$/.test(Typpy(data.date))) { + callback(new Error("The date field should be a string or a date object.")); + return GitStats; + } else if (Typpy(data.date, Date)) { + data.date = Moment(data.date); + } + + if (typeof data.hash !== "string" || !data.hash) { + callback(new Error("Invalid hash.")); + return GitStats; + } + + // This is not used, but remains here just in case we need + // it in the future + if (typeof data.url !== "string" || !data.url) { + delete data.url; + } + + function modify (err, stats) { + + const commits = stats.commits + , day = data.date.format(DATE_FORMAT) + , today = commits[day] = Object(commits[day]) + ; + + today[data.hash] = 1; + + if (data.save === false) { + callback(null, stats); + } else { + self.save(stats, callback); + } + + return stats; + } + + // Check if we have input data + if (data._data) { + return modify(null, data._data); + } else { + // Get stats + self.get(modify); + } + + return self; + } + + /** + * removeCommit + * Deletes a specifc commit from the history. + * + * @name record + * @function + * @param {Object} data The commit data containing: + * + * - `date` (String|Date): The date object or a string in a format that can be parsed. If not provided, the hash object will be searched in all dates. + * - `hash` (String): The commit hash. + * - `_data` (Object): If this field is provided, it should be the content of the git-stats data file as object. It will be modified in-memory and then returned. + * - `save` (Boolean): If `false`, the result will *not* be saved in the file. + * + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + removeCommit (data, callback) { + + const self = this; + + // Validate data + callback = callback || function (err) { if (err) throw err; }; + data = Object(data); + + if (typeof data.date === "string") { + data.date = new Moment(new Date(data.date)); + } + + if (!/^moment|date$/.test(Typpy(data.date))) { + data.date = null; + } else if (Typpy(data.date, Date)) { + data.date = Moment(data.date); + } + + if (typeof data.hash !== "string" || !data.hash) { + callback(new Error("Invalid hash.")); + return GitStats; + } + + function modify (err, stats) { + + if (err) { return callback(err); } + if (!data.date) { + IterateObject(stats.commits, function (todayObj) { + delete todayObj[data.hash]; + }); + } else { + const commits = stats.commits + , day = data.date.format(DATE_FORMAT) + , today = commits[day] = Object(commits[day]) + ; + + delete today[data.hash]; + } + + if (data.save === false) { + callback(null, stats); + } else { + self.save(stats, callback); + } + + return stats; + } + + // Check if we have input data + if (data._data) { + return modify(null, data._data); + } else { + // Get stats + self.get(modify); + } + + return self; + } + + /** + * get + * Gets the git stats. + * + * @name get + * @function + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + get (callback) { + const self = this; + ReadJson(self.path, function (err, data) { + + if (err && err.code === "ENOENT") { + return self.save(DEFAULT_DATA, function (err) { + callback(err, DEFAULT_DATA); + }); + } + + if (err) { return callback(err); } + callback(null, data); + }); + return self; + } + + /** + * save + * Saves the provided stats. + * + * @name save + * @function + * @param {Object} stats The stats to be saved. + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + save (stats, callback) { + WriteJson(this.path, stats, callback); + return this; + } + + /** + * iterateDays + * Iterate through the days, calling the callback function on each day. + * + * @name iterateDays + * @function + * @param {Object} data An object containing the following fields: + * + * - `start` (Moment): A `Moment` date object representing the start date (default: *an year ago*). + * - `end` (Moment): A `Moment` date object representing the end date (default: *now*). + * - `format` (String): The format of the date (default: `"MMM D, YYYY"`). + * + * @param {Function} callback The callback function called with the current day formatted (type: string) and the `Moment` date object. + * @return {GitStats} The `GitStats` instance. + */ + iterateDays (data, callback) { + + if (typeof data === "function") { + callback = data; + data = undefined; + } + + // Merge the defaults + data.end = data.end || Moment(); + data.start = data.start || Moment().subtract(1, "years"); + data.format = data.format || DATE_FORMAT; + + let start = new Moment(data.start.format(DATE_FORMAT), DATE_FORMAT) + , end = new Moment(data.end.format(DATE_FORMAT), DATE_FORMAT) + , tomrrow = Moment(end.format(DATE_FORMAT), DATE_FORMAT).add(1, "days") + , endStr = tomrrow.format(DATE_FORMAT) + , cDay = null + ; + + while (start.format(DATE_FORMAT) !== endStr) { + cDay = start.format(data.format); + callback(cDay, start); + start.add(1, "days"); + } + + return this; + } + + /** + * graph + * Creates an object with the stats on the provided period (default: *last year*). + * + * @name graph + * @function + * @param {Object} data The object passed to the `iterateDays` method. + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + graph (data, callback) { + + if (typeof data === "function") { + callback = data; + data = undefined; + } + + const self = this; + + // Get commits + self.get(function (err, stats) { + if (err) { return callback(err); } + + let cDayObj = null + , year = {} + ; + + // Iterate days + self.iterateDays(data, function (cDay) { + cDayObj = Object(stats.commits[cDay]); + cDayObj = year[cDay] = { + _: cDayObj + , c: Object.keys(cDayObj).length + }; + }); + + callback(null, year); + }); + + return self; + } + + /** + * calendar + * Creates the calendar data for the provided period (default: *last year*). + * + * @name calendar + * @function + * @param {Object} data The object passed to the `graph` method. + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + calendar (data, callback) { + + const self = this; + + self.graph(data, function (err, graph) { + if (err) { return callback(err); } + + let cal = { total: 0, days: {}, cStreak: 0, lStreak: 0, max: 0 } + , cDay = null + , days = Object.keys(graph) + , levels = null + , cLevel = 0 + ; + + days.forEach(function (c) { + cDay = graph[c]; + cal.total += cDay.c; + if (cDay.c > cal.max) { + cal.max = cDay.c; + } + + if (cDay.c > 0) { + if (++cal.cStreak > cal.lStreak) { + cal.lStreak = cal.cStreak; + } + } else { + cal.cStreak = 0; + } + }); + + levels = cal.max / (LEVELS.length * 2); + days.forEach(function (c) { + cDay = graph[c]; + cal.days[c] = { + c: cDay.c + , level: !levels + ? 0 : (cLevel = Math.round(cDay.c / levels)) >= 4 + ? 4 : !cLevel && cDay.c > 0 ? 1 : cLevel + }; + }); + + callback(null, cal); + }); + return self; + } + + /** + * ansiCalendar + * Creates the ANSI contributions calendar. + * + * @name ansiCalendar + * @function + * @param {Object} options The object passed to the `calendar` method. + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + ansiCalendar (options, callback) { + + if (typeof options === "function") { + callback = options; + options = undefined; + } + + const self = this; + + self.graph(options, function (err, graph) { + let cal = [] + , data = { + theme: options.theme + , start: options.start + , end: options.end + , firstDay: options.firstDay + , cal: cal + , raw: options.raw + } + ; + + self.iterateDays(options, function (cDay) { + const cDayObj = graph[cDay]; + if (!cDayObj) { return; } + cal.push([cDay, cDayObj.c]); + }); + + callback(null, CliGhCal(cal, data)); + }); + + return self; + } + + /** + * authors + * Creates an array with the authors of a git repository. + * + * @name authors + * @function + * @param {String|Object} options The repo path or an object containing the following fields: + * + * - `repo` (String): The repository path. + * - `start` (String): The start date. + * - `end` (String): The end date. + * + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + authors (options, callback) { + const repo = new Gry(options.repo); + repo.exec(['shortlog', '-s', '-n', '--all', '--since', options.start.toString(), '--until', options.end.toString()], function (err, stdout) { + if (err) { return callback(err); } + const lines = stdout.split("\n"); + const pieData = stdout.split("\n").map(function (c) { + const splits = c.split("\t").map(function (cc) { + return cc.trim(); + }); + return { + value: parseInt(splits[0]) + , label: splits[1] + }; + }); + callback(null, pieData); + }); + return this; + } + + /** + * authorsPie + * Creates the authors pie. + * + * @name authorsPie + * @function + * @param {String|Object} options The repo path or an object containing the following fields: + * + * - `repo` (String): The repository path. + * - `radius` (Number): The pie radius. + * - `no_ansi` (Boolean): If `true`, the pie will not contain ansi characters. + * - `raw` (Boolean): If `true`, the raw JSON will be displayed. + * + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + authorsPie (options, callback) { + + if (typeof options === "string") { + options = { + repo: options + }; + } + + options = Ul.merge(options, { + radius: process.stdout.rows / 2 || 20 + }); + + if (!IsThere(options.repo)) { + return callback(new Error("The repository folder doesn't exist.")); + } + + let self = this + , repo = new Gry(options.repo) + , pie = null + , pieData = [] + ; + + self.authors(options, function (err, authors) { + if (err) { return callback(err); } + if (authors.length > 50) { + let others = { + value: authors.slice(50).reduce(function (a, b) { + return a + b.value; + }, 0) + , label: "Others" + }; + authors = authors.slice(0, 50); + authors.push(others); + } + + let data = { + legend: true + , flat: true + , no_ansi: options.no_ansi + , authors: authors + }; + + callback(null, options.raw ? data : new CliPie(options.radius, authors, data).toString()); + }); + + return self; + } + + /** + * globalActivity + * Creates the global contributions calendar (all commits made by all committers). + * + * @name globalActivity + * @function + * @param {String|Object} options The repo path or an object containing the following fields: + * + * - `repo` (String): The repository path. + * - `start` (String): The start date. + * - `end` (String): The end date. + * - `theme` (String|Object): The calendar theme. + * - `raw` (Boolean): If `true`, the raw JSON will be displayed. + * + * @param {Function} callback The callback function. + * @return {GitStats} The `GitStats` instance. + */ + globalActivity (options, callback) { + + if (typeof options === "string") { + options = { + repo: options + }; + } + + options.repo = Abs(options.repo); + + if (!IsThere(options.repo)) { + return callback(new Error("The repository folder doesn't exist.")); + } + + let commits = {} + , today = null + , cal = [] + ; + + let logArgs = ["log","--since", options.start.format(DATE_FORMAT), "--until", options.end.format(DATE_FORMAT)] + if(options.author){ + logArgs = logArgs.concat(["--author", options.author]) + } + + GitLogParser(Spawn("git",logArgs , { cwd: options.repo }).stdout).on("commit", function(commit) { + if (!commit) { return; } + today = Moment(commit.date).format(DATE_FORMAT); + commits[today] = commits[today] || 0; + ++commits[today]; + }).on("error", function (err) { + callback(err); + }).on("finish", function () { + Object.keys(commits).forEach(function (c) { + cal.push([c, commits[c]]) + }); + let data = { + theme: options.theme + , start: options.start + , end: options.end + , cal: cal + , raw: options.raw + }; + callback(null, CliGhCal(cal, data)); + }); + + return this; + } } // Defaults @@ -64,613 +676,4 @@ GitStats.DEFAULT_CONFIG = { , global_activity: false }; -/** - * getConfig - * Fetches the configuration object from file (`~/.git-stats-config.js`). - * - * @name getConfig - * @function - * @param {Function} callback The callback function. - * @return {Object|Undefined} If no callback is provided, the configuration object will be returned. - */ -GitStats.prototype.getConfig = function (callback) { - var data = {} - , err = null - ; - - try { - data = require(CONFIG_PATH); - } catch (err) { - if (err.code === "MODULE_NOT_FOUND") { - err = null; - data = {}; - } - } - - if (callback) { - return callback(err, data); - } else { - if (err) { - throw err; - } - } - - return data; -}; - -/** - * initConfig - * Inits the configuration field (`this.config`). - * - * @name initConfig - * @function - * @param {Object|String} input The path to a custom git-stats configuration file or the configuration object. - * @param {Function} callback The callback function. - */ -GitStats.prototype.initConfig = function (input, callback) { - - var self = this; - - if (Typpy(input, Function)) { - callback = input; - input = null; - } - - input = input || CONFIG_PATH; - - // Handle object input - if (Typpy(input, Object)) { - this.config = Ul.deepMerge(input, GitStats.DEFAULT_CONFIG); - callback && callback(null, this.config); - return this.config; - } - - if (callback) { - this.getConfig(function (err, data) { - if (err) { return callback(err); } - self.initConfig(data, callback); - }); - } else { - this.initConfig(this.getConfig()); - } -}; - -/** - * record - * Records a new commit. - * - * @name record - * @function - * @param {Object} data The commit data containing: - * - * - `date` (String|Date): The date object or a string in a format that can be parsed. - * - `url` (String): The repository remote url. - * - `hash` (String): The commit hash. - * - `_data` (Object): If this field is provided, it should be the content of the git-stats data file as object. It will be modified in-memory and then returned. - * - `save` (Boolean): If `false`, the result will *not* be saved in the file. - * - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.record = function (data, callback) { - - var self = this; - - // Validate data - callback = callback || function (err) { if (err) throw err; }; - data = Object(data); - - if (typeof data.date === "string") { - data.date = new Moment(new Date(data.date)); - } - - if (!/^moment|date$/.test(Typpy(data.date))) { - callback(new Error("The date field should be a string or a date object.")); - return GitStats; - } else if (Typpy(data.date, Date)) { - data.date = Moment(data.date); - } - - if (typeof data.hash !== "string" || !data.hash) { - callback(new Error("Invalid hash.")); - return GitStats; - } - - // This is not used, but remains here just in case we need - // it in the future - if (typeof data.url !== "string" || !data.url) { - delete data.url; - } - - function modify (err, stats) { - - var commits = stats.commits - , day = data.date.format(DATE_FORMAT) - , today = commits[day] = Object(commits[day]) - ; - - today[data.hash] = 1; - - if (data.save === false) { - callback(null, stats); - } else { - self.save(stats, callback); - } - - return stats; - } - - // Check if we have input data - if (data._data) { - return modify(null, data._data); - } else { - // Get stats - self.get(modify); - } - - return self; -}; - -/** - * removeCommit - * Deletes a specifc commit from the history. - * - * @name record - * @function - * @param {Object} data The commit data containing: - * - * - `date` (String|Date): The date object or a string in a format that can be parsed. If not provided, the hash object will be searched in all dates. - * - `hash` (String): The commit hash. - * - `_data` (Object): If this field is provided, it should be the content of the git-stats data file as object. It will be modified in-memory and then returned. - * - `save` (Boolean): If `false`, the result will *not* be saved in the file. - * - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.removeCommit = function (data, callback) { - - var self = this; - - // Validate data - callback = callback || function (err) { if (err) throw err; }; - data = Object(data); - - if (typeof data.date === "string") { - data.date = new Moment(new Date(data.date)); - } - - if (!/^moment|date$/.test(Typpy(data.date))) { - data.date = null; - } else if (Typpy(data.date, Date)) { - data.date = Moment(data.date); - } - - if (typeof data.hash !== "string" || !data.hash) { - callback(new Error("Invalid hash.")); - return GitStats; - } - - function modify (err, stats) { - - if (err) { return callback(err); } - if (!data.date) { - IterateObject(stats.commits, function (todayObj) { - delete todayObj[data.hash]; - }); - } else { - var commits = stats.commits - , day = data.date.format(DATE_FORMAT) - , today = commits[day] = Object(commits[day]) - ; - - delete today[data.hash]; - } - - if (data.save === false) { - callback(null, stats); - } else { - self.save(stats, callback); - } - - return stats; - } - - // Check if we have input data - if (data._data) { - return modify(null, data._data); - } else { - // Get stats - self.get(modify); - } - - return self; -}; - -/** - * get - * Gets the git stats. - * - * @name get - * @function - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.get = function (callback) { - var self = this; - ReadJson(self.path, function (err, data) { - - if (err && err.code === "ENOENT") { - return self.save(DEFAULT_DATA, function (err) { - callback(err, DEFAULT_DATA); - }); - } - - if (err) { return callback(err); } - callback(null, data); - }); - return self; -}; - -/** - * save - * Saves the provided stats. - * - * @name save - * @function - * @param {Object} stats The stats to be saved. - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.save = function (stats, callback) { - WriteJson(this.path, stats, callback); - return this; -}; - -/** - * iterateDays - * Iterate through the days, calling the callback function on each day. - * - * @name iterateDays - * @function - * @param {Object} data An object containing the following fields: - * - * - `start` (Moment): A `Moment` date object representing the start date (default: *an year ago*). - * - `end` (Moment): A `Moment` date object representing the end date (default: *now*). - * - `format` (String): The format of the date (default: `"MMM D, YYYY"`). - * - * @param {Function} callback The callback function called with the current day formatted (type: string) and the `Moment` date object. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.iterateDays = function (data, callback) { - - if (typeof data === "function") { - callback = data; - data = undefined; - } - - // Merge the defaults - data.end = data.end || Moment(); - data.start = data.start || Moment().subtract(1, "years"); - data.format = data.format || DATE_FORMAT; - - var start = new Moment(data.start.format(DATE_FORMAT), DATE_FORMAT) - , end = new Moment(data.end.format(DATE_FORMAT), DATE_FORMAT) - , tomrrow = Moment(end.format(DATE_FORMAT), DATE_FORMAT).add(1, "days") - , endStr = tomrrow.format(DATE_FORMAT) - , cDay = null - ; - - while (start.format(DATE_FORMAT) !== endStr) { - cDay = start.format(data.format); - callback(cDay, start); - start.add(1, "days"); - } - - return this; -}; - -/** - * graph - * Creates an object with the stats on the provided period (default: *last year*). - * - * @name graph - * @function - * @param {Object} data The object passed to the `iterateDays` method. - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.graph = function (data, callback) { - - if (typeof data === "function") { - callback = data; - data = undefined; - } - - var self = this; - - // Get commits - self.get(function (err, stats) { - if (err) { return callback(err); } - - var cDayObj = null - , year = {} - ; - - // Iterate days - self.iterateDays(data, function (cDay) { - cDayObj = Object(stats.commits[cDay]); - cDayObj = year[cDay] = { - _: cDayObj - , c: Object.keys(cDayObj).length - }; - }); - - callback(null, year); - }); - - return self; -}; - -/** - * calendar - * Creates the calendar data for the provided period (default: *last year*). - * - * @name calendar - * @function - * @param {Object} data The object passed to the `graph` method. - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.calendar = function (data, callback) { - - var self = this; - - self.graph(data, function (err, graph) { - if (err) { return callback(err); } - - var cal = { total: 0, days: {}, cStreak: 0, lStreak: 0, max: 0 } - , cDay = null - , days = Object.keys(graph) - , levels = null - , cLevel = 0 - ; - - days.forEach(function (c) { - cDay = graph[c]; - cal.total += cDay.c; - if (cDay.c > cal.max) { - cal.max = cDay.c; - } - - if (cDay.c > 0) { - if (++cal.cStreak > cal.lStreak) { - cal.lStreak = cal.cStreak; - } - } else { - cal.cStreak = 0; - } - }); - - levels = cal.max / (LEVELS.length * 2); - days.forEach(function (c) { - cDay = graph[c]; - cal.days[c] = { - c: cDay.c - , level: !levels - ? 0 : (cLevel = Math.round(cDay.c / levels)) >= 4 - ? 4 : !cLevel && cDay.c > 0 ? 1 : cLevel - }; - }); - - callback(null, cal); - }); - return self; -}; - -/** - * ansiCalendar - * Creates the ANSI contributions calendar. - * - * @name ansiCalendar - * @function - * @param {Object} options The object passed to the `calendar` method. - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.ansiCalendar = function (options, callback) { - - if (typeof options === "function") { - callback = options; - options = undefined; - } - - var self = this; - - self.graph(options, function (err, graph) { - var cal = [] - , data = { - theme: options.theme - , start: options.start - , end: options.end - , firstDay: options.firstDay - , cal: cal - , raw: options.raw - } - ; - - self.iterateDays(options, function (cDay) { - var cDayObj = graph[cDay]; - if (!cDayObj) { return; } - cal.push([cDay, cDayObj.c]); - }); - - callback(null, CliGhCal(cal, data)); - }); - - return self; -}; - -/** - * authors - * Creates an array with the authors of a git repository. - * - * @name authors - * @function - * @param {String|Object} options The repo path or an object containing the following fields: - * - * - `repo` (String): The repository path. - * - `start` (String): The start date. - * - `end` (String): The end date. - * - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.authors = function (options, callback) { - var repo = new Gry(options.repo); - repo.exec(['shortlog', '-s', '-n', '--all', '--since', options.start.toString(), '--until', options.end.toString()], function (err, stdout) { - if (err) { return callback(err); } - var lines = stdout.split("\n"); - var pieData = stdout.split("\n").map(function (c) { - var splits = c.split("\t").map(function (cc) { - return cc.trim(); - }); - return { - value: parseInt(splits[0]) - , label: splits[1] - }; - }); - callback(null, pieData); - }); - return this; -}; - -/** - * authorsPie - * Creates the authors pie. - * - * @name authorsPie - * @function - * @param {String|Object} options The repo path or an object containing the following fields: - * - * - `repo` (String): The repository path. - * - `radius` (Number): The pie radius. - * - `no_ansi` (Boolean): If `true`, the pie will not contain ansi characters. - * - `raw` (Boolean): If `true`, the raw JSON will be displayed. - * - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.authorsPie = function (options, callback) { - - if (typeof options === "string") { - options = { - repo: options - }; - } - - options = Ul.merge(options, { - radius: process.stdout.rows / 2 || 20 - }); - - if (!IsThere(options.repo)) { - return callback(new Error("The repository folder doesn't exist.")); - } - - var self = this - , repo = new Gry(options.repo) - , pie = null - , pieData = [] - ; - - self.authors(options, function (err, authors) { - if (err) { return callback(err); } - if (authors.length > 50) { - var others = { - value: authors.slice(50).reduce(function (a, b) { - return a + b.value; - }, 0) - , label: "Others" - }; - authors = authors.slice(0, 50); - authors.push(others); - } - - var data = { - legend: true - , flat: true - , no_ansi: options.no_ansi - , authors: authors - }; - - callback(null, options.raw ? data : new CliPie(options.radius, authors, data).toString()); - }); - - return self; -}; - -/** - * globalActivity - * Creates the global contributions calendar (all commits made by all committers). - * - * @name globalActivity - * @function - * @param {String|Object} options The repo path or an object containing the following fields: - * - * - `repo` (String): The repository path. - * - `start` (String): The start date. - * - `end` (String): The end date. - * - `theme` (String|Object): The calendar theme. - * - `raw` (Boolean): If `true`, the raw JSON will be displayed. - * - * @param {Function} callback The callback function. - * @return {GitStats} The `GitStats` instance. - */ -GitStats.prototype.globalActivity = function (options, callback) { - - if (typeof options === "string") { - options = { - repo: options - }; - } - - options.repo = Abs(options.repo); - - if (!IsThere(options.repo)) { - return callback(new Error("The repository folder doesn't exist.")); - } - - var commits = {} - , today = null - , cal = [] - ; - - var logArgs = ["log","--since", options.start.format(DATE_FORMAT), "--until", options.end.format(DATE_FORMAT)] - if(options.author){ - logArgs = logArgs.concat(["--author", options.author]) - } - - GitLogParser(Spawn("git",logArgs , { cwd: options.repo }).stdout).on("commit", function(commit) { - if (!commit) { return; } - today = Moment(commit.date).format(DATE_FORMAT); - commits[today] = commits[today] || 0; - ++commits[today]; - }).on("error", function (err) { - callback(err); - }).on("finish", function () { - Object.keys(commits).forEach(function (c) { - cal.push([c, commits[c]]) - }); - var data = { - theme: options.theme - , start: options.start - , end: options.end - , cal: cal - , raw: options.raw - }; - callback(null, CliGhCal(cal, data)); - }); - - return this; -}; - module.exports = GitStats; diff --git a/package-lock.json b/package-lock.json index 5d09ffa..acbe93d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,8 +1,1842 @@ { "name": "git-stats", "version": "2.11.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "git-stats", + "version": "2.11.0", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "abs": "^1.0.0", + "bug-killer": "^4.0.0", + "cli-gh-cal": "^1.4.0", + "cli-pie": "^2.0.0", + "deffy": "^2.2.2", + "gitlog-parser": "0.0.4", + "gry": "^6.1.0", + "is-there": "^4.0.0", + "iterate-object": "^1.1.0", + "moment": "^2.29.3", + "r-json": "^1.0.0", + "tilda": "^4.3.3", + "typpy": "^2.1.0", + "ul": "^5.0.0", + "w-json": "^1.0.0" + }, + "bin": { + "git-stats": "bin/git-stats" + }, + "devDependencies": {} + }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" + }, + "node_modules/abs": { + "version": "1.3.14", + "resolved": "https://registry.npmjs.org/abs/-/abs-1.3.14.tgz", + "integrity": "sha512-PrS26IzwKLWwuURpiKl8wRmJ2KdR/azaVrLEBWG/TALwT20Y7qjtYp1qcMLHA4206hBHY5phv3w4pjf9NPv4Vw==", + "dependencies": { + "ul": "^5.0.0" + } + }, + "node_modules/add-subtract-date": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/add-subtract-date/-/add-subtract-date-1.0.15.tgz", + "integrity": "sha512-MiL4wnMyM999meyCrSA3LME9uZ/b5ptSd0ACDVUoTfutFwvkMyIN7nG7gjrU56WEk5RlFLBghabcgdYwY8s+nQ==" + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-parser": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.2.10.tgz", + "integrity": "sha512-CGKGIbd678lm15IXJXI1cTyOVAnMQw0jES+klW/yIc+GzYccsYanLMhczPIIj2hE64B79g75QfiuWrEWd6nJdg==" + }, + "node_modules/ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ansy": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/ansy/-/ansy-1.0.15.tgz", + "integrity": "sha512-mQyNSn58HN7aEthofkap0hn8jg7/5SJWrB0ypExgcECOwLppc0njH+QBA9X5VMiEN9SM0JlFZWJQGycxxInAqg==", + "dependencies": { + "ansi-styles": "^3.0.0", + "custom-return": "^1.0.0", + "supports-color": "^3.1.2", + "ul": "^5.2.1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/arrs-to-obj": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/arrs-to-obj/-/arrs-to-obj-1.0.12.tgz", + "integrity": "sha512-348sGggQcNrSVF4J009QXjfb5XrxwTw+tjMoOLIUrfRqxmSUf9W/U9hX3XdR5St/sX2Tc994WepBfRjr2BYg1g==" + }, + "node_modules/auto-parse": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/auto-parse/-/auto-parse-1.8.0.tgz", + "integrity": "sha512-Uri4uC+K5cSi5hjM4snFrqPrjqUpwxeSW5EMTPvN7Ju3PlDzmXXDr5tjdzxPvvwgT3J7bmMDJ3Rm625nbrc72A==", + "dependencies": { + "typpy": "2.3.11" + } + }, + "node_modules/auto-parse/node_modules/typpy": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.11.tgz", + "integrity": "sha512-Jh/fykZSaxeKO0ceMAs6agki9T5TNA9kiIR6fzKbvafKpIw8UlNlHhzuqKyi5lfJJ5VojJOx9tooIbyy7vHV/g==", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/barbe": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/barbe/-/barbe-3.0.16.tgz", + "integrity": "sha512-WSJbowJ8dUfDUSWSZzJDD2BP+xwbLdGPbZMStzgUX8UDSS2stPLvi9pwCIsU9k8RXU6x56nIJzJYSfFct3C1+Q==", + "dependencies": { + "iterate-object": "^1.3.2", + "regex-escape": "^3.0.0", + "typpy": "^2.3.1" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" + }, + "node_modules/bug-killer": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/bug-killer/-/bug-killer-4.4.4.tgz", + "integrity": "sha1-luAyK5Q3orBnLXiqzR7SvvEflFo=", + "dependencies": { + "ansi-parser": "^3.2.5", + "couleurs": "^6.0.6", + "daty": "^1.0.7", + "deffy": "^2.2.2", + "typpy": "^2.3.6" + } + }, + "node_modules/byline": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/byline/-/byline-4.2.2.tgz", + "integrity": "sha1-wgOpilsCkIIqk4anjtosvVvNsy8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelo": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/camelo/-/camelo-1.1.14.tgz", + "integrity": "sha512-u2HiBzrRWquCSDvRhbKeNA87pSDqCH2ptTDZ9+LtVvA11B48sIw5JPcADVRsggrMZsL8AqgihJ4j8GcjtfCAfA==", + "dependencies": { + "mocha": "^8.2.0", + "regex-escape": "^3.4.10", + "uc-first-array": "^1.1.10" + } + }, + "node_modules/chalk": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz", + "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dependencies": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.1" + } + }, + "node_modules/class-methods": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/class-methods/-/class-methods-1.0.12.tgz", + "integrity": "sha512-14T82nNlU+OAhPNm4Fw4kJUS8klgt9n1+CdtB6LHvmWC5Wb89TZQ6CuCwEK2YR03O/hT0eHGIpQxtovAnN9CtA==", + "dependencies": { + "exclude-arr": "^1.0.0", + "static-methods": "^1.0.0", + "ul": "^5.2.1" + } + }, + "node_modules/cli-box": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/cli-box/-/cli-box-6.0.10.tgz", + "integrity": "sha512-6jjSF6G1gOXaCyBQJKo3L3lZKxP8jzdECG7FBiA4m2w7K8jBxXXwsMb75fBLwoVwOtKwvgKjLJurw8HU5XNciw==", + "dependencies": { + "ansi-parser": "^3.2.1", + "deffy": "^2.2.1", + "is-undefined": "^1.0.0", + "is-win": "^1.0.0", + "ul": "^5.2.1" + } + }, + "node_modules/cli-circle": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/cli-circle/-/cli-circle-3.2.11.tgz", + "integrity": "sha512-IU+ZgHR0Z9Ga+LqAeWefV9e5K7guBTXxxnzv9PYHA/t8LitBgGpZUYEJEINloiv3QlqbWnt5N5Dw+EyJSujR3g==", + "dependencies": { + "cli-graph": "^3.0.0", + "typpy": "^2.3.3", + "ul": "^5.0.0" + } + }, + "node_modules/cli-gh-cal": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/cli-gh-cal/-/cli-gh-cal-1.4.13.tgz", + "integrity": "sha512-wNYMn0PM7XVcRaQ9DEI6ZRB9ZId8jpG9cprOo3QoV1KMm2WL3eSrPIXsqQxANsFeYQM4cgosJhqsTBKcDIZ6Vg==", + "dependencies": { + "ansi-parser": "^3.0.0", + "bug-killer": "^4.2.5", + "cli-box": "^6.0.5", + "couleurs": "^6.0.5", + "deffy": "^2.0.0", + "git-stats-colors": "^2.3.8", + "moment": "^2.9.0", + "tilda": "^4.3.3", + "typpy": "^2.0.0", + "ul": "^5.0.0", + "window-size": "^1.1.1" + }, + "bin": { + "cli-gh-cal": "bin/cli-gh-cal" + } + }, + "node_modules/cli-graph": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/cli-graph/-/cli-graph-3.2.2.tgz", + "integrity": "sha1-1oEKJjqxCXG+aIJ59n+smPjfdDo=", + "dependencies": { + "ul": "5.0.0" + } + }, + "node_modules/cli-graph/node_modules/deffy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.0.0.tgz", + "integrity": "sha1-+C4I7qUYxKCjCx8D7FBNJIryiTI=", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/cli-graph/node_modules/typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=" + }, + "node_modules/cli-graph/node_modules/ul": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.0.0.tgz", + "integrity": "sha1-yoDXkwJfP9Xcm/g0aYGNMQp8mmI=", + "dependencies": { + "deffy": "2.0.0", + "typpy": "2.0.0" + } + }, + "node_modules/cli-pie": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/cli-pie/-/cli-pie-2.4.2.tgz", + "integrity": "sha512-/ixPjwAwH4wt2LHDN4IuOGyp+IdwASQXQTTLggaZWoCMr6ZAaRZItE7pCqKlgge3bj8TWF956Sli3g/Hmt5CVQ==", + "dependencies": { + "cli-circle": "^3.0.0", + "couleurs": "^5.0.0", + "flatcolors": "^3.0.0", + "ul": "^5.0.0" + } + }, + "node_modules/cli-pie/node_modules/couleurs": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-5.2.1.tgz", + "integrity": "sha1-U5n596FZhS7BQkT4Qb2FjwTcUqM=", + "dependencies": { + "flat-colors": "3.0.0", + "typpy": "2.0.0", + "x256": "0.0.2" + } + }, + "node_modules/cli-pie/node_modules/typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=" + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clp": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/clp/-/clp-4.0.12.tgz", + "integrity": "sha512-DOQX14xsm4mM06JVzB/5nTk+tBdst+mFffz1OK4TWPa6++M/J7TJWuciXVwCRxTFzY2f+FRQARUu8+uqgQBpUQ==", + "dependencies": { + "is-number": "^2.1.0", + "last-char": "^1.3.1", + "match-it": "^1.0.0" + } + }, + "node_modules/clp/node_modules/is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/couleurs": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-6.0.11.tgz", + "integrity": "sha512-y5WUDtgQKw/tVViZCj3ACX8VseU0ONxiet8SRsE89uH4s/otRLXGOMymfVbKMFzedKOdxQpTcYWukRwkvgRYdw==", + "dependencies": { + "ansy": "^1.0.0", + "color-convert": "^1.0.0", + "iterate-object": "^1.3.1", + "typpy": "^2.3.1" + } + }, + "node_modules/custom-return": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/custom-return/-/custom-return-1.0.12.tgz", + "integrity": "sha512-Xy6IlEV6gW5Iu4YRoQe0A5RG1mzezawcTXzAk7u28oB2UilRfbbOc1C7RmWE6AJ1inSm8gghCkIpo0LUQfLbvw==", + "dependencies": { + "noop6": "^1.0.0" + } + }, + "node_modules/date-unit-ms": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/date-unit-ms/-/date-unit-ms-1.1.14.tgz", + "integrity": "sha512-6vUHdMQkblV8lKYQqnTM2kUmWlFVG6F/0mzUbcnNygcR2vuUPeHAIE7BO7mj/brmgV1INSAG9D2GpgTLOEOHvg==" + }, + "node_modules/daty": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/daty/-/daty-1.2.1.tgz", + "integrity": "sha512-0ScX8eww2sJ1fnJuuLhP6JXonVrIIJZiVlGL6ve+Dnv3vPVFf3ZMDlose5+h/SnR4gQ1nmG3acoBP3Slycr4ag==", + "dependencies": { + "add-subtract-date": "^1.0.0", + "class-methods": "^1.0.4", + "date-unit-ms": "^1.1.0", + "diff-dates": "^1.0.0", + "formatoid": "^1.0.0" + } + }, + "node_modules/days": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/days/-/days-1.1.1.tgz", + "integrity": "sha512-vzeIwVsEIyA35GH4+mPd4hjVDNI87wYANyZFs0BHjBr5kIBH5zEl7LfD6Wr4SFZca4D3CU9IH1w4DuZLlXzKRw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug-mode": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/debug-mode/-/debug-mode-2.0.2.tgz", + "integrity": "sha512-uOGKcpU0ZSADgNKzyoZ3I3Sj5xAgGGOavQKhH60sTrW4+EtOa2MDrcop+XUdRmLqI4p0rjSrqPcQbwlBtLLhRw==" + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deffy": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.2.4.tgz", + "integrity": "sha512-pLc9lsbsWjr6RxmJ2OLyvm+9l4j1yK69h+TML/gUit/t3vTijpkNGh8LioaJYTGO7F25m6HZndADcUOo2PsiUg==", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/diff": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", + "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-dates": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/diff-dates/-/diff-dates-1.0.14.tgz", + "integrity": "sha512-JbWO1wl9jJZdLPLK/nENeUL68Mv7+SQQrXlEPSxuzZid89+FXpl7xSGxbPGd5z/2Xx3KJe4+fHPpaKnWnZ8V3w==", + "dependencies": { + "date-unit-ms": "^1.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/err": { + "version": "2.1.12", + "resolved": "https://registry.npmjs.org/err/-/err-2.1.12.tgz", + "integrity": "sha512-C0XHNJOnH072AC8q0L5oclAZvBCD8nzBb24bcHSqEkurDHyRo6bpOztgddHtH4Ik/9evmBCVW0nEY0NdnSt46Q==", + "dependencies": { + "barbe": "^3.0.4", + "iterate-object": "^1.3.1", + "typpy": "^2.2.0" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/exclude-arr": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/exclude-arr/-/exclude-arr-1.0.11.tgz", + "integrity": "sha512-yQVFDXkkpDOhSPGOu2yG4fKmDsBiufj2M5uJRS6ijcLW7/pUvCxAHJ2YQTJUkLJ4nWbl+XZn/qwMzrWYfWFgFg==" + }, + "node_modules/exec-limiter": { + "version": "3.2.13", + "resolved": "https://registry.npmjs.org/exec-limiter/-/exec-limiter-3.2.13.tgz", + "integrity": "sha512-86Ri699bwiHZVBzTzNj8gspqAhCPchg70zPVWIh3qzUOA1pUMcb272Em3LPk8AE0mS95B9yMJhtqF8vFJAn0dA==", + "dependencies": { + "limit-it": "^3.0.0", + "typpy": "^2.1.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fillo": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/fillo/-/fillo-1.0.13.tgz", + "integrity": "sha512-9LYJ0ww96DUYETd2Bia5NS1b8rj42nEE5zsfcUwDErMopTs6BRBe4dRIVjrZGXSiK4vNSL/Q3u0dyqbmkA2Zdg==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-colors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flat-colors/-/flat-colors-3.0.0.tgz", + "integrity": "sha1-JTqxojmJwyHxOwrNS/c//0By7Lc=" + }, + "node_modules/flatcolors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/flatcolors/-/flatcolors-3.0.0.tgz", + "integrity": "sha1-Q5MoO3M1qJsuTUcKqWb4zYofqz0=" + }, + "node_modules/formatoid": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/formatoid/-/formatoid-1.2.4.tgz", + "integrity": "sha512-9wWHOPJvbIheSpiHGl0xaBwdszlzPaeh2KqHVexGQnKpO85xrMoKvuf6M3q0B4uC3I9lkXjH6+8ipQC8PQ/7Gw==", + "dependencies": { + "days": "^1.0.1", + "fillo": "^1.0.0", + "months": "^1.0.0", + "parse-it": "^1.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function.name": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/function.name/-/function.name-1.0.13.tgz", + "integrity": "sha512-mVrqdoy5npWZyoXl4DxCeuVF6delDcQjVS9aPdvLYlBxtMTZDR2B5GVEQEoM1jJyspCqg3C0v4ABkLE7tp9xFA==", + "dependencies": { + "noop6": "^1.0.1" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/git-stats-colors": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/git-stats-colors/-/git-stats-colors-2.3.13.tgz", + "integrity": "sha512-PknbZgyly9nwNlK5V1K27dM714bxT8y0PPjhg2TGZnI7lBvsrfJkS7fVVVPgihsd5ceWatsaHw/cQn2ULbMhhg==", + "dependencies": { + "couleurs": "^6.0.5" + } + }, + "node_modules/gitlog-parser": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/gitlog-parser/-/gitlog-parser-0.0.4.tgz", + "integrity": "sha1-YtuYR2UZv637TA05MbG/MB4I8fY=", + "dependencies": { + "byline": "^4.1.1" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "engines": { + "node": ">=4.x" + } + }, + "node_modules/gry": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gry/-/gry-6.1.0.tgz", + "integrity": "sha512-zwTDU/VR4QSNa2NFnAPh0io88mdyGZypL11isQPf72LAOZ0JTNF8hNSV8xt1571DjcnKwiOhVNPwANtUoRZemA==", + "dependencies": { + "abs": "^1.2.1", + "exec-limiter": "^3.0.0", + "one-by-one": "^3.0.0", + "ul": "^5.0.0" + } + }, + "node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/indento": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/indento/-/indento-1.1.13.tgz", + "integrity": "sha512-YZWk3mreBEM7sBPddsiQnW9Z8SGg/gNpFfscJq00HCDS7pxcQWWWMSVKJU7YkTRyDu1Zv2s8zaK8gQWKmCXHlg==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-empty-obj": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/is-empty-obj/-/is-empty-obj-1.0.12.tgz", + "integrity": "sha512-qHBAsU2hONx/K5o0VwTLRVfHb/cAsJY8+cYLLQBupCdKu0v5bxT83K9Dr997Go7gIoc4J6J0pD5qIIIvBFQZBQ==" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-there": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/is-there/-/is-there-4.5.1.tgz", + "integrity": "sha512-vIZ7HTXAoRoIwYSsTnxb0sg9L6rth+JOulNcavsbskQkCIWoSM2cjFOWZs4wGziGZER+Xgs/HXiCQZgiL8ppxQ==" + }, + "node_modules/is-undefined": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/is-undefined/-/is-undefined-1.0.11.tgz", + "integrity": "sha512-gRwyH8IRpV73MDlVefPllIjxBjrP9YAB0YCLtxnROhRkedTSzzBJgfxTC6HgP2/dttawQHWNZe88MvXS9Hbn/g==" + }, + "node_modules/is-win": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-win/-/is-win-1.0.10.tgz", + "integrity": "sha512-tJ9PPj5RW2RUaZ2lAIVRqQjMSynA44Ln89h+Ue+pOecoWIv6dLHvN6dtLxeCi/h5epPJPSVyuaNObLAMq62OEA==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/iterate-object": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/iterate-object/-/iterate-object-1.3.4.tgz", + "integrity": "sha512-4dG1D1x/7g8PwHS9aK6QV5V94+ZvyP4+d19qDv43EzImmrndysIl4prmJ1hWWIGCqrZHyaHBm6BSEWHOLnpoNw==" + }, + "node_modules/js-yaml": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", + "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/last-char": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/last-char/-/last-char-1.3.11.tgz", + "integrity": "sha512-Thgr0MN085/Eo1UulZKOJy+HMoXSbw9CZ2iPqVxr6nFoIAUo6pkVc25wEU0A8cAz22wv2ZEPrlxhnguBmQ0CPA==" + }, + "node_modules/le-table": { + "version": "6.1.10", + "resolved": "https://registry.npmjs.org/le-table/-/le-table-6.1.10.tgz", + "integrity": "sha512-ZpNb2ekquwQdsZUA/xwY6b/RzPpMbHdlOLnO7mimHuKOiNBSpRI+TXRIrBtUgS9t7crYKRrrJz6/7TVFen/ahg==", + "dependencies": { + "ansi-parser": "^3.2.1", + "cli-box": "^6.0.0", + "overlap": "^2.2.1", + "ul": "^5.2.1" + } + }, + "node_modules/limit-it": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/limit-it/-/limit-it-3.2.10.tgz", + "integrity": "sha512-T0NK99pHnkimldr1WUqvbGV1oWDku/xC9J/OqzJFsV1jeOS6Bwl8W7vkeQIBqwiON9dTALws+rX/XPMQqWerDQ==", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/match-it": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/match-it/-/match-it-1.0.9.tgz", + "integrity": "sha512-l5qvhHYTFi86C+xBfxt/u0VaxVP6zP+E9RfGsxOK9no3fGNioCnntKvq400iys3tWTJd5JoR42DNpt8tEgrx7A==" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", + "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.1", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.0.0", + "log-symbols": "4.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.20", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 10.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/moment": { + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==", + "engines": { + "node": "*" + } + }, + "node_modules/months": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/months/-/months-1.2.0.tgz", + "integrity": "sha512-zFM7hUpziSYGk2DNObYGWgHdRRxAOgjl8CC1Rbl50p/q0rGDsREfk0nbxxmSIquVi/lEAuUY8nwbwkZ8biNCOQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/nanoid": { + "version": "3.1.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", + "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/noop6": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/noop6/-/noop6-1.0.9.tgz", + "integrity": "sha512-DB3Hwyd89dPr5HqEPg3YHjzvwh/mCqizC1zZ8vyofqc+TQRyPDnT4wgXXbLGF4z9YAzwwTLi8pNLhGqcbSjgkA==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/obj-def": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/obj-def/-/obj-def-1.0.9.tgz", + "integrity": "sha512-bQ4ya3VYD6FAA1+s6mEhaURRHSmw4+sKaXE6UyXZ1XDYc5D+c7look25dFdydmLd18epUegh398gdDkMUZI9xg==", + "dependencies": { + "deffy": "^2.2.2" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-by-one": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/one-by-one/-/one-by-one-3.2.8.tgz", + "integrity": "sha512-HR/pSzZdm46Xqj58K+Bu64kMbSTw8/u77AwWvV+rprO/OsuR++pPlkUJn+SmwqBGRgHKwSKQ974V3uls7crIeQ==", + "dependencies": { + "obj-def": "^1.0.0", + "sliced": "^1.0.1" + } + }, + "node_modules/overlap": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/overlap/-/overlap-2.2.10.tgz", + "integrity": "sha512-LtHwP1Xny/vEmLo+5sHFYUu9xbOIlOwmy6wsMWPojsYtjDLgjtfLbWV6HTwgEx6FKryK7gPW9S2EmUDI9wjBQQ==", + "dependencies": { + "ansi-parser": "3.0.0", + "cli-box": "5.0.0", + "couleurs": "5.0.0" + } + }, + "node_modules/overlap/node_modules/ansi-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-parser/-/ansi-parser-3.0.0.tgz", + "integrity": "sha1-lFwOcjLK9WdSFzdbPriJIAjBRik=" + }, + "node_modules/overlap/node_modules/cli-box": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-box/-/cli-box-5.0.0.tgz", + "integrity": "sha1-hw6oqnfnwlF5QWzsz+XtBpCARgI=", + "dependencies": { + "ansi-parser": "3.0.0", + "ul": "5.0.0" + } + }, + "node_modules/overlap/node_modules/couleurs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/couleurs/-/couleurs-5.0.0.tgz", + "integrity": "sha1-HNOs5cyhvsAEFXiydGSyZ2OH9ts=", + "dependencies": { + "flat-colors": "3.0.0", + "typpy": "2.0.0", + "x256": "0.0.2" + } + }, + "node_modules/overlap/node_modules/deffy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/deffy/-/deffy-2.0.0.tgz", + "integrity": "sha1-+C4I7qUYxKCjCx8D7FBNJIryiTI=", + "dependencies": { + "typpy": "^2.0.0" + } + }, + "node_modules/overlap/node_modules/typpy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.0.0.tgz", + "integrity": "sha1-re87rMEv9Hr/kg+rA6j/MnnXN9Y=" + }, + "node_modules/overlap/node_modules/ul": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.0.0.tgz", + "integrity": "sha1-yoDXkwJfP9Xcm/g0aYGNMQp8mmI=", + "dependencies": { + "deffy": "2.0.0", + "typpy": "2.0.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-it": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/parse-it/-/parse-it-1.0.10.tgz", + "integrity": "sha512-VAG4EuoNd2TT2wSRUuKyLEkZR3MhdWc+3UPp5CDQzqSt/FiniG+yJ5RXyJYiuzVAMEKL4d97gx6O3LR5jEB3uQ==", + "dependencies": { + "regex-escape": "^3.4.0" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prompt-sync": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/prompt-sync/-/prompt-sync-4.2.0.tgz", + "integrity": "sha512-BuEzzc5zptP5LsgV5MZETjDaKSWfchl5U9Luiu8SKp7iZWD5tZalOxvNcZRwv+d2phNFr8xlbxmFNcRKfJOzJw==", + "dependencies": { + "strip-ansi": "^5.0.0" + } + }, + "node_modules/prompt-sync/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/prompt-sync/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/promptify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promptify/-/promptify-2.0.1.tgz", + "integrity": "sha512-+RHLo1+rfntA2Y76tiMo2uGTvS2afybMawR4PuJo24SUAqJCAMdaxDuo2uMsDNFJod09bVXYTAjpi+I+mGzoyA==", + "dependencies": { + "is-win": "^1.0.4", + "ul": "^5.2.9" + } + }, + "node_modules/r-json": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/r-json/-/r-json-1.2.10.tgz", + "integrity": "sha512-hu9vyLjSlHXT62NAS7DjI9WazDlvjN0lgp3n431dCVnirVcLkZIpzSwA3orhZEKzdDD2jqNYI+w0yG0aFf4kpA==" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regex-escape": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/regex-escape/-/regex-escape-3.4.10.tgz", + "integrity": "sha512-qEqf7uzW+iYcKNLMDFnMkghhQBnGdivT6KqVQyKsyjSWnoFyooXVnxrw9dtv3AFLnD6VBGXxtZGAQNFGFTnCqA==" + }, + "node_modules/remove-blank-lines": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/remove-blank-lines/-/remove-blank-lines-1.4.1.tgz", + "integrity": "sha512-NEs3uvzpaZscL9qFGIHMO7iFy45/nRQC0bBeIMys8UDJT5CX/OcgDeRpcmwXGcr9Ez+IYZka7w0xhA9pEs7Cag==" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "node_modules/static-methods": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/static-methods/-/static-methods-1.0.12.tgz", + "integrity": "sha512-QreySTr3LHtHk0OhrZ3RKvrV/4nBRyUPPCycmTUQTENIopEaDalZzI+q+KfmNmcxeHhA3WKe3h25lAxXZEDGVw==" + }, + "node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tilda": { + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/tilda/-/tilda-4.4.16.tgz", + "integrity": "sha512-5zDX3G4rQKPW/xug3odKzTPbeEq5jJW94PufTHWbObvXMo+e/ReMMX8eykUjYUIA+WSWl2tDb+30Kc1IS0VZLA==", + "dependencies": { + "ansi-parser": "^3.2.1", + "arrs-to-obj": "^1.0.0", + "auto-parse": "^1.2.0", + "camelo": "^1.1.2", + "clp": "^4.0.0", + "debug-mode": "^2.0.0", + "deffy": "^2.2.1", + "err": "^2.1.0", + "indento": "^1.1.1", + "is-empty-obj": "^1.0.1", + "is-undefined": "^1.0.0", + "iterate-object": "^1.3.2", + "le-table": "^6.1.0", + "prompt-sync": "^4.1.4", + "promptify": "^2.0.0", + "r-json": "^1.2.1", + "remove-blank-lines": "^1.0.1", + "typpy": "^2.3.1", + "ul": "^5.2.1", + "wrap-text": "^1.0.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typpy": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/typpy/-/typpy-2.3.13.tgz", + "integrity": "sha512-vOxIcQz9sxHi+rT09SJ5aDgVgrPppQjwnnayTrMye1ODaU8gIZTDM19t9TxmEElbMihx2Nq/0/b/MtyKfayRqA==", + "dependencies": { + "function.name": "^1.0.3" + } + }, + "node_modules/uc-first-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/uc-first-array/-/uc-first-array-1.1.10.tgz", + "integrity": "sha512-tX2PJLrqtexTxVN9hTTY+K5gPnF2gyj7SfjPF4Q2Xhbi1fSNiO12I/G+AoMzxJLwr9R50CmVn8iAhWCvZlJm3A==", + "dependencies": { + "ucfirst": "^1.0.0" + } + }, + "node_modules/ucfirst": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ucfirst/-/ucfirst-1.0.0.tgz", + "integrity": "sha1-ThBbZEjQXiZOzsQ14LkZNjxfLy8=" + }, + "node_modules/ul": { + "version": "5.2.15", + "resolved": "https://registry.npmjs.org/ul/-/ul-5.2.15.tgz", + "integrity": "sha512-svLEUy8xSCip5IWnsRa0UOg+2zP0Wsj4qlbjTmX6GJSmvKMHADBuHOm1dpNkWqWPIGuVSqzUkV3Cris5JrlTRQ==", + "dependencies": { + "deffy": "^2.2.2", + "typpy": "^2.3.4" + } + }, + "node_modules/w-json": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/w-json/-/w-json-1.3.10.tgz", + "integrity": "sha512-XadVyw0xE+oZ5FGApXsdswv96rOhStzKqL53uSe5UaTadABGkWIg1+DTx8kiZ/VqTZTBneoL0l65RcPe4W3ecw==" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/window-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-1.1.1.tgz", + "integrity": "sha512-5D/9vujkmVQ7pSmc0SCBmHXbkv6eaHwXEx65MywhmUMsI8sGqJ972APq1lotfcwMKPFLuCFfL8xGHLIp7jaBmA==", + "dependencies": { + "define-property": "^1.0.0", + "is-number": "^3.0.0" + }, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/window-size/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", + "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-text": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/wrap-text/-/wrap-text-1.0.9.tgz", + "integrity": "sha512-NWfjspSgMDXQIMpKM56AwCQPI01OMFRYYJBh6dGNCfH7AOl+j/VqqbiopgJ4VuQfSluqLc+2ekqaPNpYAGZ/Vg==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/x256": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", + "integrity": "sha1-ya8Yh296F1gB1WT+cK2egxd4STQ=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + }, "dependencies": { "@ungap/promise-all-settled": { "version": "1.1.2", @@ -938,9 +2772,9 @@ } }, "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + "version": "2.29.3", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz", + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==" }, "months": { "version": "1.2.0", diff --git a/package.json b/package.json index e950e06..c0f219c 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,6 @@ "Fabian Furger " ], "license": "MIT", - "devDependencies": {}, "repository": { "type": "git", "url": "https://github.com/IonicaBizau/git-stats.git" @@ -42,7 +41,7 @@ "gry": "^6.1.0", "is-there": "^4.0.0", "iterate-object": "^1.1.0", - "moment": "^2.9.0", + "moment": "^2.29.3", "r-json": "^1.0.0", "tilda": "^4.3.3", "typpy": "^2.1.0",