"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __commonJS = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); var __publicField = (obj, key, value) => { __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); return value; }; // node_modules/dayjs/dayjs.min.js var require_dayjs_min = __commonJS({ "node_modules/dayjs/dayjs.min.js"(exports, module2) { !function(t, e) { "object" == typeof exports && "undefined" != typeof module2 ? module2.exports = e() : "function" == typeof define && define.amd ? define(e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).dayjs = e(); }(exports, function() { "use strict"; var t = 1e3, e = 6e4, n = 36e5, r = "millisecond", i = "second", s = "minute", u = "hour", a = "day", o = "week", c = "month", f = "quarter", h = "year", d = "date", l = "Invalid Date", $ = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/, y = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g, M = { name: "en", weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), ordinal: function(t2) { var e2 = ["th", "st", "nd", "rd"], n2 = t2 % 100; return "[" + t2 + (e2[(n2 - 20) % 10] || e2[n2] || e2[0]) + "]"; } }, m = function(t2, e2, n2) { var r2 = String(t2); return !r2 || r2.length >= e2 ? t2 : "" + Array(e2 + 1 - r2.length).join(n2) + t2; }, v = { s: m, z: function(t2) { var e2 = -t2.utcOffset(), n2 = Math.abs(e2), r2 = Math.floor(n2 / 60), i2 = n2 % 60; return (e2 <= 0 ? "+" : "-") + m(r2, 2, "0") + ":" + m(i2, 2, "0"); }, m: function t2(e2, n2) { if (e2.date() < n2.date()) return -t2(n2, e2); var r2 = 12 * (n2.year() - e2.year()) + (n2.month() - e2.month()), i2 = e2.clone().add(r2, c), s2 = n2 - i2 < 0, u2 = e2.clone().add(r2 + (s2 ? -1 : 1), c); return +(-(r2 + (n2 - i2) / (s2 ? i2 - u2 : u2 - i2)) || 0); }, a: function(t2) { return t2 < 0 ? Math.ceil(t2) || 0 : Math.floor(t2); }, p: function(t2) { return { M: c, y: h, w: o, d: a, D: d, h: u, m: s, s: i, ms: r, Q: f }[t2] || String(t2 || "").toLowerCase().replace(/s$/, ""); }, u: function(t2) { return void 0 === t2; } }, g = "en", D = {}; D[g] = M; var p = function(t2) { return t2 instanceof b; }, S = function t2(e2, n2, r2) { var i2; if (!e2) return g; if ("string" == typeof e2) { var s2 = e2.toLowerCase(); D[s2] && (i2 = s2), n2 && (D[s2] = n2, i2 = s2); var u2 = e2.split("-"); if (!i2 && u2.length > 1) return t2(u2[0]); } else { var a2 = e2.name; D[a2] = e2, i2 = a2; } return !r2 && i2 && (g = i2), i2 || !r2 && g; }, w = function(t2, e2) { if (p(t2)) return t2.clone(); var n2 = "object" == typeof e2 ? e2 : {}; return n2.date = t2, n2.args = arguments, new b(n2); }, O = v; O.l = S, O.i = p, O.w = function(t2, e2) { return w(t2, { locale: e2.$L, utc: e2.$u, x: e2.$x, $offset: e2.$offset }); }; var b = function() { function M2(t2) { this.$L = S(t2.locale, null, true), this.parse(t2); } var m2 = M2.prototype; return m2.parse = function(t2) { this.$d = function(t3) { var e2 = t3.date, n2 = t3.utc; if (null === e2) return /* @__PURE__ */ new Date(NaN); if (O.u(e2)) return /* @__PURE__ */ new Date(); if (e2 instanceof Date) return new Date(e2); if ("string" == typeof e2 && !/Z$/i.test(e2)) { var r2 = e2.match($); if (r2) { var i2 = r2[2] - 1 || 0, s2 = (r2[7] || "0").substring(0, 3); return n2 ? new Date(Date.UTC(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2)) : new Date(r2[1], i2, r2[3] || 1, r2[4] || 0, r2[5] || 0, r2[6] || 0, s2); } } return new Date(e2); }(t2), this.$x = t2.x || {}, this.init(); }, m2.init = function() { var t2 = this.$d; this.$y = t2.getFullYear(), this.$M = t2.getMonth(), this.$D = t2.getDate(), this.$W = t2.getDay(), this.$H = t2.getHours(), this.$m = t2.getMinutes(), this.$s = t2.getSeconds(), this.$ms = t2.getMilliseconds(); }, m2.$utils = function() { return O; }, m2.isValid = function() { return !(this.$d.toString() === l); }, m2.isSame = function(t2, e2) { var n2 = w(t2); return this.startOf(e2) <= n2 && n2 <= this.endOf(e2); }, m2.isAfter = function(t2, e2) { return w(t2) < this.startOf(e2); }, m2.isBefore = function(t2, e2) { return this.endOf(e2) < w(t2); }, m2.$g = function(t2, e2, n2) { return O.u(t2) ? this[e2] : this.set(n2, t2); }, m2.unix = function() { return Math.floor(this.valueOf() / 1e3); }, m2.valueOf = function() { return this.$d.getTime(); }, m2.startOf = function(t2, e2) { var n2 = this, r2 = !!O.u(e2) || e2, f2 = O.p(t2), l2 = function(t3, e3) { var i2 = O.w(n2.$u ? Date.UTC(n2.$y, e3, t3) : new Date(n2.$y, e3, t3), n2); return r2 ? i2 : i2.endOf(a); }, $2 = function(t3, e3) { return O.w(n2.toDate()[t3].apply(n2.toDate("s"), (r2 ? [0, 0, 0, 0] : [23, 59, 59, 999]).slice(e3)), n2); }, y2 = this.$W, M3 = this.$M, m3 = this.$D, v2 = "set" + (this.$u ? "UTC" : ""); switch (f2) { case h: return r2 ? l2(1, 0) : l2(31, 11); case c: return r2 ? l2(1, M3) : l2(0, M3 + 1); case o: var g2 = this.$locale().weekStart || 0, D2 = (y2 < g2 ? y2 + 7 : y2) - g2; return l2(r2 ? m3 - D2 : m3 + (6 - D2), M3); case a: case d: return $2(v2 + "Hours", 0); case u: return $2(v2 + "Minutes", 1); case s: return $2(v2 + "Seconds", 2); case i: return $2(v2 + "Milliseconds", 3); default: return this.clone(); } }, m2.endOf = function(t2) { return this.startOf(t2, false); }, m2.$set = function(t2, e2) { var n2, o2 = O.p(t2), f2 = "set" + (this.$u ? "UTC" : ""), l2 = (n2 = {}, n2[a] = f2 + "Date", n2[d] = f2 + "Date", n2[c] = f2 + "Month", n2[h] = f2 + "FullYear", n2[u] = f2 + "Hours", n2[s] = f2 + "Minutes", n2[i] = f2 + "Seconds", n2[r] = f2 + "Milliseconds", n2)[o2], $2 = o2 === a ? this.$D + (e2 - this.$W) : e2; if (o2 === c || o2 === h) { var y2 = this.clone().set(d, 1); y2.$d[l2]($2), y2.init(), this.$d = y2.set(d, Math.min(this.$D, y2.daysInMonth())).$d; } else l2 && this.$d[l2]($2); return this.init(), this; }, m2.set = function(t2, e2) { return this.clone().$set(t2, e2); }, m2.get = function(t2) { return this[O.p(t2)](); }, m2.add = function(r2, f2) { var d2, l2 = this; r2 = Number(r2); var $2 = O.p(f2), y2 = function(t2) { var e2 = w(l2); return O.w(e2.date(e2.date() + Math.round(t2 * r2)), l2); }; if ($2 === c) return this.set(c, this.$M + r2); if ($2 === h) return this.set(h, this.$y + r2); if ($2 === a) return y2(1); if ($2 === o) return y2(7); var M3 = (d2 = {}, d2[s] = e, d2[u] = n, d2[i] = t, d2)[$2] || 1, m3 = this.$d.getTime() + r2 * M3; return O.w(m3, this); }, m2.subtract = function(t2, e2) { return this.add(-1 * t2, e2); }, m2.format = function(t2) { var e2 = this, n2 = this.$locale(); if (!this.isValid()) return n2.invalidDate || l; var r2 = t2 || "YYYY-MM-DDTHH:mm:ssZ", i2 = O.z(this), s2 = this.$H, u2 = this.$m, a2 = this.$M, o2 = n2.weekdays, c2 = n2.months, f2 = n2.meridiem, h2 = function(t3, n3, i3, s3) { return t3 && (t3[n3] || t3(e2, r2)) || i3[n3].slice(0, s3); }, d2 = function(t3) { return O.s(s2 % 12 || 12, t3, "0"); }, $2 = f2 || function(t3, e3, n3) { var r3 = t3 < 12 ? "AM" : "PM"; return n3 ? r3.toLowerCase() : r3; }; return r2.replace(y, function(t3, r3) { return r3 || function(t4) { switch (t4) { case "YY": return String(e2.$y).slice(-2); case "YYYY": return O.s(e2.$y, 4, "0"); case "M": return a2 + 1; case "MM": return O.s(a2 + 1, 2, "0"); case "MMM": return h2(n2.monthsShort, a2, c2, 3); case "MMMM": return h2(c2, a2); case "D": return e2.$D; case "DD": return O.s(e2.$D, 2, "0"); case "d": return String(e2.$W); case "dd": return h2(n2.weekdaysMin, e2.$W, o2, 2); case "ddd": return h2(n2.weekdaysShort, e2.$W, o2, 3); case "dddd": return o2[e2.$W]; case "H": return String(s2); case "HH": return O.s(s2, 2, "0"); case "h": return d2(1); case "hh": return d2(2); case "a": return $2(s2, u2, true); case "A": return $2(s2, u2, false); case "m": return String(u2); case "mm": return O.s(u2, 2, "0"); case "s": return String(e2.$s); case "ss": return O.s(e2.$s, 2, "0"); case "SSS": return O.s(e2.$ms, 3, "0"); case "Z": return i2; } return null; }(t3) || i2.replace(":", ""); }); }, m2.utcOffset = function() { return 15 * -Math.round(this.$d.getTimezoneOffset() / 15); }, m2.diff = function(r2, d2, l2) { var $2, y2 = this, M3 = O.p(d2), m3 = w(r2), v2 = (m3.utcOffset() - this.utcOffset()) * e, g2 = this - m3, D2 = function() { return O.m(y2, m3); }; switch (M3) { case h: $2 = D2() / 12; break; case c: $2 = D2(); break; case f: $2 = D2() / 3; break; case o: $2 = (g2 - v2) / 6048e5; break; case a: $2 = (g2 - v2) / 864e5; break; case u: $2 = g2 / n; break; case s: $2 = g2 / e; break; case i: $2 = g2 / t; break; default: $2 = g2; } return l2 ? $2 : O.a($2); }, m2.daysInMonth = function() { return this.endOf(c).$D; }, m2.$locale = function() { return D[this.$L]; }, m2.locale = function(t2, e2) { if (!t2) return this.$L; var n2 = this.clone(), r2 = S(t2, e2, true); return r2 && (n2.$L = r2), n2; }, m2.clone = function() { return O.w(this.$d, this); }, m2.toDate = function() { return new Date(this.valueOf()); }, m2.toJSON = function() { return this.isValid() ? this.toISOString() : null; }, m2.toISOString = function() { return this.$d.toISOString(); }, m2.toString = function() { return this.$d.toUTCString(); }, M2; }(), _ = b.prototype; return w.prototype = _, [["$ms", r], ["$s", i], ["$m", s], ["$H", u], ["$W", a], ["$M", c], ["$y", h], ["$D", d]].forEach(function(t2) { _[t2[1]] = function(e2) { return this.$g(e2, t2[0], t2[1]); }; }), w.extend = function(t2, e2) { return t2.$i || (t2(e2, b, w), t2.$i = true), w; }, w.locale = S, w.isDayjs = p, w.unix = function(t2) { return w(1e3 * t2); }, w.en = D[g], w.Ls = D, w.p = {}, w; }); } }); // node_modules/ms/index.js var require_ms = __commonJS({ "node_modules/ms/index.js"(exports, module2) { var s = 1e3; var m = s * 60; var h = m * 60; var d = h * 24; var w = d * 7; var y = d * 365.25; module2.exports = function(val, options) { options = options || {}; var type = typeof val; if (type === "string" && val.length > 0) { return parse(val); } else if (type === "number" && isFinite(val)) { return options.long ? fmtLong(val) : fmtShort(val); } throw new Error( "val is not a non-empty string or a valid number. val=" + JSON.stringify(val) ); }; function parse(str) { str = String(str); if (str.length > 100) { return; } var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( str ); if (!match) { return; } var n = parseFloat(match[1]); var type = (match[2] || "ms").toLowerCase(); switch (type) { case "years": case "year": case "yrs": case "yr": case "y": return n * y; case "weeks": case "week": case "w": return n * w; case "days": case "day": case "d": return n * d; case "hours": case "hour": case "hrs": case "hr": case "h": return n * h; case "minutes": case "minute": case "mins": case "min": case "m": return n * m; case "seconds": case "second": case "secs": case "sec": case "s": return n * s; case "milliseconds": case "millisecond": case "msecs": case "msec": case "ms": return n; default: return void 0; } } function fmtShort(ms) { var msAbs = Math.abs(ms); if (msAbs >= d) { return Math.round(ms / d) + "d"; } if (msAbs >= h) { return Math.round(ms / h) + "h"; } if (msAbs >= m) { return Math.round(ms / m) + "m"; } if (msAbs >= s) { return Math.round(ms / s) + "s"; } return ms + "ms"; } function fmtLong(ms) { var msAbs = Math.abs(ms); if (msAbs >= d) { return plural(ms, msAbs, d, "day"); } if (msAbs >= h) { return plural(ms, msAbs, h, "hour"); } if (msAbs >= m) { return plural(ms, msAbs, m, "minute"); } if (msAbs >= s) { return plural(ms, msAbs, s, "second"); } return ms + " ms"; } function plural(ms, msAbs, n, name) { var isPlural = msAbs >= n * 1.5; return Math.round(ms / n) + " " + name + (isPlural ? "s" : ""); } } }); // node_modules/debug/src/common.js var require_common = __commonJS({ "node_modules/debug/src/common.js"(exports, module2) { function setup(env) { createDebug.debug = createDebug; createDebug.default = createDebug; createDebug.coerce = coerce; createDebug.disable = disable; createDebug.enable = enable; createDebug.enabled = enabled; createDebug.humanize = require_ms(); createDebug.destroy = destroy; Object.keys(env).forEach((key) => { createDebug[key] = env[key]; }); createDebug.names = []; createDebug.skips = []; createDebug.formatters = {}; function selectColor(namespace) { let hash = 0; for (let i = 0; i < namespace.length; i++) { hash = (hash << 5) - hash + namespace.charCodeAt(i); hash |= 0; } return createDebug.colors[Math.abs(hash) % createDebug.colors.length]; } createDebug.selectColor = selectColor; function createDebug(namespace) { let prevTime; let enableOverride = null; let namespacesCache; let enabledCache; function debug2(...args) { if (!debug2.enabled) { return; } const self2 = debug2; const curr = Number(/* @__PURE__ */ new Date()); const ms = curr - (prevTime || curr); self2.diff = ms; self2.prev = prevTime; self2.curr = curr; prevTime = curr; args[0] = createDebug.coerce(args[0]); if (typeof args[0] !== "string") { args.unshift("%O"); } let index = 0; args[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => { if (match === "%%") { return "%"; } index++; const formatter = createDebug.formatters[format]; if (typeof formatter === "function") { const val = args[index]; match = formatter.call(self2, val); args.splice(index, 1); index--; } return match; }); createDebug.formatArgs.call(self2, args); const logFn = self2.log || createDebug.log; logFn.apply(self2, args); } debug2.namespace = namespace; debug2.useColors = createDebug.useColors(); debug2.color = createDebug.selectColor(namespace); debug2.extend = extend; debug2.destroy = createDebug.destroy; Object.defineProperty(debug2, "enabled", { enumerable: true, configurable: false, get: () => { if (enableOverride !== null) { return enableOverride; } if (namespacesCache !== createDebug.namespaces) { namespacesCache = createDebug.namespaces; enabledCache = createDebug.enabled(namespace); } return enabledCache; }, set: (v) => { enableOverride = v; } }); if (typeof createDebug.init === "function") { createDebug.init(debug2); } return debug2; } function extend(namespace, delimiter) { const newDebug = createDebug(this.namespace + (typeof delimiter === "undefined" ? ":" : delimiter) + namespace); newDebug.log = this.log; return newDebug; } function enable(namespaces) { createDebug.save(namespaces); createDebug.namespaces = namespaces; createDebug.names = []; createDebug.skips = []; let i; const split = (typeof namespaces === "string" ? namespaces : "").split(/[\s,]+/); const len = split.length; for (i = 0; i < len; i++) { if (!split[i]) { continue; } namespaces = split[i].replace(/\*/g, ".*?"); if (namespaces[0] === "-") { createDebug.skips.push(new RegExp("^" + namespaces.slice(1) + "$")); } else { createDebug.names.push(new RegExp("^" + namespaces + "$")); } } } function disable() { const namespaces = [ ...createDebug.names.map(toNamespace), ...createDebug.skips.map(toNamespace).map((namespace) => "-" + namespace) ].join(","); createDebug.enable(""); return namespaces; } function enabled(name) { if (name[name.length - 1] === "*") { return true; } let i; let len; for (i = 0, len = createDebug.skips.length; i < len; i++) { if (createDebug.skips[i].test(name)) { return false; } } for (i = 0, len = createDebug.names.length; i < len; i++) { if (createDebug.names[i].test(name)) { return true; } } return false; } function toNamespace(regexp) { return regexp.toString().substring(2, regexp.toString().length - 2).replace(/\.\*\?$/, "*"); } function coerce(val) { if (val instanceof Error) { return val.stack || val.message; } return val; } function destroy() { console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); } createDebug.enable(createDebug.load()); return createDebug; } module2.exports = setup; } }); // node_modules/debug/src/browser.js var require_browser = __commonJS({ "node_modules/debug/src/browser.js"(exports, module2) { exports.formatArgs = formatArgs; exports.save = save; exports.load = load; exports.useColors = useColors; exports.storage = localstorage(); exports.destroy = (() => { let warned = false; return () => { if (!warned) { warned = true; console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."); } }; })(); exports.colors = [ "#0000CC", "#0000FF", "#0033CC", "#0033FF", "#0066CC", "#0066FF", "#0099CC", "#0099FF", "#00CC00", "#00CC33", "#00CC66", "#00CC99", "#00CCCC", "#00CCFF", "#3300CC", "#3300FF", "#3333CC", "#3333FF", "#3366CC", "#3366FF", "#3399CC", "#3399FF", "#33CC00", "#33CC33", "#33CC66", "#33CC99", "#33CCCC", "#33CCFF", "#6600CC", "#6600FF", "#6633CC", "#6633FF", "#66CC00", "#66CC33", "#9900CC", "#9900FF", "#9933CC", "#9933FF", "#99CC00", "#99CC33", "#CC0000", "#CC0033", "#CC0066", "#CC0099", "#CC00CC", "#CC00FF", "#CC3300", "#CC3333", "#CC3366", "#CC3399", "#CC33CC", "#CC33FF", "#CC6600", "#CC6633", "#CC9900", "#CC9933", "#CCCC00", "#CCCC33", "#FF0000", "#FF0033", "#FF0066", "#FF0099", "#FF00CC", "#FF00FF", "#FF3300", "#FF3333", "#FF3366", "#FF3399", "#FF33CC", "#FF33FF", "#FF6600", "#FF6633", "#FF9900", "#FF9933", "#FFCC00", "#FFCC33" ]; function useColors() { if (typeof window !== "undefined" && window.process && (window.process.type === "renderer" || window.process.__nwjs)) { return true; } if (typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/)) { return false; } return typeof document !== "undefined" && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773 typeof window !== "undefined" && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31? // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/); } function formatArgs(args) { args[0] = (this.useColors ? "%c" : "") + this.namespace + (this.useColors ? " %c" : " ") + args[0] + (this.useColors ? "%c " : " ") + "+" + module2.exports.humanize(this.diff); if (!this.useColors) { return; } const c = "color: " + this.color; args.splice(1, 0, c, "color: inherit"); let index = 0; let lastC = 0; args[0].replace(/%[a-zA-Z%]/g, (match) => { if (match === "%%") { return; } index++; if (match === "%c") { lastC = index; } }); args.splice(lastC, 0, c); } exports.log = console.debug || console.log || (() => { }); function save(namespaces) { try { if (namespaces) { exports.storage.setItem("debug", namespaces); } else { exports.storage.removeItem("debug"); } } catch (error) { } } function load() { let r; try { r = exports.storage.getItem("debug"); } catch (error) { } if (!r && typeof process !== "undefined" && "env" in process) { r = process.env.DEBUG; } return r; } function localstorage() { try { return localStorage; } catch (error) { } } module2.exports = require_common()(exports); var { formatters } = module2.exports; formatters.j = function(v) { try { return JSON.stringify(v); } catch (error) { return "[UnexpectedJSONParseError]: " + error.message; } }; } }); // node_modules/@kwsites/file-exists/dist/src/index.js var require_src = __commonJS({ "node_modules/@kwsites/file-exists/dist/src/index.js"(exports) { "use strict"; var __importDefault = exports && exports.__importDefault || function(mod) { return mod && mod.__esModule ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var fs_1 = require("fs"); var debug_1 = __importDefault(require_browser()); var log = debug_1.default("@kwsites/file-exists"); function check(path, isFile, isDirectory) { log(`checking %s`, path); try { const stat = fs_1.statSync(path); if (stat.isFile() && isFile) { log(`[OK] path represents a file`); return true; } if (stat.isDirectory() && isDirectory) { log(`[OK] path represents a directory`); return true; } log(`[FAIL] path represents something other than a file or directory`); return false; } catch (e) { if (e.code === "ENOENT") { log(`[FAIL] path is not accessible: %o`, e); return false; } log(`[FATAL] %o`, e); throw e; } } function exists2(path, type = exports.READABLE) { return check(path, (type & exports.FILE) > 0, (type & exports.FOLDER) > 0); } exports.exists = exists2; exports.FILE = 1; exports.FOLDER = 2; exports.READABLE = exports.FILE + exports.FOLDER; } }); // node_modules/@kwsites/file-exists/dist/index.js var require_dist = __commonJS({ "node_modules/@kwsites/file-exists/dist/index.js"(exports) { "use strict"; function __export3(m) { for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; } Object.defineProperty(exports, "__esModule", { value: true }); __export3(require_src()); } }); // node_modules/@kwsites/promise-deferred/dist/index.js var require_dist2 = __commonJS({ "node_modules/@kwsites/promise-deferred/dist/index.js"(exports) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createDeferred = exports.deferred = void 0; function deferred2() { let done; let fail; let status = "pending"; const promise = new Promise((_done, _fail) => { done = _done; fail = _fail; }); return { promise, done(result) { if (status === "pending") { status = "resolved"; done(result); } }, fail(error) { if (status === "pending") { status = "rejected"; fail(error); } }, get fulfilled() { return status !== "pending"; }, get status() { return status; } }; } exports.deferred = deferred2; exports.createDeferred = deferred2; exports.default = deferred2; } }); // src/main.ts var main_exports = {}; __export(main_exports, { default: () => YaosPlugin }); module.exports = __toCommonJS(main_exports); // src/utils/constants.ts var PLUGIN_NAME = "YAOS"; // node_modules/consola/dist/core.mjs var LogLevels = { silent: Number.NEGATIVE_INFINITY, fatal: 0, error: 0, warn: 1, log: 2, info: 3, success: 3, fail: 3, ready: 3, start: 3, box: 3, debug: 4, trace: 5, verbose: Number.POSITIVE_INFINITY }; var LogTypes = { // Silent silent: { level: -1 }, // Level 0 fatal: { level: LogLevels.fatal }, error: { level: LogLevels.error }, // Level 1 warn: { level: LogLevels.warn }, // Level 2 log: { level: LogLevels.log }, // Level 3 info: { level: LogLevels.info }, success: { level: LogLevels.success }, fail: { level: LogLevels.fail }, ready: { level: LogLevels.info }, start: { level: LogLevels.info }, box: { level: LogLevels.info }, // Level 4 debug: { level: LogLevels.debug }, // Level 5 trace: { level: LogLevels.trace }, // Verbose verbose: { level: LogLevels.verbose } }; function isObject(value) { return value !== null && typeof value === "object"; } function _defu(baseObject, defaults, namespace = ".", merger) { if (!isObject(defaults)) { return _defu(baseObject, {}, namespace, merger); } const object = Object.assign({}, defaults); for (const key in baseObject) { if (key === "__proto__" || key === "constructor") { continue; } const value = baseObject[key]; if (value === null || value === void 0) { continue; } if (merger && merger(object, key, value, namespace)) { continue; } if (Array.isArray(value) && Array.isArray(object[key])) { object[key] = [...value, ...object[key]]; } else if (isObject(value) && isObject(object[key])) { object[key] = _defu( value, object[key], (namespace ? `${namespace}.` : "") + key.toString(), merger ); } else { object[key] = value; } } return object; } function createDefu(merger) { return (...arguments_) => ( // eslint-disable-next-line unicorn/no-array-reduce arguments_.reduce((p, c) => _defu(p, c, "", merger), {}) ); } var defu = createDefu(); function isPlainObject(obj) { return Object.prototype.toString.call(obj) === "[object Object]"; } function isLogObj(arg) { if (!isPlainObject(arg)) { return false; } if (!arg.message && !arg.args) { return false; } if (arg.stack) { return false; } return true; } var paused = false; var queue = []; var Consola = class _Consola { constructor(options = {}) { const types = options.types || LogTypes; this.options = defu( { ...options, defaults: { ...options.defaults }, level: _normalizeLogLevel(options.level, types), reporters: [...options.reporters || []] }, { types: LogTypes, throttle: 1e3, throttleMin: 5, formatOptions: { date: true, colors: false, compact: true } } ); for (const type in types) { const defaults = { type, ...this.options.defaults, ...types[type] }; this[type] = this._wrapLogFn(defaults); this[type].raw = this._wrapLogFn( defaults, true ); } if (this.options.mockFn) { this.mockTypes(); } this._lastLog = {}; } get level() { return this.options.level; } set level(level) { this.options.level = _normalizeLogLevel( level, this.options.types, this.options.level ); } prompt(message, opts) { if (!this.options.prompt) { throw new Error("prompt is not supported!"); } return this.options.prompt(message, opts); } create(options) { const instance = new _Consola({ ...this.options, ...options }); if (this._mockFn) { instance.mockTypes(this._mockFn); } return instance; } withDefaults(defaults) { return this.create({ ...this.options, defaults: { ...this.options.defaults, ...defaults } }); } withTag(tag) { return this.withDefaults({ tag: this.options.defaults.tag ? this.options.defaults.tag + ":" + tag : tag }); } addReporter(reporter) { this.options.reporters.push(reporter); return this; } removeReporter(reporter) { if (reporter) { const i = this.options.reporters.indexOf(reporter); if (i >= 0) { return this.options.reporters.splice(i, 1); } } else { this.options.reporters.splice(0); } return this; } setReporters(reporters) { this.options.reporters = Array.isArray(reporters) ? reporters : [reporters]; return this; } wrapAll() { this.wrapConsole(); this.wrapStd(); } restoreAll() { this.restoreConsole(); this.restoreStd(); } wrapConsole() { for (const type in this.options.types) { if (!console["__" + type]) { console["__" + type] = console[type]; } console[type] = this[type].raw; } } restoreConsole() { for (const type in this.options.types) { if (console["__" + type]) { console[type] = console["__" + type]; delete console["__" + type]; } } } wrapStd() { this._wrapStream(this.options.stdout, "log"); this._wrapStream(this.options.stderr, "log"); } _wrapStream(stream, type) { if (!stream) { return; } if (!stream.__write) { stream.__write = stream.write; } stream.write = (data) => { this[type].raw(String(data).trim()); }; } restoreStd() { this._restoreStream(this.options.stdout); this._restoreStream(this.options.stderr); } _restoreStream(stream) { if (!stream) { return; } if (stream.__write) { stream.write = stream.__write; delete stream.__write; } } pauseLogs() { paused = true; } resumeLogs() { paused = false; const _queue = queue.splice(0); for (const item of _queue) { item[0]._logFn(item[1], item[2]); } } mockTypes(mockFn) { const _mockFn = mockFn || this.options.mockFn; this._mockFn = _mockFn; if (typeof _mockFn !== "function") { return; } for (const type in this.options.types) { this[type] = _mockFn(type, this.options.types[type]) || this[type]; this[type].raw = this[type]; } } _wrapLogFn(defaults, isRaw) { return (...args) => { if (paused) { queue.push([this, defaults, args, isRaw]); return; } return this._logFn(defaults, args, isRaw); }; } _logFn(defaults, args, isRaw) { if ((defaults.level || 0) > this.level) { return false; } const logObj = { date: /* @__PURE__ */ new Date(), args: [], ...defaults, level: _normalizeLogLevel(defaults.level, this.options.types) }; if (!isRaw && args.length === 1 && isLogObj(args[0])) { Object.assign(logObj, args[0]); } else { logObj.args = [...args]; } if (logObj.message) { logObj.args.unshift(logObj.message); delete logObj.message; } if (logObj.additional) { if (!Array.isArray(logObj.additional)) { logObj.additional = logObj.additional.split("\n"); } logObj.args.push("\n" + logObj.additional.join("\n")); delete logObj.additional; } logObj.type = typeof logObj.type === "string" ? logObj.type.toLowerCase() : "log"; logObj.tag = typeof logObj.tag === "string" ? logObj.tag : ""; const resolveLog = (newLog = false) => { const repeated = (this._lastLog.count || 0) - this.options.throttleMin; if (this._lastLog.object && repeated > 0) { const args2 = [...this._lastLog.object.args]; if (repeated > 1) { args2.push(`(repeated ${repeated} times)`); } this._log({ ...this._lastLog.object, args: args2 }); this._lastLog.count = 1; } if (newLog) { this._lastLog.object = logObj; this._log(logObj); } }; clearTimeout(this._lastLog.timeout); const diffTime = this._lastLog.time && logObj.date ? logObj.date.getTime() - this._lastLog.time.getTime() : 0; this._lastLog.time = logObj.date; if (diffTime < this.options.throttle) { try { const serializedLog = JSON.stringify([ logObj.type, logObj.tag, logObj.args ]); const isSameLog = this._lastLog.serialized === serializedLog; this._lastLog.serialized = serializedLog; if (isSameLog) { this._lastLog.count = (this._lastLog.count || 0) + 1; if (this._lastLog.count > this.options.throttleMin) { this._lastLog.timeout = setTimeout( resolveLog, this.options.throttle ); return; } } } catch (e) { } } resolveLog(true); } _log(logObj) { for (const reporter of this.options.reporters) { reporter.log(logObj, { options: this.options }); } } }; function _normalizeLogLevel(input, types = {}, defaultLevel = 3) { if (input === void 0) { return defaultLevel; } if (typeof input === "number") { return input; } if (types[input] && types[input].level !== void 0) { return types[input].level; } return defaultLevel; } Consola.prototype.add = Consola.prototype.addReporter; Consola.prototype.remove = Consola.prototype.removeReporter; Consola.prototype.clear = Consola.prototype.removeReporter; Consola.prototype.withScope = Consola.prototype.withTag; Consola.prototype.mock = Consola.prototype.mockTypes; Consola.prototype.pause = Consola.prototype.pauseLogs; Consola.prototype.resume = Consola.prototype.resumeLogs; function createConsola(options = {}) { return new Consola(options); } // node_modules/consola/dist/browser.mjs var BrowserReporter = class { constructor(options) { this.options = { ...options }; this.defaultColor = "#7f8c8d"; this.levelColorMap = { 0: "#c0392b", // Red 1: "#f39c12", // Yellow 3: "#00BCD4" // Cyan }; this.typeColorMap = { success: "#2ecc71" // Green }; } _getLogFn(level) { if (level < 1) { return console.__error || console.error; } if (level === 1) { return console.__warn || console.warn; } return console.__log || console.log; } log(logObj) { const consoleLogFn = this._getLogFn(logObj.level); const type = logObj.type === "log" ? "" : logObj.type; const tag = logObj.tag || ""; const color = this.typeColorMap[logObj.type] || this.levelColorMap[logObj.level] || this.defaultColor; const style = ` background: ${color}; border-radius: 0.5em; color: white; font-weight: bold; padding: 2px 0.5em; `; const badge = `%c${[tag, type].filter(Boolean).join(":")}`; if (typeof logObj.args[0] === "string") { consoleLogFn( `${badge}%c ${logObj.args[0]}`, style, // Empty string as style resets to default console style "", ...logObj.args.slice(1) ); } else { consoleLogFn(badge, style, ...logObj.args); } } }; function createConsola2(options = {}) { const consola2 = createConsola({ reporters: options.reporters || [new BrowserReporter({})], prompt(message, options2 = {}) { if (options2.type === "confirm") { return Promise.resolve(confirm(message)); } return Promise.resolve(prompt(message)); }, ...options }); return consola2; } var consola = createConsola2(); // src/utils/logger.ts var logger = consola.create({ level: LogLevels.debug }).withTag(PLUGIN_NAME); var logger_default = logger; // src/utils/notifier.ts var import_obsidian = require("obsidian"); var notifyUserAboutFailure = (message) => new import_obsidian.Notice(`FATAL: ${message}`); // src/controllers/syncController.ts var import_obsidian2 = require("obsidian"); var SyncController = class { constructor(gitService, gitignoreService) { this.gitService = gitService; this.gitignoreService = gitignoreService; logger_default.debug("Initialized sync controller."); } async createVaultBackup() { if (await this.gitService.unstagedChangesExist()) { await this.handleUnstagedChanges(); } else { logger_default.info("No changes in vault detected for backup."); } if (await this.gitService.isLocalAhead()) { await this.handleLocalAhead(); } } async handleLocalAhead() { try { await this.gitService.gitPush(); this.notifyUserAboutBackup(); } catch (e) { logger_default.warn("Remote and local have conflicting changes!"); logger_default.info("Starting rebase process..."); try { await this.gitService.gitPullWithRebase(); await this.gitService.gitPush(); this.notifyUserAboutBackup(); logger_default.success("Created vault backup."); } catch (e2) { this.notifyUserAboutConflicts(); logger_default.error("Automatic rebasing failed."); } } } async handleUnstagedChanges() { logger_default.info("Unstaged changes detected. Creating backup..."); await this.gitService.gitStageAll(); await this.gitService.gitCommit(); } notifyUserAboutBackup() { new import_obsidian2.Notice("Successfully backed up vault!"); } notifyUserAboutConflicts() { new import_obsidian2.Notice("Your local and remote repositories had conflicting changes."); new import_obsidian2.Notice("Please fix the changes and then click the sync button again."); } async sync() { if (await this.gitService.isRepo()) { logger_default.debug("Vault is initialized as a Git repository."); } else { logger_default.fatal("Vault is not initialized as a Git repository."); notifyUserAboutFailure("Vault is not a Git repository."); return; } if (await this.gitService.isRemoteConfigured()) { logger_default.debug("Remote repository is configured."); } else { logger_default.fatal("Remote repository is not configured."); notifyUserAboutFailure("Remote repository is not configured."); return; } if (await this.gitService.isRebasing()) { logger_default.debug("Stopping in progress rebase."); await this.gitService.stopRebasing(); } await this.createVaultBackup(); } }; // src/services/gitService.ts var import_dayjs = __toESM(require_dayjs_min()); // node_modules/simple-git/dist/esm/index.js var import_file_exists = __toESM(require_dist(), 1); var import_debug = __toESM(require_browser(), 1); var import_child_process = require("child_process"); var import_promise_deferred = __toESM(require_dist2(), 1); var import_promise_deferred2 = __toESM(require_dist2(), 1); var __defProp2 = Object.defineProperty; var __defProps = Object.defineProperties; var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor; var __getOwnPropDescs = Object.getOwnPropertyDescriptors; var __getOwnPropNames2 = Object.getOwnPropertyNames; var __getOwnPropSymbols = Object.getOwnPropertySymbols; var __hasOwnProp2 = Object.prototype.hasOwnProperty; var __propIsEnum = Object.prototype.propertyIsEnumerable; var __defNormalProp2 = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; var __spreadValues = (a, b) => { for (var prop in b || (b = {})) if (__hasOwnProp2.call(b, prop)) __defNormalProp2(a, prop, b[prop]); if (__getOwnPropSymbols) for (var prop of __getOwnPropSymbols(b)) { if (__propIsEnum.call(b, prop)) __defNormalProp2(a, prop, b[prop]); } return a; }; var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b)); var __markAsModule = (target) => __defProp2(target, "__esModule", { value: true }); var __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames2(fn)[0]])(fn = 0)), res; }; var __commonJS2 = (cb, mod) => function __require() { return mod || (0, cb[__getOwnPropNames2(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports; }; var __export2 = (target, all) => { for (var name in all) __defProp2(target, name, { get: all[name], enumerable: true }); }; var __reExport = (target, module2, copyDefault, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames2(module2)) if (!__hasOwnProp2.call(target, key) && (copyDefault || key !== "default")) __defProp2(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc2(module2, key)) || desc.enumerable }); } return target; }; var __toCommonJS2 = /* @__PURE__ */ ((cache2) => { return (module2, temp) => { return cache2 && cache2.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache2 && cache2.set(module2, temp), temp); }; })(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0); var __async = (__this, __arguments, generator) => { return new Promise((resolve2, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve2(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; function isPathSpec(path) { return path instanceof String && cache.has(path); } function toPaths(pathSpec) { return cache.get(pathSpec) || []; } var cache; var init_pathspec = __esm({ "src/lib/args/pathspec.ts"() { cache = /* @__PURE__ */ new WeakMap(); } }); var GitError; var init_git_error = __esm({ "src/lib/errors/git-error.ts"() { GitError = class extends Error { constructor(task, message) { super(message); this.task = task; Object.setPrototypeOf(this, new.target.prototype); } }; } }); var GitResponseError; var init_git_response_error = __esm({ "src/lib/errors/git-response-error.ts"() { init_git_error(); GitResponseError = class extends GitError { constructor(git, message) { super(void 0, message || String(git)); this.git = git; } }; } }); var TaskConfigurationError; var init_task_configuration_error = __esm({ "src/lib/errors/task-configuration-error.ts"() { init_git_error(); TaskConfigurationError = class extends GitError { constructor(message) { super(void 0, message); } }; } }); function asFunction(source) { return typeof source === "function" ? source : NOOP; } function isUserFunction(source) { return typeof source === "function" && source !== NOOP; } function splitOn(input, char) { const index = input.indexOf(char); if (index <= 0) { return [input, ""]; } return [input.substr(0, index), input.substr(index + 1)]; } function first(input, offset = 0) { return isArrayLike(input) && input.length > offset ? input[offset] : void 0; } function last(input, offset = 0) { if (isArrayLike(input) && input.length > offset) { return input[input.length - 1 - offset]; } } function isArrayLike(input) { return !!(input && typeof input.length === "number"); } function toLinesWithContent(input = "", trimmed2 = true, separator = "\n") { return input.split(separator).reduce((output, line) => { const lineContent = trimmed2 ? line.trim() : line; if (lineContent) { output.push(lineContent); } return output; }, []); } function forEachLineWithContent(input, callback) { return toLinesWithContent(input, true).map((line) => callback(line)); } function folderExists(path) { return (0, import_file_exists.exists)(path, import_file_exists.FOLDER); } function append(target, item) { if (Array.isArray(target)) { if (!target.includes(item)) { target.push(item); } } else { target.add(item); } return item; } function including(target, item) { if (Array.isArray(target) && !target.includes(item)) { target.push(item); } return target; } function remove(target, item) { if (Array.isArray(target)) { const index = target.indexOf(item); if (index >= 0) { target.splice(index, 1); } } else { target.delete(item); } return item; } function asArray(source) { return Array.isArray(source) ? source : [source]; } function asStringArray(source) { return asArray(source).map(String); } function asNumber(source, onNaN = 0) { if (source == null) { return onNaN; } const num = parseInt(source, 10); return isNaN(num) ? onNaN : num; } function prefixedArray(input, prefix) { const output = []; for (let i = 0, max = input.length; i < max; i++) { output.push(prefix, input[i]); } return output; } function bufferToString(input) { return (Array.isArray(input) ? Buffer.concat(input) : input).toString("utf-8"); } function pick(source, properties) { return Object.assign({}, ...properties.map((property) => property in source ? { [property]: source[property] } : {})); } function delay(duration = 0) { return new Promise((done) => setTimeout(done, duration)); } var NULL; var NOOP; var objectToString; var init_util = __esm({ "src/lib/utils/util.ts"() { NULL = "\0"; NOOP = () => { }; objectToString = Object.prototype.toString.call.bind(Object.prototype.toString); } }); function filterType(input, filter, def) { if (filter(input)) { return input; } return arguments.length > 2 ? def : void 0; } function filterPrimitives(input, omit) { const type = isPathSpec(input) ? "string" : typeof input; return /number|string|boolean/.test(type) && (!omit || !omit.includes(type)); } function filterPlainObject(input) { return !!input && objectToString(input) === "[object Object]"; } function filterFunction(input) { return typeof input === "function"; } var filterArray; var filterString; var filterStringArray; var filterStringOrStringArray; var filterHasLength; var init_argument_filters = __esm({ "src/lib/utils/argument-filters.ts"() { init_util(); init_pathspec(); filterArray = (input) => { return Array.isArray(input); }; filterString = (input) => { return typeof input === "string"; }; filterStringArray = (input) => { return Array.isArray(input) && input.every(filterString); }; filterStringOrStringArray = (input) => { return filterString(input) || Array.isArray(input) && input.every(filterString); }; filterHasLength = (input) => { if (input == null || "number|boolean|function".includes(typeof input)) { return false; } return Array.isArray(input) || typeof input === "string" || typeof input.length === "number"; }; } }); var ExitCodes; var init_exit_codes = __esm({ "src/lib/utils/exit-codes.ts"() { ExitCodes = /* @__PURE__ */ ((ExitCodes2) => { ExitCodes2[ExitCodes2["SUCCESS"] = 0] = "SUCCESS"; ExitCodes2[ExitCodes2["ERROR"] = 1] = "ERROR"; ExitCodes2[ExitCodes2["NOT_FOUND"] = -2] = "NOT_FOUND"; ExitCodes2[ExitCodes2["UNCLEAN"] = 128] = "UNCLEAN"; return ExitCodes2; })(ExitCodes || {}); } }); var GitOutputStreams; var init_git_output_streams = __esm({ "src/lib/utils/git-output-streams.ts"() { GitOutputStreams = class { constructor(stdOut, stdErr) { this.stdOut = stdOut; this.stdErr = stdErr; } asStrings() { return new GitOutputStreams(this.stdOut.toString("utf8"), this.stdErr.toString("utf8")); } }; } }); var LineParser; var RemoteLineParser; var init_line_parser = __esm({ "src/lib/utils/line-parser.ts"() { LineParser = class { constructor(regExp, useMatches) { this.matches = []; this.parse = (line, target) => { this.resetMatches(); if (!this._regExp.every((reg, index) => this.addMatch(reg, index, line(index)))) { return false; } return this.useMatches(target, this.prepareMatches()) !== false; }; this._regExp = Array.isArray(regExp) ? regExp : [regExp]; if (useMatches) { this.useMatches = useMatches; } } useMatches(target, match) { throw new Error(`LineParser:useMatches not implemented`); } resetMatches() { this.matches.length = 0; } prepareMatches() { return this.matches; } addMatch(reg, index, line) { const matched = line && reg.exec(line); if (matched) { this.pushMatch(index, matched); } return !!matched; } pushMatch(_index, matched) { this.matches.push(...matched.slice(1)); } }; RemoteLineParser = class extends LineParser { addMatch(reg, index, line) { return /^remote:\s/.test(String(line)) && super.addMatch(reg, index, line); } pushMatch(index, matched) { if (index > 0 || matched.length > 1) { super.pushMatch(index, matched); } } }; } }); function createInstanceConfig(...options) { const baseDir = process.cwd(); const config = Object.assign(__spreadValues({ baseDir }, defaultOptions), ...options.filter((o) => typeof o === "object" && o)); config.baseDir = config.baseDir || baseDir; config.trimmed = config.trimmed === true; return config; } var defaultOptions; var init_simple_git_options = __esm({ "src/lib/utils/simple-git-options.ts"() { defaultOptions = { binary: "git", maxConcurrentProcesses: 5, config: [], trimmed: false }; } }); function appendTaskOptions(options, commands = []) { if (!filterPlainObject(options)) { return commands; } return Object.keys(options).reduce((commands2, key) => { const value = options[key]; if (isPathSpec(value)) { commands2.push(value); } else if (filterPrimitives(value, ["boolean"])) { commands2.push(key + "=" + value); } else { commands2.push(key); } return commands2; }, commands); } function getTrailingOptions(args, initialPrimitive = 0, objectOnly = false) { const command = []; for (let i = 0, max = initialPrimitive < 0 ? args.length : initialPrimitive; i < max; i++) { if ("string|number".includes(typeof args[i])) { command.push(String(args[i])); } } appendTaskOptions(trailingOptionsArgument(args), command); if (!objectOnly) { command.push(...trailingArrayArgument(args)); } return command; } function trailingArrayArgument(args) { const hasTrailingCallback = typeof last(args) === "function"; return filterType(last(args, hasTrailingCallback ? 1 : 0), filterArray, []); } function trailingOptionsArgument(args) { const hasTrailingCallback = filterFunction(last(args)); return filterType(last(args, hasTrailingCallback ? 1 : 0), filterPlainObject); } function trailingFunctionArgument(args, includeNoop = true) { const callback = asFunction(last(args)); return includeNoop || isUserFunction(callback) ? callback : void 0; } var init_task_options = __esm({ "src/lib/utils/task-options.ts"() { init_argument_filters(); init_util(); init_pathspec(); } }); function callTaskParser(parser3, streams) { return parser3(streams.stdOut, streams.stdErr); } function parseStringResponse(result, parsers12, texts, trim = true) { asArray(texts).forEach((text) => { for (let lines = toLinesWithContent(text, trim), i = 0, max = lines.length; i < max; i++) { const line = (offset = 0) => { if (i + offset >= max) { return; } return lines[i + offset]; }; parsers12.some(({ parse }) => parse(line, result)); } }); return result; } var init_task_parser = __esm({ "src/lib/utils/task-parser.ts"() { init_util(); } }); var utils_exports = {}; __export2(utils_exports, { ExitCodes: () => ExitCodes, GitOutputStreams: () => GitOutputStreams, LineParser: () => LineParser, NOOP: () => NOOP, NULL: () => NULL, RemoteLineParser: () => RemoteLineParser, append: () => append, appendTaskOptions: () => appendTaskOptions, asArray: () => asArray, asFunction: () => asFunction, asNumber: () => asNumber, asStringArray: () => asStringArray, bufferToString: () => bufferToString, callTaskParser: () => callTaskParser, createInstanceConfig: () => createInstanceConfig, delay: () => delay, filterArray: () => filterArray, filterFunction: () => filterFunction, filterHasLength: () => filterHasLength, filterPlainObject: () => filterPlainObject, filterPrimitives: () => filterPrimitives, filterString: () => filterString, filterStringArray: () => filterStringArray, filterStringOrStringArray: () => filterStringOrStringArray, filterType: () => filterType, first: () => first, folderExists: () => folderExists, forEachLineWithContent: () => forEachLineWithContent, getTrailingOptions: () => getTrailingOptions, including: () => including, isUserFunction: () => isUserFunction, last: () => last, objectToString: () => objectToString, parseStringResponse: () => parseStringResponse, pick: () => pick, prefixedArray: () => prefixedArray, remove: () => remove, splitOn: () => splitOn, toLinesWithContent: () => toLinesWithContent, trailingFunctionArgument: () => trailingFunctionArgument, trailingOptionsArgument: () => trailingOptionsArgument }); var init_utils = __esm({ "src/lib/utils/index.ts"() { init_argument_filters(); init_exit_codes(); init_git_output_streams(); init_line_parser(); init_simple_git_options(); init_task_options(); init_task_parser(); init_util(); } }); var check_is_repo_exports = {}; __export2(check_is_repo_exports, { CheckRepoActions: () => CheckRepoActions, checkIsBareRepoTask: () => checkIsBareRepoTask, checkIsRepoRootTask: () => checkIsRepoRootTask, checkIsRepoTask: () => checkIsRepoTask }); function checkIsRepoTask(action) { switch (action) { case "bare": return checkIsBareRepoTask(); case "root": return checkIsRepoRootTask(); } const commands = ["rev-parse", "--is-inside-work-tree"]; return { commands, format: "utf-8", onError, parser }; } function checkIsRepoRootTask() { const commands = ["rev-parse", "--git-dir"]; return { commands, format: "utf-8", onError, parser(path) { return /^\.(git)?$/.test(path.trim()); } }; } function checkIsBareRepoTask() { const commands = ["rev-parse", "--is-bare-repository"]; return { commands, format: "utf-8", onError, parser }; } function isNotRepoMessage(error) { return /(Not a git repository|Kein Git-Repository)/i.test(String(error)); } var CheckRepoActions; var onError; var parser; var init_check_is_repo = __esm({ "src/lib/tasks/check-is-repo.ts"() { init_utils(); CheckRepoActions = /* @__PURE__ */ ((CheckRepoActions2) => { CheckRepoActions2["BARE"] = "bare"; CheckRepoActions2["IN_TREE"] = "tree"; CheckRepoActions2["IS_REPO_ROOT"] = "root"; return CheckRepoActions2; })(CheckRepoActions || {}); onError = ({ exitCode }, error, done, fail) => { if (exitCode === 128 && isNotRepoMessage(error)) { return done(Buffer.from("false")); } fail(error); }; parser = (text) => { return text.trim() === "true"; }; } }); function cleanSummaryParser(dryRun, text) { const summary = new CleanResponse(dryRun); const regexp = dryRun ? dryRunRemovalRegexp : removalRegexp; toLinesWithContent(text).forEach((line) => { const removed = line.replace(regexp, ""); summary.paths.push(removed); (isFolderRegexp.test(removed) ? summary.folders : summary.files).push(removed); }); return summary; } var CleanResponse; var removalRegexp; var dryRunRemovalRegexp; var isFolderRegexp; var init_CleanSummary = __esm({ "src/lib/responses/CleanSummary.ts"() { init_utils(); CleanResponse = class { constructor(dryRun) { this.dryRun = dryRun; this.paths = []; this.files = []; this.folders = []; } }; removalRegexp = /^[a-z]+\s*/i; dryRunRemovalRegexp = /^[a-z]+\s+[a-z]+\s*/i; isFolderRegexp = /\/$/; } }); var task_exports = {}; __export2(task_exports, { EMPTY_COMMANDS: () => EMPTY_COMMANDS, adhocExecTask: () => adhocExecTask, configurationErrorTask: () => configurationErrorTask, isBufferTask: () => isBufferTask, isEmptyTask: () => isEmptyTask, straightThroughBufferTask: () => straightThroughBufferTask, straightThroughStringTask: () => straightThroughStringTask }); function adhocExecTask(parser3) { return { commands: EMPTY_COMMANDS, format: "empty", parser: parser3 }; } function configurationErrorTask(error) { return { commands: EMPTY_COMMANDS, format: "empty", parser() { throw typeof error === "string" ? new TaskConfigurationError(error) : error; } }; } function straightThroughStringTask(commands, trimmed2 = false) { return { commands, format: "utf-8", parser(text) { return trimmed2 ? String(text).trim() : text; } }; } function straightThroughBufferTask(commands) { return { commands, format: "buffer", parser(buffer) { return buffer; } }; } function isBufferTask(task) { return task.format === "buffer"; } function isEmptyTask(task) { return task.format === "empty" || !task.commands.length; } var EMPTY_COMMANDS; var init_task = __esm({ "src/lib/tasks/task.ts"() { init_task_configuration_error(); EMPTY_COMMANDS = []; } }); var clean_exports = {}; __export2(clean_exports, { CONFIG_ERROR_INTERACTIVE_MODE: () => CONFIG_ERROR_INTERACTIVE_MODE, CONFIG_ERROR_MODE_REQUIRED: () => CONFIG_ERROR_MODE_REQUIRED, CONFIG_ERROR_UNKNOWN_OPTION: () => CONFIG_ERROR_UNKNOWN_OPTION, CleanOptions: () => CleanOptions, cleanTask: () => cleanTask, cleanWithOptionsTask: () => cleanWithOptionsTask, isCleanOptionsArray: () => isCleanOptionsArray }); function cleanWithOptionsTask(mode, customArgs) { const { cleanMode, options, valid } = getCleanOptions(mode); if (!cleanMode) { return configurationErrorTask(CONFIG_ERROR_MODE_REQUIRED); } if (!valid.options) { return configurationErrorTask(CONFIG_ERROR_UNKNOWN_OPTION + JSON.stringify(mode)); } options.push(...customArgs); if (options.some(isInteractiveMode)) { return configurationErrorTask(CONFIG_ERROR_INTERACTIVE_MODE); } return cleanTask(cleanMode, options); } function cleanTask(mode, customArgs) { const commands = ["clean", `-${mode}`, ...customArgs]; return { commands, format: "utf-8", parser(text) { return cleanSummaryParser(mode === "n", text); } }; } function isCleanOptionsArray(input) { return Array.isArray(input) && input.every((test) => CleanOptionValues.has(test)); } function getCleanOptions(input) { let cleanMode; let options = []; let valid = { cleanMode: false, options: true }; input.replace(/[^a-z]i/g, "").split("").forEach((char) => { if (isCleanMode(char)) { cleanMode = char; valid.cleanMode = true; } else { valid.options = valid.options && isKnownOption(options[options.length] = `-${char}`); } }); return { cleanMode, options, valid }; } function isCleanMode(cleanMode) { return cleanMode === "f" || cleanMode === "n"; } function isKnownOption(option) { return /^-[a-z]$/i.test(option) && CleanOptionValues.has(option.charAt(1)); } function isInteractiveMode(option) { if (/^-[^\-]/.test(option)) { return option.indexOf("i") > 0; } return option === "--interactive"; } var CONFIG_ERROR_INTERACTIVE_MODE; var CONFIG_ERROR_MODE_REQUIRED; var CONFIG_ERROR_UNKNOWN_OPTION; var CleanOptions; var CleanOptionValues; var init_clean = __esm({ "src/lib/tasks/clean.ts"() { init_CleanSummary(); init_utils(); init_task(); CONFIG_ERROR_INTERACTIVE_MODE = "Git clean interactive mode is not supported"; CONFIG_ERROR_MODE_REQUIRED = 'Git clean mode parameter ("n" or "f") is required'; CONFIG_ERROR_UNKNOWN_OPTION = "Git clean unknown option found in: "; CleanOptions = /* @__PURE__ */ ((CleanOptions2) => { CleanOptions2["DRY_RUN"] = "n"; CleanOptions2["FORCE"] = "f"; CleanOptions2["IGNORED_INCLUDED"] = "x"; CleanOptions2["IGNORED_ONLY"] = "X"; CleanOptions2["EXCLUDING"] = "e"; CleanOptions2["QUIET"] = "q"; CleanOptions2["RECURSIVE"] = "d"; return CleanOptions2; })(CleanOptions || {}); CleanOptionValues = /* @__PURE__ */ new Set([ "i", ...asStringArray(Object.values(CleanOptions)) ]); } }); function configListParser(text) { const config = new ConfigList(); for (const item of configParser(text)) { config.addValue(item.file, String(item.key), item.value); } return config; } function configGetParser(text, key) { let value = null; const values = []; const scopes = /* @__PURE__ */ new Map(); for (const item of configParser(text, key)) { if (item.key !== key) { continue; } values.push(value = item.value); if (!scopes.has(item.file)) { scopes.set(item.file, []); } scopes.get(item.file).push(value); } return { key, paths: Array.from(scopes.keys()), scopes, value, values }; } function configFilePath(filePath) { return filePath.replace(/^(file):/, ""); } function* configParser(text, requestedKey = null) { const lines = text.split("\0"); for (let i = 0, max = lines.length - 1; i < max; ) { const file = configFilePath(lines[i++]); let value = lines[i++]; let key = requestedKey; if (value.includes("\n")) { const line = splitOn(value, "\n"); key = line[0]; value = line[1]; } yield { file, key, value }; } } var ConfigList; var init_ConfigList = __esm({ "src/lib/responses/ConfigList.ts"() { init_utils(); ConfigList = class { constructor() { this.files = []; this.values = /* @__PURE__ */ Object.create(null); } get all() { if (!this._all) { this._all = this.files.reduce((all, file) => { return Object.assign(all, this.values[file]); }, {}); } return this._all; } addFile(file) { if (!(file in this.values)) { const latest = last(this.files); this.values[file] = latest ? Object.create(this.values[latest]) : {}; this.files.push(file); } return this.values[file]; } addValue(file, key, value) { const values = this.addFile(file); if (!values.hasOwnProperty(key)) { values[key] = value; } else if (Array.isArray(values[key])) { values[key].push(value); } else { values[key] = [values[key], value]; } this._all = void 0; } }; } }); function asConfigScope(scope, fallback) { if (typeof scope === "string" && GitConfigScope.hasOwnProperty(scope)) { return scope; } return fallback; } function addConfigTask(key, value, append2, scope) { const commands = ["config", `--${scope}`]; if (append2) { commands.push("--add"); } commands.push(key, value); return { commands, format: "utf-8", parser(text) { return text; } }; } function getConfigTask(key, scope) { const commands = ["config", "--null", "--show-origin", "--get-all", key]; if (scope) { commands.splice(1, 0, `--${scope}`); } return { commands, format: "utf-8", parser(text) { return configGetParser(text, key); } }; } function listConfigTask(scope) { const commands = ["config", "--list", "--show-origin", "--null"]; if (scope) { commands.push(`--${scope}`); } return { commands, format: "utf-8", parser(text) { return configListParser(text); } }; } function config_default() { return { addConfig(key, value, ...rest) { return this._runTask(addConfigTask(key, value, rest[0] === true, asConfigScope( rest[1], "local" /* local */ )), trailingFunctionArgument(arguments)); }, getConfig(key, scope) { return this._runTask(getConfigTask(key, asConfigScope(scope, void 0)), trailingFunctionArgument(arguments)); }, listConfig(...rest) { return this._runTask(listConfigTask(asConfigScope(rest[0], void 0)), trailingFunctionArgument(arguments)); } }; } var GitConfigScope; var init_config = __esm({ "src/lib/tasks/config.ts"() { init_ConfigList(); init_utils(); GitConfigScope = /* @__PURE__ */ ((GitConfigScope2) => { GitConfigScope2["system"] = "system"; GitConfigScope2["global"] = "global"; GitConfigScope2["local"] = "local"; GitConfigScope2["worktree"] = "worktree"; return GitConfigScope2; })(GitConfigScope || {}); } }); function grepQueryBuilder(...params) { return new GrepQuery().param(...params); } function parseGrep(grep) { const paths = /* @__PURE__ */ new Set(); const results = {}; forEachLineWithContent(grep, (input) => { const [path, line, preview] = input.split(NULL); paths.add(path); (results[path] = results[path] || []).push({ line: asNumber(line), path, preview }); }); return { paths, results }; } function grep_default() { return { grep(searchTerm) { const then = trailingFunctionArgument(arguments); const options = getTrailingOptions(arguments); for (const option of disallowedOptions) { if (options.includes(option)) { return this._runTask(configurationErrorTask(`git.grep: use of "${option}" is not supported.`), then); } } if (typeof searchTerm === "string") { searchTerm = grepQueryBuilder().param(searchTerm); } const commands = ["grep", "--null", "-n", "--full-name", ...options, ...searchTerm]; return this._runTask({ commands, format: "utf-8", parser(stdOut) { return parseGrep(stdOut); } }, then); } }; } var disallowedOptions; var Query; var _a; var GrepQuery; var init_grep = __esm({ "src/lib/tasks/grep.ts"() { init_utils(); init_task(); disallowedOptions = ["-h"]; Query = Symbol("grepQuery"); GrepQuery = class { constructor() { this[_a] = []; } *[(_a = Query, Symbol.iterator)]() { for (const query of this[Query]) { yield query; } } and(...and) { and.length && this[Query].push("--and", "(", ...prefixedArray(and, "-e"), ")"); return this; } param(...param) { this[Query].push(...prefixedArray(param, "-e")); return this; } }; } }); var reset_exports = {}; __export2(reset_exports, { ResetMode: () => ResetMode, getResetMode: () => getResetMode, resetTask: () => resetTask }); function resetTask(mode, customArgs) { const commands = ["reset"]; if (isValidResetMode(mode)) { commands.push(`--${mode}`); } commands.push(...customArgs); return straightThroughStringTask(commands); } function getResetMode(mode) { if (isValidResetMode(mode)) { return mode; } switch (typeof mode) { case "string": case "undefined": return "soft"; } return; } function isValidResetMode(mode) { return ResetModes.includes(mode); } var ResetMode; var ResetModes; var init_reset = __esm({ "src/lib/tasks/reset.ts"() { init_task(); ResetMode = /* @__PURE__ */ ((ResetMode2) => { ResetMode2["MIXED"] = "mixed"; ResetMode2["SOFT"] = "soft"; ResetMode2["HARD"] = "hard"; ResetMode2["MERGE"] = "merge"; ResetMode2["KEEP"] = "keep"; return ResetMode2; })(ResetMode || {}); ResetModes = Array.from(Object.values(ResetMode)); } }); function createLog() { return (0, import_debug.default)("simple-git"); } function prefixedLogger(to, prefix, forward) { if (!prefix || !String(prefix).replace(/\s*/, "")) { return !forward ? to : (message, ...args) => { to(message, ...args); forward(message, ...args); }; } return (message, ...args) => { to(`%s ${message}`, prefix, ...args); if (forward) { forward(message, ...args); } }; } function childLoggerName(name, childDebugger, { namespace: parentNamespace }) { if (typeof name === "string") { return name; } const childNamespace = childDebugger && childDebugger.namespace || ""; if (childNamespace.startsWith(parentNamespace)) { return childNamespace.substr(parentNamespace.length + 1); } return childNamespace || parentNamespace; } function createLogger(label, verbose, initialStep, infoDebugger = createLog()) { const labelPrefix = label && `[${label}]` || ""; const spawned = []; const debugDebugger = typeof verbose === "string" ? infoDebugger.extend(verbose) : verbose; const key = childLoggerName(filterType(verbose, filterString), debugDebugger, infoDebugger); return step(initialStep); function sibling(name, initial) { return append(spawned, createLogger(label, key.replace(/^[^:]+/, name), initial, infoDebugger)); } function step(phase) { const stepPrefix = phase && `[${phase}]` || ""; const debug2 = debugDebugger && prefixedLogger(debugDebugger, stepPrefix) || NOOP; const info = prefixedLogger(infoDebugger, `${labelPrefix} ${stepPrefix}`, debug2); return Object.assign(debugDebugger ? debug2 : info, { label, sibling, info, step }); } } var init_git_logger = __esm({ "src/lib/git-logger.ts"() { init_utils(); import_debug.default.formatters.L = (value) => String(filterHasLength(value) ? value.length : "-"); import_debug.default.formatters.B = (value) => { if (Buffer.isBuffer(value)) { return value.toString("utf8"); } return objectToString(value); }; } }); var _TasksPendingQueue; var TasksPendingQueue; var init_tasks_pending_queue = __esm({ "src/lib/runners/tasks-pending-queue.ts"() { init_git_error(); init_git_logger(); _TasksPendingQueue = class { constructor(logLabel = "GitExecutor") { this.logLabel = logLabel; this._queue = /* @__PURE__ */ new Map(); } withProgress(task) { return this._queue.get(task); } createProgress(task) { const name = _TasksPendingQueue.getName(task.commands[0]); const logger2 = createLogger(this.logLabel, name); return { task, logger: logger2, name }; } push(task) { const progress = this.createProgress(task); progress.logger("Adding task to the queue, commands = %o", task.commands); this._queue.set(task, progress); return progress; } fatal(err) { for (const [task, { logger: logger2 }] of Array.from(this._queue.entries())) { if (task === err.task) { logger2.info(`Failed %o`, err); logger2(`Fatal exception, any as-yet un-started tasks run through this executor will not be attempted`); } else { logger2.info(`A fatal exception occurred in a previous task, the queue has been purged: %o`, err.message); } this.complete(task); } if (this._queue.size !== 0) { throw new Error(`Queue size should be zero after fatal: ${this._queue.size}`); } } complete(task) { const progress = this.withProgress(task); if (progress) { this._queue.delete(task); } } attempt(task) { const progress = this.withProgress(task); if (!progress) { throw new GitError(void 0, "TasksPendingQueue: attempt called for an unknown task"); } progress.logger("Starting task"); return progress; } static getName(name = "empty") { return `task:${name}:${++_TasksPendingQueue.counter}`; } }; TasksPendingQueue = _TasksPendingQueue; TasksPendingQueue.counter = 0; } }); function pluginContext(task, commands) { return { method: first(task.commands) || "", commands }; } function onErrorReceived(target, logger2) { return (err) => { logger2(`[ERROR] child process exception %o`, err); target.push(Buffer.from(String(err.stack), "ascii")); }; } function onDataReceived(target, name, logger2, output) { return (buffer) => { logger2(`%s received %L bytes`, name, buffer); output(`%B`, buffer); target.push(buffer); }; } var GitExecutorChain; var init_git_executor_chain = __esm({ "src/lib/runners/git-executor-chain.ts"() { init_git_error(); init_task(); init_utils(); init_tasks_pending_queue(); GitExecutorChain = class { constructor(_executor, _scheduler, _plugins) { this._executor = _executor; this._scheduler = _scheduler; this._plugins = _plugins; this._chain = Promise.resolve(); this._queue = new TasksPendingQueue(); } get binary() { return this._executor.binary; } get cwd() { return this._cwd || this._executor.cwd; } set cwd(cwd) { this._cwd = cwd; } get env() { return this._executor.env; } get outputHandler() { return this._executor.outputHandler; } chain() { return this; } push(task) { this._queue.push(task); return this._chain = this._chain.then(() => this.attemptTask(task)); } attemptTask(task) { return __async(this, null, function* () { const onScheduleComplete = yield this._scheduler.next(); const onQueueComplete = () => this._queue.complete(task); try { const { logger: logger2 } = this._queue.attempt(task); return yield isEmptyTask(task) ? this.attemptEmptyTask(task, logger2) : this.attemptRemoteTask(task, logger2); } catch (e) { throw this.onFatalException(task, e); } finally { onQueueComplete(); onScheduleComplete(); } }); } onFatalException(task, e) { const gitError = e instanceof GitError ? Object.assign(e, { task }) : new GitError(task, e && String(e)); this._chain = Promise.resolve(); this._queue.fatal(gitError); return gitError; } attemptRemoteTask(task, logger2) { return __async(this, null, function* () { const args = this._plugins.exec("spawn.args", [...task.commands], pluginContext(task, task.commands)); const raw = yield this.gitResponse(task, this.binary, args, this.outputHandler, logger2.step("SPAWN")); const outputStreams = yield this.handleTaskData(task, args, raw, logger2.step("HANDLE")); logger2(`passing response to task's parser as a %s`, task.format); if (isBufferTask(task)) { return callTaskParser(task.parser, outputStreams); } return callTaskParser(task.parser, outputStreams.asStrings()); }); } attemptEmptyTask(task, logger2) { return __async(this, null, function* () { logger2(`empty task bypassing child process to call to task's parser`); return task.parser(this); }); } handleTaskData(task, args, result, logger2) { const { exitCode, rejection, stdOut, stdErr } = result; return new Promise((done, fail) => { logger2(`Preparing to handle process response exitCode=%d stdOut=`, exitCode); const { error } = this._plugins.exec("task.error", { error: rejection }, __spreadValues(__spreadValues({}, pluginContext(task, args)), result)); if (error && task.onError) { logger2.info(`exitCode=%s handling with custom error handler`); return task.onError(result, error, (newStdOut) => { logger2.info(`custom error handler treated as success`); logger2(`custom error returned a %s`, objectToString(newStdOut)); done(new GitOutputStreams(Array.isArray(newStdOut) ? Buffer.concat(newStdOut) : newStdOut, Buffer.concat(stdErr))); }, fail); } if (error) { logger2.info(`handling as error: exitCode=%s stdErr=%s rejection=%o`, exitCode, stdErr.length, rejection); return fail(error); } logger2.info(`retrieving task output complete`); done(new GitOutputStreams(Buffer.concat(stdOut), Buffer.concat(stdErr))); }); } gitResponse(task, command, args, outputHandler, logger2) { return __async(this, null, function* () { const outputLogger = logger2.sibling("output"); const spawnOptions = this._plugins.exec("spawn.options", { cwd: this.cwd, env: this.env, windowsHide: true }, pluginContext(task, task.commands)); return new Promise((done) => { const stdOut = []; const stdErr = []; logger2.info(`%s %o`, command, args); logger2("%O", spawnOptions); let rejection = this._beforeSpawn(task, args); if (rejection) { return done({ stdOut, stdErr, exitCode: 9901, rejection }); } this._plugins.exec("spawn.before", void 0, __spreadProps(__spreadValues({}, pluginContext(task, args)), { kill(reason) { rejection = reason || rejection; } })); const spawned = (0, import_child_process.spawn)(command, args, spawnOptions); spawned.stdout.on("data", onDataReceived(stdOut, "stdOut", logger2, outputLogger.step("stdOut"))); spawned.stderr.on("data", onDataReceived(stdErr, "stdErr", logger2, outputLogger.step("stdErr"))); spawned.on("error", onErrorReceived(stdErr, logger2)); if (outputHandler) { logger2(`Passing child process stdOut/stdErr to custom outputHandler`); outputHandler(command, spawned.stdout, spawned.stderr, [...args]); } this._plugins.exec("spawn.after", void 0, __spreadProps(__spreadValues({}, pluginContext(task, args)), { spawned, close(exitCode, reason) { done({ stdOut, stdErr, exitCode, rejection: rejection || reason }); }, kill(reason) { if (spawned.killed) { return; } rejection = reason; spawned.kill("SIGINT"); } })); }); }); } _beforeSpawn(task, args) { let rejection; this._plugins.exec("spawn.before", void 0, __spreadProps(__spreadValues({}, pluginContext(task, args)), { kill(reason) { rejection = reason || rejection; } })); return rejection; } }; } }); var git_executor_exports = {}; __export2(git_executor_exports, { GitExecutor: () => GitExecutor }); var GitExecutor; var init_git_executor = __esm({ "src/lib/runners/git-executor.ts"() { init_git_executor_chain(); GitExecutor = class { constructor(binary = "git", cwd, _scheduler, _plugins) { this.binary = binary; this.cwd = cwd; this._scheduler = _scheduler; this._plugins = _plugins; this._chain = new GitExecutorChain(this, this._scheduler, this._plugins); } chain() { return new GitExecutorChain(this, this._scheduler, this._plugins); } push(task) { return this._chain.push(task); } }; } }); function taskCallback(task, response, callback = NOOP) { const onSuccess = (data) => { callback(null, data); }; const onError2 = (err) => { if ((err == null ? void 0 : err.task) === task) { callback(err instanceof GitResponseError ? addDeprecationNoticeToError(err) : err, void 0); } }; response.then(onSuccess, onError2); } function addDeprecationNoticeToError(err) { let log = (name) => { console.warn(`simple-git deprecation notice: accessing GitResponseError.${name} should be GitResponseError.git.${name}, this will no longer be available in version 3`); log = NOOP; }; return Object.create(err, Object.getOwnPropertyNames(err.git).reduce(descriptorReducer, {})); function descriptorReducer(all, name) { if (name in err) { return all; } all[name] = { enumerable: false, configurable: false, get() { log(name); return err.git[name]; } }; return all; } } var init_task_callback = __esm({ "src/lib/task-callback.ts"() { init_git_response_error(); init_utils(); } }); function changeWorkingDirectoryTask(directory, root) { return adhocExecTask((instance) => { if (!folderExists(directory)) { throw new Error(`Git.cwd: cannot change to non-directory "${directory}"`); } return (root || instance).cwd = directory; }); } var init_change_working_directory = __esm({ "src/lib/tasks/change-working-directory.ts"() { init_utils(); init_task(); } }); function checkoutTask(args) { const commands = ["checkout", ...args]; if (commands[1] === "-b" && commands.includes("-B")) { commands[1] = remove(commands, "-B"); } return straightThroughStringTask(commands); } function checkout_default() { return { checkout() { return this._runTask(checkoutTask(getTrailingOptions(arguments, 1)), trailingFunctionArgument(arguments)); }, checkoutBranch(branchName, startPoint) { return this._runTask(checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); }, checkoutLocalBranch(branchName) { return this._runTask(checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); } }; } var init_checkout = __esm({ "src/lib/tasks/checkout.ts"() { init_utils(); init_task(); } }); function parseCommitResult(stdOut) { const result = { author: null, branch: "", commit: "", root: false, summary: { changes: 0, insertions: 0, deletions: 0 } }; return parseStringResponse(result, parsers, stdOut); } var parsers; var init_parse_commit = __esm({ "src/lib/parsers/parse-commit.ts"() { init_utils(); parsers = [ new LineParser(/^\[([^\s]+)( \([^)]+\))? ([^\]]+)/, (result, [branch, root, commit]) => { result.branch = branch; result.commit = commit; result.root = !!root; }), new LineParser(/\s*Author:\s(.+)/i, (result, [author]) => { const parts = author.split("<"); const email = parts.pop(); if (!email || !email.includes("@")) { return; } result.author = { email: email.substr(0, email.length - 1), name: parts.join("<").trim() }; }), new LineParser(/(\d+)[^,]*(?:,\s*(\d+)[^,]*)(?:,\s*(\d+))/g, (result, [changes, insertions, deletions]) => { result.summary.changes = parseInt(changes, 10) || 0; result.summary.insertions = parseInt(insertions, 10) || 0; result.summary.deletions = parseInt(deletions, 10) || 0; }), new LineParser(/^(\d+)[^,]*(?:,\s*(\d+)[^(]+\(([+-]))?/, (result, [changes, lines, direction]) => { result.summary.changes = parseInt(changes, 10) || 0; const count = parseInt(lines, 10) || 0; if (direction === "-") { result.summary.deletions = count; } else if (direction === "+") { result.summary.insertions = count; } }) ]; } }); function commitTask(message, files, customArgs) { const commands = [ "-c", "core.abbrev=40", "commit", ...prefixedArray(message, "-m"), ...files, ...customArgs ]; return { commands, format: "utf-8", parser: parseCommitResult }; } function commit_default() { return { commit(message, ...rest) { const next = trailingFunctionArgument(arguments); const task = rejectDeprecatedSignatures(message) || commitTask(asArray(message), asArray(filterType(rest[0], filterStringOrStringArray, [])), [...filterType(rest[1], filterArray, []), ...getTrailingOptions(arguments, 0, true)]); return this._runTask(task, next); } }; function rejectDeprecatedSignatures(message) { return !filterStringOrStringArray(message) && configurationErrorTask(`git.commit: requires the commit message to be supplied as a string/string[]`); } } var init_commit = __esm({ "src/lib/tasks/commit.ts"() { init_parse_commit(); init_utils(); init_task(); } }); function hashObjectTask(filePath, write) { const commands = ["hash-object", filePath]; if (write) { commands.push("-w"); } return straightThroughStringTask(commands, true); } var init_hash_object = __esm({ "src/lib/tasks/hash-object.ts"() { init_task(); } }); function parseInit(bare, path, text) { const response = String(text).trim(); let result; if (result = initResponseRegex.exec(response)) { return new InitSummary(bare, path, false, result[1]); } if (result = reInitResponseRegex.exec(response)) { return new InitSummary(bare, path, true, result[1]); } let gitDir = ""; const tokens = response.split(" "); while (tokens.length) { const token = tokens.shift(); if (token === "in") { gitDir = tokens.join(" "); break; } } return new InitSummary(bare, path, /^re/i.test(response), gitDir); } var InitSummary; var initResponseRegex; var reInitResponseRegex; var init_InitSummary = __esm({ "src/lib/responses/InitSummary.ts"() { InitSummary = class { constructor(bare, path, existing, gitDir) { this.bare = bare; this.path = path; this.existing = existing; this.gitDir = gitDir; } }; initResponseRegex = /^Init.+ repository in (.+)$/; reInitResponseRegex = /^Rein.+ in (.+)$/; } }); function hasBareCommand(command) { return command.includes(bareCommand); } function initTask(bare = false, path, customArgs) { const commands = ["init", ...customArgs]; if (bare && !hasBareCommand(commands)) { commands.splice(1, 0, bareCommand); } return { commands, format: "utf-8", parser(text) { return parseInit(commands.includes("--bare"), path, text); } }; } var bareCommand; var init_init = __esm({ "src/lib/tasks/init.ts"() { init_InitSummary(); bareCommand = "--bare"; } }); function logFormatFromCommand(customArgs) { for (let i = 0; i < customArgs.length; i++) { const format = logFormatRegex.exec(customArgs[i]); if (format) { return `--${format[1]}`; } } return ""; } function isLogFormat(customArg) { return logFormatRegex.test(customArg); } var logFormatRegex; var init_log_format = __esm({ "src/lib/args/log-format.ts"() { logFormatRegex = /^--(stat|numstat|name-only|name-status)(=|$)/; } }); var DiffSummary; var init_DiffSummary = __esm({ "src/lib/responses/DiffSummary.ts"() { DiffSummary = class { constructor() { this.changed = 0; this.deletions = 0; this.insertions = 0; this.files = []; } }; } }); function getDiffParser(format = "") { const parser3 = diffSummaryParsers[format]; return (stdOut) => parseStringResponse(new DiffSummary(), parser3, stdOut, false); } var statParser; var numStatParser; var nameOnlyParser; var nameStatusParser; var diffSummaryParsers; var init_parse_diff_summary = __esm({ "src/lib/parsers/parse-diff-summary.ts"() { init_log_format(); init_DiffSummary(); init_utils(); statParser = [ new LineParser(/(.+)\s+\|\s+(\d+)(\s+[+\-]+)?$/, (result, [file, changes, alterations = ""]) => { result.files.push({ file: file.trim(), changes: asNumber(changes), insertions: alterations.replace(/[^+]/g, "").length, deletions: alterations.replace(/[^-]/g, "").length, binary: false }); }), new LineParser(/(.+) \|\s+Bin ([0-9.]+) -> ([0-9.]+) ([a-z]+)/, (result, [file, before, after]) => { result.files.push({ file: file.trim(), before: asNumber(before), after: asNumber(after), binary: true }); }), new LineParser(/(\d+) files? changed\s*((?:, \d+ [^,]+){0,2})/, (result, [changed, summary]) => { const inserted = /(\d+) i/.exec(summary); const deleted = /(\d+) d/.exec(summary); result.changed = asNumber(changed); result.insertions = asNumber(inserted == null ? void 0 : inserted[1]); result.deletions = asNumber(deleted == null ? void 0 : deleted[1]); }) ]; numStatParser = [ new LineParser(/(\d+)\t(\d+)\t(.+)$/, (result, [changesInsert, changesDelete, file]) => { const insertions = asNumber(changesInsert); const deletions = asNumber(changesDelete); result.changed++; result.insertions += insertions; result.deletions += deletions; result.files.push({ file, changes: insertions + deletions, insertions, deletions, binary: false }); }), new LineParser(/-\t-\t(.+)$/, (result, [file]) => { result.changed++; result.files.push({ file, after: 0, before: 0, binary: true }); }) ]; nameOnlyParser = [ new LineParser(/(.+)$/, (result, [file]) => { result.changed++; result.files.push({ file, changes: 0, insertions: 0, deletions: 0, binary: false }); }) ]; nameStatusParser = [ new LineParser(/([ACDMRTUXB])\s*(.+)$/, (result, [_status, file]) => { result.changed++; result.files.push({ file, changes: 0, insertions: 0, deletions: 0, binary: false }); }) ]; diffSummaryParsers = { [ "" /* NONE */ ]: statParser, [ "--stat" /* STAT */ ]: statParser, [ "--numstat" /* NUM_STAT */ ]: numStatParser, [ "--name-status" /* NAME_STATUS */ ]: nameStatusParser, [ "--name-only" /* NAME_ONLY */ ]: nameOnlyParser }; } }); function lineBuilder(tokens, fields) { return fields.reduce((line, field, index) => { line[field] = tokens[index] || ""; return line; }, /* @__PURE__ */ Object.create({ diff: null })); } function createListLogSummaryParser(splitter = SPLITTER, fields = defaultFieldNames, logFormat = "") { const parseDiffResult = getDiffParser(logFormat); return function(stdOut) { const all = toLinesWithContent(stdOut, true, START_BOUNDARY).map(function(item) { const lineDetail = item.trim().split(COMMIT_BOUNDARY); const listLogLine = lineBuilder(lineDetail[0].trim().split(splitter), fields); if (lineDetail.length > 1 && !!lineDetail[1].trim()) { listLogLine.diff = parseDiffResult(lineDetail[1]); } return listLogLine; }); return { all, latest: all.length && all[0] || null, total: all.length }; }; } var START_BOUNDARY; var COMMIT_BOUNDARY; var SPLITTER; var defaultFieldNames; var init_parse_list_log_summary = __esm({ "src/lib/parsers/parse-list-log-summary.ts"() { init_utils(); init_parse_diff_summary(); init_log_format(); START_BOUNDARY = "\xF2\xF2\xF2\xF2\xF2\xF2 "; COMMIT_BOUNDARY = " \xF2\xF2"; SPLITTER = " \xF2 "; defaultFieldNames = ["hash", "date", "message", "refs", "author_name", "author_email"]; } }); var diff_exports = {}; __export2(diff_exports, { diffSummaryTask: () => diffSummaryTask, validateLogFormatConfig: () => validateLogFormatConfig }); function diffSummaryTask(customArgs) { let logFormat = logFormatFromCommand(customArgs); const commands = ["diff"]; if (logFormat === "") { logFormat = "--stat"; commands.push("--stat=4096"); } commands.push(...customArgs); return validateLogFormatConfig(commands) || { commands, format: "utf-8", parser: getDiffParser(logFormat) }; } function validateLogFormatConfig(customArgs) { const flags = customArgs.filter(isLogFormat); if (flags.length > 1) { return configurationErrorTask(`Summary flags are mutually exclusive - pick one of ${flags.join(",")}`); } if (flags.length && customArgs.includes("-z")) { return configurationErrorTask(`Summary flag ${flags} parsing is not compatible with null termination option '-z'`); } } var init_diff = __esm({ "src/lib/tasks/diff.ts"() { init_log_format(); init_parse_diff_summary(); init_task(); } }); function prettyFormat(format, splitter) { const fields = []; const formatStr = []; Object.keys(format).forEach((field) => { fields.push(field); formatStr.push(String(format[field])); }); return [fields, formatStr.join(splitter)]; } function userOptions(input) { return Object.keys(input).reduce((out, key) => { if (!(key in excludeOptions)) { out[key] = input[key]; } return out; }, {}); } function parseLogOptions(opt = {}, customArgs = []) { const splitter = filterType(opt.splitter, filterString, SPLITTER); const format = !filterPrimitives(opt.format) && opt.format ? opt.format : { hash: "%H", date: opt.strictDate === false ? "%ai" : "%aI", message: "%s", refs: "%D", body: opt.multiLine ? "%B" : "%b", author_name: opt.mailMap !== false ? "%aN" : "%an", author_email: opt.mailMap !== false ? "%aE" : "%ae" }; const [fields, formatStr] = prettyFormat(format, splitter); const suffix = []; const command = [ `--pretty=format:${START_BOUNDARY}${formatStr}${COMMIT_BOUNDARY}`, ...customArgs ]; const maxCount = opt.n || opt["max-count"] || opt.maxCount; if (maxCount) { command.push(`--max-count=${maxCount}`); } if (opt.from || opt.to) { const rangeOperator = opt.symmetric !== false ? "..." : ".."; suffix.push(`${opt.from || ""}${rangeOperator}${opt.to || ""}`); } if (filterString(opt.file)) { suffix.push("--follow", opt.file); } appendTaskOptions(userOptions(opt), command); return { fields, splitter, commands: [...command, ...suffix] }; } function logTask(splitter, fields, customArgs) { const parser3 = createListLogSummaryParser(splitter, fields, logFormatFromCommand(customArgs)); return { commands: ["log", ...customArgs], format: "utf-8", parser: parser3 }; } function log_default() { return { log(...rest) { const next = trailingFunctionArgument(arguments); const options = parseLogOptions(trailingOptionsArgument(arguments), filterType(arguments[0], filterArray)); const task = rejectDeprecatedSignatures(...rest) || validateLogFormatConfig(options.commands) || createLogTask(options); return this._runTask(task, next); } }; function createLogTask(options) { return logTask(options.splitter, options.fields, options.commands); } function rejectDeprecatedSignatures(from, to) { return filterString(from) && filterString(to) && configurationErrorTask(`git.log(string, string) should be replaced with git.log({ from: string, to: string })`); } } var excludeOptions; var init_log = __esm({ "src/lib/tasks/log.ts"() { init_log_format(); init_parse_list_log_summary(); init_utils(); init_task(); init_diff(); excludeOptions = /* @__PURE__ */ ((excludeOptions2) => { excludeOptions2[excludeOptions2["--pretty"] = 0] = "--pretty"; excludeOptions2[excludeOptions2["max-count"] = 1] = "max-count"; excludeOptions2[excludeOptions2["maxCount"] = 2] = "maxCount"; excludeOptions2[excludeOptions2["n"] = 3] = "n"; excludeOptions2[excludeOptions2["file"] = 4] = "file"; excludeOptions2[excludeOptions2["format"] = 5] = "format"; excludeOptions2[excludeOptions2["from"] = 6] = "from"; excludeOptions2[excludeOptions2["to"] = 7] = "to"; excludeOptions2[excludeOptions2["splitter"] = 8] = "splitter"; excludeOptions2[excludeOptions2["symmetric"] = 9] = "symmetric"; excludeOptions2[excludeOptions2["mailMap"] = 10] = "mailMap"; excludeOptions2[excludeOptions2["multiLine"] = 11] = "multiLine"; excludeOptions2[excludeOptions2["strictDate"] = 12] = "strictDate"; return excludeOptions2; })(excludeOptions || {}); } }); var MergeSummaryConflict; var MergeSummaryDetail; var init_MergeSummary = __esm({ "src/lib/responses/MergeSummary.ts"() { MergeSummaryConflict = class { constructor(reason, file = null, meta) { this.reason = reason; this.file = file; this.meta = meta; } toString() { return `${this.file}:${this.reason}`; } }; MergeSummaryDetail = class { constructor() { this.conflicts = []; this.merges = []; this.result = "success"; } get failed() { return this.conflicts.length > 0; } get reason() { return this.result; } toString() { if (this.conflicts.length) { return `CONFLICTS: ${this.conflicts.join(", ")}`; } return "OK"; } }; } }); var PullSummary; var PullFailedSummary; var init_PullSummary = __esm({ "src/lib/responses/PullSummary.ts"() { PullSummary = class { constructor() { this.remoteMessages = { all: [] }; this.created = []; this.deleted = []; this.files = []; this.deletions = {}; this.insertions = {}; this.summary = { changes: 0, deletions: 0, insertions: 0 }; } }; PullFailedSummary = class { constructor() { this.remote = ""; this.hash = { local: "", remote: "" }; this.branch = { local: "", remote: "" }; this.message = ""; } toString() { return this.message; } }; } }); function objectEnumerationResult(remoteMessages) { return remoteMessages.objects = remoteMessages.objects || { compressing: 0, counting: 0, enumerating: 0, packReused: 0, reused: { count: 0, delta: 0 }, total: { count: 0, delta: 0 } }; } function asObjectCount(source) { const count = /^\s*(\d+)/.exec(source); const delta = /delta (\d+)/i.exec(source); return { count: asNumber(count && count[1] || "0"), delta: asNumber(delta && delta[1] || "0") }; } var remoteMessagesObjectParsers; var init_parse_remote_objects = __esm({ "src/lib/parsers/parse-remote-objects.ts"() { init_utils(); remoteMessagesObjectParsers = [ new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: (\d+),/i, (result, [action, count]) => { const key = action.toLowerCase(); const enumeration = objectEnumerationResult(result.remoteMessages); Object.assign(enumeration, { [key]: asNumber(count) }); }), new RemoteLineParser(/^remote:\s*(enumerating|counting|compressing) objects: \d+% \(\d+\/(\d+)\),/i, (result, [action, count]) => { const key = action.toLowerCase(); const enumeration = objectEnumerationResult(result.remoteMessages); Object.assign(enumeration, { [key]: asNumber(count) }); }), new RemoteLineParser(/total ([^,]+), reused ([^,]+), pack-reused (\d+)/i, (result, [total, reused, packReused]) => { const objects = objectEnumerationResult(result.remoteMessages); objects.total = asObjectCount(total); objects.reused = asObjectCount(reused); objects.packReused = asNumber(packReused); }) ]; } }); function parseRemoteMessages(_stdOut, stdErr) { return parseStringResponse({ remoteMessages: new RemoteMessageSummary() }, parsers2, stdErr); } var parsers2; var RemoteMessageSummary; var init_parse_remote_messages = __esm({ "src/lib/parsers/parse-remote-messages.ts"() { init_utils(); init_parse_remote_objects(); parsers2 = [ new RemoteLineParser(/^remote:\s*(.+)$/, (result, [text]) => { result.remoteMessages.all.push(text.trim()); return false; }), ...remoteMessagesObjectParsers, new RemoteLineParser([/create a (?:pull|merge) request/i, /\s(https?:\/\/\S+)$/], (result, [pullRequestUrl]) => { result.remoteMessages.pullRequestUrl = pullRequestUrl; }), new RemoteLineParser([/found (\d+) vulnerabilities.+\(([^)]+)\)/i, /\s(https?:\/\/\S+)$/], (result, [count, summary, url]) => { result.remoteMessages.vulnerabilities = { count: asNumber(count), summary, url }; }) ]; RemoteMessageSummary = class { constructor() { this.all = []; } }; } }); function parsePullErrorResult(stdOut, stdErr) { const pullError = parseStringResponse(new PullFailedSummary(), errorParsers, [stdOut, stdErr]); return pullError.message && pullError; } var FILE_UPDATE_REGEX; var SUMMARY_REGEX; var ACTION_REGEX; var parsers3; var errorParsers; var parsePullDetail; var parsePullResult; var init_parse_pull = __esm({ "src/lib/parsers/parse-pull.ts"() { init_PullSummary(); init_utils(); init_parse_remote_messages(); FILE_UPDATE_REGEX = /^\s*(.+?)\s+\|\s+\d+\s*(\+*)(-*)/; SUMMARY_REGEX = /(\d+)\D+((\d+)\D+\(\+\))?(\D+(\d+)\D+\(-\))?/; ACTION_REGEX = /^(create|delete) mode \d+ (.+)/; parsers3 = [ new LineParser(FILE_UPDATE_REGEX, (result, [file, insertions, deletions]) => { result.files.push(file); if (insertions) { result.insertions[file] = insertions.length; } if (deletions) { result.deletions[file] = deletions.length; } }), new LineParser(SUMMARY_REGEX, (result, [changes, , insertions, , deletions]) => { if (insertions !== void 0 || deletions !== void 0) { result.summary.changes = +changes || 0; result.summary.insertions = +insertions || 0; result.summary.deletions = +deletions || 0; return true; } return false; }), new LineParser(ACTION_REGEX, (result, [action, file]) => { append(result.files, file); append(action === "create" ? result.created : result.deleted, file); }) ]; errorParsers = [ new LineParser(/^from\s(.+)$/i, (result, [remote]) => void (result.remote = remote)), new LineParser(/^fatal:\s(.+)$/, (result, [message]) => void (result.message = message)), new LineParser(/([a-z0-9]+)\.\.([a-z0-9]+)\s+(\S+)\s+->\s+(\S+)$/, (result, [hashLocal, hashRemote, branchLocal, branchRemote]) => { result.branch.local = branchLocal; result.hash.local = hashLocal; result.branch.remote = branchRemote; result.hash.remote = hashRemote; }) ]; parsePullDetail = (stdOut, stdErr) => { return parseStringResponse(new PullSummary(), parsers3, [stdOut, stdErr]); }; parsePullResult = (stdOut, stdErr) => { return Object.assign(new PullSummary(), parsePullDetail(stdOut, stdErr), parseRemoteMessages(stdOut, stdErr)); }; } }); var parsers4; var parseMergeResult; var parseMergeDetail; var init_parse_merge = __esm({ "src/lib/parsers/parse-merge.ts"() { init_MergeSummary(); init_utils(); init_parse_pull(); parsers4 = [ new LineParser(/^Auto-merging\s+(.+)$/, (summary, [autoMerge]) => { summary.merges.push(autoMerge); }), new LineParser(/^CONFLICT\s+\((.+)\): Merge conflict in (.+)$/, (summary, [reason, file]) => { summary.conflicts.push(new MergeSummaryConflict(reason, file)); }), new LineParser(/^CONFLICT\s+\((.+\/delete)\): (.+) deleted in (.+) and/, (summary, [reason, file, deleteRef]) => { summary.conflicts.push(new MergeSummaryConflict(reason, file, { deleteRef })); }), new LineParser(/^CONFLICT\s+\((.+)\):/, (summary, [reason]) => { summary.conflicts.push(new MergeSummaryConflict(reason, null)); }), new LineParser(/^Automatic merge failed;\s+(.+)$/, (summary, [result]) => { summary.result = result; }) ]; parseMergeResult = (stdOut, stdErr) => { return Object.assign(parseMergeDetail(stdOut, stdErr), parsePullResult(stdOut, stdErr)); }; parseMergeDetail = (stdOut) => { return parseStringResponse(new MergeSummaryDetail(), parsers4, stdOut); }; } }); function mergeTask(customArgs) { if (!customArgs.length) { return configurationErrorTask("Git.merge requires at least one option"); } return { commands: ["merge", ...customArgs], format: "utf-8", parser(stdOut, stdErr) { const merge = parseMergeResult(stdOut, stdErr); if (merge.failed) { throw new GitResponseError(merge); } return merge; } }; } var init_merge = __esm({ "src/lib/tasks/merge.ts"() { init_git_response_error(); init_parse_merge(); init_task(); } }); function pushResultPushedItem(local, remote, status) { const deleted = status.includes("deleted"); const tag = status.includes("tag") || /^refs\/tags/.test(local); const alreadyUpdated = !status.includes("new"); return { deleted, tag, branch: !tag, new: !alreadyUpdated, alreadyUpdated, local, remote }; } var parsers5; var parsePushResult; var parsePushDetail; var init_parse_push = __esm({ "src/lib/parsers/parse-push.ts"() { init_utils(); init_parse_remote_messages(); parsers5 = [ new LineParser(/^Pushing to (.+)$/, (result, [repo]) => { result.repo = repo; }), new LineParser(/^updating local tracking ref '(.+)'/, (result, [local]) => { result.ref = __spreadProps(__spreadValues({}, result.ref || {}), { local }); }), new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => { result.pushed.push(pushResultPushedItem(local, remote, type)); }), new LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => { result.branch = __spreadProps(__spreadValues({}, result.branch || {}), { local, remote, remoteName }); }), new LineParser(/^([^:]+):(\S+)\s+([a-z0-9]+)\.\.([a-z0-9]+)$/, (result, [local, remote, from, to]) => { result.update = { head: { local, remote }, hash: { from, to } }; }) ]; parsePushResult = (stdOut, stdErr) => { const pushDetail = parsePushDetail(stdOut, stdErr); const responseDetail = parseRemoteMessages(stdOut, stdErr); return __spreadValues(__spreadValues({}, pushDetail), responseDetail); }; parsePushDetail = (stdOut, stdErr) => { return parseStringResponse({ pushed: [] }, parsers5, [stdOut, stdErr]); }; } }); var push_exports = {}; __export2(push_exports, { pushTagsTask: () => pushTagsTask, pushTask: () => pushTask }); function pushTagsTask(ref = {}, customArgs) { append(customArgs, "--tags"); return pushTask(ref, customArgs); } function pushTask(ref = {}, customArgs) { const commands = ["push", ...customArgs]; if (ref.branch) { commands.splice(1, 0, ref.branch); } if (ref.remote) { commands.splice(1, 0, ref.remote); } remove(commands, "-v"); append(commands, "--verbose"); append(commands, "--porcelain"); return { commands, format: "utf-8", parser: parsePushResult }; } var init_push = __esm({ "src/lib/tasks/push.ts"() { init_parse_push(); init_utils(); } }); function show_default() { return { showBuffer() { const commands = ["show", ...getTrailingOptions(arguments, 1)]; if (!commands.includes("--binary")) { commands.splice(1, 0, "--binary"); } return this._runTask(straightThroughBufferTask(commands), trailingFunctionArgument(arguments)); }, show() { const commands = ["show", ...getTrailingOptions(arguments, 1)]; return this._runTask(straightThroughStringTask(commands), trailingFunctionArgument(arguments)); } }; } var init_show = __esm({ "src/lib/tasks/show.ts"() { init_utils(); init_task(); } }); var fromPathRegex; var FileStatusSummary; var init_FileStatusSummary = __esm({ "src/lib/responses/FileStatusSummary.ts"() { fromPathRegex = /^(.+) -> (.+)$/; FileStatusSummary = class { constructor(path, index, working_dir) { this.path = path; this.index = index; this.working_dir = working_dir; if (index + working_dir === "R") { const detail = fromPathRegex.exec(path) || [null, path, path]; this.from = detail[1] || ""; this.path = detail[2] || ""; } } }; } }); function renamedFile(line) { const [to, from] = line.split(NULL); return { from: from || to, to }; } function parser2(indexX, indexY, handler) { return [`${indexX}${indexY}`, handler]; } function conflicts(indexX, ...indexY) { return indexY.map((y) => parser2(indexX, y, (result, file) => append(result.conflicted, file))); } function splitLine(result, lineStr) { const trimmed2 = lineStr.trim(); switch (" ") { case trimmed2.charAt(2): return data(trimmed2.charAt(0), trimmed2.charAt(1), trimmed2.substr(3)); case trimmed2.charAt(1): return data(" ", trimmed2.charAt(0), trimmed2.substr(2)); default: return; } function data(index, workingDir, path) { const raw = `${index}${workingDir}`; const handler = parsers6.get(raw); if (handler) { handler(result, path); } if (raw !== "##" && raw !== "!!") { result.files.push(new FileStatusSummary(path.replace(/\0.+$/, ""), index, workingDir)); } } } var StatusSummary; var parsers6; var parseStatusSummary; var init_StatusSummary = __esm({ "src/lib/responses/StatusSummary.ts"() { init_utils(); init_FileStatusSummary(); StatusSummary = class { constructor() { this.not_added = []; this.conflicted = []; this.created = []; this.deleted = []; this.ignored = void 0; this.modified = []; this.renamed = []; this.files = []; this.staged = []; this.ahead = 0; this.behind = 0; this.current = null; this.tracking = null; this.detached = false; this.isClean = () => { return !this.files.length; }; } }; parsers6 = new Map([ parser2(" ", "A", (result, file) => append(result.created, file)), parser2(" ", "D", (result, file) => append(result.deleted, file)), parser2(" ", "M", (result, file) => append(result.modified, file)), parser2("A", " ", (result, file) => append(result.created, file) && append(result.staged, file)), parser2("A", "M", (result, file) => append(result.created, file) && append(result.staged, file) && append(result.modified, file)), parser2("D", " ", (result, file) => append(result.deleted, file) && append(result.staged, file)), parser2("M", " ", (result, file) => append(result.modified, file) && append(result.staged, file)), parser2("M", "M", (result, file) => append(result.modified, file) && append(result.staged, file)), parser2("R", " ", (result, file) => { append(result.renamed, renamedFile(file)); }), parser2("R", "M", (result, file) => { const renamed = renamedFile(file); append(result.renamed, renamed); append(result.modified, renamed.to); }), parser2("!", "!", (_result, _file) => { append(_result.ignored = _result.ignored || [], _file); }), parser2("?", "?", (result, file) => append(result.not_added, file)), ...conflicts( "A", "A", "U" /* UNMERGED */ ), ...conflicts( "D", "D", "U" /* UNMERGED */ ), ...conflicts( "U", "A", "D", "U" /* UNMERGED */ ), [ "##", (result, line) => { const aheadReg = /ahead (\d+)/; const behindReg = /behind (\d+)/; const currentReg = /^(.+?(?=(?:\.{3}|\s|$)))/; const trackingReg = /\.{3}(\S*)/; const onEmptyBranchReg = /\son\s([\S]+)$/; let regexResult; regexResult = aheadReg.exec(line); result.ahead = regexResult && +regexResult[1] || 0; regexResult = behindReg.exec(line); result.behind = regexResult && +regexResult[1] || 0; regexResult = currentReg.exec(line); result.current = regexResult && regexResult[1]; regexResult = trackingReg.exec(line); result.tracking = regexResult && regexResult[1]; regexResult = onEmptyBranchReg.exec(line); result.current = regexResult && regexResult[1] || result.current; result.detached = /\(no branch\)/.test(line); } ] ]); parseStatusSummary = function(text) { const lines = text.split(NULL); const status = new StatusSummary(); for (let i = 0, l = lines.length; i < l; ) { let line = lines[i++].trim(); if (!line) { continue; } if (line.charAt(0) === "R") { line += NULL + (lines[i++] || ""); } splitLine(status, line); } return status; }; } }); function statusTask(customArgs) { const commands = [ "status", "--porcelain", "-b", "-u", "--null", ...customArgs.filter((arg) => !ignoredOptions.includes(arg)) ]; return { format: "utf-8", commands, parser(text) { return parseStatusSummary(text); } }; } var ignoredOptions; var init_status = __esm({ "src/lib/tasks/status.ts"() { init_StatusSummary(); ignoredOptions = ["--null", "-z"]; } }); function versionResponse(major = 0, minor = 0, patch = 0, agent = "", installed = true) { return Object.defineProperty({ major, minor, patch, agent, installed }, "toString", { value() { return `${this.major}.${this.minor}.${this.patch}`; }, configurable: false, enumerable: false }); } function notInstalledResponse() { return versionResponse(0, 0, 0, "", false); } function version_default() { return { version() { return this._runTask({ commands: ["--version"], format: "utf-8", parser: versionParser, onError(result, error, done, fail) { if (result.exitCode === -2) { return done(Buffer.from(NOT_INSTALLED)); } fail(error); } }); } }; } function versionParser(stdOut) { if (stdOut === NOT_INSTALLED) { return notInstalledResponse(); } return parseStringResponse(versionResponse(0, 0, 0, stdOut), parsers7, stdOut); } var NOT_INSTALLED; var parsers7; var init_version = __esm({ "src/lib/tasks/version.ts"() { init_utils(); NOT_INSTALLED = "installed=false"; parsers7 = [ new LineParser(/version (\d+)\.(\d+)\.(\d+)(?:\s*\((.+)\))?/, (result, [major, minor, patch, agent = ""]) => { Object.assign(result, versionResponse(asNumber(major), asNumber(minor), asNumber(patch), agent)); }), new LineParser(/version (\d+)\.(\d+)\.(\D+)(.+)?$/, (result, [major, minor, patch, agent = ""]) => { Object.assign(result, versionResponse(asNumber(major), asNumber(minor), patch, agent)); }) ]; } }); var simple_git_api_exports = {}; __export2(simple_git_api_exports, { SimpleGitApi: () => SimpleGitApi }); var SimpleGitApi; var init_simple_git_api = __esm({ "src/lib/simple-git-api.ts"() { init_task_callback(); init_change_working_directory(); init_checkout(); init_commit(); init_config(); init_grep(); init_hash_object(); init_init(); init_log(); init_merge(); init_push(); init_show(); init_status(); init_task(); init_version(); init_utils(); SimpleGitApi = class { constructor(_executor) { this._executor = _executor; } _runTask(task, then) { const chain = this._executor.chain(); const promise = chain.push(task); if (then) { taskCallback(task, promise, then); } return Object.create(this, { then: { value: promise.then.bind(promise) }, catch: { value: promise.catch.bind(promise) }, _executor: { value: chain } }); } add(files) { return this._runTask(straightThroughStringTask(["add", ...asArray(files)]), trailingFunctionArgument(arguments)); } cwd(directory) { const next = trailingFunctionArgument(arguments); if (typeof directory === "string") { return this._runTask(changeWorkingDirectoryTask(directory, this._executor), next); } if (typeof (directory == null ? void 0 : directory.path) === "string") { return this._runTask(changeWorkingDirectoryTask(directory.path, directory.root && this._executor || void 0), next); } return this._runTask(configurationErrorTask("Git.cwd: workingDirectory must be supplied as a string"), next); } hashObject(path, write) { return this._runTask(hashObjectTask(path, write === true), trailingFunctionArgument(arguments)); } init(bare) { return this._runTask(initTask(bare === true, this._executor.cwd, getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); } merge() { return this._runTask(mergeTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); } mergeFromTo(remote, branch) { if (!(filterString(remote) && filterString(branch))) { return this._runTask(configurationErrorTask(`Git.mergeFromTo requires that the 'remote' and 'branch' arguments are supplied as strings`)); } return this._runTask(mergeTask([remote, branch, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments, false)); } outputHandler(handler) { this._executor.outputHandler = handler; return this; } push() { const task = pushTask({ remote: filterType(arguments[0], filterString), branch: filterType(arguments[1], filterString) }, getTrailingOptions(arguments)); return this._runTask(task, trailingFunctionArgument(arguments)); } stash() { return this._runTask(straightThroughStringTask(["stash", ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments)); } status() { return this._runTask(statusTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments)); } }; Object.assign(SimpleGitApi.prototype, checkout_default(), commit_default(), config_default(), grep_default(), log_default(), show_default(), version_default()); } }); var scheduler_exports = {}; __export2(scheduler_exports, { Scheduler: () => Scheduler }); var createScheduledTask; var Scheduler; var init_scheduler = __esm({ "src/lib/runners/scheduler.ts"() { init_utils(); init_git_logger(); createScheduledTask = (() => { let id = 0; return () => { id++; const { promise, done } = (0, import_promise_deferred.createDeferred)(); return { promise, done, id }; }; })(); Scheduler = class { constructor(concurrency = 2) { this.concurrency = concurrency; this.logger = createLogger("", "scheduler"); this.pending = []; this.running = []; this.logger(`Constructed, concurrency=%s`, concurrency); } schedule() { if (!this.pending.length || this.running.length >= this.concurrency) { this.logger(`Schedule attempt ignored, pending=%s running=%s concurrency=%s`, this.pending.length, this.running.length, this.concurrency); return; } const task = append(this.running, this.pending.shift()); this.logger(`Attempting id=%s`, task.id); task.done(() => { this.logger(`Completing id=`, task.id); remove(this.running, task); this.schedule(); }); } next() { const { promise, id } = append(this.pending, createScheduledTask()); this.logger(`Scheduling id=%s`, id); this.schedule(); return promise; } }; } }); var apply_patch_exports = {}; __export2(apply_patch_exports, { applyPatchTask: () => applyPatchTask }); function applyPatchTask(patches, customArgs) { return straightThroughStringTask(["apply", ...customArgs, ...patches]); } var init_apply_patch = __esm({ "src/lib/tasks/apply-patch.ts"() { init_task(); } }); function branchDeletionSuccess(branch, hash) { return { branch, hash, success: true }; } function branchDeletionFailure(branch) { return { branch, hash: null, success: false }; } var BranchDeletionBatch; var init_BranchDeleteSummary = __esm({ "src/lib/responses/BranchDeleteSummary.ts"() { BranchDeletionBatch = class { constructor() { this.all = []; this.branches = {}; this.errors = []; } get success() { return !this.errors.length; } }; } }); function hasBranchDeletionError(data, processExitCode) { return processExitCode === 1 && deleteErrorRegex.test(data); } var deleteSuccessRegex; var deleteErrorRegex; var parsers8; var parseBranchDeletions; var init_parse_branch_delete = __esm({ "src/lib/parsers/parse-branch-delete.ts"() { init_BranchDeleteSummary(); init_utils(); deleteSuccessRegex = /(\S+)\s+\(\S+\s([^)]+)\)/; deleteErrorRegex = /^error[^']+'([^']+)'/m; parsers8 = [ new LineParser(deleteSuccessRegex, (result, [branch, hash]) => { const deletion = branchDeletionSuccess(branch, hash); result.all.push(deletion); result.branches[branch] = deletion; }), new LineParser(deleteErrorRegex, (result, [branch]) => { const deletion = branchDeletionFailure(branch); result.errors.push(deletion); result.all.push(deletion); result.branches[branch] = deletion; }) ]; parseBranchDeletions = (stdOut, stdErr) => { return parseStringResponse(new BranchDeletionBatch(), parsers8, [stdOut, stdErr]); }; } }); var BranchSummaryResult; var init_BranchSummary = __esm({ "src/lib/responses/BranchSummary.ts"() { BranchSummaryResult = class { constructor() { this.all = []; this.branches = {}; this.current = ""; this.detached = false; } push(status, detached, name, commit, label) { if (status === "*") { this.detached = detached; this.current = name; } this.all.push(name); this.branches[name] = { current: status === "*", linkedWorkTree: status === "+", name, commit, label }; } }; } }); function branchStatus(input) { return input ? input.charAt(0) : ""; } function parseBranchSummary(stdOut) { return parseStringResponse(new BranchSummaryResult(), parsers9, stdOut); } var parsers9; var init_parse_branch = __esm({ "src/lib/parsers/parse-branch.ts"() { init_BranchSummary(); init_utils(); parsers9 = [ new LineParser(/^([*+]\s)?\((?:HEAD )?detached (?:from|at) (\S+)\)\s+([a-z0-9]+)\s(.*)$/, (result, [current, name, commit, label]) => { result.push(branchStatus(current), true, name, commit, label); }), new LineParser(/^([*+]\s)?(\S+)\s+([a-z0-9]+)\s?(.*)$/s, (result, [current, name, commit, label]) => { result.push(branchStatus(current), false, name, commit, label); }) ]; } }); var branch_exports = {}; __export2(branch_exports, { branchLocalTask: () => branchLocalTask, branchTask: () => branchTask, containsDeleteBranchCommand: () => containsDeleteBranchCommand, deleteBranchTask: () => deleteBranchTask, deleteBranchesTask: () => deleteBranchesTask }); function containsDeleteBranchCommand(commands) { const deleteCommands = ["-d", "-D", "--delete"]; return commands.some((command) => deleteCommands.includes(command)); } function branchTask(customArgs) { const isDelete = containsDeleteBranchCommand(customArgs); const commands = ["branch", ...customArgs]; if (commands.length === 1) { commands.push("-a"); } if (!commands.includes("-v")) { commands.splice(1, 0, "-v"); } return { format: "utf-8", commands, parser(stdOut, stdErr) { if (isDelete) { return parseBranchDeletions(stdOut, stdErr).all[0]; } return parseBranchSummary(stdOut); } }; } function branchLocalTask() { const parser3 = parseBranchSummary; return { format: "utf-8", commands: ["branch", "-v"], parser: parser3 }; } function deleteBranchesTask(branches, forceDelete = false) { return { format: "utf-8", commands: ["branch", "-v", forceDelete ? "-D" : "-d", ...branches], parser(stdOut, stdErr) { return parseBranchDeletions(stdOut, stdErr); }, onError({ exitCode, stdOut }, error, done, fail) { if (!hasBranchDeletionError(String(error), exitCode)) { return fail(error); } done(stdOut); } }; } function deleteBranchTask(branch, forceDelete = false) { const task = { format: "utf-8", commands: ["branch", "-v", forceDelete ? "-D" : "-d", branch], parser(stdOut, stdErr) { return parseBranchDeletions(stdOut, stdErr).branches[branch]; }, onError({ exitCode, stdErr, stdOut }, error, _, fail) { if (!hasBranchDeletionError(String(error), exitCode)) { return fail(error); } throw new GitResponseError(task.parser(bufferToString(stdOut), bufferToString(stdErr)), String(error)); } }; return task; } var init_branch = __esm({ "src/lib/tasks/branch.ts"() { init_git_response_error(); init_parse_branch_delete(); init_parse_branch(); init_utils(); } }); var parseCheckIgnore; var init_CheckIgnore = __esm({ "src/lib/responses/CheckIgnore.ts"() { parseCheckIgnore = (text) => { return text.split(/\n/g).map((line) => line.trim()).filter((file) => !!file); }; } }); var check_ignore_exports = {}; __export2(check_ignore_exports, { checkIgnoreTask: () => checkIgnoreTask }); function checkIgnoreTask(paths) { return { commands: ["check-ignore", ...paths], format: "utf-8", parser: parseCheckIgnore }; } var init_check_ignore = __esm({ "src/lib/tasks/check-ignore.ts"() { init_CheckIgnore(); } }); var clone_exports = {}; __export2(clone_exports, { cloneMirrorTask: () => cloneMirrorTask, cloneTask: () => cloneTask }); function disallowedCommand(command) { return /^--upload-pack(=|$)/.test(command); } function cloneTask(repo, directory, customArgs) { const commands = ["clone", ...customArgs]; filterString(repo) && commands.push(repo); filterString(directory) && commands.push(directory); const banned = commands.find(disallowedCommand); if (banned) { return configurationErrorTask(`git.fetch: potential exploit argument blocked.`); } return straightThroughStringTask(commands); } function cloneMirrorTask(repo, directory, customArgs) { append(customArgs, "--mirror"); return cloneTask(repo, directory, customArgs); } var init_clone = __esm({ "src/lib/tasks/clone.ts"() { init_task(); init_utils(); } }); function parseFetchResult(stdOut, stdErr) { const result = { raw: stdOut, remote: null, branches: [], tags: [], updated: [], deleted: [] }; return parseStringResponse(result, parsers10, [stdOut, stdErr]); } var parsers10; var init_parse_fetch = __esm({ "src/lib/parsers/parse-fetch.ts"() { init_utils(); parsers10 = [ new LineParser(/From (.+)$/, (result, [remote]) => { result.remote = remote; }), new LineParser(/\* \[new branch]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { result.branches.push({ name, tracking }); }), new LineParser(/\* \[new tag]\s+(\S+)\s*-> (.+)$/, (result, [name, tracking]) => { result.tags.push({ name, tracking }); }), new LineParser(/- \[deleted]\s+\S+\s*-> (.+)$/, (result, [tracking]) => { result.deleted.push({ tracking }); }), new LineParser(/\s*([^.]+)\.\.(\S+)\s+(\S+)\s*-> (.+)$/, (result, [from, to, name, tracking]) => { result.updated.push({ name, tracking, to, from }); }) ]; } }); var fetch_exports = {}; __export2(fetch_exports, { fetchTask: () => fetchTask }); function disallowedCommand2(command) { return /^--upload-pack(=|$)/.test(command); } function fetchTask(remote, branch, customArgs) { const commands = ["fetch", ...customArgs]; if (remote && branch) { commands.push(remote, branch); } const banned = commands.find(disallowedCommand2); if (banned) { return configurationErrorTask(`git.fetch: potential exploit argument blocked.`); } return { commands, format: "utf-8", parser: parseFetchResult }; } var init_fetch = __esm({ "src/lib/tasks/fetch.ts"() { init_parse_fetch(); init_task(); } }); function parseMoveResult(stdOut) { return parseStringResponse({ moves: [] }, parsers11, stdOut); } var parsers11; var init_parse_move = __esm({ "src/lib/parsers/parse-move.ts"() { init_utils(); parsers11 = [ new LineParser(/^Renaming (.+) to (.+)$/, (result, [from, to]) => { result.moves.push({ from, to }); }) ]; } }); var move_exports = {}; __export2(move_exports, { moveTask: () => moveTask }); function moveTask(from, to) { return { commands: ["mv", "-v", ...asArray(from), to], format: "utf-8", parser: parseMoveResult }; } var init_move = __esm({ "src/lib/tasks/move.ts"() { init_parse_move(); init_utils(); } }); var pull_exports = {}; __export2(pull_exports, { pullTask: () => pullTask }); function pullTask(remote, branch, customArgs) { const commands = ["pull", ...customArgs]; if (remote && branch) { commands.splice(1, 0, remote, branch); } return { commands, format: "utf-8", parser(stdOut, stdErr) { return parsePullResult(stdOut, stdErr); }, onError(result, _error, _done, fail) { const pullError = parsePullErrorResult(bufferToString(result.stdOut), bufferToString(result.stdErr)); if (pullError) { return fail(new GitResponseError(pullError)); } fail(_error); } }; } var init_pull = __esm({ "src/lib/tasks/pull.ts"() { init_git_response_error(); init_parse_pull(); init_utils(); } }); function parseGetRemotes(text) { const remotes = {}; forEach(text, ([name]) => remotes[name] = { name }); return Object.values(remotes); } function parseGetRemotesVerbose(text) { const remotes = {}; forEach(text, ([name, url, purpose]) => { if (!remotes.hasOwnProperty(name)) { remotes[name] = { name, refs: { fetch: "", push: "" } }; } if (purpose && url) { remotes[name].refs[purpose.replace(/[^a-z]/g, "")] = url; } }); return Object.values(remotes); } function forEach(text, handler) { forEachLineWithContent(text, (line) => handler(line.split(/\s+/))); } var init_GetRemoteSummary = __esm({ "src/lib/responses/GetRemoteSummary.ts"() { init_utils(); } }); var remote_exports = {}; __export2(remote_exports, { addRemoteTask: () => addRemoteTask, getRemotesTask: () => getRemotesTask, listRemotesTask: () => listRemotesTask, remoteTask: () => remoteTask, removeRemoteTask: () => removeRemoteTask }); function addRemoteTask(remoteName, remoteRepo, customArgs = []) { return straightThroughStringTask(["remote", "add", ...customArgs, remoteName, remoteRepo]); } function getRemotesTask(verbose) { const commands = ["remote"]; if (verbose) { commands.push("-v"); } return { commands, format: "utf-8", parser: verbose ? parseGetRemotesVerbose : parseGetRemotes }; } function listRemotesTask(customArgs = []) { const commands = [...customArgs]; if (commands[0] !== "ls-remote") { commands.unshift("ls-remote"); } return straightThroughStringTask(commands); } function remoteTask(customArgs = []) { const commands = [...customArgs]; if (commands[0] !== "remote") { commands.unshift("remote"); } return straightThroughStringTask(commands); } function removeRemoteTask(remoteName) { return straightThroughStringTask(["remote", "remove", remoteName]); } var init_remote = __esm({ "src/lib/tasks/remote.ts"() { init_GetRemoteSummary(); init_task(); } }); var stash_list_exports = {}; __export2(stash_list_exports, { stashListTask: () => stashListTask }); function stashListTask(opt = {}, customArgs) { const options = parseLogOptions(opt); const commands = ["stash", "list", ...options.commands, ...customArgs]; const parser3 = createListLogSummaryParser(options.splitter, options.fields, logFormatFromCommand(commands)); return validateLogFormatConfig(commands) || { commands, format: "utf-8", parser: parser3 }; } var init_stash_list = __esm({ "src/lib/tasks/stash-list.ts"() { init_log_format(); init_parse_list_log_summary(); init_diff(); init_log(); } }); var sub_module_exports = {}; __export2(sub_module_exports, { addSubModuleTask: () => addSubModuleTask, initSubModuleTask: () => initSubModuleTask, subModuleTask: () => subModuleTask, updateSubModuleTask: () => updateSubModuleTask }); function addSubModuleTask(repo, path) { return subModuleTask(["add", repo, path]); } function initSubModuleTask(customArgs) { return subModuleTask(["init", ...customArgs]); } function subModuleTask(customArgs) { const commands = [...customArgs]; if (commands[0] !== "submodule") { commands.unshift("submodule"); } return straightThroughStringTask(commands); } function updateSubModuleTask(customArgs) { return subModuleTask(["update", ...customArgs]); } var init_sub_module = __esm({ "src/lib/tasks/sub-module.ts"() { init_task(); } }); function singleSorted(a, b) { const aIsNum = isNaN(a); const bIsNum = isNaN(b); if (aIsNum !== bIsNum) { return aIsNum ? 1 : -1; } return aIsNum ? sorted(a, b) : 0; } function sorted(a, b) { return a === b ? 0 : a > b ? 1 : -1; } function trimmed(input) { return input.trim(); } function toNumber(input) { if (typeof input === "string") { return parseInt(input.replace(/^\D+/g, ""), 10) || 0; } return 0; } var TagList; var parseTagList; var init_TagList = __esm({ "src/lib/responses/TagList.ts"() { TagList = class { constructor(all, latest) { this.all = all; this.latest = latest; } }; parseTagList = function(data, customSort = false) { const tags = data.split("\n").map(trimmed).filter(Boolean); if (!customSort) { tags.sort(function(tagA, tagB) { const partsA = tagA.split("."); const partsB = tagB.split("."); if (partsA.length === 1 || partsB.length === 1) { return singleSorted(toNumber(partsA[0]), toNumber(partsB[0])); } for (let i = 0, l = Math.max(partsA.length, partsB.length); i < l; i++) { const diff = sorted(toNumber(partsA[i]), toNumber(partsB[i])); if (diff) { return diff; } } return 0; }); } const latest = customSort ? tags[0] : [...tags].reverse().find((tag) => tag.indexOf(".") >= 0); return new TagList(tags, latest); }; } }); var tag_exports = {}; __export2(tag_exports, { addAnnotatedTagTask: () => addAnnotatedTagTask, addTagTask: () => addTagTask, tagListTask: () => tagListTask }); function tagListTask(customArgs = []) { const hasCustomSort = customArgs.some((option) => /^--sort=/.test(option)); return { format: "utf-8", commands: ["tag", "-l", ...customArgs], parser(text) { return parseTagList(text, hasCustomSort); } }; } function addTagTask(name) { return { format: "utf-8", commands: ["tag", name], parser() { return { name }; } }; } function addAnnotatedTagTask(name, tagMessage) { return { format: "utf-8", commands: ["tag", "-a", "-m", tagMessage, name], parser() { return { name }; } }; } var init_tag = __esm({ "src/lib/tasks/tag.ts"() { init_TagList(); } }); var require_git = __commonJS2({ "src/git.js"(exports, module2) { var { GitExecutor: GitExecutor2 } = (init_git_executor(), __toCommonJS2(git_executor_exports)); var { SimpleGitApi: SimpleGitApi2 } = (init_simple_git_api(), __toCommonJS2(simple_git_api_exports)); var { Scheduler: Scheduler2 } = (init_scheduler(), __toCommonJS2(scheduler_exports)); var { configurationErrorTask: configurationErrorTask2 } = (init_task(), __toCommonJS2(task_exports)); var { asArray: asArray2, filterArray: filterArray2, filterPrimitives: filterPrimitives2, filterString: filterString2, filterStringOrStringArray: filterStringOrStringArray2, filterType: filterType2, getTrailingOptions: getTrailingOptions2, trailingFunctionArgument: trailingFunctionArgument2, trailingOptionsArgument: trailingOptionsArgument2 } = (init_utils(), __toCommonJS2(utils_exports)); var { applyPatchTask: applyPatchTask2 } = (init_apply_patch(), __toCommonJS2(apply_patch_exports)); var { branchTask: branchTask2, branchLocalTask: branchLocalTask2, deleteBranchesTask: deleteBranchesTask2, deleteBranchTask: deleteBranchTask2 } = (init_branch(), __toCommonJS2(branch_exports)); var { checkIgnoreTask: checkIgnoreTask2 } = (init_check_ignore(), __toCommonJS2(check_ignore_exports)); var { checkIsRepoTask: checkIsRepoTask2 } = (init_check_is_repo(), __toCommonJS2(check_is_repo_exports)); var { cloneTask: cloneTask2, cloneMirrorTask: cloneMirrorTask2 } = (init_clone(), __toCommonJS2(clone_exports)); var { cleanWithOptionsTask: cleanWithOptionsTask2, isCleanOptionsArray: isCleanOptionsArray2 } = (init_clean(), __toCommonJS2(clean_exports)); var { diffSummaryTask: diffSummaryTask2 } = (init_diff(), __toCommonJS2(diff_exports)); var { fetchTask: fetchTask2 } = (init_fetch(), __toCommonJS2(fetch_exports)); var { moveTask: moveTask2 } = (init_move(), __toCommonJS2(move_exports)); var { pullTask: pullTask2 } = (init_pull(), __toCommonJS2(pull_exports)); var { pushTagsTask: pushTagsTask2 } = (init_push(), __toCommonJS2(push_exports)); var { addRemoteTask: addRemoteTask2, getRemotesTask: getRemotesTask2, listRemotesTask: listRemotesTask2, remoteTask: remoteTask2, removeRemoteTask: removeRemoteTask2 } = (init_remote(), __toCommonJS2(remote_exports)); var { getResetMode: getResetMode2, resetTask: resetTask2 } = (init_reset(), __toCommonJS2(reset_exports)); var { stashListTask: stashListTask2 } = (init_stash_list(), __toCommonJS2(stash_list_exports)); var { addSubModuleTask: addSubModuleTask2, initSubModuleTask: initSubModuleTask2, subModuleTask: subModuleTask2, updateSubModuleTask: updateSubModuleTask2 } = (init_sub_module(), __toCommonJS2(sub_module_exports)); var { addAnnotatedTagTask: addAnnotatedTagTask2, addTagTask: addTagTask2, tagListTask: tagListTask2 } = (init_tag(), __toCommonJS2(tag_exports)); var { straightThroughBufferTask: straightThroughBufferTask2, straightThroughStringTask: straightThroughStringTask2 } = (init_task(), __toCommonJS2(task_exports)); function Git2(options, plugins) { this._executor = new GitExecutor2(options.binary, options.baseDir, new Scheduler2(options.maxConcurrentProcesses), plugins); this._trimmed = options.trimmed; } (Git2.prototype = Object.create(SimpleGitApi2.prototype)).constructor = Git2; Git2.prototype.customBinary = function(command) { this._executor.binary = command; return this; }; Git2.prototype.env = function(name, value) { if (arguments.length === 1 && typeof name === "object") { this._executor.env = name; } else { (this._executor.env = this._executor.env || {})[name] = value; } return this; }; Git2.prototype.stashList = function(options) { return this._runTask(stashListTask2(trailingOptionsArgument2(arguments) || {}, filterArray2(options) && options || []), trailingFunctionArgument2(arguments)); }; function createCloneTask(api, task, repoPath, localPath) { if (typeof repoPath !== "string") { return configurationErrorTask2(`git.${api}() requires a string 'repoPath'`); } return task(repoPath, filterType2(localPath, filterString2), getTrailingOptions2(arguments)); } Git2.prototype.clone = function() { return this._runTask(createCloneTask("clone", cloneTask2, ...arguments), trailingFunctionArgument2(arguments)); }; Git2.prototype.mirror = function() { return this._runTask(createCloneTask("mirror", cloneMirrorTask2, ...arguments), trailingFunctionArgument2(arguments)); }; Git2.prototype.mv = function(from, to) { return this._runTask(moveTask2(from, to), trailingFunctionArgument2(arguments)); }; Git2.prototype.checkoutLatestTag = function(then) { var git = this; return this.pull(function() { git.tags(function(err, tags) { git.checkout(tags.latest, then); }); }); }; Git2.prototype.pull = function(remote, branch, options, then) { return this._runTask(pullTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.fetch = function(remote, branch) { return this._runTask(fetchTask2(filterType2(remote, filterString2), filterType2(branch, filterString2), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.silent = function(silence) { console.warn("simple-git deprecation notice: git.silent: logging should be configured using the `debug` library / `DEBUG` environment variable, this will be an error in version 3"); return this; }; Git2.prototype.tags = function(options, then) { return this._runTask(tagListTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.rebase = function() { return this._runTask(straightThroughStringTask2(["rebase", ...getTrailingOptions2(arguments)]), trailingFunctionArgument2(arguments)); }; Git2.prototype.reset = function(mode) { return this._runTask(resetTask2(getResetMode2(mode), getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.revert = function(commit) { const next = trailingFunctionArgument2(arguments); if (typeof commit !== "string") { return this._runTask(configurationErrorTask2("Commit must be a string"), next); } return this._runTask(straightThroughStringTask2(["revert", ...getTrailingOptions2(arguments, 0, true), commit]), next); }; Git2.prototype.addTag = function(name) { const task = typeof name === "string" ? addTagTask2(name) : configurationErrorTask2("Git.addTag requires a tag name"); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.addAnnotatedTag = function(tagName, tagMessage) { return this._runTask(addAnnotatedTagTask2(tagName, tagMessage), trailingFunctionArgument2(arguments)); }; Git2.prototype.deleteLocalBranch = function(branchName, forceDelete, then) { return this._runTask(deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); }; Git2.prototype.deleteLocalBranches = function(branchNames, forceDelete, then) { return this._runTask(deleteBranchesTask2(branchNames, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments)); }; Git2.prototype.branch = function(options, then) { return this._runTask(branchTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.branchLocal = function(then) { return this._runTask(branchLocalTask2(), trailingFunctionArgument2(arguments)); }; Git2.prototype.raw = function(commands) { const createRestCommands = !Array.isArray(commands); const command = [].slice.call(createRestCommands ? arguments : commands, 0); for (let i = 0; i < command.length && createRestCommands; i++) { if (!filterPrimitives2(command[i])) { command.splice(i, command.length - i); break; } } command.push(...getTrailingOptions2(arguments, 0, true)); var next = trailingFunctionArgument2(arguments); if (!command.length) { return this._runTask(configurationErrorTask2("Raw: must supply one or more command to execute"), next); } return this._runTask(straightThroughStringTask2(command, this._trimmed), next); }; Git2.prototype.submoduleAdd = function(repo, path, then) { return this._runTask(addSubModuleTask2(repo, path), trailingFunctionArgument2(arguments)); }; Git2.prototype.submoduleUpdate = function(args, then) { return this._runTask(updateSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); }; Git2.prototype.submoduleInit = function(args, then) { return this._runTask(initSubModuleTask2(getTrailingOptions2(arguments, true)), trailingFunctionArgument2(arguments)); }; Git2.prototype.subModule = function(options, then) { return this._runTask(subModuleTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.listRemote = function() { return this._runTask(listRemotesTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.addRemote = function(remoteName, remoteRepo, then) { return this._runTask(addRemoteTask2(remoteName, remoteRepo, getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.removeRemote = function(remoteName, then) { return this._runTask(removeRemoteTask2(remoteName), trailingFunctionArgument2(arguments)); }; Git2.prototype.getRemotes = function(verbose, then) { return this._runTask(getRemotesTask2(verbose === true), trailingFunctionArgument2(arguments)); }; Git2.prototype.remote = function(options, then) { return this._runTask(remoteTask2(getTrailingOptions2(arguments)), trailingFunctionArgument2(arguments)); }; Git2.prototype.tag = function(options, then) { const command = getTrailingOptions2(arguments); if (command[0] !== "tag") { command.unshift("tag"); } return this._runTask(straightThroughStringTask2(command), trailingFunctionArgument2(arguments)); }; Git2.prototype.updateServerInfo = function(then) { return this._runTask(straightThroughStringTask2(["update-server-info"]), trailingFunctionArgument2(arguments)); }; Git2.prototype.pushTags = function(remote, then) { const task = pushTagsTask2({ remote: filterType2(remote, filterString2) }, getTrailingOptions2(arguments)); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.rm = function(files) { return this._runTask(straightThroughStringTask2(["rm", "-f", ...asArray2(files)]), trailingFunctionArgument2(arguments)); }; Git2.prototype.rmKeepLocal = function(files) { return this._runTask(straightThroughStringTask2(["rm", "--cached", ...asArray2(files)]), trailingFunctionArgument2(arguments)); }; Git2.prototype.catFile = function(options, then) { return this._catFile("utf-8", arguments); }; Git2.prototype.binaryCatFile = function() { return this._catFile("buffer", arguments); }; Git2.prototype._catFile = function(format, args) { var handler = trailingFunctionArgument2(args); var command = ["cat-file"]; var options = args[0]; if (typeof options === "string") { return this._runTask(configurationErrorTask2("Git.catFile: options must be supplied as an array of strings"), handler); } if (Array.isArray(options)) { command.push.apply(command, options); } const task = format === "buffer" ? straightThroughBufferTask2(command) : straightThroughStringTask2(command); return this._runTask(task, handler); }; Git2.prototype.diff = function(options, then) { const task = filterString2(options) ? configurationErrorTask2("git.diff: supplying options as a single string is no longer supported, switch to an array of strings") : straightThroughStringTask2(["diff", ...getTrailingOptions2(arguments)]); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.diffSummary = function() { return this._runTask(diffSummaryTask2(getTrailingOptions2(arguments, 1)), trailingFunctionArgument2(arguments)); }; Git2.prototype.applyPatch = function(patches) { const task = !filterStringOrStringArray2(patches) ? configurationErrorTask2(`git.applyPatch requires one or more string patches as the first argument`) : applyPatchTask2(asArray2(patches), getTrailingOptions2([].slice.call(arguments, 1))); return this._runTask(task, trailingFunctionArgument2(arguments)); }; Git2.prototype.revparse = function() { const commands = ["rev-parse", ...getTrailingOptions2(arguments, true)]; return this._runTask(straightThroughStringTask2(commands, true), trailingFunctionArgument2(arguments)); }; Git2.prototype.clean = function(mode, options, then) { const usingCleanOptionsArray = isCleanOptionsArray2(mode); const cleanMode = usingCleanOptionsArray && mode.join("") || filterType2(mode, filterString2) || ""; const customArgs = getTrailingOptions2([].slice.call(arguments, usingCleanOptionsArray ? 1 : 0)); return this._runTask(cleanWithOptionsTask2(cleanMode, customArgs), trailingFunctionArgument2(arguments)); }; Git2.prototype.exec = function(then) { const task = { commands: [], format: "utf-8", parser() { if (typeof then === "function") { then(); } } }; return this._runTask(task); }; Git2.prototype.clearQueue = function() { return this; }; Git2.prototype.checkIgnore = function(pathnames, then) { return this._runTask(checkIgnoreTask2(asArray2(filterType2(pathnames, filterStringOrStringArray2, []))), trailingFunctionArgument2(arguments)); }; Git2.prototype.checkIsRepo = function(checkType, then) { return this._runTask(checkIsRepoTask2(filterType2(checkType, filterString2)), trailingFunctionArgument2(arguments)); }; module2.exports = Git2; } }); init_pathspec(); init_git_error(); var GitConstructError = class extends GitError { constructor(config, message) { super(void 0, message); this.config = config; } }; init_git_error(); init_git_error(); var GitPluginError = class extends GitError { constructor(task, plugin, message) { super(task, message); this.task = task; this.plugin = plugin; Object.setPrototypeOf(this, new.target.prototype); } }; init_git_response_error(); init_task_configuration_error(); init_check_is_repo(); init_clean(); init_config(); init_grep(); init_reset(); function abortPlugin(signal) { if (!signal) { return; } const onSpawnAfter = { type: "spawn.after", action(_data, context) { function kill() { context.kill(new GitPluginError(void 0, "abort", "Abort signal received")); } signal.addEventListener("abort", kill); context.spawned.on("close", () => signal.removeEventListener("abort", kill)); } }; const onSpawnBefore = { type: "spawn.before", action(_data, context) { if (signal.aborted) { context.kill(new GitPluginError(void 0, "abort", "Abort already signaled")); } } }; return [onSpawnBefore, onSpawnAfter]; } function isConfigSwitch(arg) { return typeof arg === "string" && arg.trim().toLowerCase() === "-c"; } function preventProtocolOverride(arg, next) { if (!isConfigSwitch(arg)) { return; } if (!/^\s*protocol(.[a-z]+)?.allow/.test(next)) { return; } throw new GitPluginError(void 0, "unsafe", "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol"); } function preventUploadPack(arg, method) { if (/^\s*--(upload|receive)-pack/.test(arg)) { throw new GitPluginError(void 0, "unsafe", `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`); } if (method === "clone" && /^\s*-u\b/.test(arg)) { throw new GitPluginError(void 0, "unsafe", `Use of clone with option -u is not permitted without enabling allowUnsafePack`); } if (method === "push" && /^\s*--exec\b/.test(arg)) { throw new GitPluginError(void 0, "unsafe", `Use of push with option --exec is not permitted without enabling allowUnsafePack`); } } function blockUnsafeOperationsPlugin({ allowUnsafeProtocolOverride = false, allowUnsafePack = false } = {}) { return { type: "spawn.args", action(args, context) { args.forEach((current, index) => { const next = index < args.length ? args[index + 1] : ""; allowUnsafeProtocolOverride || preventProtocolOverride(current, next); allowUnsafePack || preventUploadPack(current, context.method); }); return args; } }; } init_utils(); function commandConfigPrefixingPlugin(configuration) { const prefix = prefixedArray(configuration, "-c"); return { type: "spawn.args", action(data) { return [...prefix, ...data]; } }; } init_utils(); var never = (0, import_promise_deferred2.deferred)().promise; function completionDetectionPlugin({ onClose = true, onExit = 50 } = {}) { function createEvents() { let exitCode = -1; const events = { close: (0, import_promise_deferred2.deferred)(), closeTimeout: (0, import_promise_deferred2.deferred)(), exit: (0, import_promise_deferred2.deferred)(), exitTimeout: (0, import_promise_deferred2.deferred)() }; const result = Promise.race([ onClose === false ? never : events.closeTimeout.promise, onExit === false ? never : events.exitTimeout.promise ]); configureTimeout(onClose, events.close, events.closeTimeout); configureTimeout(onExit, events.exit, events.exitTimeout); return { close(code) { exitCode = code; events.close.done(); }, exit(code) { exitCode = code; events.exit.done(); }, get exitCode() { return exitCode; }, result }; } function configureTimeout(flag, event, timeout) { if (flag === false) { return; } (flag === true ? event.promise : event.promise.then(() => delay(flag))).then(timeout.done); } return { type: "spawn.after", action(_0, _1) { return __async(this, arguments, function* (_data, { spawned, close }) { var _a2, _b; const events = createEvents(); let deferClose = true; let quickClose = () => void (deferClose = false); (_a2 = spawned.stdout) == null ? void 0 : _a2.on("data", quickClose); (_b = spawned.stderr) == null ? void 0 : _b.on("data", quickClose); spawned.on("error", quickClose); spawned.on("close", (code) => events.close(code)); spawned.on("exit", (code) => events.exit(code)); try { yield events.result; if (deferClose) { yield delay(50); } close(events.exitCode); } catch (err) { close(events.exitCode, err); } }); } }; } init_git_error(); function isTaskError(result) { return !!(result.exitCode && result.stdErr.length); } function getErrorMessage(result) { return Buffer.concat([...result.stdOut, ...result.stdErr]); } function errorDetectionHandler(overwrite = false, isError = isTaskError, errorMessage = getErrorMessage) { return (error, result) => { if (!overwrite && error || !isError(result)) { return error; } return errorMessage(result); }; } function errorDetectionPlugin(config) { return { type: "task.error", action(data, context) { const error = config(data.error, { stdErr: context.stdErr, stdOut: context.stdOut, exitCode: context.exitCode }); if (Buffer.isBuffer(error)) { return { error: new GitError(void 0, error.toString("utf-8")) }; } return { error }; } }; } init_utils(); var PluginStore = class { constructor() { this.plugins = /* @__PURE__ */ new Set(); } add(plugin) { const plugins = []; asArray(plugin).forEach((plugin2) => plugin2 && this.plugins.add(append(plugins, plugin2))); return () => { plugins.forEach((plugin2) => this.plugins.delete(plugin2)); }; } exec(type, data, context) { let output = data; const contextual = Object.freeze(Object.create(context)); for (const plugin of this.plugins) { if (plugin.type === type) { output = plugin.action(output, contextual); } } return output; } }; init_utils(); function progressMonitorPlugin(progress) { const progressCommand = "--progress"; const progressMethods = ["checkout", "clone", "fetch", "pull", "push"]; const onProgress = { type: "spawn.after", action(_data, context) { var _a2; if (!context.commands.includes(progressCommand)) { return; } (_a2 = context.spawned.stderr) == null ? void 0 : _a2.on("data", (chunk) => { const message = /^([\s\S]+?):\s*(\d+)% \((\d+)\/(\d+)\)/.exec(chunk.toString("utf8")); if (!message) { return; } progress({ method: context.method, stage: progressEventStage(message[1]), progress: asNumber(message[2]), processed: asNumber(message[3]), total: asNumber(message[4]) }); }); } }; const onArgs = { type: "spawn.args", action(args, context) { if (!progressMethods.includes(context.method)) { return args; } return including(args, progressCommand); } }; return [onArgs, onProgress]; } function progressEventStage(input) { return String(input.toLowerCase().split(" ", 1)) || "unknown"; } init_utils(); function spawnOptionsPlugin(spawnOptions) { const options = pick(spawnOptions, ["uid", "gid"]); return { type: "spawn.options", action(data) { return __spreadValues(__spreadValues({}, options), data); } }; } function timeoutPlugin({ block, stdErr = true, stdOut = true }) { if (block > 0) { return { type: "spawn.after", action(_data, context) { var _a2, _b; let timeout; function wait() { timeout && clearTimeout(timeout); timeout = setTimeout(kill, block); } function stop() { var _a3, _b2; (_a3 = context.spawned.stdout) == null ? void 0 : _a3.off("data", wait); (_b2 = context.spawned.stderr) == null ? void 0 : _b2.off("data", wait); context.spawned.off("exit", stop); context.spawned.off("close", stop); timeout && clearTimeout(timeout); } function kill() { stop(); context.kill(new GitPluginError(void 0, "timeout", `block timeout reached`)); } stdOut && ((_a2 = context.spawned.stdout) == null ? void 0 : _a2.on("data", wait)); stdErr && ((_b = context.spawned.stderr) == null ? void 0 : _b.on("data", wait)); context.spawned.on("exit", stop); context.spawned.on("close", stop); wait(); } }; } } init_pathspec(); function suffixPathsPlugin() { return { type: "spawn.args", action(data) { const prefix = []; let suffix; function append2(args) { (suffix = suffix || []).push(...args); } for (let i = 0; i < data.length; i++) { const param = data[i]; if (isPathSpec(param)) { append2(toPaths(param)); continue; } if (param === "--") { append2(data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item)); break; } prefix.push(param); } return !suffix ? prefix : [...prefix, "--", ...suffix.map(String)]; } }; } init_utils(); var Git = require_git(); function gitInstanceFactory(baseDir, options) { const plugins = new PluginStore(); const config = createInstanceConfig(baseDir && (typeof baseDir === "string" ? { baseDir } : baseDir) || {}, options); if (!folderExists(config.baseDir)) { throw new GitConstructError(config, `Cannot use simple-git on a directory that does not exist`); } if (Array.isArray(config.config)) { plugins.add(commandConfigPrefixingPlugin(config.config)); } plugins.add(blockUnsafeOperationsPlugin(config.unsafe)); plugins.add(suffixPathsPlugin()); plugins.add(completionDetectionPlugin(config.completion)); config.abort && plugins.add(abortPlugin(config.abort)); config.progress && plugins.add(progressMonitorPlugin(config.progress)); config.timeout && plugins.add(timeoutPlugin(config.timeout)); config.spawnOptions && plugins.add(spawnOptionsPlugin(config.spawnOptions)); plugins.add(errorDetectionPlugin(errorDetectionHandler(true))); config.errors && plugins.add(errorDetectionPlugin(config.errors)); return new Git(config, plugins); } init_git_response_error(); var esm_default = gitInstanceFactory; // src/services/gitService.ts var DEFAULT_REMOTE = "origin"; var DEFAULT_BRANCH = "main"; var CURRENT_TIME = () => (0, import_dayjs.default)().format("YYYY-MM-DDTHH:mm"); var COMMIT_MESSAGE = (deviceName) => `chore: vault backup from ${deviceName} at ${CURRENT_TIME()}`; var SimpleGitService = class { constructor(repoPath, settings) { this.settings = settings; __publicField(this, "gitProvider"); logger_default.debug("Initializing SimpleGitService..."); this.gitProvider = esm_default(repoPath); logger_default.debug("SimpleGitService initialized."); } async gitCommit(message = COMMIT_MESSAGE(this.settings.deviceName)) { logger_default.info(`Committing... ${message}`); await this.gitProvider.commit(message); } async gitPullWithRebase() { await this.gitProvider.pull(["--rebase"]); } async gitPush(forcePush = false) { const options = forcePush ? ["-f"] : []; await this.gitProvider.push(DEFAULT_REMOTE, DEFAULT_BRANCH, options); logger_default.info(`Pushed changes to ${DEFAULT_REMOTE}/${DEFAULT_BRANCH}.`); } async gitStage(...files) { await Promise.all(files.map((file) => this.gitProvider.add(file))); } async gitStageAll() { await this.gitProvider.add("./*"); } async isLocalAhead() { return this.gitProvider.status().then((status) => status.ahead > 0); } async isRebasing() { return this.gitProvider.raw(["status"]).then((status) => status.includes("rebase")); } async isRemoteConfigured() { let remoteConfigured = false; try { const remotes = await this.gitProvider.listRemote(["--get-url"]); remoteConfigured = !!remotes; } catch (e) { remoteConfigured = false; } return remoteConfigured; } async isRepo() { return this.gitProvider.checkIsRepo(); } async getConflictingFiles() { return this.gitProvider.status().then((status) => status.conflicted); } async stopRebasing() { process.env.GIT_EDITOR = "true"; await this.gitStageAll(); await this.gitProvider.rebase(["--continue"]); await this.gitPush(); process.env.GIT_EDITOR = void 0; } async unstagedChangesExist() { return this.gitProvider.status().then((status) => status.files.length > 0 || status.not_added.length > 0); } }; // src/services/gitignoreService.ts var import_path = require("path"); var GITIGNORE_FILE_NAME = ".gitignore"; var GitignoreService = class { constructor(basePath, gitService) { this.gitService = gitService; __publicField(this, "gitignorePath"); logger_default.debug("Initializing GitignoreService..."); this.gitignorePath = (0, import_path.resolve)(basePath, GITIGNORE_FILE_NAME); logger_default.debug("GitignoreService initialized."); } async stageCommitAndPushGitignore(message) { await this.gitService.gitStage(GITIGNORE_FILE_NAME); await this.gitService.gitCommit(message); await this.gitService.gitPush(); } }; // src/views/modals/unmergedFilesView.ts var import_obsidian3 = require("obsidian"); var UnmergedFilesView = class extends import_obsidian3.Modal { constructor(app, gitService) { super(app); this.gitService = gitService; } onOpen() { var _a2; this.contentEl.empty(); this.contentEl.createEl("h3", { text: "Loading...", cls: "yaos-title" }); (_a2 = this.gitService) == null ? void 0 : _a2.getConflictingFiles().then((files) => { this.contentEl.empty(); if (files.length > 0) { this.contentEl.createEl("h3", { text: "Please resolve the conflicts in the following files:", cls: "yaos-title" }); const list = this.contentEl.createEl("ul"); files.forEach( (file) => list.createEl("li").createEl("strong", { text: file, cls: "yaos-conflicting-files" }) ); } else { this.contentEl.createEl("h3", { text: "No unmerged files to show!", cls: "yaos-title" }); } }); } onClose() { this.contentEl.empty(); } }; // src/views/settingsTab.ts var import_obsidian4 = require("obsidian"); var import_os = __toESM(require("os")); var GITHUB_ISSUE_LINK = "https://github.com/mahyarmirrashed/yaos/issues/new/choose"; var DEFAULT_YAOS_SETTINGS = { deviceName: import_os.default.hostname(), syncImages: false, syncAudio: false, syncVideos: false, syncPdfs: false, syncOtherFiles: false, syncMainSettings: false, syncAppearanceSettings: false, syncThemesAndSnippets: false, syncHotkeys: false, syncCorePluginSettings: false, syncCommunityPluginSettings: false }; var YaosSettingTab = class extends import_obsidian4.PluginSettingTab { constructor(app, plugin) { super(app, plugin); __publicField(this, "plugin"); this.plugin = plugin; } display() { const { containerEl } = this; containerEl.empty(); this.addGeneralSection(containerEl); } addGeneralSection(el) { el.createEl("h2", { text: "General" }); this.addDeviceNameSetting(el); this.addCreateIssueSetting(el); } addSelectiveSection(el) { el.createEl("h2", { text: "Selective sync" }); this.addToggleSetting(el, { propertyName: "syncImages", settingName: "Sync images", settingDesc: "Sync image files with these extensions: bmp, png, jpg, jpeg, gif, svg, webp." }); this.addToggleSetting(el, { propertyName: "syncAudio", settingName: "Sync audio", settingDesc: "Sync audio files with these extensions: mp3, wav, m4a, 3gp, flac, ogg, oga, opus." }); this.addToggleSetting(el, { propertyName: "syncVideos", settingName: "Sync videos", settingDesc: "Sync video files with these extensions: mp4, webm, ogv, mov, mkv." }); this.addToggleSetting(el, { propertyName: "syncPdfs", settingName: "Sync PDFs", settingDesc: "Sync PDF files." }); this.addToggleSetting(el, { propertyName: "syncOtherFiles", settingName: "Sync all other types", settingDesc: "Sync unsupported file types." }); } addVaultSection(el) { el.createEl("h2", { text: "Vault configuration sync" }); this.addDisabledToggleSetting(el, { propertyName: "syncMainSettings", settingName: "Sync main settings", settingDesc: "Sync editor settings, files, link settings, and others." }); this.addDisabledToggleSetting(el, { propertyName: "syncAppearanceSettings", settingName: "Sync appearance settings", settingDesc: "Sync appearance settings like dark mode, active theme, and enabled snippets." }); this.addDisabledToggleSetting(el, { propertyName: "syncThemesAndSnippets", settingName: "Sync themes and snippets", settingDesc: "Sync downloaded themes and snippets. Whether they are enabled depends on the previous setting." }); this.addDisabledToggleSetting(el, { propertyName: "syncHotkeys", settingName: "Sync hotkeys", settingDesc: "Sync custom hotkeys." }); this.addDisabledToggleSetting(el, { propertyName: "syncCorePluginSettings", settingName: "Sync core plugin settings", settingDesc: "Sync core plugin settings." }); this.addDisabledToggleSetting(el, { propertyName: "syncCommunityPluginSettings", settingName: "Sync community plugin settings", settingDesc: "Sync core plugin settings." }); } addDeviceNameSetting(el) { new import_obsidian4.Setting(el).setName("Device name").setDesc( "This name will be displayed in the commit messages to indicate the sync source. Leave empty to use the default name." ).addText( (text) => text.setPlaceholder(DEFAULT_YAOS_SETTINGS.deviceName).setValue(this.plugin.settings.deviceName).onChange(async (deviceName) => { this.plugin.settings.deviceName = deviceName; await this.plugin.saveSettings(); }) ); } addCreateIssueSetting(el) { new import_obsidian4.Setting(el).setName("Contact support").setDesc( "If you run into any issues working with this plugin, please let us know by creating an issue on our GitHub page." ).addButton( (button) => button.setButtonText("Create issue").setTooltip("Create an issue on GitHub").setCta().onClick(() => self.open(GITHUB_ISSUE_LINK, "_blank", "norefferrer")) ); } addDisabledToggleSetting(el, options) { this.addToggleSetting(el, options, true); } addToggleSetting(el, options, disabled = false) { const { propertyName, settingName, settingDesc } = options; new import_obsidian4.Setting(el).setName(settingName).setDesc(settingDesc).addToggle( (toggle) => toggle.setValue(disabled ? true : this.plugin.settings[propertyName]).setDisabled(disabled).onChange(async (value) => { this.plugin.settings[propertyName] = value; await this.plugin.saveSettings(); }) ); } }; // src/main.ts var import_obsidian5 = require("obsidian"); var PLUGIN_ICON = "sync"; var YaosPlugin = class extends import_obsidian5.Plugin { constructor() { super(...arguments); __publicField(this, "gitService"); __publicField(this, "gitignoreService"); __publicField(this, "syncController"); __publicField(this, "settings", DEFAULT_YAOS_SETTINGS); } async onload() { logger_default.debug("Initializing plugin..."); try { await this.loadSettings(); logger_default.info("Loaded settings."); } catch (e) { logger_default.error("Failed to load settings."); } const adapter = this.app.vault.adapter; if (adapter instanceof import_obsidian5.FileSystemAdapter) { const basePath = adapter.getBasePath(); this.gitService = new SimpleGitService(basePath, this.settings); this.gitignoreService = new GitignoreService(basePath, this.gitService); this.syncController = new SyncController( this.gitService, this.gitignoreService ); this.addCommand({ id: "show-unmerged", name: "Show unmerged/conflicting files", callback: () => new UnmergedFilesView(this.app, this.gitService).open() }); this.addCommand({ id: "sync", name: "Sync your vault", callback: async () => { await this.syncVault(); } }); this.addRibbonIcon(PLUGIN_ICON, PLUGIN_NAME, this.syncVault.bind(this)); this.addSettingTab(new YaosSettingTab(this.app, this)); logger_default.debug("Plugin initialized."); } else { notifyUserAboutFailure("Adapter type is not recognized."); logger_default.fatal("Logger type was not FileSystemAdapter."); } } async loadSettings() { this.settings = Object.assign( {}, DEFAULT_YAOS_SETTINGS, await this.loadData() ); if (this.settings.deviceName === "") this.settings.deviceName = DEFAULT_YAOS_SETTINGS.deviceName; } async saveSettings(settings = this.settings) { await this.saveData(settings); } async syncVault(_evt) { if (!this.gitService || !this.gitignoreService) { logger_default.fatal("Services were not initialized."); } else if (!this.syncController) { logger_default.fatal("Sync controller was not initialized."); } else { try { await this.syncController.sync(); } catch (e) { new import_obsidian5.Notice("Unknown error occurred. Please create an issue."); logger_default.fatal("Unknown error:", e); } } } };