@mks2508/coolify-mks-cli-mcp 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/coolify-state.d.ts +12 -4
- package/dist/cli/coolify-state.d.ts.map +1 -1
- package/dist/cli/index.js +8886 -7957
- package/dist/coolify/config.d.ts +25 -0
- package/dist/coolify/config.d.ts.map +1 -1
- package/dist/coolify/index.d.ts +118 -10
- package/dist/coolify/index.d.ts.map +1 -1
- package/dist/coolify/types.d.ts +61 -1
- package/dist/coolify/types.d.ts.map +1 -1
- package/dist/index.cjs +2267 -227
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +2289 -227
- package/dist/index.js.map +1 -1
- package/dist/sdk.d.ts +56 -8
- package/dist/sdk.d.ts.map +1 -1
- package/dist/server/stdio.js +253 -100
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/handlers.d.ts.map +1 -1
- package/dist/utils/env-parser.d.ts +24 -0
- package/dist/utils/env-parser.d.ts.map +1 -0
- package/dist/utils/format.d.ts +32 -0
- package/dist/utils/format.d.ts.map +1 -1
- package/package.json +2 -1
- package/src/cli/commands/create.ts +279 -37
- package/src/cli/commands/env.ts +348 -54
- package/src/cli/commands/init.ts +69 -15
- package/src/cli/commands/main-menu.ts +1 -1
- package/src/cli/commands/projects.ts +3 -3
- package/src/cli/commands/show.ts +39 -10
- package/src/cli/commands/status.ts +23 -7
- package/src/cli/commands/svc.ts +7 -1
- package/src/cli/commands/update.ts +52 -0
- package/src/cli/commands/volumes.ts +293 -0
- package/src/cli/coolify-state.ts +42 -4
- package/src/cli/index.ts +50 -4
- package/src/cli/ui/banner.ts +3 -3
- package/src/cli/ui/screen.ts +26 -2
- package/src/coolify/config.ts +75 -0
- package/src/coolify/index.ts +325 -106
- package/src/coolify/types.ts +62 -1
- package/src/sdk.ts +87 -39
- package/src/tools/definitions.ts +22 -0
- package/src/tools/handlers.ts +19 -0
- package/src/utils/env-parser.ts +45 -0
- package/src/utils/format.ts +178 -0
package/dist/index.cjs
CHANGED
|
@@ -8,6 +8,9 @@ var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
|
8
8
|
var __esm = (fn, res) => function() {
|
|
9
9
|
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
10
10
|
};
|
|
11
|
+
var __commonJS = (cb, mod) => function() {
|
|
12
|
+
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
13
|
+
};
|
|
11
14
|
var __export = (target, all) => {
|
|
12
15
|
for (var name in all) __defProp(target, name, {
|
|
13
16
|
get: all[name],
|
|
@@ -533,10 +536,10 @@ function isRunningInTerminal() {
|
|
|
533
536
|
return Boolean(isTTY || hasTerminalEnv || isTerminalProgram);
|
|
534
537
|
}
|
|
535
538
|
function supportsANSI() {
|
|
536
|
-
const env = getEnvironment();
|
|
537
|
-
if (env === "browser") return false;
|
|
538
|
-
if (env === "terminal") return true;
|
|
539
|
-
if (env === "server") return checkServerANSISupport();
|
|
539
|
+
const env$1 = getEnvironment();
|
|
540
|
+
if (env$1 === "browser") return false;
|
|
541
|
+
if (env$1 === "terminal") return true;
|
|
542
|
+
if (env$1 === "server") return checkServerANSISupport();
|
|
540
543
|
return false;
|
|
541
544
|
}
|
|
542
545
|
function checkServerANSISupport() {
|
|
@@ -545,8 +548,8 @@ function checkServerANSISupport() {
|
|
|
545
548
|
return Boolean(supportsANSI2);
|
|
546
549
|
}
|
|
547
550
|
function getColorCapability() {
|
|
548
|
-
const env = getEnvironment();
|
|
549
|
-
if (env === "browser") return "full";
|
|
551
|
+
const env$1 = getEnvironment();
|
|
552
|
+
if (env$1 === "browser") return "full";
|
|
550
553
|
if (!supportsANSI()) return "none";
|
|
551
554
|
if (typeof process !== "undefined" && process.env) {
|
|
552
555
|
const hasTrueColor = process.env.COLORTERM === "truecolor" || process.env.COLORTERM === "24bit";
|
|
@@ -956,7 +959,7 @@ var TerminalRenderer = class {
|
|
|
956
959
|
/**
|
|
957
960
|
* Get ANSI style codes
|
|
958
961
|
*/
|
|
959
|
-
getStyleCode(styles) {
|
|
962
|
+
getStyleCode(styles$2) {
|
|
960
963
|
const styleCodes = {
|
|
961
964
|
"bold": "1",
|
|
962
965
|
"dim": "2",
|
|
@@ -964,27 +967,27 @@ var TerminalRenderer = class {
|
|
|
964
967
|
"underline": "4",
|
|
965
968
|
"reset": "0"
|
|
966
969
|
};
|
|
967
|
-
const codes = styles.map((style) => styleCodes[style] || "0").join(";");
|
|
968
|
-
return codes ? `\x1B[${codes}m` : "";
|
|
970
|
+
const codes$1 = styles$2.map((style) => styleCodes[style] || "0").join(";");
|
|
971
|
+
return codes$1 ? `\x1B[${codes$1}m` : "";
|
|
969
972
|
}
|
|
970
973
|
/**
|
|
971
974
|
* Convert log styles to ANSI formatting
|
|
972
975
|
*/
|
|
973
|
-
renderTerminal(level, message, timestamp, prefix, location, styles) {
|
|
976
|
+
renderTerminal(level$1, message, timestamp, prefix, location, styles$2) {
|
|
974
977
|
const reset = "\x1B[0m";
|
|
975
978
|
const result = {
|
|
976
979
|
text: "",
|
|
977
980
|
reset
|
|
978
981
|
};
|
|
979
|
-
if (styles) {
|
|
980
|
-
result.timestamp = this.styleTimestamp(timestamp, styles.timestamp);
|
|
981
|
-
result.level = this.styleLevel(level, styles.level);
|
|
982
|
-
result.prefix = this.stylePrefix(prefix, styles.prefix);
|
|
983
|
-
result.message = this.styleMessage(message, styles.message);
|
|
984
|
-
result.location = this.styleLocation(location, styles.location);
|
|
982
|
+
if (styles$2) {
|
|
983
|
+
result.timestamp = this.styleTimestamp(timestamp, styles$2.timestamp);
|
|
984
|
+
result.level = this.styleLevel(level$1, styles$2.level);
|
|
985
|
+
result.prefix = this.stylePrefix(prefix, styles$2.prefix);
|
|
986
|
+
result.message = this.styleMessage(message, styles$2.message);
|
|
987
|
+
result.location = this.styleLocation(location, styles$2.location);
|
|
985
988
|
} else {
|
|
986
989
|
result.timestamp = this.styleTimestamp(timestamp);
|
|
987
|
-
result.level = this.styleLevel(level);
|
|
990
|
+
result.level = this.styleLevel(level$1);
|
|
988
991
|
result.prefix = this.stylePrefix(prefix);
|
|
989
992
|
result.message = this.styleMessage(message);
|
|
990
993
|
result.location = this.styleLocation(location);
|
|
@@ -1010,9 +1013,9 @@ var TerminalRenderer = class {
|
|
|
1010
1013
|
/**
|
|
1011
1014
|
* Style level with appropriate colors and formatting
|
|
1012
1015
|
*/
|
|
1013
|
-
styleLevel(level, style) {
|
|
1016
|
+
styleLevel(level$1, style) {
|
|
1014
1017
|
if (!style?.show) return "";
|
|
1015
|
-
const levelText = this.getLevelText(level);
|
|
1018
|
+
const levelText = this.getLevelText(level$1);
|
|
1016
1019
|
const levelColors = {
|
|
1017
1020
|
"debug": "magenta",
|
|
1018
1021
|
"info": "blue",
|
|
@@ -1021,7 +1024,7 @@ var TerminalRenderer = class {
|
|
|
1021
1024
|
"critical": "red"
|
|
1022
1025
|
};
|
|
1023
1026
|
if (this.colorCapability === "none") return `[${levelText}]`;
|
|
1024
|
-
const color = levelColors[level] || "white";
|
|
1027
|
+
const color = levelColors[level$1] || "white";
|
|
1025
1028
|
const colorCode = this.getColorCode(color);
|
|
1026
1029
|
const boldStyle = this.getStyleCode(["bold"]);
|
|
1027
1030
|
if (style?.style === "compact") return `${colorCode}[${levelText}][0m`;
|
|
@@ -1060,7 +1063,7 @@ var TerminalRenderer = class {
|
|
|
1060
1063
|
/**
|
|
1061
1064
|
* Get text representation of log level
|
|
1062
1065
|
*/
|
|
1063
|
-
getLevelText(level) {
|
|
1066
|
+
getLevelText(level$1) {
|
|
1064
1067
|
const levelMap = {
|
|
1065
1068
|
"debug": "DEBUG",
|
|
1066
1069
|
"info": "INFO",
|
|
@@ -1068,12 +1071,12 @@ var TerminalRenderer = class {
|
|
|
1068
1071
|
"error": "ERROR",
|
|
1069
1072
|
"critical": "CRITICAL"
|
|
1070
1073
|
};
|
|
1071
|
-
return levelMap[level] || String(level).toUpperCase();
|
|
1074
|
+
return levelMap[level$1] || String(level$1).toUpperCase();
|
|
1072
1075
|
}
|
|
1073
1076
|
/**
|
|
1074
1077
|
* Create cyberpunk-style ANSI rendering with truecolor support
|
|
1075
1078
|
*/
|
|
1076
|
-
renderCyberpunk(level, message, timestamp, prefix, location) {
|
|
1079
|
+
renderCyberpunk(level$1, message, timestamp, prefix, location) {
|
|
1077
1080
|
const reset = ANSI.reset;
|
|
1078
1081
|
const cyberpunkColors = {
|
|
1079
1082
|
"debug": "#ff00ff",
|
|
@@ -1084,10 +1087,10 @@ var TerminalRenderer = class {
|
|
|
1084
1087
|
};
|
|
1085
1088
|
const parts = [];
|
|
1086
1089
|
if (timestamp) parts.push(`${ANSI.dim}${timestamp}${reset}`);
|
|
1087
|
-
const levelColor = this.getColorCode(cyberpunkColors[level] || "#ffffff");
|
|
1090
|
+
const levelColor = this.getColorCode(cyberpunkColors[level$1] || "#ffffff");
|
|
1088
1091
|
const bgBlack = ANSI.bg.black;
|
|
1089
|
-
const bold = level === "critical" ? ANSI.bold : "";
|
|
1090
|
-
parts.push(`${bgBlack}${levelColor}${bold} ${this.getLevelText(level)} ${reset}`);
|
|
1092
|
+
const bold = level$1 === "critical" ? ANSI.bold : "";
|
|
1093
|
+
parts.push(`${bgBlack}${levelColor}${bold} ${this.getLevelText(level$1)} ${reset}`);
|
|
1091
1094
|
if (prefix) {
|
|
1092
1095
|
const cyanColor = this.getColorCode("#00ffff");
|
|
1093
1096
|
parts.push(`${bgBlack}${cyanColor}[${prefix.toUpperCase()}]${reset}`);
|
|
@@ -1102,7 +1105,7 @@ var TerminalRenderer = class {
|
|
|
1102
1105
|
/**
|
|
1103
1106
|
* Create minimal ANSI rendering with truecolor support
|
|
1104
1107
|
*/
|
|
1105
|
-
renderMinimal(level, message, timestamp, prefix) {
|
|
1108
|
+
renderMinimal(level$1, message, timestamp, prefix) {
|
|
1106
1109
|
const reset = ANSI.reset;
|
|
1107
1110
|
const minimalColors = {
|
|
1108
1111
|
"debug": "#c678dd",
|
|
@@ -1113,9 +1116,9 @@ var TerminalRenderer = class {
|
|
|
1113
1116
|
};
|
|
1114
1117
|
const parts = [];
|
|
1115
1118
|
if (timestamp) parts.push(`${ANSI.dim}${timestamp}${reset}`);
|
|
1116
|
-
const levelColor = this.getColorCode(minimalColors[level] || "#abb2bf");
|
|
1117
|
-
const bold = level === "critical" ? ANSI.bold : "";
|
|
1118
|
-
parts.push(`${levelColor}${bold}${this.getLevelText(level)}:${reset}`);
|
|
1119
|
+
const levelColor = this.getColorCode(minimalColors[level$1] || "#abb2bf");
|
|
1120
|
+
const bold = level$1 === "critical" ? ANSI.bold : "";
|
|
1121
|
+
parts.push(`${levelColor}${bold}${this.getLevelText(level$1)}:${reset}`);
|
|
1119
1122
|
if (prefix) {
|
|
1120
1123
|
const cyanColor = this.getColorCode("#56b6c2");
|
|
1121
1124
|
parts.push(`${cyanColor}[${prefix.toUpperCase()}]${reset}`);
|
|
@@ -1129,7 +1132,7 @@ var TerminalRenderer = class {
|
|
|
1129
1132
|
/**
|
|
1130
1133
|
* Get chalk-like interface for log level with truecolor support
|
|
1131
1134
|
*/
|
|
1132
|
-
getChalkForLevel(level) {
|
|
1135
|
+
getChalkForLevel(level$1) {
|
|
1133
1136
|
const levelColors = {
|
|
1134
1137
|
"debug": "#c678dd",
|
|
1135
1138
|
"info": "#61afef",
|
|
@@ -1140,7 +1143,7 @@ var TerminalRenderer = class {
|
|
|
1140
1143
|
const reset = ANSI.reset;
|
|
1141
1144
|
return {
|
|
1142
1145
|
color: (text) => {
|
|
1143
|
-
const color = levelColors[level] || "#abb2bf";
|
|
1146
|
+
const color = levelColors[level$1] || "#abb2bf";
|
|
1144
1147
|
const colorCode = this.getColorCode(color);
|
|
1145
1148
|
return `${colorCode}${text}${reset}`;
|
|
1146
1149
|
},
|
|
@@ -1175,28 +1178,28 @@ var CSS2ANSIAdapter = class {
|
|
|
1175
1178
|
/**
|
|
1176
1179
|
* Convert LogStyles to ANSIStyle for terminal rendering
|
|
1177
1180
|
*/
|
|
1178
|
-
adaptStyles(level, message, timestamp, prefix, location, styles, presetName) {
|
|
1181
|
+
adaptStyles(level$1, message, timestamp, prefix, location, styles$2, presetName) {
|
|
1179
1182
|
if (presetName) switch (presetName) {
|
|
1180
|
-
case "cyberpunk": return this.renderer.renderCyberpunk(level, message, timestamp, prefix, location);
|
|
1181
|
-
case "minimal": return this.renderer.renderMinimal(level, message, timestamp, prefix);
|
|
1182
|
-
case "production": return this.adaptProductionStyles(level, message, timestamp, prefix, location, styles);
|
|
1183
|
-
case "debug": return this.adaptDebugStyles(level, message, timestamp, prefix, location, styles);
|
|
1184
|
-
case "glassmorphism": return this.adaptGlassmorphismStyles(level, message, timestamp, prefix, location, styles);
|
|
1183
|
+
case "cyberpunk": return this.renderer.renderCyberpunk(level$1, message, timestamp, prefix, location);
|
|
1184
|
+
case "minimal": return this.renderer.renderMinimal(level$1, message, timestamp, prefix);
|
|
1185
|
+
case "production": return this.adaptProductionStyles(level$1, message, timestamp, prefix, location, styles$2);
|
|
1186
|
+
case "debug": return this.adaptDebugStyles(level$1, message, timestamp, prefix, location, styles$2);
|
|
1187
|
+
case "glassmorphism": return this.adaptGlassmorphismStyles(level$1, message, timestamp, prefix, location, styles$2);
|
|
1185
1188
|
}
|
|
1186
|
-
return this.renderer.renderTerminal(level, message, timestamp, prefix, location, styles);
|
|
1189
|
+
return this.renderer.renderTerminal(level$1, message, timestamp, prefix, location, styles$2);
|
|
1187
1190
|
}
|
|
1188
1191
|
/**
|
|
1189
1192
|
* Adapt production preset for terminal
|
|
1190
1193
|
*/
|
|
1191
|
-
adaptProductionStyles(level, message, timestamp, prefix, location, styles) {
|
|
1194
|
+
adaptProductionStyles(level$1, message, timestamp, prefix, location, styles$2) {
|
|
1192
1195
|
const reset = "\x1B[0m";
|
|
1193
|
-
const levelChalk = this.renderer.getChalkForLevel(level);
|
|
1196
|
+
const levelChalk = this.renderer.getChalkForLevel(level$1);
|
|
1194
1197
|
const parts = [];
|
|
1195
|
-
if (timestamp && styles?.timestamp?.show) parts.push(levelChalk.dim(timestamp));
|
|
1196
|
-
if (styles?.level?.show) parts.push(levelChalk.color(`[${this.renderer["getLevelText"](level)}]`));
|
|
1197
|
-
if (prefix && styles?.prefix?.show) parts.push(levelChalk.dim(`[${prefix}]`));
|
|
1198
|
-
if (message && styles?.message?.show) parts.push(levelChalk.reset(message));
|
|
1199
|
-
if (location && styles?.location?.show) parts.push(levelChalk.dim(`(${location})`));
|
|
1198
|
+
if (timestamp && styles$2?.timestamp?.show) parts.push(levelChalk.dim(timestamp));
|
|
1199
|
+
if (styles$2?.level?.show) parts.push(levelChalk.color(`[${this.renderer["getLevelText"](level$1)}]`));
|
|
1200
|
+
if (prefix && styles$2?.prefix?.show) parts.push(levelChalk.dim(`[${prefix}]`));
|
|
1201
|
+
if (message && styles$2?.message?.show) parts.push(levelChalk.reset(message));
|
|
1202
|
+
if (location && styles$2?.location?.show) parts.push(levelChalk.dim(`(${location})`));
|
|
1200
1203
|
return {
|
|
1201
1204
|
text: parts.join(" ") + reset,
|
|
1202
1205
|
reset
|
|
@@ -1205,17 +1208,17 @@ var CSS2ANSIAdapter = class {
|
|
|
1205
1208
|
/**
|
|
1206
1209
|
* Adapt debug preset for terminal
|
|
1207
1210
|
*/
|
|
1208
|
-
adaptDebugStyles(level, message, timestamp, prefix, location, styles) {
|
|
1211
|
+
adaptDebugStyles(level$1, message, timestamp, prefix, location, styles$2) {
|
|
1209
1212
|
const reset = "\x1B[0m";
|
|
1210
|
-
const levelChalk = this.renderer.getChalkForLevel(level);
|
|
1213
|
+
const levelChalk = this.renderer.getChalkForLevel(level$1);
|
|
1211
1214
|
const parts = [];
|
|
1212
|
-
if (timestamp && styles?.timestamp?.show) parts.push(levelChalk.dim(timestamp));
|
|
1213
|
-
if (styles?.level?.show) if (styles?.level?.style === "compact") parts.push(levelChalk.color(`[${this.renderer["getLevelText"](level)}]`));
|
|
1214
|
-
else parts.push(levelChalk.bold(`[${this.renderer["getLevelText"](level)}]`));
|
|
1215
|
-
if (prefix && styles?.prefix?.show) if (styles?.prefix?.style === "compact") parts.push(levelChalk.cyan.dim(`[${prefix}]`));
|
|
1215
|
+
if (timestamp && styles$2?.timestamp?.show) parts.push(levelChalk.dim(timestamp));
|
|
1216
|
+
if (styles$2?.level?.show) if (styles$2?.level?.style === "compact") parts.push(levelChalk.color(`[${this.renderer["getLevelText"](level$1)}]`));
|
|
1217
|
+
else parts.push(levelChalk.bold(`[${this.renderer["getLevelText"](level$1)}]`));
|
|
1218
|
+
if (prefix && styles$2?.prefix?.show) if (styles$2?.prefix?.style === "compact") parts.push(levelChalk.cyan.dim(`[${prefix}]`));
|
|
1216
1219
|
else parts.push(levelChalk.cyan.bold(`[${prefix}]`));
|
|
1217
|
-
if (message && styles?.message?.show) parts.push(levelChalk.reset(message));
|
|
1218
|
-
if (location && styles?.location?.show) if (styles?.location?.style === "clickable") parts.push(levelChalk.dim(`${location} (clickable)`));
|
|
1220
|
+
if (message && styles$2?.message?.show) parts.push(levelChalk.reset(message));
|
|
1221
|
+
if (location && styles$2?.location?.show) if (styles$2?.location?.style === "clickable") parts.push(levelChalk.dim(`${location} (clickable)`));
|
|
1219
1222
|
else parts.push(levelChalk.dim(`(${location})`));
|
|
1220
1223
|
return {
|
|
1221
1224
|
text: parts.join(" ") + reset,
|
|
@@ -1225,15 +1228,15 @@ var CSS2ANSIAdapter = class {
|
|
|
1225
1228
|
/**
|
|
1226
1229
|
* Adapt glassmorphism preset for terminal
|
|
1227
1230
|
*/
|
|
1228
|
-
adaptGlassmorphismStyles(level, message, timestamp, prefix, location, styles) {
|
|
1231
|
+
adaptGlassmorphismStyles(level$1, message, timestamp, prefix, location, styles$2) {
|
|
1229
1232
|
const reset = "\x1B[0m";
|
|
1230
|
-
const levelChalk = this.renderer.getChalkForLevel(level);
|
|
1233
|
+
const levelChalk = this.renderer.getChalkForLevel(level$1);
|
|
1231
1234
|
const parts = [];
|
|
1232
|
-
if (timestamp && styles?.timestamp?.show) parts.push(levelChalk.dim(timestamp));
|
|
1233
|
-
if (styles?.level?.show) parts.push(levelChalk.bgGray(` ${this.renderer["getLevelText"](level)} `));
|
|
1234
|
-
if (prefix && styles?.prefix?.show) parts.push(levelChalk.bgBlue(`[${prefix}]`));
|
|
1235
|
-
if (message && styles?.message?.show) parts.push(levelChalk.reset(message));
|
|
1236
|
-
if (location && styles?.location?.show) parts.push(levelChalk.dim(`(${location})`));
|
|
1235
|
+
if (timestamp && styles$2?.timestamp?.show) parts.push(levelChalk.dim(timestamp));
|
|
1236
|
+
if (styles$2?.level?.show) parts.push(levelChalk.bgGray(` ${this.renderer["getLevelText"](level$1)} `));
|
|
1237
|
+
if (prefix && styles$2?.prefix?.show) parts.push(levelChalk.bgBlue(`[${prefix}]`));
|
|
1238
|
+
if (message && styles$2?.message?.show) parts.push(levelChalk.reset(message));
|
|
1239
|
+
if (location && styles$2?.location?.show) parts.push(levelChalk.dim(`(${location})`));
|
|
1237
1240
|
return {
|
|
1238
1241
|
text: parts.join(" ") + reset,
|
|
1239
1242
|
reset
|
|
@@ -1284,9 +1287,9 @@ var CSS2ANSIAdapter = class {
|
|
|
1284
1287
|
/**
|
|
1285
1288
|
* Check if a style should be rendered in terminal
|
|
1286
1289
|
*/
|
|
1287
|
-
shouldRenderStyle(styleType, styles) {
|
|
1288
|
-
if (!styles) return true;
|
|
1289
|
-
const styleConfig = styles[styleType];
|
|
1290
|
+
shouldRenderStyle(styleType, styles$2) {
|
|
1291
|
+
if (!styles$2) return true;
|
|
1292
|
+
const styleConfig = styles$2[styleType];
|
|
1290
1293
|
return styleConfig?.show !== false;
|
|
1291
1294
|
}
|
|
1292
1295
|
/**
|
|
@@ -1297,8 +1300,8 @@ var CSS2ANSIAdapter = class {
|
|
|
1297
1300
|
}
|
|
1298
1301
|
};
|
|
1299
1302
|
const css2ansiAdapter = new CSS2ANSIAdapter();
|
|
1300
|
-
function adaptToTerminal(level, message, timestamp, prefix, location, styles, presetName) {
|
|
1301
|
-
return css2ansiAdapter.adaptStyles(level, message, timestamp, prefix, location, styles, presetName);
|
|
1303
|
+
function adaptToTerminal(level$1, message, timestamp, prefix, location, styles$2, presetName) {
|
|
1304
|
+
return css2ansiAdapter.adaptStyles(level$1, message, timestamp, prefix, location, styles$2, presetName);
|
|
1302
1305
|
}
|
|
1303
1306
|
function detectDevToolsTheme() {
|
|
1304
1307
|
try {
|
|
@@ -1310,9 +1313,9 @@ function detectDevToolsTheme() {
|
|
|
1310
1313
|
return "light";
|
|
1311
1314
|
}
|
|
1312
1315
|
}
|
|
1313
|
-
function getAdaptiveColor(colors, theme) {
|
|
1316
|
+
function getAdaptiveColor(colors$2, theme) {
|
|
1314
1317
|
const currentTheme = theme ?? detectDevToolsTheme();
|
|
1315
|
-
return colors[currentTheme];
|
|
1318
|
+
return colors$2[currentTheme];
|
|
1316
1319
|
}
|
|
1317
1320
|
function setupThemeChangeListener(callback) {
|
|
1318
1321
|
try {
|
|
@@ -1334,11 +1337,11 @@ function setupThemeChangeListener(callback) {
|
|
|
1334
1337
|
return null;
|
|
1335
1338
|
}
|
|
1336
1339
|
}
|
|
1337
|
-
function createStyledOutput(level, levelStyles, prefix, message, stackInfo, autoDetectTheme = true, presetStyles, presetName) {
|
|
1338
|
-
const levelConfig = levelStyles[level];
|
|
1340
|
+
function createStyledOutput(level$1, levelStyles, prefix, message, stackInfo, autoDetectTheme = true, presetStyles, presetName) {
|
|
1341
|
+
const levelConfig = levelStyles[level$1];
|
|
1339
1342
|
const timestamp = formatTimestamp();
|
|
1340
1343
|
const environment = getEnvironment();
|
|
1341
|
-
if (environment !== "browser" && supportsANSI()) return createTerminalOutput(level, message, timestamp, prefix, stackInfo, presetStyles, presetName);
|
|
1344
|
+
if (environment !== "browser" && supportsANSI()) return createTerminalOutput(level$1, message, timestamp, prefix, stackInfo, presetStyles, presetName);
|
|
1342
1345
|
const currentTheme = autoDetectTheme ? detectDevToolsTheme() : "light";
|
|
1343
1346
|
const timestampStyle = new StyleBuilder().color(getAdaptiveColor(ADAPTIVE_COLORS.timestamp, currentTheme)).size("11px").font("Monaco, Consolas, monospace").build();
|
|
1344
1347
|
const levelStyle = new StyleBuilder().bg(levelConfig.background).color(levelConfig.color).border(levelConfig.border).shadow(levelConfig.shadow).padding("2px 8px").rounded("4px").bold().font("Monaco, Consolas, monospace").size("12px").build();
|
|
@@ -1346,18 +1349,18 @@ function createStyledOutput(level, levelStyles, prefix, message, stackInfo, auto
|
|
|
1346
1349
|
const messageStyle = new StyleBuilder().color(getAdaptiveColor(ADAPTIVE_COLORS.messageText, currentTheme)).font("system-ui, -apple-system, sans-serif").size("14px").build();
|
|
1347
1350
|
const locationStyle = new StyleBuilder().color(getAdaptiveColor(ADAPTIVE_COLORS.location, currentTheme)).size("11px").font("Monaco, Consolas, monospace").build();
|
|
1348
1351
|
let format = `%c${timestamp.slice(11, 23)} %c${levelConfig.emoji} ${levelConfig.label}`;
|
|
1349
|
-
const styles = [timestampStyle, levelStyle];
|
|
1352
|
+
const styles$2 = [timestampStyle, levelStyle];
|
|
1350
1353
|
if (prefix) {
|
|
1351
1354
|
format += ` %c${prefix}`;
|
|
1352
|
-
styles.push(prefixStyle);
|
|
1355
|
+
styles$2.push(prefixStyle);
|
|
1353
1356
|
}
|
|
1354
1357
|
format += ` %c${message}`;
|
|
1355
|
-
styles.push(messageStyle);
|
|
1358
|
+
styles$2.push(messageStyle);
|
|
1356
1359
|
if (stackInfo) {
|
|
1357
1360
|
format += ` %c(${stackInfo.file}:${stackInfo.line}:${stackInfo.column})`;
|
|
1358
|
-
styles.push(locationStyle);
|
|
1361
|
+
styles$2.push(locationStyle);
|
|
1359
1362
|
}
|
|
1360
|
-
return [format, ...styles];
|
|
1363
|
+
return [format, ...styles$2];
|
|
1361
1364
|
}
|
|
1362
1365
|
function generateLogId() {
|
|
1363
1366
|
return `${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
@@ -1380,9 +1383,9 @@ function safeStringify(obj, _maxDepth = 3) {
|
|
|
1380
1383
|
return String(obj);
|
|
1381
1384
|
}
|
|
1382
1385
|
}
|
|
1383
|
-
function createTerminalOutput(level, message, timestamp, prefix, stackInfo, presetStyles, presetName) {
|
|
1386
|
+
function createTerminalOutput(level$1, message, timestamp, prefix, stackInfo, presetStyles, presetName) {
|
|
1384
1387
|
const location = stackInfo ? `${stackInfo.file}:${stackInfo.line}:${stackInfo.column}` : void 0;
|
|
1385
|
-
const ansiStyle = adaptToTerminal(level, message, timestamp, prefix, location, presetStyles, presetName);
|
|
1388
|
+
const ansiStyle = adaptToTerminal(level$1, message, timestamp, prefix, location, presetStyles, presetName);
|
|
1386
1389
|
return [ansiStyle.text];
|
|
1387
1390
|
}
|
|
1388
1391
|
const isNode = typeof process !== "undefined" && process.versions && process.versions.node;
|
|
@@ -1419,9 +1422,9 @@ var SerializerRegistry = class {
|
|
|
1419
1422
|
pattern: regex.source,
|
|
1420
1423
|
flags: regex.flags
|
|
1421
1424
|
}), 90);
|
|
1422
|
-
this.add(Map, (map, ctx) => {
|
|
1425
|
+
this.add(Map, (map$1, ctx) => {
|
|
1423
1426
|
const obj = {};
|
|
1424
|
-
map.forEach((value, key) => {
|
|
1427
|
+
map$1.forEach((value, key) => {
|
|
1425
1428
|
const keyStr = typeof key === "object" ? JSON.stringify(key) : String(key);
|
|
1426
1429
|
obj[keyStr] = this.serializeInternal(value, {
|
|
1427
1430
|
...ctx,
|
|
@@ -1649,7 +1652,7 @@ var TransportManager = class {
|
|
|
1649
1652
|
}
|
|
1650
1653
|
add(target) {
|
|
1651
1654
|
const id = generateTransportId();
|
|
1652
|
-
const level = target.level || this.defaultLevel;
|
|
1655
|
+
const level$1 = target.level || this.defaultLevel;
|
|
1653
1656
|
let transport;
|
|
1654
1657
|
if (typeof target.target === "string") throw new Error(`String transport targets not supported. Use inline transport object.`);
|
|
1655
1658
|
else transport = target.target;
|
|
@@ -1657,8 +1660,8 @@ var TransportManager = class {
|
|
|
1657
1660
|
id,
|
|
1658
1661
|
transport,
|
|
1659
1662
|
options: target.options || {},
|
|
1660
|
-
level,
|
|
1661
|
-
levelValue: LOG_LEVELS[level]
|
|
1663
|
+
level: level$1,
|
|
1664
|
+
levelValue: LOG_LEVELS[level$1]
|
|
1662
1665
|
};
|
|
1663
1666
|
this.transports.set(id, entry);
|
|
1664
1667
|
return id;
|
|
@@ -2516,10 +2519,10 @@ var LogStyleBuilder = class {
|
|
|
2516
2519
|
/**
|
|
2517
2520
|
* Internal method to update part configuration
|
|
2518
2521
|
*/
|
|
2519
|
-
_updatePartConfig(part, styles) {
|
|
2522
|
+
_updatePartConfig(part, styles$2) {
|
|
2520
2523
|
if (part === "layout" || part === "backdrop" || part === "transparency") return;
|
|
2521
2524
|
if (!this.logStyles[part]) this.logStyles[part] = {};
|
|
2522
|
-
this.logStyles[part].style = styles;
|
|
2525
|
+
this.logStyles[part].style = styles$2;
|
|
2523
2526
|
}
|
|
2524
2527
|
};
|
|
2525
2528
|
var PartStyleBuilderProxy = class {
|
|
@@ -2545,8 +2548,8 @@ var PartStyleBuilderProxy = class {
|
|
|
2545
2548
|
* Helper to apply styles to the parent builder
|
|
2546
2549
|
*/
|
|
2547
2550
|
applyStyles(styler) {
|
|
2548
|
-
const styles = styler.build();
|
|
2549
|
-
this.parentBuilder._updatePartConfig(this.partName, styles);
|
|
2551
|
+
const styles$2 = styler.build();
|
|
2552
|
+
this.parentBuilder._updatePartConfig(this.partName, styles$2);
|
|
2550
2553
|
return this;
|
|
2551
2554
|
}
|
|
2552
2555
|
};
|
|
@@ -3090,11 +3093,11 @@ var ExportLogHandler = class {
|
|
|
3090
3093
|
/**
|
|
3091
3094
|
* Handle incoming log and store in buffer
|
|
3092
3095
|
*/
|
|
3093
|
-
handle(level, message, args, metadata) {
|
|
3096
|
+
handle(level$1, message, args, metadata) {
|
|
3094
3097
|
const entry = {
|
|
3095
3098
|
id: generateLogId(),
|
|
3096
3099
|
timestamp: metadata.timestamp,
|
|
3097
|
-
level,
|
|
3100
|
+
level: level$1,
|
|
3098
3101
|
prefix: metadata.prefix,
|
|
3099
3102
|
message,
|
|
3100
3103
|
args,
|
|
@@ -3254,15 +3257,15 @@ var ExportLogHandler = class {
|
|
|
3254
3257
|
}
|
|
3255
3258
|
if (options.groupBy === "level") {
|
|
3256
3259
|
const grouped = logs.reduce((acc, entry) => {
|
|
3257
|
-
const level = entry.level;
|
|
3258
|
-
if (!acc[level]) acc[level] = [];
|
|
3259
|
-
const levelArray = acc[level];
|
|
3260
|
+
const level$1 = entry.level;
|
|
3261
|
+
if (!acc[level$1]) acc[level$1] = [];
|
|
3262
|
+
const levelArray = acc[level$1];
|
|
3260
3263
|
if (levelArray) levelArray.push(entry);
|
|
3261
3264
|
return acc;
|
|
3262
3265
|
}, {});
|
|
3263
|
-
Object.entries(grouped).forEach(([level, entries]) => {
|
|
3264
|
-
const emoji = this.getLevelEmoji(level);
|
|
3265
|
-
content += `## ${emoji} ${level.toUpperCase()} (${entries.length})
|
|
3266
|
+
Object.entries(grouped).forEach(([level$1, entries]) => {
|
|
3267
|
+
const emoji = this.getLevelEmoji(level$1);
|
|
3268
|
+
content += `## ${emoji} ${level$1.toUpperCase()} (${entries.length})
|
|
3266
3269
|
|
|
3267
3270
|
`;
|
|
3268
3271
|
entries.forEach((entry) => {
|
|
@@ -3293,10 +3296,10 @@ var ExportLogHandler = class {
|
|
|
3293
3296
|
exportPlain(logs, options) {
|
|
3294
3297
|
return logs.map((entry) => {
|
|
3295
3298
|
const time = formatDisplayTime(new Date(entry.timestamp), options.minimal ? "time-only" : "short");
|
|
3296
|
-
const level = entry.level.toUpperCase().padEnd(8);
|
|
3299
|
+
const level$1 = entry.level.toUpperCase().padEnd(8);
|
|
3297
3300
|
const prefix = entry.prefix ? `[${entry.prefix}] ` : "";
|
|
3298
3301
|
const location = !options.minimal && entry.location ? ` (${entry.location.file}:${entry.location.line})` : "";
|
|
3299
|
-
return `${time} ${level} ${prefix}${entry.message}${location}`;
|
|
3302
|
+
return `${time} ${level$1} ${prefix}${entry.message}${location}`;
|
|
3300
3303
|
}).join("\n");
|
|
3301
3304
|
}
|
|
3302
3305
|
/**
|
|
@@ -3358,7 +3361,7 @@ var ExportLogHandler = class {
|
|
|
3358
3361
|
/**
|
|
3359
3362
|
* Get emoji for log level
|
|
3360
3363
|
*/
|
|
3361
|
-
getLevelEmoji(level) {
|
|
3364
|
+
getLevelEmoji(level$1) {
|
|
3362
3365
|
const emojis = {
|
|
3363
3366
|
debug: "🐞",
|
|
3364
3367
|
info: "ℹ️",
|
|
@@ -3366,7 +3369,7 @@ var ExportLogHandler = class {
|
|
|
3366
3369
|
error: "❌",
|
|
3367
3370
|
critical: "🔥"
|
|
3368
3371
|
};
|
|
3369
|
-
return emojis[level] || "";
|
|
3372
|
+
return emojis[level$1] || "";
|
|
3370
3373
|
}
|
|
3371
3374
|
/**
|
|
3372
3375
|
* Main export function
|
|
@@ -4431,8 +4434,8 @@ var Logger = class {
|
|
|
4431
4434
|
*
|
|
4432
4435
|
* @since 0.3.0
|
|
4433
4436
|
*/
|
|
4434
|
-
setVerbosity(level) {
|
|
4435
|
-
this.config.verbosity = level;
|
|
4437
|
+
setVerbosity(level$1) {
|
|
4438
|
+
this.config.verbosity = level$1;
|
|
4436
4439
|
}
|
|
4437
4440
|
/**
|
|
4438
4441
|
* Establece el tema del logger
|
|
@@ -4948,7 +4951,7 @@ var Logger = class {
|
|
|
4948
4951
|
* @param {LogLevel} level - Nivel de log a verificar
|
|
4949
4952
|
* @returns {boolean} True si debe mostrarse, false si no
|
|
4950
4953
|
*/
|
|
4951
|
-
shouldLog(level) {
|
|
4954
|
+
shouldLog(level$1) {
|
|
4952
4955
|
if (this.config.verbosity === "silent") return false;
|
|
4953
4956
|
const levels = {
|
|
4954
4957
|
debug: 0,
|
|
@@ -4957,7 +4960,7 @@ var Logger = class {
|
|
|
4957
4960
|
error: 3,
|
|
4958
4961
|
critical: 4
|
|
4959
4962
|
};
|
|
4960
|
-
return levels[level] >= levels[this.config.verbosity];
|
|
4963
|
+
return levels[level$1] >= levels[this.config.verbosity];
|
|
4961
4964
|
}
|
|
4962
4965
|
/**
|
|
4963
4966
|
* Obtiene el prefijo efectivo (global + scope)
|
|
@@ -4974,8 +4977,8 @@ var Logger = class {
|
|
|
4974
4977
|
* @param {LogLevel} level - Nivel del log
|
|
4975
4978
|
* @param {...any} args - Argumentos a loggear
|
|
4976
4979
|
*/
|
|
4977
|
-
log(level, ...args) {
|
|
4978
|
-
if (!this.shouldLog(level)) return;
|
|
4980
|
+
log(level$1, ...args) {
|
|
4981
|
+
if (!this.shouldLog(level$1)) return;
|
|
4979
4982
|
const stackInfo = this.config.enableStackTrace ? parseStackTrace() : null;
|
|
4980
4983
|
const prefix = this.getEffectivePrefix();
|
|
4981
4984
|
const timestamp = formatTimestamp();
|
|
@@ -4987,7 +4990,7 @@ var Logger = class {
|
|
|
4987
4990
|
}
|
|
4988
4991
|
const additionalArgs = serializedArgs.slice(1);
|
|
4989
4992
|
let hookEntry = {
|
|
4990
|
-
level,
|
|
4993
|
+
level: level$1,
|
|
4991
4994
|
message,
|
|
4992
4995
|
args: serializedArgs,
|
|
4993
4996
|
timestamp,
|
|
@@ -4997,20 +5000,20 @@ var Logger = class {
|
|
|
4997
5000
|
this.hookManager.emit("beforeLog", hookEntry).then((processed) => {
|
|
4998
5001
|
message = processed.message;
|
|
4999
5002
|
}).catch(() => {});
|
|
5000
|
-
const [format, ...styles2] = createStyledOutput(level, LEVEL_STYLES, prefix, message, this.displaySettings.showLocation ? stackInfo : null, this.config.autoDetectTheme, this._activePreset, this._activePresetName);
|
|
5003
|
+
const [format, ...styles2] = createStyledOutput(level$1, LEVEL_STYLES, prefix, message, this.displaySettings.showLocation ? stackInfo : null, this.config.autoDetectTheme, this._activePreset, this._activePresetName);
|
|
5001
5004
|
const groupIndent = " ".repeat(this.groupDepth);
|
|
5002
5005
|
const finalFormat = groupIndent + format;
|
|
5003
|
-
this.writeOutput(finalFormat, level, styles2, additionalArgs);
|
|
5006
|
+
this.writeOutput(finalFormat, level$1, styles2, additionalArgs);
|
|
5004
5007
|
if (this.exportHandler) this.exportHandler.setGroupInfo(this.groupDepth);
|
|
5005
5008
|
const metadata = {
|
|
5006
5009
|
timestamp,
|
|
5007
|
-
level,
|
|
5010
|
+
level: level$1,
|
|
5008
5011
|
prefix,
|
|
5009
5012
|
stackInfo: stackInfo ? stackInfo : void 0
|
|
5010
5013
|
};
|
|
5011
5014
|
this.handlers.forEach((handler) => {
|
|
5012
5015
|
try {
|
|
5013
|
-
handler.handle(level, message, serializedArgs, metadata);
|
|
5016
|
+
handler.handle(level$1, message, serializedArgs, metadata);
|
|
5014
5017
|
} catch (error2) {
|
|
5015
5018
|
console.error("Log handler failed:", error2);
|
|
5016
5019
|
}
|
|
@@ -5024,8 +5027,8 @@ var Logger = class {
|
|
|
5024
5027
|
critical: 4
|
|
5025
5028
|
};
|
|
5026
5029
|
const record = {
|
|
5027
|
-
level,
|
|
5028
|
-
levelValue: levelValues[level],
|
|
5030
|
+
level: level$1,
|
|
5031
|
+
levelValue: levelValues[level$1],
|
|
5029
5032
|
time: Date.now(),
|
|
5030
5033
|
msg: message,
|
|
5031
5034
|
prefix,
|
|
@@ -5040,14 +5043,14 @@ var Logger = class {
|
|
|
5040
5043
|
}
|
|
5041
5044
|
this.hookManager.emit("afterLog", hookEntry).catch(() => {});
|
|
5042
5045
|
}
|
|
5043
|
-
logWithBindings(bindings, level, ...args) {
|
|
5044
|
-
if (!this.shouldLog(level)) return;
|
|
5046
|
+
logWithBindings(bindings, level$1, ...args) {
|
|
5047
|
+
if (!this.shouldLog(level$1)) return;
|
|
5045
5048
|
let prefix = "";
|
|
5046
5049
|
const colorCapability = getColorCapability();
|
|
5047
5050
|
if (bindings.badges?.length) prefix += bindings.badges.map((b) => formatBadge(b, "pill", colorCapability, "#00ff88")).join(" ") + " ";
|
|
5048
5051
|
if (bindings.scope) prefix += formatBadge(bindings.scope, "pill", colorCapability, "#00ffff") + " ";
|
|
5049
5052
|
if (prefix && args.length > 0) args[0] = prefix + String(args[0]);
|
|
5050
|
-
this.log(level, ...args);
|
|
5053
|
+
this.log(level$1, ...args);
|
|
5051
5054
|
}
|
|
5052
5055
|
debug(...args) {
|
|
5053
5056
|
this.log("debug", ...args);
|
|
@@ -5407,12 +5410,12 @@ var Logger = class {
|
|
|
5407
5410
|
* @param {any[]} additionalArgs - Additional arguments to log
|
|
5408
5411
|
* @since 4.0.0
|
|
5409
5412
|
*/
|
|
5410
|
-
writeOutput(message, level, styles2, additionalArgs) {
|
|
5413
|
+
writeOutput(message, level$1, styles2, additionalArgs) {
|
|
5411
5414
|
const mode = this.config.outputMode ?? "console";
|
|
5412
5415
|
if (mode === "silent") return;
|
|
5413
5416
|
if (mode === "custom" && this.config.outputWriter) {
|
|
5414
5417
|
const fullMessage = additionalArgs.length > 0 ? `${message} ${additionalArgs.map((a) => String(a)).join(" ")}` : message;
|
|
5415
|
-
this.config.outputWriter.write(fullMessage, level, styles2);
|
|
5418
|
+
this.config.outputWriter.write(fullMessage, level$1, styles2);
|
|
5416
5419
|
return;
|
|
5417
5420
|
}
|
|
5418
5421
|
if (additionalArgs.length > 0) console.log(message, ...styles2, ...additionalArgs);
|
|
@@ -5577,6 +5580,7 @@ async function loadConfig() {
|
|
|
5577
5580
|
return err(error instanceof Error ? error : new Error(String(error)));
|
|
5578
5581
|
}
|
|
5579
5582
|
}
|
|
5583
|
+
const SETTINGS_CACHE_FILE = (0, node_path.join)(CONFIG_DIR, "app-settings-cache.json");
|
|
5580
5584
|
|
|
5581
5585
|
//#endregion
|
|
5582
5586
|
//#region src/coolify/index.ts
|
|
@@ -5672,12 +5676,20 @@ var CoolifyService = class {
|
|
|
5672
5676
|
let data;
|
|
5673
5677
|
try {
|
|
5674
5678
|
data = text ? JSON.parse(text) : void 0;
|
|
5675
|
-
} catch {
|
|
5679
|
+
} catch (parseErr) {
|
|
5680
|
+
const preview = text ? text.slice(0, 200) : "(empty body)";
|
|
5681
|
+
const method = options.method ?? "GET";
|
|
5682
|
+
log.warn(`Failed to parse JSON response from ${method} ${endpoint} (status ${response.status}): ${parseErr instanceof Error ? parseErr.message : String(parseErr)}. Body preview: ${preview}`);
|
|
5676
5683
|
if (!response.ok) return {
|
|
5677
5684
|
error: text || `HTTP ${response.status}`,
|
|
5678
5685
|
status: response.status,
|
|
5679
5686
|
durationMs
|
|
5680
5687
|
};
|
|
5688
|
+
return {
|
|
5689
|
+
error: `Response was not valid JSON (status ${response.status}): ${preview}`,
|
|
5690
|
+
status: response.status,
|
|
5691
|
+
durationMs
|
|
5692
|
+
};
|
|
5681
5693
|
}
|
|
5682
5694
|
if (!response.ok) {
|
|
5683
5695
|
const parsed = data;
|
|
@@ -5771,8 +5783,8 @@ var CoolifyService = class {
|
|
|
5771
5783
|
"private-github-app": "/applications/private-github-app",
|
|
5772
5784
|
"private-deploy-key": "/applications/private-deploy-key",
|
|
5773
5785
|
dockerfile: "/applications/dockerfile",
|
|
5774
|
-
"docker-image": "/applications/
|
|
5775
|
-
"docker-compose": "/applications/
|
|
5786
|
+
"docker-image": "/applications/dockerimage",
|
|
5787
|
+
"docker-compose": "/applications/dockercompose",
|
|
5776
5788
|
dockerimage: "/applications/dockerimage",
|
|
5777
5789
|
dockercompose: "/applications/dockercompose"
|
|
5778
5790
|
};
|
|
@@ -5782,19 +5794,30 @@ var CoolifyService = class {
|
|
|
5782
5794
|
description: options.description,
|
|
5783
5795
|
project_uuid: options.projectUuid,
|
|
5784
5796
|
environment_uuid: options.environmentUuid,
|
|
5797
|
+
environment_name: options.environmentName,
|
|
5785
5798
|
server_uuid: options.serverUuid
|
|
5786
5799
|
};
|
|
5787
|
-
if (options.githubRepoUrl) body.git_repository = options.githubRepoUrl
|
|
5800
|
+
if (options.githubRepoUrl) body.git_repository = options.githubRepoUrl;
|
|
5788
5801
|
if (appType === "public" || appType === "private-github-app" || appType === "private-deploy-key") {
|
|
5789
5802
|
if (options.githubAppUuid) body.github_app_uuid = options.githubAppUuid;
|
|
5803
|
+
if (appType === "private-deploy-key" && options.privateKeyUuid) body.private_key_uuid = options.privateKeyUuid;
|
|
5790
5804
|
body.git_branch = options.branch || "main";
|
|
5791
5805
|
body.build_pack = options.buildPack || "dockerfile";
|
|
5792
5806
|
if (options.portsExposes) body.ports_exposes = options.portsExposes;
|
|
5793
|
-
if (options.dockerfileLocation)
|
|
5794
|
-
|
|
5795
|
-
|
|
5796
|
-
|
|
5797
|
-
|
|
5807
|
+
if (options.dockerfileLocation) {
|
|
5808
|
+
const p = options.dockerfileLocation;
|
|
5809
|
+
body.dockerfile_location = p.startsWith("/") ? p : `/${p}`;
|
|
5810
|
+
}
|
|
5811
|
+
if (options.dockerComposeLocation) {
|
|
5812
|
+
const p = options.dockerComposeLocation;
|
|
5813
|
+
body.docker_compose_location = p.startsWith("/") ? p : `/${p}`;
|
|
5814
|
+
}
|
|
5815
|
+
if (options.baseDirectory) {
|
|
5816
|
+
const p = options.baseDirectory;
|
|
5817
|
+
body.base_directory = p.startsWith("/") ? p : `/${p}`;
|
|
5818
|
+
}
|
|
5819
|
+
} else if (appType === "docker-image" && options.dockerImage) body.docker_registry_image_name = options.dockerImage;
|
|
5820
|
+
else if (appType === "docker-compose" && options.dockerCompose) body.docker_compose_raw = options.dockerCompose;
|
|
5798
5821
|
log.debug(`Create application body: ${JSON.stringify(body, null, 2)}`);
|
|
5799
5822
|
log.debug(`Endpoint: POST ${endpoint}`);
|
|
5800
5823
|
const result = await this.request(endpoint, {
|
|
@@ -5815,51 +5838,30 @@ var CoolifyService = class {
|
|
|
5815
5838
|
/**
|
|
5816
5839
|
* Sets environment variables for an application.
|
|
5817
5840
|
*
|
|
5841
|
+
* Delegates to {@link bulkUpdateEnvironmentVariables} so the same
|
|
5842
|
+
* create-or-update logic applies. This fixes the post-delete scenario
|
|
5843
|
+
* (where the variable was deleted via the API and only its base value
|
|
5844
|
+
* from docker-compose/git remains visible) and prevents duplicates
|
|
5845
|
+
* that the singular POST endpoint would create when called for a key
|
|
5846
|
+
* that already exists. Also eliminates the N+1 API calls and the
|
|
5847
|
+
* TOCTOU race between the DELETE and the re-POST that the previous
|
|
5848
|
+
* per-key POST -> DELETE -> re-POST dance had.
|
|
5849
|
+
*
|
|
5818
5850
|
* @param appUuid - Application UUID
|
|
5819
5851
|
* @param envVars - Environment variables to set
|
|
5820
5852
|
* @returns Result indicating success or error
|
|
5821
5853
|
*/
|
|
5822
5854
|
async setEnvironmentVariables(appUuid, envVars) {
|
|
5823
5855
|
log.info(`Setting ${Object.keys(envVars).length} environment variables for ${appUuid}`);
|
|
5824
|
-
|
|
5825
|
-
|
|
5826
|
-
|
|
5827
|
-
|
|
5828
|
-
|
|
5829
|
-
|
|
5830
|
-
|
|
5831
|
-
|
|
5832
|
-
|
|
5833
|
-
});
|
|
5834
|
-
if (result.error && result.error.includes("already exists")) {
|
|
5835
|
-
const listResult = await this.request(`/applications/${appUuid}/envs`);
|
|
5836
|
-
const existing = listResult.data?.find((v) => v.key === key);
|
|
5837
|
-
if (existing) {
|
|
5838
|
-
await this.request(`/applications/${appUuid}/envs/${existing.uuid}`, { method: "DELETE" });
|
|
5839
|
-
const repost = await this.request(`/applications/${appUuid}/envs`, {
|
|
5840
|
-
method: "POST",
|
|
5841
|
-
body: JSON.stringify({
|
|
5842
|
-
key,
|
|
5843
|
-
value,
|
|
5844
|
-
is_preview: false,
|
|
5845
|
-
is_buildtime: false
|
|
5846
|
-
})
|
|
5847
|
-
});
|
|
5848
|
-
if (repost.error) {
|
|
5849
|
-
log.error(`Failed to update env var ${key}: ${repost.error}`);
|
|
5850
|
-
return err(new Error(`Failed to update ${key}: ${repost.error}`));
|
|
5851
|
-
}
|
|
5852
|
-
log.debug(`Updated existing env var: ${key}`);
|
|
5853
|
-
} else {
|
|
5854
|
-
log.error(`Failed to set env var ${key}: ${result.error}`);
|
|
5855
|
-
return err(new Error(`Failed to set ${key}: ${result.error}`));
|
|
5856
|
-
}
|
|
5857
|
-
} else if (result.error) {
|
|
5858
|
-
log.error(`Failed to set env var ${key}: ${result.error}`);
|
|
5859
|
-
return err(new Error(`Failed to set ${key}: ${result.error}`));
|
|
5860
|
-
}
|
|
5861
|
-
}
|
|
5862
|
-
log.success(`${Object.keys(envVars).length} environment variables set`);
|
|
5856
|
+
const vars = Object.entries(envVars).map(([key, value]) => ({
|
|
5857
|
+
key,
|
|
5858
|
+
value,
|
|
5859
|
+
is_buildtime: false,
|
|
5860
|
+
is_runtime: true
|
|
5861
|
+
}));
|
|
5862
|
+
const result = await this.bulkUpdateEnvironmentVariables(appUuid, vars);
|
|
5863
|
+
if (isErr(result)) return err(result.error);
|
|
5864
|
+
log.success(`${vars.length} environment variables set`);
|
|
5863
5865
|
return ok(void 0);
|
|
5864
5866
|
}
|
|
5865
5867
|
/**
|
|
@@ -5880,48 +5882,31 @@ var CoolifyService = class {
|
|
|
5880
5882
|
}
|
|
5881
5883
|
/**
|
|
5882
5884
|
* Sets a single environment variable for an application.
|
|
5883
|
-
*
|
|
5885
|
+
*
|
|
5886
|
+
* Delegates to {@link bulkUpdateEnvironmentVariables} so the same
|
|
5887
|
+
* create-or-update logic applies. This fixes the post-delete scenario
|
|
5888
|
+
* (where the variable was deleted via the API and only its base value
|
|
5889
|
+
* from docker-compose/git remains visible) and prevents duplicates
|
|
5890
|
+
* that the singular PATCH endpoint would create when called without
|
|
5891
|
+
* the variable's UUID.
|
|
5884
5892
|
*
|
|
5885
5893
|
* @param appUuid - Application UUID
|
|
5886
5894
|
* @param key - Variable name
|
|
5887
5895
|
* @param value - Variable value
|
|
5888
|
-
* @param isBuildTime - Whether the variable is available at build time
|
|
5896
|
+
* @param isBuildTime - Whether the variable is available at build time
|
|
5897
|
+
* (only for new vars; existing runtime-only vars will be flipped to
|
|
5898
|
+
* build-time and vice versa).
|
|
5889
5899
|
* @returns Result indicating success or error
|
|
5890
5900
|
*/
|
|
5891
5901
|
async setEnvironmentVariable(appUuid, key, value, isBuildTime = false) {
|
|
5892
5902
|
log.info(`Setting environment variable ${key} for ${appUuid} (buildtime: ${isBuildTime})`);
|
|
5893
|
-
const
|
|
5894
|
-
|
|
5895
|
-
|
|
5896
|
-
|
|
5897
|
-
|
|
5898
|
-
|
|
5899
|
-
|
|
5900
|
-
body: JSON.stringify({
|
|
5901
|
-
key,
|
|
5902
|
-
value,
|
|
5903
|
-
is_buildtime: isBuildTime
|
|
5904
|
-
})
|
|
5905
|
-
});
|
|
5906
|
-
if (result.error) {
|
|
5907
|
-
log.error(`Failed to update env var: ${result.error}`);
|
|
5908
|
-
return err(new Error(result.error));
|
|
5909
|
-
}
|
|
5910
|
-
} else {
|
|
5911
|
-
log.debug(`Variable ${key} does not exist, using POST to create`);
|
|
5912
|
-
const result = await this.request(`/applications/${appUuid}/envs`, {
|
|
5913
|
-
method: "POST",
|
|
5914
|
-
body: JSON.stringify({
|
|
5915
|
-
key,
|
|
5916
|
-
value,
|
|
5917
|
-
is_buildtime: isBuildTime
|
|
5918
|
-
})
|
|
5919
|
-
});
|
|
5920
|
-
if (result.error) {
|
|
5921
|
-
log.error(`Failed to create env var: ${result.error}`);
|
|
5922
|
-
return err(new Error(result.error));
|
|
5923
|
-
}
|
|
5924
|
-
}
|
|
5903
|
+
const result = await this.bulkUpdateEnvironmentVariables(appUuid, [{
|
|
5904
|
+
key,
|
|
5905
|
+
value,
|
|
5906
|
+
is_buildtime: isBuildTime,
|
|
5907
|
+
is_runtime: !isBuildTime
|
|
5908
|
+
}]);
|
|
5909
|
+
if (isErr(result)) return err(result.error);
|
|
5925
5910
|
log.success(`Environment variable ${key} set for ${appUuid}`);
|
|
5926
5911
|
return ok(void 0);
|
|
5927
5912
|
}
|
|
@@ -6011,6 +5996,27 @@ var CoolifyService = class {
|
|
|
6011
5996
|
return ok(result.data || []);
|
|
6012
5997
|
}
|
|
6013
5998
|
/**
|
|
5999
|
+
* Lists all GitHub Apps configured in Coolify.
|
|
6000
|
+
* Fetches all pages internally and returns a flat list.
|
|
6001
|
+
*
|
|
6002
|
+
* @param perPage - Items per page for each request (default: 50)
|
|
6003
|
+
* @returns Result with all GitHub Apps or error
|
|
6004
|
+
*/
|
|
6005
|
+
async listGithubAppsAll(perPage = 50) {
|
|
6006
|
+
const allApps = [];
|
|
6007
|
+
let page = 1;
|
|
6008
|
+
while (true) {
|
|
6009
|
+
const result = await this.listGithubApps(page, perPage);
|
|
6010
|
+
if (isErr(result)) return err(result.error);
|
|
6011
|
+
const apps = result.value;
|
|
6012
|
+
if (apps.length === 0) break;
|
|
6013
|
+
allApps.push(...apps);
|
|
6014
|
+
if (apps.length < perPage) break;
|
|
6015
|
+
page++;
|
|
6016
|
+
}
|
|
6017
|
+
return ok(allApps);
|
|
6018
|
+
}
|
|
6019
|
+
/**
|
|
6014
6020
|
* Lists all projects.
|
|
6015
6021
|
*
|
|
6016
6022
|
* @param page - Optional page number for pagination
|
|
@@ -6169,8 +6175,10 @@ var CoolifyService = class {
|
|
|
6169
6175
|
if (options.baseDirectory) body.base_directory = options.baseDirectory;
|
|
6170
6176
|
if (options.domains) body.domains = options.domains;
|
|
6171
6177
|
if (options.dockerComposeDomains) body.docker_compose_domains = options.dockerComposeDomains;
|
|
6178
|
+
if (options.dockerComposeRaw !== void 0) body.docker_compose_raw = options.dockerComposeRaw;
|
|
6172
6179
|
if (options.isForceHttpsEnabled !== void 0) body.is_force_https_enabled = options.isForceHttpsEnabled;
|
|
6173
6180
|
if (options.isAutoDeployEnabled !== void 0) body.is_auto_deploy_enabled = options.isAutoDeployEnabled;
|
|
6181
|
+
if (options.watchPaths !== void 0) body.watch_paths = options.watchPaths;
|
|
6174
6182
|
if (options.healthCheckEnabled !== void 0) body.health_check_enabled = options.healthCheckEnabled;
|
|
6175
6183
|
if (options.healthCheckPath) body.health_check_path = options.healthCheckPath;
|
|
6176
6184
|
if (options.healthCheckPort) body.health_check_port = String(options.healthCheckPort);
|
|
@@ -6241,15 +6249,22 @@ var CoolifyService = class {
|
|
|
6241
6249
|
/**
|
|
6242
6250
|
* Bulk updates environment variables for an application.
|
|
6243
6251
|
*
|
|
6252
|
+
* Uses the bulk endpoint `PATCH /applications/{appUuid}/envs/bulk` which
|
|
6253
|
+
* has create-or-update semantics: if the variable exists in the override
|
|
6254
|
+
* table, its value is updated; otherwise a new override is created. This
|
|
6255
|
+
* is the only reliable way to update a variable that has been deleted
|
|
6256
|
+
* (i.e. its base value from docker-compose/git is still visible in
|
|
6257
|
+
* `getEnvironmentVariables` but no override row exists).
|
|
6258
|
+
*
|
|
6244
6259
|
* @param appUuid - Application UUID
|
|
6245
|
-
* @param envVars - Array of
|
|
6260
|
+
* @param envVars - Array of variable definitions to upsert
|
|
6246
6261
|
* @returns Result indicating success or error
|
|
6247
6262
|
*/
|
|
6248
6263
|
async bulkUpdateEnvironmentVariables(appUuid, envVars) {
|
|
6249
6264
|
log.info(`Bulk updating ${envVars.length} env vars for ${appUuid}`);
|
|
6250
6265
|
const result = await this.request(`/applications/${appUuid}/envs/bulk`, {
|
|
6251
6266
|
method: "PATCH",
|
|
6252
|
-
body: JSON.stringify(envVars)
|
|
6267
|
+
body: JSON.stringify({ data: envVars })
|
|
6253
6268
|
});
|
|
6254
6269
|
if (result.error) {
|
|
6255
6270
|
log.error(`Failed to bulk update env vars: ${result.error}`);
|
|
@@ -6259,6 +6274,32 @@ var CoolifyService = class {
|
|
|
6259
6274
|
return ok(result.data || { message: "Environment variables updated" });
|
|
6260
6275
|
}
|
|
6261
6276
|
/**
|
|
6277
|
+
* Bulk updates environment variables for a database.
|
|
6278
|
+
*
|
|
6279
|
+
* Uses the bulk endpoint `PATCH /databases/{databaseUuid}/envs/bulk` which
|
|
6280
|
+
* has create-or-update semantics. Note: the database schema is narrower
|
|
6281
|
+
* than applications — it accepts `key`, `value`, `is_literal`,
|
|
6282
|
+
* `is_multiline`, `is_shown_once` but does NOT accept `is_preview`,
|
|
6283
|
+
* `is_buildtime` or `is_runtime` (those flags are application-only).
|
|
6284
|
+
*
|
|
6285
|
+
* @param databaseUuid - Database UUID
|
|
6286
|
+
* @param envVars - Array of variable definitions to upsert
|
|
6287
|
+
* @returns Result indicating success or error
|
|
6288
|
+
*/
|
|
6289
|
+
async bulkUpdateDatabaseEnvVars(databaseUuid, envVars) {
|
|
6290
|
+
log.info(`Bulk updating ${envVars.length} env vars for database ${databaseUuid}`);
|
|
6291
|
+
const result = await this.request(`/databases/${databaseUuid}/envs/bulk`, {
|
|
6292
|
+
method: "PATCH",
|
|
6293
|
+
body: JSON.stringify({ data: envVars })
|
|
6294
|
+
});
|
|
6295
|
+
if (result.error) {
|
|
6296
|
+
log.error(`Failed to bulk update database env vars: ${result.error}`);
|
|
6297
|
+
return err(new Error(result.error));
|
|
6298
|
+
}
|
|
6299
|
+
log.success(`Bulk updated ${envVars.length} env vars for database ${databaseUuid}`);
|
|
6300
|
+
return ok(result.data || { message: "Environment variables updated" });
|
|
6301
|
+
}
|
|
6302
|
+
/**
|
|
6262
6303
|
* Gets deployment history for an application.
|
|
6263
6304
|
*
|
|
6264
6305
|
* @param appUuid - Application UUID
|
|
@@ -6666,10 +6707,10 @@ var CoolifyService = class {
|
|
|
6666
6707
|
const envIdMap = new Map();
|
|
6667
6708
|
for (let i = 0; i < projects.length; i++) {
|
|
6668
6709
|
const envResult = envResults[i];
|
|
6669
|
-
if (envResult.status === "fulfilled" && !isErr(envResult.value)) for (const env of envResult.value.value) envIdMap.set(env.id, {
|
|
6710
|
+
if (envResult.status === "fulfilled" && !isErr(envResult.value)) for (const env$1 of envResult.value.value) envIdMap.set(env$1.id, {
|
|
6670
6711
|
projectUuid: projects[i].uuid,
|
|
6671
|
-
envName: env.name,
|
|
6672
|
-
envUuid: env.uuid
|
|
6712
|
+
envName: env$1.name,
|
|
6713
|
+
envUuid: env$1.uuid
|
|
6673
6714
|
});
|
|
6674
6715
|
}
|
|
6675
6716
|
const projectNodes = projects.map((p) => ({
|
|
@@ -6681,15 +6722,15 @@ var CoolifyService = class {
|
|
|
6681
6722
|
const projectMap = new Map();
|
|
6682
6723
|
for (const node of projectNodes) projectMap.set(node.uuid, node);
|
|
6683
6724
|
const envNodeMap = new Map();
|
|
6684
|
-
for (const [envId, info] of envIdMap) {
|
|
6685
|
-
const project = projectMap.get(info.projectUuid);
|
|
6725
|
+
for (const [envId, info$1] of envIdMap) {
|
|
6726
|
+
const project = projectMap.get(info$1.projectUuid);
|
|
6686
6727
|
if (!project) continue;
|
|
6687
6728
|
let envNode = project.environments.find((e) => e.id === envId);
|
|
6688
6729
|
if (!envNode) {
|
|
6689
6730
|
envNode = {
|
|
6690
6731
|
id: envId,
|
|
6691
|
-
uuid: info.envUuid,
|
|
6692
|
-
name: info.envName,
|
|
6732
|
+
uuid: info$1.envUuid,
|
|
6733
|
+
name: info$1.envName,
|
|
6693
6734
|
resources: []
|
|
6694
6735
|
};
|
|
6695
6736
|
project.environments.push(envNode);
|
|
@@ -6810,8 +6851,46 @@ var CoolifyService = class {
|
|
|
6810
6851
|
return ok(result.data || []);
|
|
6811
6852
|
}
|
|
6812
6853
|
/**
|
|
6854
|
+
* Bulk updates environment variables for a service.
|
|
6855
|
+
*
|
|
6856
|
+
* Uses the bulk endpoint `PATCH /services/{uuid}/envs/bulk` which has
|
|
6857
|
+
* create-or-update semantics: if the variable exists in the override
|
|
6858
|
+
* table, its value is updated; otherwise a new override is created.
|
|
6859
|
+
*
|
|
6860
|
+
* This is the only reliable way to update a variable that has been
|
|
6861
|
+
* deleted (i.e. its base value from docker-compose/git is still visible
|
|
6862
|
+
* in `listServiceEnvVars` but no override row exists), and the only way
|
|
6863
|
+
* to set the same key twice without the `POST /services/{uuid}/envs`
|
|
6864
|
+
* returning 409 "already exists".
|
|
6865
|
+
*
|
|
6866
|
+
* @param serviceUuid - Service UUID
|
|
6867
|
+
* @param envVars - Array of variable definitions to upsert
|
|
6868
|
+
* @returns Result indicating success or error
|
|
6869
|
+
*/
|
|
6870
|
+
async bulkUpdateServiceEnvVars(serviceUuid, envVars) {
|
|
6871
|
+
log.info(`Bulk updating ${envVars.length} env vars for service ${serviceUuid}`);
|
|
6872
|
+
const result = await this.request(`/services/${serviceUuid}/envs/bulk`, {
|
|
6873
|
+
method: "PATCH",
|
|
6874
|
+
body: JSON.stringify({ data: envVars })
|
|
6875
|
+
});
|
|
6876
|
+
if (result.error) {
|
|
6877
|
+
log.error(`Failed to bulk update service env vars: ${result.error}`);
|
|
6878
|
+
return err(new Error(result.error));
|
|
6879
|
+
}
|
|
6880
|
+
log.success(`Bulk updated ${envVars.length} env vars for service ${serviceUuid}`);
|
|
6881
|
+
return ok(result.data || { message: "Environment variables updated" });
|
|
6882
|
+
}
|
|
6883
|
+
/**
|
|
6813
6884
|
* Creates an environment variable for a service.
|
|
6814
6885
|
*
|
|
6886
|
+
* NOTE: Prefer `bulkUpdateServiceEnvVars` for any non-trivial use case.
|
|
6887
|
+
* This endpoint uses `POST /services/{uuid}/envs` and returns 409
|
|
6888
|
+
* "already exists" when the key is already present as an override,
|
|
6889
|
+
* with no recovery path on the server side. Bulk has create-or-update
|
|
6890
|
+
* semantics and handles both new and existing keys reliably.
|
|
6891
|
+
*
|
|
6892
|
+
* Kept for callers that explicitly want a strict create-only operation.
|
|
6893
|
+
*
|
|
6815
6894
|
* @param uuid - Service UUID
|
|
6816
6895
|
* @param data - Env var data (key, value, is_preview)
|
|
6817
6896
|
* @returns Result with created env var UUID or error
|
|
@@ -6825,6 +6904,69 @@ var CoolifyService = class {
|
|
|
6825
6904
|
return ok(result.data);
|
|
6826
6905
|
}
|
|
6827
6906
|
/**
|
|
6907
|
+
* Deletes an environment variable from a service.
|
|
6908
|
+
*
|
|
6909
|
+
* @param serviceUuid - Service UUID
|
|
6910
|
+
* @param key - Variable name to delete
|
|
6911
|
+
* @returns Result indicating success or error
|
|
6912
|
+
*/
|
|
6913
|
+
async deleteServiceEnvVar(serviceUuid, key) {
|
|
6914
|
+
log.info(`Deleting environment variable ${key} from service ${serviceUuid}`);
|
|
6915
|
+
const envVarsResult = await this.listServiceEnvVars(serviceUuid);
|
|
6916
|
+
if (isErr(envVarsResult)) return err(envVarsResult.error);
|
|
6917
|
+
const envVar = envVarsResult.value.find((ev) => ev.key === key);
|
|
6918
|
+
if (!envVar) {
|
|
6919
|
+
log.error(`Environment variable ${key} not found on service ${serviceUuid}`);
|
|
6920
|
+
return err(new Error(`Environment variable ${key} not found`));
|
|
6921
|
+
}
|
|
6922
|
+
const result = await this.request(`/services/${serviceUuid}/envs/${envVar.uuid}`, { method: "DELETE" });
|
|
6923
|
+
if (result.error) {
|
|
6924
|
+
log.error(`Failed to delete service env var: ${result.error}`);
|
|
6925
|
+
return err(new Error(result.error));
|
|
6926
|
+
}
|
|
6927
|
+
log.success(`Environment variable ${key} deleted from service ${serviceUuid}`);
|
|
6928
|
+
return ok(void 0);
|
|
6929
|
+
}
|
|
6930
|
+
/**
|
|
6931
|
+
* Lists environment variables for a database.
|
|
6932
|
+
*
|
|
6933
|
+
* @param databaseUuid - Database UUID
|
|
6934
|
+
* @returns Result with env vars list or error
|
|
6935
|
+
*/
|
|
6936
|
+
async listDatabaseEnvVars(databaseUuid) {
|
|
6937
|
+
log.info(`Listing env vars for database ${databaseUuid}`);
|
|
6938
|
+
const result = await this.request(`/databases/${databaseUuid}/envs`);
|
|
6939
|
+
if (result.error) {
|
|
6940
|
+
log.error(`Failed to list database env vars: ${result.error}`);
|
|
6941
|
+
return err(new Error(result.error));
|
|
6942
|
+
}
|
|
6943
|
+
return ok(result.data || []);
|
|
6944
|
+
}
|
|
6945
|
+
/**
|
|
6946
|
+
* Deletes an environment variable from a database.
|
|
6947
|
+
*
|
|
6948
|
+
* @param databaseUuid - Database UUID
|
|
6949
|
+
* @param key - Variable name to delete
|
|
6950
|
+
* @returns Result indicating success or error
|
|
6951
|
+
*/
|
|
6952
|
+
async deleteDatabaseEnvVar(databaseUuid, key) {
|
|
6953
|
+
log.info(`Deleting environment variable ${key} from database ${databaseUuid}`);
|
|
6954
|
+
const envVarsResult = await this.listDatabaseEnvVars(databaseUuid);
|
|
6955
|
+
if (isErr(envVarsResult)) return err(envVarsResult.error);
|
|
6956
|
+
const envVar = envVarsResult.value.find((ev) => ev.key === key);
|
|
6957
|
+
if (!envVar) {
|
|
6958
|
+
log.error(`Environment variable ${key} not found on database ${databaseUuid}`);
|
|
6959
|
+
return err(new Error(`Environment variable ${key} not found`));
|
|
6960
|
+
}
|
|
6961
|
+
const result = await this.request(`/databases/${databaseUuid}/envs/${envVar.uuid}`, { method: "DELETE" });
|
|
6962
|
+
if (result.error) {
|
|
6963
|
+
log.error(`Failed to delete database env var: ${result.error}`);
|
|
6964
|
+
return err(new Error(result.error));
|
|
6965
|
+
}
|
|
6966
|
+
log.success(`Environment variable ${key} deleted from database ${databaseUuid}`);
|
|
6967
|
+
return ok(void 0);
|
|
6968
|
+
}
|
|
6969
|
+
/**
|
|
6828
6970
|
* Gets resources deployed on a server.
|
|
6829
6971
|
*
|
|
6830
6972
|
* @param serverUuid - Server UUID
|
|
@@ -7529,6 +7671,45 @@ function getCoolifyService() {
|
|
|
7529
7671
|
return instance;
|
|
7530
7672
|
}
|
|
7531
7673
|
|
|
7674
|
+
//#endregion
|
|
7675
|
+
//#region src/utils/env-parser.ts
|
|
7676
|
+
/**
|
|
7677
|
+
* .env file parser shared between the SDK (syncEnv) and the CLI (--sync stdin).
|
|
7678
|
+
*
|
|
7679
|
+
* Kept as a standalone exported function (not a class method) so both the
|
|
7680
|
+
* SDK's ApplicationsResource and the CLI's stdin sync handler can use the
|
|
7681
|
+
* same implementation without coupling to either.
|
|
7682
|
+
*
|
|
7683
|
+
* @module
|
|
7684
|
+
*/
|
|
7685
|
+
/**
|
|
7686
|
+
* Parses .env-style content into a Map.
|
|
7687
|
+
*
|
|
7688
|
+
* Handles:
|
|
7689
|
+
* - Comments (lines starting with `#`)
|
|
7690
|
+
* - Empty lines (skipped)
|
|
7691
|
+
* - Quoted values (`"value"` or `'value'`)
|
|
7692
|
+
* - Values containing `=` (only the first `=` is the separator)
|
|
7693
|
+
* - Lines without `=` (skipped — invalid)
|
|
7694
|
+
*
|
|
7695
|
+
* @param content - File contents in KEY=VALUE format
|
|
7696
|
+
* @returns Map of key → value (empty string for `KEY=` with no value)
|
|
7697
|
+
*/
|
|
7698
|
+
function parseEnvContent(content) {
|
|
7699
|
+
const envVars = new Map();
|
|
7700
|
+
for (const line of content.split("\n")) {
|
|
7701
|
+
const trimmed = line.trim();
|
|
7702
|
+
if (!trimmed || trimmed.startsWith("#")) continue;
|
|
7703
|
+
const eq = trimmed.indexOf("=");
|
|
7704
|
+
if (eq === -1) continue;
|
|
7705
|
+
const key = trimmed.slice(0, eq).trim();
|
|
7706
|
+
let value = trimmed.slice(eq + 1).trim();
|
|
7707
|
+
if (value.startsWith("\"") && value.endsWith("\"") || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
|
|
7708
|
+
if (key) envVars.set(key, value);
|
|
7709
|
+
}
|
|
7710
|
+
return envVars;
|
|
7711
|
+
}
|
|
7712
|
+
|
|
7532
7713
|
//#endregion
|
|
7533
7714
|
//#region src/sdk.ts
|
|
7534
7715
|
init_dist();
|
|
@@ -7547,6 +7728,10 @@ var ApplicationsResource = class {
|
|
|
7547
7728
|
async listSummaries() {
|
|
7548
7729
|
return unwrap(await this.svc.listApplicationSummaries());
|
|
7549
7730
|
}
|
|
7731
|
+
/** Get a single application by UUID with full details (including settings and watch_paths). */
|
|
7732
|
+
async get(uuid) {
|
|
7733
|
+
return unwrap(await this.svc.getApplication(uuid));
|
|
7734
|
+
}
|
|
7550
7735
|
/** Resolve application by name, domain, or UUID. */
|
|
7551
7736
|
async resolve(query) {
|
|
7552
7737
|
return unwrap(await this.svc.resolveApplication(query));
|
|
@@ -7613,10 +7798,15 @@ var ApplicationsResource = class {
|
|
|
7613
7798
|
async syncEnv(uuid, options = {}) {
|
|
7614
7799
|
const { filePath, dryRun = false, prune = false, onProgress } = options;
|
|
7615
7800
|
let envContent;
|
|
7801
|
+
const { readFileSync: readFileSync$1 } = await import("node:fs");
|
|
7802
|
+
const { resolve, isAbsolute } = await import("node:path");
|
|
7803
|
+
const target = filePath || ".env";
|
|
7804
|
+
const absoluteTarget = isAbsolute(target) ? target : resolve(process.cwd(), target);
|
|
7616
7805
|
try {
|
|
7617
|
-
envContent =
|
|
7618
|
-
} catch {
|
|
7619
|
-
|
|
7806
|
+
envContent = readFileSync$1(absoluteTarget, "utf-8");
|
|
7807
|
+
} catch (err$1) {
|
|
7808
|
+
const msg = err$1 instanceof Error ? err$1.message : String(err$1);
|
|
7809
|
+
throw new Error(`Cannot read env file at ${absoluteTarget} (resolved from ${target}): ${msg}`);
|
|
7620
7810
|
}
|
|
7621
7811
|
const localVars = this.parseEnvContent(envContent);
|
|
7622
7812
|
if (localVars.size === 0) return {
|
|
@@ -7694,25 +7884,14 @@ var ApplicationsResource = class {
|
|
|
7694
7884
|
}
|
|
7695
7885
|
/**
|
|
7696
7886
|
* Parse .env file content into a Map.
|
|
7697
|
-
*
|
|
7887
|
+
* Delegates to the shared utility in `./utils/env-parser.js` so the SDK
|
|
7888
|
+
* and CLI use a single implementation.
|
|
7698
7889
|
*
|
|
7699
7890
|
* @param content - The .env file content
|
|
7700
7891
|
* @returns Map of environment variables
|
|
7701
7892
|
*/
|
|
7702
7893
|
parseEnvContent(content) {
|
|
7703
|
-
|
|
7704
|
-
const lines = content.split("\n");
|
|
7705
|
-
for (const line of lines) {
|
|
7706
|
-
const trimmedLine = line.trim();
|
|
7707
|
-
if (!trimmedLine || trimmedLine.startsWith("#")) continue;
|
|
7708
|
-
const eqIndex = trimmedLine.indexOf("=");
|
|
7709
|
-
if (eqIndex === -1) continue;
|
|
7710
|
-
const key = trimmedLine.slice(0, eqIndex).trim();
|
|
7711
|
-
let value = trimmedLine.slice(eqIndex + 1).trim();
|
|
7712
|
-
if (value.startsWith("\"") && value.endsWith("\"") || value.startsWith("'") && value.endsWith("'")) value = value.slice(1, -1);
|
|
7713
|
-
envVars.set(key, value);
|
|
7714
|
-
}
|
|
7715
|
-
return envVars;
|
|
7894
|
+
return parseEnvContent(content);
|
|
7716
7895
|
}
|
|
7717
7896
|
};
|
|
7718
7897
|
var DatabasesResource = class {
|
|
@@ -7759,6 +7938,24 @@ var DatabasesResource = class {
|
|
|
7759
7938
|
async deleteBackup(dbUuid, backupUuid) {
|
|
7760
7939
|
return unwrap(await this.svc.deleteDatabaseBackup(dbUuid, backupUuid));
|
|
7761
7940
|
}
|
|
7941
|
+
/** List env vars for a database. */
|
|
7942
|
+
async envVars(uuid) {
|
|
7943
|
+
return unwrap(await this.svc.listDatabaseEnvVars(uuid));
|
|
7944
|
+
}
|
|
7945
|
+
/**
|
|
7946
|
+
* Bulk set (create-or-update) env vars for a database.
|
|
7947
|
+
*
|
|
7948
|
+
* Note: the database schema is narrower than applications — only
|
|
7949
|
+
* `is_literal`, `is_multiline`, `is_shown_once` are accepted. No
|
|
7950
|
+
* `is_preview` / `is_buildtime` / `is_runtime`.
|
|
7951
|
+
*/
|
|
7952
|
+
async bulkSetEnv(uuid, vars) {
|
|
7953
|
+
return unwrap(await this.svc.bulkUpdateDatabaseEnvVars(uuid, vars));
|
|
7954
|
+
}
|
|
7955
|
+
/** Delete a database env var by key. Resolves key → UUID, then DELETE. */
|
|
7956
|
+
async deleteEnv(uuid, key) {
|
|
7957
|
+
return unwrap(await this.svc.deleteDatabaseEnvVar(uuid, key));
|
|
7958
|
+
}
|
|
7762
7959
|
};
|
|
7763
7960
|
var ServicesResource = class {
|
|
7764
7961
|
constructor(svc) {
|
|
@@ -7795,8 +7992,34 @@ var ServicesResource = class {
|
|
|
7795
7992
|
async envVars(uuid) {
|
|
7796
7993
|
return unwrap(await this.svc.listServiceEnvVars(uuid));
|
|
7797
7994
|
}
|
|
7995
|
+
/**
|
|
7996
|
+
* Sets (creates or updates) a single env var for a service.
|
|
7997
|
+
*
|
|
7998
|
+
* Delegates to the bulk endpoint `PATCH /services/{uuid}/envs/bulk`,
|
|
7999
|
+
* which has create-or-update semantics — calling this for the same key
|
|
8000
|
+
* a second time updates the override value rather than failing with
|
|
8001
|
+
* 409 "already exists" (which is what the raw `POST /services/{uuid}/envs`
|
|
8002
|
+
* endpoint does). Mirrors `ApplicationsResource.setEnv`.
|
|
8003
|
+
*
|
|
8004
|
+
* @param uuid - Service UUID
|
|
8005
|
+
* @param data - Env var data (key, value, is_preview)
|
|
8006
|
+
*/
|
|
7798
8007
|
async setEnv(uuid, data) {
|
|
7799
|
-
return unwrap(await this.svc.
|
|
8008
|
+
return unwrap(await this.svc.bulkUpdateServiceEnvVars(uuid, [data]));
|
|
8009
|
+
}
|
|
8010
|
+
/**
|
|
8011
|
+
* Bulk set (create-or-update) env vars for a service.
|
|
8012
|
+
* Mirrors `ApplicationsResource.bulkSetEnv`.
|
|
8013
|
+
*
|
|
8014
|
+
* @param uuid - Service UUID
|
|
8015
|
+
* @param vars - Array of env var definitions to upsert
|
|
8016
|
+
*/
|
|
8017
|
+
async bulkSetEnv(uuid, vars) {
|
|
8018
|
+
return unwrap(await this.svc.bulkUpdateServiceEnvVars(uuid, vars));
|
|
8019
|
+
}
|
|
8020
|
+
/** Delete a service env var by key. Resolves key → UUID, then DELETE. */
|
|
8021
|
+
async deleteEnv(uuid, key) {
|
|
8022
|
+
return unwrap(await this.svc.deleteServiceEnvVar(uuid, key));
|
|
7800
8023
|
}
|
|
7801
8024
|
};
|
|
7802
8025
|
var ServersResource = class {
|
|
@@ -8341,6 +8564,11 @@ Redeploy after updating to apply changes.`,
|
|
|
8341
8564
|
type: "string",
|
|
8342
8565
|
description: "Base directory for build context (default: \"/\")"
|
|
8343
8566
|
},
|
|
8567
|
+
watchPaths: {
|
|
8568
|
+
type: "string",
|
|
8569
|
+
description: "Watch paths for selective auto-deploy. Newline-separated globs (e.g. \"src/**\\npackages/**\"). Set to empty string or null to clear.",
|
|
8570
|
+
nullable: true
|
|
8571
|
+
},
|
|
8344
8572
|
dockerComposeDomains: {
|
|
8345
8573
|
type: "string",
|
|
8346
8574
|
description: "Docker Compose domains JSON: { \"service-name\": { \"domain\": \"https://...\" } }"
|
|
@@ -8349,6 +8577,20 @@ Redeploy after updating to apply changes.`,
|
|
|
8349
8577
|
required: ["uuid"]
|
|
8350
8578
|
}
|
|
8351
8579
|
},
|
|
8580
|
+
{
|
|
8581
|
+
name: "get_application",
|
|
8582
|
+
description: `Get detailed information about a Coolify application including settings (auto-deploy, force HTTPS) and watch paths.
|
|
8583
|
+
|
|
8584
|
+
Returns full application details that list_applications doesn't include.`,
|
|
8585
|
+
inputSchema: {
|
|
8586
|
+
type: "object",
|
|
8587
|
+
properties: { uuid: {
|
|
8588
|
+
type: "string",
|
|
8589
|
+
description: "Application UUID"
|
|
8590
|
+
} },
|
|
8591
|
+
required: ["uuid"]
|
|
8592
|
+
}
|
|
8593
|
+
},
|
|
8352
8594
|
{
|
|
8353
8595
|
name: "set_domains",
|
|
8354
8596
|
description: `Set domains/FQDN for a Coolify application.
|
|
@@ -9217,11 +9459,25 @@ async function handleToolCall(name, args) {
|
|
|
9217
9459
|
startCommand: a.startCommand,
|
|
9218
9460
|
domains: a.domains,
|
|
9219
9461
|
isForceHttpsEnabled: a.isForceHttpsEnabled,
|
|
9220
|
-
isAutoDeployEnabled: a.isAutoDeployEnabled
|
|
9462
|
+
isAutoDeployEnabled: a.isAutoDeployEnabled,
|
|
9463
|
+
watchPaths: a.watchPaths
|
|
9221
9464
|
}).then((app) => ({
|
|
9222
9465
|
message: `Application ${a.uuid} updated`,
|
|
9223
9466
|
application: app
|
|
9224
9467
|
})), "Failed to update application");
|
|
9468
|
+
case "get_application": return mcpCall((s) => s.applications.get(a.uuid).then((app) => ({
|
|
9469
|
+
uuid: app.uuid,
|
|
9470
|
+
name: app.name,
|
|
9471
|
+
status: app.status,
|
|
9472
|
+
fqdn: app.fqdn,
|
|
9473
|
+
git_repository: app.git_repository,
|
|
9474
|
+
git_branch: app.git_branch,
|
|
9475
|
+
build_pack: app.build_pack,
|
|
9476
|
+
dockerfile_location: app.dockerfile_location,
|
|
9477
|
+
base_directory: app.base_directory,
|
|
9478
|
+
watch_paths: app.watch_paths,
|
|
9479
|
+
settings: app.settings
|
|
9480
|
+
})), "Failed to get application");
|
|
9225
9481
|
case "get_application_logs": return mcpCall((s) => s.applications.logs(a.uuid, {
|
|
9226
9482
|
tail: a.tail,
|
|
9227
9483
|
serviceName: a.serviceName
|
|
@@ -9581,6 +9837,1787 @@ var init_network = __esm({ "src/network.ts"() {
|
|
|
9581
9837
|
];
|
|
9582
9838
|
} });
|
|
9583
9839
|
|
|
9840
|
+
//#endregion
|
|
9841
|
+
//#region ../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/debug.js
|
|
9842
|
+
var require_debug = __commonJS({ "../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/debug.js"(exports, module) {
|
|
9843
|
+
let messages = [];
|
|
9844
|
+
let level = 0;
|
|
9845
|
+
const debug$3 = (msg, min) => {
|
|
9846
|
+
if (level >= min) messages.push(msg);
|
|
9847
|
+
};
|
|
9848
|
+
debug$3.WARN = 1;
|
|
9849
|
+
debug$3.INFO = 2;
|
|
9850
|
+
debug$3.DEBUG = 3;
|
|
9851
|
+
debug$3.reset = () => {
|
|
9852
|
+
messages = [];
|
|
9853
|
+
};
|
|
9854
|
+
debug$3.setDebugLevel = (v) => {
|
|
9855
|
+
level = v;
|
|
9856
|
+
};
|
|
9857
|
+
debug$3.warn = (msg) => debug$3(msg, debug$3.WARN);
|
|
9858
|
+
debug$3.info = (msg) => debug$3(msg, debug$3.INFO);
|
|
9859
|
+
debug$3.debug = (msg) => debug$3(msg, debug$3.DEBUG);
|
|
9860
|
+
debug$3.debugMessages = () => messages;
|
|
9861
|
+
module.exports = debug$3;
|
|
9862
|
+
} });
|
|
9863
|
+
|
|
9864
|
+
//#endregion
|
|
9865
|
+
//#region ../../../node_modules/.bun/ansi-regex@5.0.1/node_modules/ansi-regex/index.js
|
|
9866
|
+
var require_ansi_regex = __commonJS({ "../../../node_modules/.bun/ansi-regex@5.0.1/node_modules/ansi-regex/index.js"(exports, module) {
|
|
9867
|
+
module.exports = ({ onlyFirst = false } = {}) => {
|
|
9868
|
+
const pattern = ["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");
|
|
9869
|
+
return new RegExp(pattern, onlyFirst ? void 0 : "g");
|
|
9870
|
+
};
|
|
9871
|
+
} });
|
|
9872
|
+
|
|
9873
|
+
//#endregion
|
|
9874
|
+
//#region ../../../node_modules/.bun/strip-ansi@6.0.1/node_modules/strip-ansi/index.js
|
|
9875
|
+
var require_strip_ansi = __commonJS({ "../../../node_modules/.bun/strip-ansi@6.0.1/node_modules/strip-ansi/index.js"(exports, module) {
|
|
9876
|
+
const ansiRegex = require_ansi_regex();
|
|
9877
|
+
module.exports = (string) => typeof string === "string" ? string.replace(ansiRegex(), "") : string;
|
|
9878
|
+
} });
|
|
9879
|
+
|
|
9880
|
+
//#endregion
|
|
9881
|
+
//#region ../../../node_modules/.bun/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js
|
|
9882
|
+
var require_is_fullwidth_code_point = __commonJS({ "../../../node_modules/.bun/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js"(exports, module) {
|
|
9883
|
+
const isFullwidthCodePoint$1 = (codePoint) => {
|
|
9884
|
+
if (Number.isNaN(codePoint)) return false;
|
|
9885
|
+
if (codePoint >= 4352 && (codePoint <= 4447 || codePoint === 9001 || codePoint === 9002 || 11904 <= codePoint && codePoint <= 12871 && codePoint !== 12351 || 12880 <= codePoint && codePoint <= 19903 || 19968 <= codePoint && codePoint <= 42182 || 43360 <= codePoint && codePoint <= 43388 || 44032 <= codePoint && codePoint <= 55203 || 63744 <= codePoint && codePoint <= 64255 || 65040 <= codePoint && codePoint <= 65049 || 65072 <= codePoint && codePoint <= 65131 || 65281 <= codePoint && codePoint <= 65376 || 65504 <= codePoint && codePoint <= 65510 || 110592 <= codePoint && codePoint <= 110593 || 127488 <= codePoint && codePoint <= 127569 || 131072 <= codePoint && codePoint <= 262141)) return true;
|
|
9886
|
+
return false;
|
|
9887
|
+
};
|
|
9888
|
+
module.exports = isFullwidthCodePoint$1;
|
|
9889
|
+
module.exports.default = isFullwidthCodePoint$1;
|
|
9890
|
+
} });
|
|
9891
|
+
|
|
9892
|
+
//#endregion
|
|
9893
|
+
//#region ../../../node_modules/.bun/emoji-regex@8.0.0/node_modules/emoji-regex/index.js
|
|
9894
|
+
var require_emoji_regex = __commonJS({ "../../../node_modules/.bun/emoji-regex@8.0.0/node_modules/emoji-regex/index.js"(exports, module) {
|
|
9895
|
+
module.exports = function() {
|
|
9896
|
+
return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g;
|
|
9897
|
+
};
|
|
9898
|
+
} });
|
|
9899
|
+
|
|
9900
|
+
//#endregion
|
|
9901
|
+
//#region ../../../node_modules/.bun/string-width@4.2.3/node_modules/string-width/index.js
|
|
9902
|
+
var require_string_width = __commonJS({ "../../../node_modules/.bun/string-width@4.2.3/node_modules/string-width/index.js"(exports, module) {
|
|
9903
|
+
const stripAnsi = require_strip_ansi();
|
|
9904
|
+
const isFullwidthCodePoint = require_is_fullwidth_code_point();
|
|
9905
|
+
const emojiRegex = require_emoji_regex();
|
|
9906
|
+
const stringWidth$1 = (string) => {
|
|
9907
|
+
if (typeof string !== "string" || string.length === 0) return 0;
|
|
9908
|
+
string = stripAnsi(string);
|
|
9909
|
+
if (string.length === 0) return 0;
|
|
9910
|
+
string = string.replace(emojiRegex(), " ");
|
|
9911
|
+
let width = 0;
|
|
9912
|
+
for (let i = 0; i < string.length; i++) {
|
|
9913
|
+
const code = string.codePointAt(i);
|
|
9914
|
+
if (code <= 31 || code >= 127 && code <= 159) continue;
|
|
9915
|
+
if (code >= 768 && code <= 879) continue;
|
|
9916
|
+
if (code > 65535) i++;
|
|
9917
|
+
width += isFullwidthCodePoint(code) ? 2 : 1;
|
|
9918
|
+
}
|
|
9919
|
+
return width;
|
|
9920
|
+
};
|
|
9921
|
+
module.exports = stringWidth$1;
|
|
9922
|
+
module.exports.default = stringWidth$1;
|
|
9923
|
+
} });
|
|
9924
|
+
|
|
9925
|
+
//#endregion
|
|
9926
|
+
//#region ../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/utils.js
|
|
9927
|
+
var require_utils = __commonJS({ "../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/utils.js"(exports, module) {
|
|
9928
|
+
const stringWidth = require_string_width();
|
|
9929
|
+
function codeRegex(capture) {
|
|
9930
|
+
return capture ? /\u001b\[((?:\d*;){0,5}\d*)m/g : /\u001b\[(?:\d*;){0,5}\d*m/g;
|
|
9931
|
+
}
|
|
9932
|
+
function strlen(str) {
|
|
9933
|
+
let code = codeRegex();
|
|
9934
|
+
let stripped = ("" + str).replace(code, "");
|
|
9935
|
+
let split = stripped.split("\n");
|
|
9936
|
+
return split.reduce(function(memo, s) {
|
|
9937
|
+
return stringWidth(s) > memo ? stringWidth(s) : memo;
|
|
9938
|
+
}, 0);
|
|
9939
|
+
}
|
|
9940
|
+
function repeat(str, times) {
|
|
9941
|
+
return Array(times + 1).join(str);
|
|
9942
|
+
}
|
|
9943
|
+
function pad(str, len, pad$1, dir) {
|
|
9944
|
+
let length = strlen(str);
|
|
9945
|
+
if (len + 1 >= length) {
|
|
9946
|
+
let padlen = len - length;
|
|
9947
|
+
switch (dir) {
|
|
9948
|
+
case "right": {
|
|
9949
|
+
str = repeat(pad$1, padlen) + str;
|
|
9950
|
+
break;
|
|
9951
|
+
}
|
|
9952
|
+
case "center": {
|
|
9953
|
+
let right = Math.ceil(padlen / 2);
|
|
9954
|
+
let left = padlen - right;
|
|
9955
|
+
str = repeat(pad$1, left) + str + repeat(pad$1, right);
|
|
9956
|
+
break;
|
|
9957
|
+
}
|
|
9958
|
+
default: {
|
|
9959
|
+
str = str + repeat(pad$1, padlen);
|
|
9960
|
+
break;
|
|
9961
|
+
}
|
|
9962
|
+
}
|
|
9963
|
+
}
|
|
9964
|
+
return str;
|
|
9965
|
+
}
|
|
9966
|
+
let codeCache = {};
|
|
9967
|
+
function addToCodeCache(name, on, off) {
|
|
9968
|
+
on = "\x1B[" + on + "m";
|
|
9969
|
+
off = "\x1B[" + off + "m";
|
|
9970
|
+
codeCache[on] = {
|
|
9971
|
+
set: name,
|
|
9972
|
+
to: true
|
|
9973
|
+
};
|
|
9974
|
+
codeCache[off] = {
|
|
9975
|
+
set: name,
|
|
9976
|
+
to: false
|
|
9977
|
+
};
|
|
9978
|
+
codeCache[name] = {
|
|
9979
|
+
on,
|
|
9980
|
+
off
|
|
9981
|
+
};
|
|
9982
|
+
}
|
|
9983
|
+
addToCodeCache("bold", 1, 22);
|
|
9984
|
+
addToCodeCache("italics", 3, 23);
|
|
9985
|
+
addToCodeCache("underline", 4, 24);
|
|
9986
|
+
addToCodeCache("inverse", 7, 27);
|
|
9987
|
+
addToCodeCache("strikethrough", 9, 29);
|
|
9988
|
+
function updateState(state, controlChars) {
|
|
9989
|
+
let controlCode = controlChars[1] ? parseInt(controlChars[1].split(";")[0]) : 0;
|
|
9990
|
+
if (controlCode >= 30 && controlCode <= 39 || controlCode >= 90 && controlCode <= 97) {
|
|
9991
|
+
state.lastForegroundAdded = controlChars[0];
|
|
9992
|
+
return;
|
|
9993
|
+
}
|
|
9994
|
+
if (controlCode >= 40 && controlCode <= 49 || controlCode >= 100 && controlCode <= 107) {
|
|
9995
|
+
state.lastBackgroundAdded = controlChars[0];
|
|
9996
|
+
return;
|
|
9997
|
+
}
|
|
9998
|
+
if (controlCode === 0) {
|
|
9999
|
+
for (let i in state)
|
|
10000
|
+
/* istanbul ignore else */
|
|
10001
|
+
if (Object.prototype.hasOwnProperty.call(state, i)) delete state[i];
|
|
10002
|
+
return;
|
|
10003
|
+
}
|
|
10004
|
+
let info$1 = codeCache[controlChars[0]];
|
|
10005
|
+
if (info$1) state[info$1.set] = info$1.to;
|
|
10006
|
+
}
|
|
10007
|
+
function readState(line) {
|
|
10008
|
+
let code = codeRegex(true);
|
|
10009
|
+
let controlChars = code.exec(line);
|
|
10010
|
+
let state = {};
|
|
10011
|
+
while (controlChars !== null) {
|
|
10012
|
+
updateState(state, controlChars);
|
|
10013
|
+
controlChars = code.exec(line);
|
|
10014
|
+
}
|
|
10015
|
+
return state;
|
|
10016
|
+
}
|
|
10017
|
+
function unwindState(state, ret) {
|
|
10018
|
+
let lastBackgroundAdded = state.lastBackgroundAdded;
|
|
10019
|
+
let lastForegroundAdded = state.lastForegroundAdded;
|
|
10020
|
+
delete state.lastBackgroundAdded;
|
|
10021
|
+
delete state.lastForegroundAdded;
|
|
10022
|
+
Object.keys(state).forEach(function(key) {
|
|
10023
|
+
if (state[key]) ret += codeCache[key].off;
|
|
10024
|
+
});
|
|
10025
|
+
if (lastBackgroundAdded && lastBackgroundAdded != "\x1B[49m") ret += "\x1B[49m";
|
|
10026
|
+
if (lastForegroundAdded && lastForegroundAdded != "\x1B[39m") ret += "\x1B[39m";
|
|
10027
|
+
return ret;
|
|
10028
|
+
}
|
|
10029
|
+
function rewindState(state, ret) {
|
|
10030
|
+
let lastBackgroundAdded = state.lastBackgroundAdded;
|
|
10031
|
+
let lastForegroundAdded = state.lastForegroundAdded;
|
|
10032
|
+
delete state.lastBackgroundAdded;
|
|
10033
|
+
delete state.lastForegroundAdded;
|
|
10034
|
+
Object.keys(state).forEach(function(key) {
|
|
10035
|
+
if (state[key]) ret = codeCache[key].on + ret;
|
|
10036
|
+
});
|
|
10037
|
+
if (lastBackgroundAdded && lastBackgroundAdded != "\x1B[49m") ret = lastBackgroundAdded + ret;
|
|
10038
|
+
if (lastForegroundAdded && lastForegroundAdded != "\x1B[39m") ret = lastForegroundAdded + ret;
|
|
10039
|
+
return ret;
|
|
10040
|
+
}
|
|
10041
|
+
function truncateWidth(str, desiredLength) {
|
|
10042
|
+
if (str.length === strlen(str)) return str.substr(0, desiredLength);
|
|
10043
|
+
while (strlen(str) > desiredLength) str = str.slice(0, -1);
|
|
10044
|
+
return str;
|
|
10045
|
+
}
|
|
10046
|
+
function truncateWidthWithAnsi(str, desiredLength) {
|
|
10047
|
+
let code = codeRegex(true);
|
|
10048
|
+
let split = str.split(codeRegex());
|
|
10049
|
+
let splitIndex = 0;
|
|
10050
|
+
let retLen = 0;
|
|
10051
|
+
let ret = "";
|
|
10052
|
+
let myArray;
|
|
10053
|
+
let state = {};
|
|
10054
|
+
while (retLen < desiredLength) {
|
|
10055
|
+
myArray = code.exec(str);
|
|
10056
|
+
let toAdd = split[splitIndex];
|
|
10057
|
+
splitIndex++;
|
|
10058
|
+
if (retLen + strlen(toAdd) > desiredLength) toAdd = truncateWidth(toAdd, desiredLength - retLen);
|
|
10059
|
+
ret += toAdd;
|
|
10060
|
+
retLen += strlen(toAdd);
|
|
10061
|
+
if (retLen < desiredLength) {
|
|
10062
|
+
if (!myArray) break;
|
|
10063
|
+
ret += myArray[0];
|
|
10064
|
+
updateState(state, myArray);
|
|
10065
|
+
}
|
|
10066
|
+
}
|
|
10067
|
+
return unwindState(state, ret);
|
|
10068
|
+
}
|
|
10069
|
+
function truncate(str, desiredLength, truncateChar) {
|
|
10070
|
+
truncateChar = truncateChar || "…";
|
|
10071
|
+
let lengthOfStr = strlen(str);
|
|
10072
|
+
if (lengthOfStr <= desiredLength) return str;
|
|
10073
|
+
desiredLength -= strlen(truncateChar);
|
|
10074
|
+
let ret = truncateWidthWithAnsi(str, desiredLength);
|
|
10075
|
+
ret += truncateChar;
|
|
10076
|
+
const hrefTag = "\x1B]8;;\x07";
|
|
10077
|
+
if (str.includes(hrefTag) && !ret.includes(hrefTag)) ret += hrefTag;
|
|
10078
|
+
return ret;
|
|
10079
|
+
}
|
|
10080
|
+
function defaultOptions() {
|
|
10081
|
+
return {
|
|
10082
|
+
chars: {
|
|
10083
|
+
top: "─",
|
|
10084
|
+
"top-mid": "┬",
|
|
10085
|
+
"top-left": "┌",
|
|
10086
|
+
"top-right": "┐",
|
|
10087
|
+
bottom: "─",
|
|
10088
|
+
"bottom-mid": "┴",
|
|
10089
|
+
"bottom-left": "└",
|
|
10090
|
+
"bottom-right": "┘",
|
|
10091
|
+
left: "│",
|
|
10092
|
+
"left-mid": "├",
|
|
10093
|
+
mid: "─",
|
|
10094
|
+
"mid-mid": "┼",
|
|
10095
|
+
right: "│",
|
|
10096
|
+
"right-mid": "┤",
|
|
10097
|
+
middle: "│"
|
|
10098
|
+
},
|
|
10099
|
+
truncate: "…",
|
|
10100
|
+
colWidths: [],
|
|
10101
|
+
rowHeights: [],
|
|
10102
|
+
colAligns: [],
|
|
10103
|
+
rowAligns: [],
|
|
10104
|
+
style: {
|
|
10105
|
+
"padding-left": 1,
|
|
10106
|
+
"padding-right": 1,
|
|
10107
|
+
head: ["red"],
|
|
10108
|
+
border: ["grey"],
|
|
10109
|
+
compact: false
|
|
10110
|
+
},
|
|
10111
|
+
head: []
|
|
10112
|
+
};
|
|
10113
|
+
}
|
|
10114
|
+
function mergeOptions(options, defaults) {
|
|
10115
|
+
options = options || {};
|
|
10116
|
+
defaults = defaults || defaultOptions();
|
|
10117
|
+
let ret = Object.assign({}, defaults, options);
|
|
10118
|
+
ret.chars = Object.assign({}, defaults.chars, options.chars);
|
|
10119
|
+
ret.style = Object.assign({}, defaults.style, options.style);
|
|
10120
|
+
return ret;
|
|
10121
|
+
}
|
|
10122
|
+
function wordWrap(maxLength, input) {
|
|
10123
|
+
let lines = [];
|
|
10124
|
+
let split = input.split(/(\s+)/g);
|
|
10125
|
+
let line = [];
|
|
10126
|
+
let lineLength = 0;
|
|
10127
|
+
let whitespace;
|
|
10128
|
+
for (let i = 0; i < split.length; i += 2) {
|
|
10129
|
+
let word = split[i];
|
|
10130
|
+
let newLength = lineLength + strlen(word);
|
|
10131
|
+
if (lineLength > 0 && whitespace) newLength += whitespace.length;
|
|
10132
|
+
if (newLength > maxLength) {
|
|
10133
|
+
if (lineLength !== 0) lines.push(line.join(""));
|
|
10134
|
+
line = [word];
|
|
10135
|
+
lineLength = strlen(word);
|
|
10136
|
+
} else {
|
|
10137
|
+
line.push(whitespace || "", word);
|
|
10138
|
+
lineLength = newLength;
|
|
10139
|
+
}
|
|
10140
|
+
whitespace = split[i + 1];
|
|
10141
|
+
}
|
|
10142
|
+
if (lineLength) lines.push(line.join(""));
|
|
10143
|
+
return lines;
|
|
10144
|
+
}
|
|
10145
|
+
function textWrap(maxLength, input) {
|
|
10146
|
+
let lines = [];
|
|
10147
|
+
let line = "";
|
|
10148
|
+
function pushLine(str, ws) {
|
|
10149
|
+
if (line.length && ws) line += ws;
|
|
10150
|
+
line += str;
|
|
10151
|
+
while (line.length > maxLength) {
|
|
10152
|
+
lines.push(line.slice(0, maxLength));
|
|
10153
|
+
line = line.slice(maxLength);
|
|
10154
|
+
}
|
|
10155
|
+
}
|
|
10156
|
+
let split = input.split(/(\s+)/g);
|
|
10157
|
+
for (let i = 0; i < split.length; i += 2) pushLine(split[i], i && split[i - 1]);
|
|
10158
|
+
if (line.length) lines.push(line);
|
|
10159
|
+
return lines;
|
|
10160
|
+
}
|
|
10161
|
+
function multiLineWordWrap(maxLength, input, wrapOnWordBoundary = true) {
|
|
10162
|
+
let output = [];
|
|
10163
|
+
input = input.split("\n");
|
|
10164
|
+
const handler = wrapOnWordBoundary ? wordWrap : textWrap;
|
|
10165
|
+
for (let i = 0; i < input.length; i++) output.push.apply(output, handler(maxLength, input[i]));
|
|
10166
|
+
return output;
|
|
10167
|
+
}
|
|
10168
|
+
function colorizeLines(input) {
|
|
10169
|
+
let state = {};
|
|
10170
|
+
let output = [];
|
|
10171
|
+
for (let i = 0; i < input.length; i++) {
|
|
10172
|
+
let line = rewindState(state, input[i]);
|
|
10173
|
+
state = readState(line);
|
|
10174
|
+
let temp = Object.assign({}, state);
|
|
10175
|
+
output.push(unwindState(temp, line));
|
|
10176
|
+
}
|
|
10177
|
+
return output;
|
|
10178
|
+
}
|
|
10179
|
+
/**
|
|
10180
|
+
* Credit: Matheus Sampaio https://github.com/matheussampaio
|
|
10181
|
+
*/
|
|
10182
|
+
function hyperlink(url, text) {
|
|
10183
|
+
const OSC = "\x1B]";
|
|
10184
|
+
const BEL = "\x07";
|
|
10185
|
+
const SEP = ";";
|
|
10186
|
+
return [
|
|
10187
|
+
OSC,
|
|
10188
|
+
"8",
|
|
10189
|
+
SEP,
|
|
10190
|
+
SEP,
|
|
10191
|
+
url || text,
|
|
10192
|
+
BEL,
|
|
10193
|
+
text,
|
|
10194
|
+
OSC,
|
|
10195
|
+
"8",
|
|
10196
|
+
SEP,
|
|
10197
|
+
SEP,
|
|
10198
|
+
BEL
|
|
10199
|
+
].join("");
|
|
10200
|
+
}
|
|
10201
|
+
module.exports = {
|
|
10202
|
+
strlen,
|
|
10203
|
+
repeat,
|
|
10204
|
+
pad,
|
|
10205
|
+
truncate,
|
|
10206
|
+
mergeOptions,
|
|
10207
|
+
wordWrap: multiLineWordWrap,
|
|
10208
|
+
colorizeLines,
|
|
10209
|
+
hyperlink
|
|
10210
|
+
};
|
|
10211
|
+
} });
|
|
10212
|
+
|
|
10213
|
+
//#endregion
|
|
10214
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/styles.js
|
|
10215
|
+
var require_styles = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/styles.js"(exports, module) {
|
|
10216
|
+
var styles$1 = {};
|
|
10217
|
+
module["exports"] = styles$1;
|
|
10218
|
+
var codes = {
|
|
10219
|
+
reset: [0, 0],
|
|
10220
|
+
bold: [1, 22],
|
|
10221
|
+
dim: [2, 22],
|
|
10222
|
+
italic: [3, 23],
|
|
10223
|
+
underline: [4, 24],
|
|
10224
|
+
inverse: [7, 27],
|
|
10225
|
+
hidden: [8, 28],
|
|
10226
|
+
strikethrough: [9, 29],
|
|
10227
|
+
black: [30, 39],
|
|
10228
|
+
red: [31, 39],
|
|
10229
|
+
green: [32, 39],
|
|
10230
|
+
yellow: [33, 39],
|
|
10231
|
+
blue: [34, 39],
|
|
10232
|
+
magenta: [35, 39],
|
|
10233
|
+
cyan: [36, 39],
|
|
10234
|
+
white: [37, 39],
|
|
10235
|
+
gray: [90, 39],
|
|
10236
|
+
grey: [90, 39],
|
|
10237
|
+
brightRed: [91, 39],
|
|
10238
|
+
brightGreen: [92, 39],
|
|
10239
|
+
brightYellow: [93, 39],
|
|
10240
|
+
brightBlue: [94, 39],
|
|
10241
|
+
brightMagenta: [95, 39],
|
|
10242
|
+
brightCyan: [96, 39],
|
|
10243
|
+
brightWhite: [97, 39],
|
|
10244
|
+
bgBlack: [40, 49],
|
|
10245
|
+
bgRed: [41, 49],
|
|
10246
|
+
bgGreen: [42, 49],
|
|
10247
|
+
bgYellow: [43, 49],
|
|
10248
|
+
bgBlue: [44, 49],
|
|
10249
|
+
bgMagenta: [45, 49],
|
|
10250
|
+
bgCyan: [46, 49],
|
|
10251
|
+
bgWhite: [47, 49],
|
|
10252
|
+
bgGray: [100, 49],
|
|
10253
|
+
bgGrey: [100, 49],
|
|
10254
|
+
bgBrightRed: [101, 49],
|
|
10255
|
+
bgBrightGreen: [102, 49],
|
|
10256
|
+
bgBrightYellow: [103, 49],
|
|
10257
|
+
bgBrightBlue: [104, 49],
|
|
10258
|
+
bgBrightMagenta: [105, 49],
|
|
10259
|
+
bgBrightCyan: [106, 49],
|
|
10260
|
+
bgBrightWhite: [107, 49],
|
|
10261
|
+
blackBG: [40, 49],
|
|
10262
|
+
redBG: [41, 49],
|
|
10263
|
+
greenBG: [42, 49],
|
|
10264
|
+
yellowBG: [43, 49],
|
|
10265
|
+
blueBG: [44, 49],
|
|
10266
|
+
magentaBG: [45, 49],
|
|
10267
|
+
cyanBG: [46, 49],
|
|
10268
|
+
whiteBG: [47, 49]
|
|
10269
|
+
};
|
|
10270
|
+
Object.keys(codes).forEach(function(key) {
|
|
10271
|
+
var val = codes[key];
|
|
10272
|
+
var style = styles$1[key] = [];
|
|
10273
|
+
style.open = "\x1B[" + val[0] + "m";
|
|
10274
|
+
style.close = "\x1B[" + val[1] + "m";
|
|
10275
|
+
});
|
|
10276
|
+
} });
|
|
10277
|
+
|
|
10278
|
+
//#endregion
|
|
10279
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/has-flag.js
|
|
10280
|
+
var require_has_flag = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/has-flag.js"(exports, module) {
|
|
10281
|
+
module.exports = function(flag, argv) {
|
|
10282
|
+
argv = argv || process.argv;
|
|
10283
|
+
var terminatorPos = argv.indexOf("--");
|
|
10284
|
+
var prefix = /^-{1,2}/.test(flag) ? "" : "--";
|
|
10285
|
+
var pos = argv.indexOf(prefix + flag);
|
|
10286
|
+
return pos !== -1 && (terminatorPos === -1 ? true : pos < terminatorPos);
|
|
10287
|
+
};
|
|
10288
|
+
} });
|
|
10289
|
+
|
|
10290
|
+
//#endregion
|
|
10291
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/supports-colors.js
|
|
10292
|
+
var require_supports_colors = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/system/supports-colors.js"(exports, module) {
|
|
10293
|
+
var os = require("os");
|
|
10294
|
+
var hasFlag = require_has_flag();
|
|
10295
|
+
var env = process.env;
|
|
10296
|
+
var forceColor = void 0;
|
|
10297
|
+
if (hasFlag("no-color") || hasFlag("no-colors") || hasFlag("color=false")) forceColor = false;
|
|
10298
|
+
else if (hasFlag("color") || hasFlag("colors") || hasFlag("color=true") || hasFlag("color=always")) forceColor = true;
|
|
10299
|
+
if ("FORCE_COLOR" in env) forceColor = env.FORCE_COLOR.length === 0 || parseInt(env.FORCE_COLOR, 10) !== 0;
|
|
10300
|
+
function translateLevel(level$1) {
|
|
10301
|
+
if (level$1 === 0) return false;
|
|
10302
|
+
return {
|
|
10303
|
+
level: level$1,
|
|
10304
|
+
hasBasic: true,
|
|
10305
|
+
has256: level$1 >= 2,
|
|
10306
|
+
has16m: level$1 >= 3
|
|
10307
|
+
};
|
|
10308
|
+
}
|
|
10309
|
+
function supportsColor(stream) {
|
|
10310
|
+
if (forceColor === false) return 0;
|
|
10311
|
+
if (hasFlag("color=16m") || hasFlag("color=full") || hasFlag("color=truecolor")) return 3;
|
|
10312
|
+
if (hasFlag("color=256")) return 2;
|
|
10313
|
+
if (stream && !stream.isTTY && forceColor !== true) return 0;
|
|
10314
|
+
var min = forceColor ? 1 : 0;
|
|
10315
|
+
if (process.platform === "win32") {
|
|
10316
|
+
var osRelease = os.release().split(".");
|
|
10317
|
+
if (Number(process.versions.node.split(".")[0]) >= 8 && Number(osRelease[0]) >= 10 && Number(osRelease[2]) >= 10586) return Number(osRelease[2]) >= 14931 ? 3 : 2;
|
|
10318
|
+
return 1;
|
|
10319
|
+
}
|
|
10320
|
+
if ("CI" in env) {
|
|
10321
|
+
if ([
|
|
10322
|
+
"TRAVIS",
|
|
10323
|
+
"CIRCLECI",
|
|
10324
|
+
"APPVEYOR",
|
|
10325
|
+
"GITLAB_CI"
|
|
10326
|
+
].some(function(sign) {
|
|
10327
|
+
return sign in env;
|
|
10328
|
+
}) || env.CI_NAME === "codeship") return 1;
|
|
10329
|
+
return min;
|
|
10330
|
+
}
|
|
10331
|
+
if ("TEAMCITY_VERSION" in env) return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;
|
|
10332
|
+
if ("TERM_PROGRAM" in env) {
|
|
10333
|
+
var version = parseInt((env.TERM_PROGRAM_VERSION || "").split(".")[0], 10);
|
|
10334
|
+
switch (env.TERM_PROGRAM) {
|
|
10335
|
+
case "iTerm.app": return version >= 3 ? 3 : 2;
|
|
10336
|
+
case "Hyper": return 3;
|
|
10337
|
+
case "Apple_Terminal": return 2;
|
|
10338
|
+
}
|
|
10339
|
+
}
|
|
10340
|
+
if (/-256(color)?$/i.test(env.TERM)) return 2;
|
|
10341
|
+
if (/^screen|^xterm|^vt100|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) return 1;
|
|
10342
|
+
if ("COLORTERM" in env) return 1;
|
|
10343
|
+
if (env.TERM === "dumb") return min;
|
|
10344
|
+
return min;
|
|
10345
|
+
}
|
|
10346
|
+
function getSupportLevel(stream) {
|
|
10347
|
+
var level$1 = supportsColor(stream);
|
|
10348
|
+
return translateLevel(level$1);
|
|
10349
|
+
}
|
|
10350
|
+
module.exports = {
|
|
10351
|
+
supportsColor: getSupportLevel,
|
|
10352
|
+
stdout: getSupportLevel(process.stdout),
|
|
10353
|
+
stderr: getSupportLevel(process.stderr)
|
|
10354
|
+
};
|
|
10355
|
+
} });
|
|
10356
|
+
|
|
10357
|
+
//#endregion
|
|
10358
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/trap.js
|
|
10359
|
+
var require_trap = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/trap.js"(exports, module) {
|
|
10360
|
+
module["exports"] = function runTheTrap(text, options) {
|
|
10361
|
+
var result = "";
|
|
10362
|
+
text = text || "Run the trap, drop the bass";
|
|
10363
|
+
text = text.split("");
|
|
10364
|
+
var trap = {
|
|
10365
|
+
a: [
|
|
10366
|
+
"@",
|
|
10367
|
+
"Ą",
|
|
10368
|
+
"Ⱥ",
|
|
10369
|
+
"Ʌ",
|
|
10370
|
+
"Δ",
|
|
10371
|
+
"Λ",
|
|
10372
|
+
"Д"
|
|
10373
|
+
],
|
|
10374
|
+
b: [
|
|
10375
|
+
"ß",
|
|
10376
|
+
"Ɓ",
|
|
10377
|
+
"Ƀ",
|
|
10378
|
+
"ɮ",
|
|
10379
|
+
"β",
|
|
10380
|
+
"฿"
|
|
10381
|
+
],
|
|
10382
|
+
c: [
|
|
10383
|
+
"©",
|
|
10384
|
+
"Ȼ",
|
|
10385
|
+
"Ͼ"
|
|
10386
|
+
],
|
|
10387
|
+
d: [
|
|
10388
|
+
"Ð",
|
|
10389
|
+
"Ɗ",
|
|
10390
|
+
"Ԁ",
|
|
10391
|
+
"ԁ",
|
|
10392
|
+
"Ԃ",
|
|
10393
|
+
"ԃ"
|
|
10394
|
+
],
|
|
10395
|
+
e: [
|
|
10396
|
+
"Ë",
|
|
10397
|
+
"ĕ",
|
|
10398
|
+
"Ǝ",
|
|
10399
|
+
"ɘ",
|
|
10400
|
+
"Σ",
|
|
10401
|
+
"ξ",
|
|
10402
|
+
"Ҽ",
|
|
10403
|
+
"੬"
|
|
10404
|
+
],
|
|
10405
|
+
f: ["Ӻ"],
|
|
10406
|
+
g: ["ɢ"],
|
|
10407
|
+
h: [
|
|
10408
|
+
"Ħ",
|
|
10409
|
+
"ƕ",
|
|
10410
|
+
"Ң",
|
|
10411
|
+
"Һ",
|
|
10412
|
+
"Ӈ",
|
|
10413
|
+
"Ԋ"
|
|
10414
|
+
],
|
|
10415
|
+
i: ["༏"],
|
|
10416
|
+
j: ["Ĵ"],
|
|
10417
|
+
k: [
|
|
10418
|
+
"ĸ",
|
|
10419
|
+
"Ҡ",
|
|
10420
|
+
"Ӄ",
|
|
10421
|
+
"Ԟ"
|
|
10422
|
+
],
|
|
10423
|
+
l: ["Ĺ"],
|
|
10424
|
+
m: [
|
|
10425
|
+
"ʍ",
|
|
10426
|
+
"Ӎ",
|
|
10427
|
+
"ӎ",
|
|
10428
|
+
"Ԡ",
|
|
10429
|
+
"ԡ",
|
|
10430
|
+
"൩"
|
|
10431
|
+
],
|
|
10432
|
+
n: [
|
|
10433
|
+
"Ñ",
|
|
10434
|
+
"ŋ",
|
|
10435
|
+
"Ɲ",
|
|
10436
|
+
"Ͷ",
|
|
10437
|
+
"Π",
|
|
10438
|
+
"Ҋ"
|
|
10439
|
+
],
|
|
10440
|
+
o: [
|
|
10441
|
+
"Ø",
|
|
10442
|
+
"õ",
|
|
10443
|
+
"ø",
|
|
10444
|
+
"Ǿ",
|
|
10445
|
+
"ʘ",
|
|
10446
|
+
"Ѻ",
|
|
10447
|
+
"ם",
|
|
10448
|
+
"",
|
|
10449
|
+
"๏"
|
|
10450
|
+
],
|
|
10451
|
+
p: ["Ƿ", "Ҏ"],
|
|
10452
|
+
q: ["্"],
|
|
10453
|
+
r: [
|
|
10454
|
+
"®",
|
|
10455
|
+
"Ʀ",
|
|
10456
|
+
"Ȑ",
|
|
10457
|
+
"Ɍ",
|
|
10458
|
+
"ʀ",
|
|
10459
|
+
"Я"
|
|
10460
|
+
],
|
|
10461
|
+
s: [
|
|
10462
|
+
"§",
|
|
10463
|
+
"Ϟ",
|
|
10464
|
+
"ϟ",
|
|
10465
|
+
"Ϩ"
|
|
10466
|
+
],
|
|
10467
|
+
t: [
|
|
10468
|
+
"Ł",
|
|
10469
|
+
"Ŧ",
|
|
10470
|
+
"ͳ"
|
|
10471
|
+
],
|
|
10472
|
+
u: ["Ʊ", "Ս"],
|
|
10473
|
+
v: ["ט"],
|
|
10474
|
+
w: [
|
|
10475
|
+
"Ш",
|
|
10476
|
+
"Ѡ",
|
|
10477
|
+
"Ѽ",
|
|
10478
|
+
"൰"
|
|
10479
|
+
],
|
|
10480
|
+
x: [
|
|
10481
|
+
"Ҳ",
|
|
10482
|
+
"Ӿ",
|
|
10483
|
+
"Ӽ",
|
|
10484
|
+
"ӽ"
|
|
10485
|
+
],
|
|
10486
|
+
y: [
|
|
10487
|
+
"¥",
|
|
10488
|
+
"Ұ",
|
|
10489
|
+
"Ӌ"
|
|
10490
|
+
],
|
|
10491
|
+
z: ["Ƶ", "ɀ"]
|
|
10492
|
+
};
|
|
10493
|
+
text.forEach(function(c) {
|
|
10494
|
+
c = c.toLowerCase();
|
|
10495
|
+
var chars = trap[c] || [" "];
|
|
10496
|
+
var rand = Math.floor(Math.random() * chars.length);
|
|
10497
|
+
if (typeof trap[c] !== "undefined") result += trap[c][rand];
|
|
10498
|
+
else result += c;
|
|
10499
|
+
});
|
|
10500
|
+
return result;
|
|
10501
|
+
};
|
|
10502
|
+
} });
|
|
10503
|
+
|
|
10504
|
+
//#endregion
|
|
10505
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/zalgo.js
|
|
10506
|
+
var require_zalgo = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/custom/zalgo.js"(exports, module) {
|
|
10507
|
+
module["exports"] = function zalgo(text, options) {
|
|
10508
|
+
text = text || " he is here ";
|
|
10509
|
+
var soul = {
|
|
10510
|
+
"up": [
|
|
10511
|
+
"̍",
|
|
10512
|
+
"̎",
|
|
10513
|
+
"̄",
|
|
10514
|
+
"̅",
|
|
10515
|
+
"̿",
|
|
10516
|
+
"̑",
|
|
10517
|
+
"̆",
|
|
10518
|
+
"̐",
|
|
10519
|
+
"͒",
|
|
10520
|
+
"͗",
|
|
10521
|
+
"͑",
|
|
10522
|
+
"̇",
|
|
10523
|
+
"̈",
|
|
10524
|
+
"̊",
|
|
10525
|
+
"͂",
|
|
10526
|
+
"̓",
|
|
10527
|
+
"̈",
|
|
10528
|
+
"͊",
|
|
10529
|
+
"͋",
|
|
10530
|
+
"͌",
|
|
10531
|
+
"̃",
|
|
10532
|
+
"̂",
|
|
10533
|
+
"̌",
|
|
10534
|
+
"͐",
|
|
10535
|
+
"̀",
|
|
10536
|
+
"́",
|
|
10537
|
+
"̋",
|
|
10538
|
+
"̏",
|
|
10539
|
+
"̒",
|
|
10540
|
+
"̓",
|
|
10541
|
+
"̔",
|
|
10542
|
+
"̽",
|
|
10543
|
+
"̉",
|
|
10544
|
+
"ͣ",
|
|
10545
|
+
"ͤ",
|
|
10546
|
+
"ͥ",
|
|
10547
|
+
"ͦ",
|
|
10548
|
+
"ͧ",
|
|
10549
|
+
"ͨ",
|
|
10550
|
+
"ͩ",
|
|
10551
|
+
"ͪ",
|
|
10552
|
+
"ͫ",
|
|
10553
|
+
"ͬ",
|
|
10554
|
+
"ͭ",
|
|
10555
|
+
"ͮ",
|
|
10556
|
+
"ͯ",
|
|
10557
|
+
"̾",
|
|
10558
|
+
"͛",
|
|
10559
|
+
"͆",
|
|
10560
|
+
"̚"
|
|
10561
|
+
],
|
|
10562
|
+
"down": [
|
|
10563
|
+
"̖",
|
|
10564
|
+
"̗",
|
|
10565
|
+
"̘",
|
|
10566
|
+
"̙",
|
|
10567
|
+
"̜",
|
|
10568
|
+
"̝",
|
|
10569
|
+
"̞",
|
|
10570
|
+
"̟",
|
|
10571
|
+
"̠",
|
|
10572
|
+
"̤",
|
|
10573
|
+
"̥",
|
|
10574
|
+
"̦",
|
|
10575
|
+
"̩",
|
|
10576
|
+
"̪",
|
|
10577
|
+
"̫",
|
|
10578
|
+
"̬",
|
|
10579
|
+
"̭",
|
|
10580
|
+
"̮",
|
|
10581
|
+
"̯",
|
|
10582
|
+
"̰",
|
|
10583
|
+
"̱",
|
|
10584
|
+
"̲",
|
|
10585
|
+
"̳",
|
|
10586
|
+
"̹",
|
|
10587
|
+
"̺",
|
|
10588
|
+
"̻",
|
|
10589
|
+
"̼",
|
|
10590
|
+
"ͅ",
|
|
10591
|
+
"͇",
|
|
10592
|
+
"͈",
|
|
10593
|
+
"͉",
|
|
10594
|
+
"͍",
|
|
10595
|
+
"͎",
|
|
10596
|
+
"͓",
|
|
10597
|
+
"͔",
|
|
10598
|
+
"͕",
|
|
10599
|
+
"͖",
|
|
10600
|
+
"͙",
|
|
10601
|
+
"͚",
|
|
10602
|
+
"̣"
|
|
10603
|
+
],
|
|
10604
|
+
"mid": [
|
|
10605
|
+
"̕",
|
|
10606
|
+
"̛",
|
|
10607
|
+
"̀",
|
|
10608
|
+
"́",
|
|
10609
|
+
"͘",
|
|
10610
|
+
"̡",
|
|
10611
|
+
"̢",
|
|
10612
|
+
"̧",
|
|
10613
|
+
"̨",
|
|
10614
|
+
"̴",
|
|
10615
|
+
"̵",
|
|
10616
|
+
"̶",
|
|
10617
|
+
"͜",
|
|
10618
|
+
"͝",
|
|
10619
|
+
"͞",
|
|
10620
|
+
"͟",
|
|
10621
|
+
"͠",
|
|
10622
|
+
"͢",
|
|
10623
|
+
"̸",
|
|
10624
|
+
"̷",
|
|
10625
|
+
"͡",
|
|
10626
|
+
" ҉"
|
|
10627
|
+
]
|
|
10628
|
+
};
|
|
10629
|
+
var all = [].concat(soul.up, soul.down, soul.mid);
|
|
10630
|
+
function randomNumber(range) {
|
|
10631
|
+
var r = Math.floor(Math.random() * range);
|
|
10632
|
+
return r;
|
|
10633
|
+
}
|
|
10634
|
+
function isChar(character) {
|
|
10635
|
+
var bool = false;
|
|
10636
|
+
all.filter(function(i) {
|
|
10637
|
+
bool = i === character;
|
|
10638
|
+
});
|
|
10639
|
+
return bool;
|
|
10640
|
+
}
|
|
10641
|
+
function heComes(text$1, options$1) {
|
|
10642
|
+
var result = "";
|
|
10643
|
+
var counts;
|
|
10644
|
+
var l;
|
|
10645
|
+
options$1 = options$1 || {};
|
|
10646
|
+
options$1["up"] = typeof options$1["up"] !== "undefined" ? options$1["up"] : true;
|
|
10647
|
+
options$1["mid"] = typeof options$1["mid"] !== "undefined" ? options$1["mid"] : true;
|
|
10648
|
+
options$1["down"] = typeof options$1["down"] !== "undefined" ? options$1["down"] : true;
|
|
10649
|
+
options$1["size"] = typeof options$1["size"] !== "undefined" ? options$1["size"] : "maxi";
|
|
10650
|
+
text$1 = text$1.split("");
|
|
10651
|
+
for (l in text$1) {
|
|
10652
|
+
if (isChar(l)) continue;
|
|
10653
|
+
result = result + text$1[l];
|
|
10654
|
+
counts = {
|
|
10655
|
+
"up": 0,
|
|
10656
|
+
"down": 0,
|
|
10657
|
+
"mid": 0
|
|
10658
|
+
};
|
|
10659
|
+
switch (options$1.size) {
|
|
10660
|
+
case "mini":
|
|
10661
|
+
counts.up = randomNumber(8);
|
|
10662
|
+
counts.mid = randomNumber(2);
|
|
10663
|
+
counts.down = randomNumber(8);
|
|
10664
|
+
break;
|
|
10665
|
+
case "maxi":
|
|
10666
|
+
counts.up = randomNumber(16) + 3;
|
|
10667
|
+
counts.mid = randomNumber(4) + 1;
|
|
10668
|
+
counts.down = randomNumber(64) + 3;
|
|
10669
|
+
break;
|
|
10670
|
+
default:
|
|
10671
|
+
counts.up = randomNumber(8) + 1;
|
|
10672
|
+
counts.mid = randomNumber(6) / 2;
|
|
10673
|
+
counts.down = randomNumber(8) + 1;
|
|
10674
|
+
break;
|
|
10675
|
+
}
|
|
10676
|
+
var arr = [
|
|
10677
|
+
"up",
|
|
10678
|
+
"mid",
|
|
10679
|
+
"down"
|
|
10680
|
+
];
|
|
10681
|
+
for (var d in arr) {
|
|
10682
|
+
var index$1 = arr[d];
|
|
10683
|
+
for (var i = 0; i <= counts[index$1]; i++) if (options$1[index$1]) result = result + soul[index$1][randomNumber(soul[index$1].length)];
|
|
10684
|
+
}
|
|
10685
|
+
}
|
|
10686
|
+
return result;
|
|
10687
|
+
}
|
|
10688
|
+
return heComes(text, options);
|
|
10689
|
+
};
|
|
10690
|
+
} });
|
|
10691
|
+
|
|
10692
|
+
//#endregion
|
|
10693
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/america.js
|
|
10694
|
+
var require_america = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/america.js"(exports, module) {
|
|
10695
|
+
module["exports"] = function(colors$2) {
|
|
10696
|
+
return function(letter, i, exploded) {
|
|
10697
|
+
if (letter === " ") return letter;
|
|
10698
|
+
switch (i % 3) {
|
|
10699
|
+
case 0: return colors$2.red(letter);
|
|
10700
|
+
case 1: return colors$2.white(letter);
|
|
10701
|
+
case 2: return colors$2.blue(letter);
|
|
10702
|
+
}
|
|
10703
|
+
};
|
|
10704
|
+
};
|
|
10705
|
+
} });
|
|
10706
|
+
|
|
10707
|
+
//#endregion
|
|
10708
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/zebra.js
|
|
10709
|
+
var require_zebra = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/zebra.js"(exports, module) {
|
|
10710
|
+
module["exports"] = function(colors$2) {
|
|
10711
|
+
return function(letter, i, exploded) {
|
|
10712
|
+
return i % 2 === 0 ? letter : colors$2.inverse(letter);
|
|
10713
|
+
};
|
|
10714
|
+
};
|
|
10715
|
+
} });
|
|
10716
|
+
|
|
10717
|
+
//#endregion
|
|
10718
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/rainbow.js
|
|
10719
|
+
var require_rainbow = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/rainbow.js"(exports, module) {
|
|
10720
|
+
module["exports"] = function(colors$2) {
|
|
10721
|
+
var rainbowColors = [
|
|
10722
|
+
"red",
|
|
10723
|
+
"yellow",
|
|
10724
|
+
"green",
|
|
10725
|
+
"blue",
|
|
10726
|
+
"magenta"
|
|
10727
|
+
];
|
|
10728
|
+
return function(letter, i, exploded) {
|
|
10729
|
+
if (letter === " ") return letter;
|
|
10730
|
+
else return colors$2[rainbowColors[i++ % rainbowColors.length]](letter);
|
|
10731
|
+
};
|
|
10732
|
+
};
|
|
10733
|
+
} });
|
|
10734
|
+
|
|
10735
|
+
//#endregion
|
|
10736
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/random.js
|
|
10737
|
+
var require_random = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/maps/random.js"(exports, module) {
|
|
10738
|
+
module["exports"] = function(colors$2) {
|
|
10739
|
+
var available = [
|
|
10740
|
+
"underline",
|
|
10741
|
+
"inverse",
|
|
10742
|
+
"grey",
|
|
10743
|
+
"yellow",
|
|
10744
|
+
"red",
|
|
10745
|
+
"green",
|
|
10746
|
+
"blue",
|
|
10747
|
+
"white",
|
|
10748
|
+
"cyan",
|
|
10749
|
+
"magenta",
|
|
10750
|
+
"brightYellow",
|
|
10751
|
+
"brightRed",
|
|
10752
|
+
"brightGreen",
|
|
10753
|
+
"brightBlue",
|
|
10754
|
+
"brightWhite",
|
|
10755
|
+
"brightCyan",
|
|
10756
|
+
"brightMagenta"
|
|
10757
|
+
];
|
|
10758
|
+
return function(letter, i, exploded) {
|
|
10759
|
+
return letter === " " ? letter : colors$2[available[Math.round(Math.random() * (available.length - 2))]](letter);
|
|
10760
|
+
};
|
|
10761
|
+
};
|
|
10762
|
+
} });
|
|
10763
|
+
|
|
10764
|
+
//#endregion
|
|
10765
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/colors.js
|
|
10766
|
+
var require_colors = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/lib/colors.js"(exports, module) {
|
|
10767
|
+
var colors$1 = {};
|
|
10768
|
+
module["exports"] = colors$1;
|
|
10769
|
+
colors$1.themes = {};
|
|
10770
|
+
var util = require("util");
|
|
10771
|
+
var ansiStyles = colors$1.styles = require_styles();
|
|
10772
|
+
var defineProps = Object.defineProperties;
|
|
10773
|
+
var newLineRegex = new RegExp(/[\r\n]+/g);
|
|
10774
|
+
colors$1.supportsColor = require_supports_colors().supportsColor;
|
|
10775
|
+
if (typeof colors$1.enabled === "undefined") colors$1.enabled = colors$1.supportsColor() !== false;
|
|
10776
|
+
colors$1.enable = function() {
|
|
10777
|
+
colors$1.enabled = true;
|
|
10778
|
+
};
|
|
10779
|
+
colors$1.disable = function() {
|
|
10780
|
+
colors$1.enabled = false;
|
|
10781
|
+
};
|
|
10782
|
+
colors$1.stripColors = colors$1.strip = function(str) {
|
|
10783
|
+
return ("" + str).replace(/\x1B\[\d+m/g, "");
|
|
10784
|
+
};
|
|
10785
|
+
var stylize = colors$1.stylize = function stylize$1(str, style) {
|
|
10786
|
+
if (!colors$1.enabled) return str + "";
|
|
10787
|
+
var styleMap = ansiStyles[style];
|
|
10788
|
+
if (!styleMap && style in colors$1) return colors$1[style](str);
|
|
10789
|
+
return styleMap.open + str + styleMap.close;
|
|
10790
|
+
};
|
|
10791
|
+
var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
|
|
10792
|
+
var escapeStringRegexp = function(str) {
|
|
10793
|
+
if (typeof str !== "string") throw new TypeError("Expected a string");
|
|
10794
|
+
return str.replace(matchOperatorsRe, "\\$&");
|
|
10795
|
+
};
|
|
10796
|
+
function build(_styles) {
|
|
10797
|
+
var builder = function builder$1() {
|
|
10798
|
+
return applyStyle.apply(builder$1, arguments);
|
|
10799
|
+
};
|
|
10800
|
+
builder._styles = _styles;
|
|
10801
|
+
builder.__proto__ = proto;
|
|
10802
|
+
return builder;
|
|
10803
|
+
}
|
|
10804
|
+
var styles = function() {
|
|
10805
|
+
var ret = {};
|
|
10806
|
+
ansiStyles.grey = ansiStyles.gray;
|
|
10807
|
+
Object.keys(ansiStyles).forEach(function(key) {
|
|
10808
|
+
ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), "g");
|
|
10809
|
+
ret[key] = { get: function() {
|
|
10810
|
+
return build(this._styles.concat(key));
|
|
10811
|
+
} };
|
|
10812
|
+
});
|
|
10813
|
+
return ret;
|
|
10814
|
+
}();
|
|
10815
|
+
var proto = defineProps(function colors$2() {}, styles);
|
|
10816
|
+
function applyStyle() {
|
|
10817
|
+
var args = Array.prototype.slice.call(arguments);
|
|
10818
|
+
var str = args.map(function(arg) {
|
|
10819
|
+
if (arg != null && arg.constructor === String) return arg;
|
|
10820
|
+
else return util.inspect(arg);
|
|
10821
|
+
}).join(" ");
|
|
10822
|
+
if (!colors$1.enabled || !str) return str;
|
|
10823
|
+
var newLinesPresent = str.indexOf("\n") != -1;
|
|
10824
|
+
var nestedStyles = this._styles;
|
|
10825
|
+
var i = nestedStyles.length;
|
|
10826
|
+
while (i--) {
|
|
10827
|
+
var code = ansiStyles[nestedStyles[i]];
|
|
10828
|
+
str = code.open + str.replace(code.closeRe, code.open) + code.close;
|
|
10829
|
+
if (newLinesPresent) str = str.replace(newLineRegex, function(match) {
|
|
10830
|
+
return code.close + match + code.open;
|
|
10831
|
+
});
|
|
10832
|
+
}
|
|
10833
|
+
return str;
|
|
10834
|
+
}
|
|
10835
|
+
colors$1.setTheme = function(theme) {
|
|
10836
|
+
if (typeof theme === "string") {
|
|
10837
|
+
console.log("colors.setTheme now only accepts an object, not a string. If you are trying to set a theme from a file, it is now your (the caller's) responsibility to require the file. The old syntax looked like colors.setTheme(__dirname + '/../themes/generic-logging.js'); The new syntax looks like colors.setTheme(require(__dirname + '/../themes/generic-logging.js'));");
|
|
10838
|
+
return;
|
|
10839
|
+
}
|
|
10840
|
+
for (var style in theme) (function(style$1) {
|
|
10841
|
+
colors$1[style$1] = function(str) {
|
|
10842
|
+
if (typeof theme[style$1] === "object") {
|
|
10843
|
+
var out = str;
|
|
10844
|
+
for (var i in theme[style$1]) out = colors$1[theme[style$1][i]](out);
|
|
10845
|
+
return out;
|
|
10846
|
+
}
|
|
10847
|
+
return colors$1[theme[style$1]](str);
|
|
10848
|
+
};
|
|
10849
|
+
})(style);
|
|
10850
|
+
};
|
|
10851
|
+
function init() {
|
|
10852
|
+
var ret = {};
|
|
10853
|
+
Object.keys(styles).forEach(function(name) {
|
|
10854
|
+
ret[name] = { get: function() {
|
|
10855
|
+
return build([name]);
|
|
10856
|
+
} };
|
|
10857
|
+
});
|
|
10858
|
+
return ret;
|
|
10859
|
+
}
|
|
10860
|
+
var sequencer = function sequencer$1(map$1, str) {
|
|
10861
|
+
var exploded = str.split("");
|
|
10862
|
+
exploded = exploded.map(map$1);
|
|
10863
|
+
return exploded.join("");
|
|
10864
|
+
};
|
|
10865
|
+
colors$1.trap = require_trap();
|
|
10866
|
+
colors$1.zalgo = require_zalgo();
|
|
10867
|
+
colors$1.maps = {};
|
|
10868
|
+
colors$1.maps.america = require_america()(colors$1);
|
|
10869
|
+
colors$1.maps.zebra = require_zebra()(colors$1);
|
|
10870
|
+
colors$1.maps.rainbow = require_rainbow()(colors$1);
|
|
10871
|
+
colors$1.maps.random = require_random()(colors$1);
|
|
10872
|
+
for (var map in colors$1.maps) (function(map$1) {
|
|
10873
|
+
colors$1[map$1] = function(str) {
|
|
10874
|
+
return sequencer(colors$1.maps[map$1], str);
|
|
10875
|
+
};
|
|
10876
|
+
})(map);
|
|
10877
|
+
defineProps(colors$1, init());
|
|
10878
|
+
} });
|
|
10879
|
+
|
|
10880
|
+
//#endregion
|
|
10881
|
+
//#region ../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/safe.js
|
|
10882
|
+
var require_safe = __commonJS({ "../../../node_modules/.bun/@colors+colors@1.5.0/node_modules/@colors/colors/safe.js"(exports, module) {
|
|
10883
|
+
var colors = require_colors();
|
|
10884
|
+
module["exports"] = colors;
|
|
10885
|
+
} });
|
|
10886
|
+
|
|
10887
|
+
//#endregion
|
|
10888
|
+
//#region ../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/cell.js
|
|
10889
|
+
var require_cell = __commonJS({ "../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/cell.js"(exports, module) {
|
|
10890
|
+
const { info, debug: debug$2 } = require_debug();
|
|
10891
|
+
const utils$1 = require_utils();
|
|
10892
|
+
var Cell$1 = class Cell$1 {
|
|
10893
|
+
/**
|
|
10894
|
+
* A representation of a cell within the table.
|
|
10895
|
+
* Implementations must have `init` and `draw` methods,
|
|
10896
|
+
* as well as `colSpan`, `rowSpan`, `desiredHeight` and `desiredWidth` properties.
|
|
10897
|
+
* @param options
|
|
10898
|
+
* @constructor
|
|
10899
|
+
*/
|
|
10900
|
+
constructor(options) {
|
|
10901
|
+
this.setOptions(options);
|
|
10902
|
+
/**
|
|
10903
|
+
* Each cell will have it's `x` and `y` values set by the `layout-manager` prior to
|
|
10904
|
+
* `init` being called;
|
|
10905
|
+
* @type {Number}
|
|
10906
|
+
*/
|
|
10907
|
+
this.x = null;
|
|
10908
|
+
this.y = null;
|
|
10909
|
+
}
|
|
10910
|
+
setOptions(options) {
|
|
10911
|
+
if ([
|
|
10912
|
+
"boolean",
|
|
10913
|
+
"number",
|
|
10914
|
+
"bigint",
|
|
10915
|
+
"string"
|
|
10916
|
+
].indexOf(typeof options) !== -1) options = { content: "" + options };
|
|
10917
|
+
options = options || {};
|
|
10918
|
+
this.options = options;
|
|
10919
|
+
let content = options.content;
|
|
10920
|
+
if ([
|
|
10921
|
+
"boolean",
|
|
10922
|
+
"number",
|
|
10923
|
+
"bigint",
|
|
10924
|
+
"string"
|
|
10925
|
+
].indexOf(typeof content) !== -1) this.content = String(content);
|
|
10926
|
+
else if (!content) this.content = this.options.href || "";
|
|
10927
|
+
else throw new Error("Content needs to be a primitive, got: " + typeof content);
|
|
10928
|
+
this.colSpan = options.colSpan || 1;
|
|
10929
|
+
this.rowSpan = options.rowSpan || 1;
|
|
10930
|
+
if (this.options.href) Object.defineProperty(this, "href", { get() {
|
|
10931
|
+
return this.options.href;
|
|
10932
|
+
} });
|
|
10933
|
+
}
|
|
10934
|
+
mergeTableOptions(tableOptions, cells) {
|
|
10935
|
+
this.cells = cells;
|
|
10936
|
+
let optionsChars = this.options.chars || {};
|
|
10937
|
+
let tableChars = tableOptions.chars;
|
|
10938
|
+
let chars = this.chars = {};
|
|
10939
|
+
CHAR_NAMES.forEach(function(name) {
|
|
10940
|
+
setOption(optionsChars, tableChars, name, chars);
|
|
10941
|
+
});
|
|
10942
|
+
this.truncate = this.options.truncate || tableOptions.truncate;
|
|
10943
|
+
let style = this.options.style = this.options.style || {};
|
|
10944
|
+
let tableStyle = tableOptions.style;
|
|
10945
|
+
setOption(style, tableStyle, "padding-left", this);
|
|
10946
|
+
setOption(style, tableStyle, "padding-right", this);
|
|
10947
|
+
this.head = style.head || tableStyle.head;
|
|
10948
|
+
this.border = style.border || tableStyle.border;
|
|
10949
|
+
this.fixedWidth = tableOptions.colWidths[this.x];
|
|
10950
|
+
this.lines = this.computeLines(tableOptions);
|
|
10951
|
+
this.desiredWidth = utils$1.strlen(this.content) + this.paddingLeft + this.paddingRight;
|
|
10952
|
+
this.desiredHeight = this.lines.length;
|
|
10953
|
+
}
|
|
10954
|
+
computeLines(tableOptions) {
|
|
10955
|
+
const tableWordWrap = tableOptions.wordWrap || tableOptions.textWrap;
|
|
10956
|
+
const { wordWrap: wordWrap$1 = tableWordWrap } = this.options;
|
|
10957
|
+
if (this.fixedWidth && wordWrap$1) {
|
|
10958
|
+
this.fixedWidth -= this.paddingLeft + this.paddingRight;
|
|
10959
|
+
if (this.colSpan) {
|
|
10960
|
+
let i = 1;
|
|
10961
|
+
while (i < this.colSpan) {
|
|
10962
|
+
this.fixedWidth += tableOptions.colWidths[this.x + i];
|
|
10963
|
+
i++;
|
|
10964
|
+
}
|
|
10965
|
+
}
|
|
10966
|
+
const { wrapOnWordBoundary: tableWrapOnWordBoundary = true } = tableOptions;
|
|
10967
|
+
const { wrapOnWordBoundary = tableWrapOnWordBoundary } = this.options;
|
|
10968
|
+
return this.wrapLines(utils$1.wordWrap(this.fixedWidth, this.content, wrapOnWordBoundary));
|
|
10969
|
+
}
|
|
10970
|
+
return this.wrapLines(this.content.split("\n"));
|
|
10971
|
+
}
|
|
10972
|
+
wrapLines(computedLines) {
|
|
10973
|
+
const lines = utils$1.colorizeLines(computedLines);
|
|
10974
|
+
if (this.href) return lines.map((line) => utils$1.hyperlink(this.href, line));
|
|
10975
|
+
return lines;
|
|
10976
|
+
}
|
|
10977
|
+
/**
|
|
10978
|
+
* Initializes the Cells data structure.
|
|
10979
|
+
*
|
|
10980
|
+
* @param tableOptions - A fully populated set of tableOptions.
|
|
10981
|
+
* In addition to the standard default values, tableOptions must have fully populated the
|
|
10982
|
+
* `colWidths` and `rowWidths` arrays. Those arrays must have lengths equal to the number
|
|
10983
|
+
* of columns or rows (respectively) in this table, and each array item must be a Number.
|
|
10984
|
+
*
|
|
10985
|
+
*/
|
|
10986
|
+
init(tableOptions) {
|
|
10987
|
+
let x = this.x;
|
|
10988
|
+
let y = this.y;
|
|
10989
|
+
this.widths = tableOptions.colWidths.slice(x, x + this.colSpan);
|
|
10990
|
+
this.heights = tableOptions.rowHeights.slice(y, y + this.rowSpan);
|
|
10991
|
+
this.width = this.widths.reduce(sumPlusOne, -1);
|
|
10992
|
+
this.height = this.heights.reduce(sumPlusOne, -1);
|
|
10993
|
+
this.hAlign = this.options.hAlign || tableOptions.colAligns[x];
|
|
10994
|
+
this.vAlign = this.options.vAlign || tableOptions.rowAligns[y];
|
|
10995
|
+
this.drawRight = x + this.colSpan == tableOptions.colWidths.length;
|
|
10996
|
+
}
|
|
10997
|
+
/**
|
|
10998
|
+
* Draws the given line of the cell.
|
|
10999
|
+
* This default implementation defers to methods `drawTop`, `drawBottom`, `drawLine` and `drawEmpty`.
|
|
11000
|
+
* @param lineNum - can be `top`, `bottom` or a numerical line number.
|
|
11001
|
+
* @param spanningCell - will be a number if being called from a RowSpanCell, and will represent how
|
|
11002
|
+
* many rows below it's being called from. Otherwise it's undefined.
|
|
11003
|
+
* @returns {String} The representation of this line.
|
|
11004
|
+
*/
|
|
11005
|
+
draw(lineNum, spanningCell) {
|
|
11006
|
+
if (lineNum == "top") return this.drawTop(this.drawRight);
|
|
11007
|
+
if (lineNum == "bottom") return this.drawBottom(this.drawRight);
|
|
11008
|
+
let content = utils$1.truncate(this.content, 10, this.truncate);
|
|
11009
|
+
if (!lineNum) info(`${this.y}-${this.x}: ${this.rowSpan - lineNum}x${this.colSpan} Cell ${content}`);
|
|
11010
|
+
let padLen = Math.max(this.height - this.lines.length, 0);
|
|
11011
|
+
let padTop;
|
|
11012
|
+
switch (this.vAlign) {
|
|
11013
|
+
case "center":
|
|
11014
|
+
padTop = Math.ceil(padLen / 2);
|
|
11015
|
+
break;
|
|
11016
|
+
case "bottom":
|
|
11017
|
+
padTop = padLen;
|
|
11018
|
+
break;
|
|
11019
|
+
default: padTop = 0;
|
|
11020
|
+
}
|
|
11021
|
+
if (lineNum < padTop || lineNum >= padTop + this.lines.length) return this.drawEmpty(this.drawRight, spanningCell);
|
|
11022
|
+
let forceTruncation = this.lines.length > this.height && lineNum + 1 >= this.height;
|
|
11023
|
+
return this.drawLine(lineNum - padTop, this.drawRight, forceTruncation, spanningCell);
|
|
11024
|
+
}
|
|
11025
|
+
/**
|
|
11026
|
+
* Renders the top line of the cell.
|
|
11027
|
+
* @param drawRight - true if this method should render the right edge of the cell.
|
|
11028
|
+
* @returns {String}
|
|
11029
|
+
*/
|
|
11030
|
+
drawTop(drawRight) {
|
|
11031
|
+
let content = [];
|
|
11032
|
+
if (this.cells) this.widths.forEach(function(width, index$1) {
|
|
11033
|
+
content.push(this._topLeftChar(index$1));
|
|
11034
|
+
content.push(utils$1.repeat(this.chars[this.y == 0 ? "top" : "mid"], width));
|
|
11035
|
+
}, this);
|
|
11036
|
+
else {
|
|
11037
|
+
content.push(this._topLeftChar(0));
|
|
11038
|
+
content.push(utils$1.repeat(this.chars[this.y == 0 ? "top" : "mid"], this.width));
|
|
11039
|
+
}
|
|
11040
|
+
if (drawRight) content.push(this.chars[this.y == 0 ? "topRight" : "rightMid"]);
|
|
11041
|
+
return this.wrapWithStyleColors("border", content.join(""));
|
|
11042
|
+
}
|
|
11043
|
+
_topLeftChar(offset) {
|
|
11044
|
+
let x = this.x + offset;
|
|
11045
|
+
let leftChar;
|
|
11046
|
+
if (this.y == 0) leftChar = x == 0 ? "topLeft" : offset == 0 ? "topMid" : "top";
|
|
11047
|
+
else if (x == 0) leftChar = "leftMid";
|
|
11048
|
+
else {
|
|
11049
|
+
leftChar = offset == 0 ? "midMid" : "bottomMid";
|
|
11050
|
+
if (this.cells) {
|
|
11051
|
+
let spanAbove = this.cells[this.y - 1][x] instanceof Cell$1.ColSpanCell;
|
|
11052
|
+
if (spanAbove) leftChar = offset == 0 ? "topMid" : "mid";
|
|
11053
|
+
if (offset == 0) {
|
|
11054
|
+
let i = 1;
|
|
11055
|
+
while (this.cells[this.y][x - i] instanceof Cell$1.ColSpanCell) i++;
|
|
11056
|
+
if (this.cells[this.y][x - i] instanceof Cell$1.RowSpanCell) leftChar = "leftMid";
|
|
11057
|
+
}
|
|
11058
|
+
}
|
|
11059
|
+
}
|
|
11060
|
+
return this.chars[leftChar];
|
|
11061
|
+
}
|
|
11062
|
+
wrapWithStyleColors(styleProperty, content) {
|
|
11063
|
+
if (this[styleProperty] && this[styleProperty].length) try {
|
|
11064
|
+
let colors$2 = require_safe();
|
|
11065
|
+
for (let i = this[styleProperty].length - 1; i >= 0; i--) colors$2 = colors$2[this[styleProperty][i]];
|
|
11066
|
+
return colors$2(content);
|
|
11067
|
+
} catch (e) {
|
|
11068
|
+
return content;
|
|
11069
|
+
}
|
|
11070
|
+
else return content;
|
|
11071
|
+
}
|
|
11072
|
+
/**
|
|
11073
|
+
* Renders a line of text.
|
|
11074
|
+
* @param lineNum - Which line of text to render. This is not necessarily the line within the cell.
|
|
11075
|
+
* There may be top-padding above the first line of text.
|
|
11076
|
+
* @param drawRight - true if this method should render the right edge of the cell.
|
|
11077
|
+
* @param forceTruncationSymbol - `true` if the rendered text should end with the truncation symbol even
|
|
11078
|
+
* if the text fits. This is used when the cell is vertically truncated. If `false` the text should
|
|
11079
|
+
* only include the truncation symbol if the text will not fit horizontally within the cell width.
|
|
11080
|
+
* @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.
|
|
11081
|
+
* @returns {String}
|
|
11082
|
+
*/
|
|
11083
|
+
drawLine(lineNum, drawRight, forceTruncationSymbol, spanningCell) {
|
|
11084
|
+
let left = this.chars[this.x == 0 ? "left" : "middle"];
|
|
11085
|
+
if (this.x && spanningCell && this.cells) {
|
|
11086
|
+
let cellLeft = this.cells[this.y + spanningCell][this.x - 1];
|
|
11087
|
+
while (cellLeft instanceof ColSpanCell$1) cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];
|
|
11088
|
+
if (!(cellLeft instanceof RowSpanCell$1)) left = this.chars["rightMid"];
|
|
11089
|
+
}
|
|
11090
|
+
let leftPadding = utils$1.repeat(" ", this.paddingLeft);
|
|
11091
|
+
let right = drawRight ? this.chars["right"] : "";
|
|
11092
|
+
let rightPadding = utils$1.repeat(" ", this.paddingRight);
|
|
11093
|
+
let line = this.lines[lineNum];
|
|
11094
|
+
let len = this.width - (this.paddingLeft + this.paddingRight);
|
|
11095
|
+
if (forceTruncationSymbol) line += this.truncate || "…";
|
|
11096
|
+
let content = utils$1.truncate(line, len, this.truncate);
|
|
11097
|
+
content = utils$1.pad(content, len, " ", this.hAlign);
|
|
11098
|
+
content = leftPadding + content + rightPadding;
|
|
11099
|
+
return this.stylizeLine(left, content, right);
|
|
11100
|
+
}
|
|
11101
|
+
stylizeLine(left, content, right) {
|
|
11102
|
+
left = this.wrapWithStyleColors("border", left);
|
|
11103
|
+
right = this.wrapWithStyleColors("border", right);
|
|
11104
|
+
if (this.y === 0) content = this.wrapWithStyleColors("head", content);
|
|
11105
|
+
return left + content + right;
|
|
11106
|
+
}
|
|
11107
|
+
/**
|
|
11108
|
+
* Renders the bottom line of the cell.
|
|
11109
|
+
* @param drawRight - true if this method should render the right edge of the cell.
|
|
11110
|
+
* @returns {String}
|
|
11111
|
+
*/
|
|
11112
|
+
drawBottom(drawRight) {
|
|
11113
|
+
let left = this.chars[this.x == 0 ? "bottomLeft" : "bottomMid"];
|
|
11114
|
+
let content = utils$1.repeat(this.chars.bottom, this.width);
|
|
11115
|
+
let right = drawRight ? this.chars["bottomRight"] : "";
|
|
11116
|
+
return this.wrapWithStyleColors("border", left + content + right);
|
|
11117
|
+
}
|
|
11118
|
+
/**
|
|
11119
|
+
* Renders a blank line of text within the cell. Used for top and/or bottom padding.
|
|
11120
|
+
* @param drawRight - true if this method should render the right edge of the cell.
|
|
11121
|
+
* @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.
|
|
11122
|
+
* @returns {String}
|
|
11123
|
+
*/
|
|
11124
|
+
drawEmpty(drawRight, spanningCell) {
|
|
11125
|
+
let left = this.chars[this.x == 0 ? "left" : "middle"];
|
|
11126
|
+
if (this.x && spanningCell && this.cells) {
|
|
11127
|
+
let cellLeft = this.cells[this.y + spanningCell][this.x - 1];
|
|
11128
|
+
while (cellLeft instanceof ColSpanCell$1) cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];
|
|
11129
|
+
if (!(cellLeft instanceof RowSpanCell$1)) left = this.chars["rightMid"];
|
|
11130
|
+
}
|
|
11131
|
+
let right = drawRight ? this.chars["right"] : "";
|
|
11132
|
+
let content = utils$1.repeat(" ", this.width);
|
|
11133
|
+
return this.stylizeLine(left, content, right);
|
|
11134
|
+
}
|
|
11135
|
+
};
|
|
11136
|
+
var ColSpanCell$1 = class {
|
|
11137
|
+
/**
|
|
11138
|
+
* A Cell that doesn't do anything. It just draws empty lines.
|
|
11139
|
+
* Used as a placeholder in column spanning.
|
|
11140
|
+
* @constructor
|
|
11141
|
+
*/
|
|
11142
|
+
constructor() {}
|
|
11143
|
+
draw(lineNum) {
|
|
11144
|
+
if (typeof lineNum === "number") debug$2(`${this.y}-${this.x}: 1x1 ColSpanCell`);
|
|
11145
|
+
return "";
|
|
11146
|
+
}
|
|
11147
|
+
init() {}
|
|
11148
|
+
mergeTableOptions() {}
|
|
11149
|
+
};
|
|
11150
|
+
var RowSpanCell$1 = class {
|
|
11151
|
+
/**
|
|
11152
|
+
* A placeholder Cell for a Cell that spans multiple rows.
|
|
11153
|
+
* It delegates rendering to the original cell, but adds the appropriate offset.
|
|
11154
|
+
* @param originalCell
|
|
11155
|
+
* @constructor
|
|
11156
|
+
*/
|
|
11157
|
+
constructor(originalCell) {
|
|
11158
|
+
this.originalCell = originalCell;
|
|
11159
|
+
}
|
|
11160
|
+
init(tableOptions) {
|
|
11161
|
+
let y = this.y;
|
|
11162
|
+
let originalY = this.originalCell.y;
|
|
11163
|
+
this.cellOffset = y - originalY;
|
|
11164
|
+
this.offset = findDimension(tableOptions.rowHeights, originalY, this.cellOffset);
|
|
11165
|
+
}
|
|
11166
|
+
draw(lineNum) {
|
|
11167
|
+
if (lineNum == "top") return this.originalCell.draw(this.offset, this.cellOffset);
|
|
11168
|
+
if (lineNum == "bottom") return this.originalCell.draw("bottom");
|
|
11169
|
+
debug$2(`${this.y}-${this.x}: 1x${this.colSpan} RowSpanCell for ${this.originalCell.content}`);
|
|
11170
|
+
return this.originalCell.draw(this.offset + 1 + lineNum);
|
|
11171
|
+
}
|
|
11172
|
+
mergeTableOptions() {}
|
|
11173
|
+
};
|
|
11174
|
+
function firstDefined(...args) {
|
|
11175
|
+
return args.filter((v) => v !== void 0 && v !== null).shift();
|
|
11176
|
+
}
|
|
11177
|
+
function setOption(objA, objB, nameB, targetObj) {
|
|
11178
|
+
let nameA = nameB.split("-");
|
|
11179
|
+
if (nameA.length > 1) {
|
|
11180
|
+
nameA[1] = nameA[1].charAt(0).toUpperCase() + nameA[1].substr(1);
|
|
11181
|
+
nameA = nameA.join("");
|
|
11182
|
+
targetObj[nameA] = firstDefined(objA[nameA], objA[nameB], objB[nameA], objB[nameB]);
|
|
11183
|
+
} else targetObj[nameB] = firstDefined(objA[nameB], objB[nameB]);
|
|
11184
|
+
}
|
|
11185
|
+
function findDimension(dimensionTable, startingIndex, span) {
|
|
11186
|
+
let ret = dimensionTable[startingIndex];
|
|
11187
|
+
for (let i = 1; i < span; i++) ret += 1 + dimensionTable[startingIndex + i];
|
|
11188
|
+
return ret;
|
|
11189
|
+
}
|
|
11190
|
+
function sumPlusOne(a, b) {
|
|
11191
|
+
return a + b + 1;
|
|
11192
|
+
}
|
|
11193
|
+
let CHAR_NAMES = [
|
|
11194
|
+
"top",
|
|
11195
|
+
"top-mid",
|
|
11196
|
+
"top-left",
|
|
11197
|
+
"top-right",
|
|
11198
|
+
"bottom",
|
|
11199
|
+
"bottom-mid",
|
|
11200
|
+
"bottom-left",
|
|
11201
|
+
"bottom-right",
|
|
11202
|
+
"left",
|
|
11203
|
+
"left-mid",
|
|
11204
|
+
"mid",
|
|
11205
|
+
"mid-mid",
|
|
11206
|
+
"right",
|
|
11207
|
+
"right-mid",
|
|
11208
|
+
"middle"
|
|
11209
|
+
];
|
|
11210
|
+
module.exports = Cell$1;
|
|
11211
|
+
module.exports.ColSpanCell = ColSpanCell$1;
|
|
11212
|
+
module.exports.RowSpanCell = RowSpanCell$1;
|
|
11213
|
+
} });
|
|
11214
|
+
|
|
11215
|
+
//#endregion
|
|
11216
|
+
//#region ../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/layout-manager.js
|
|
11217
|
+
var require_layout_manager = __commonJS({ "../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/layout-manager.js"(exports, module) {
|
|
11218
|
+
const { warn, debug: debug$1 } = require_debug();
|
|
11219
|
+
const Cell = require_cell();
|
|
11220
|
+
const { ColSpanCell, RowSpanCell } = Cell;
|
|
11221
|
+
(function() {
|
|
11222
|
+
function next(alloc, col) {
|
|
11223
|
+
if (alloc[col] > 0) return next(alloc, col + 1);
|
|
11224
|
+
return col;
|
|
11225
|
+
}
|
|
11226
|
+
function layoutTable(table) {
|
|
11227
|
+
let alloc = {};
|
|
11228
|
+
table.forEach(function(row, rowIndex) {
|
|
11229
|
+
let col = 0;
|
|
11230
|
+
row.forEach(function(cell) {
|
|
11231
|
+
cell.y = rowIndex;
|
|
11232
|
+
cell.x = rowIndex ? next(alloc, col) : col;
|
|
11233
|
+
const rowSpan = cell.rowSpan || 1;
|
|
11234
|
+
const colSpan = cell.colSpan || 1;
|
|
11235
|
+
if (rowSpan > 1) for (let cs = 0; cs < colSpan; cs++) alloc[cell.x + cs] = rowSpan;
|
|
11236
|
+
col = cell.x + colSpan;
|
|
11237
|
+
});
|
|
11238
|
+
Object.keys(alloc).forEach((idx) => {
|
|
11239
|
+
alloc[idx]--;
|
|
11240
|
+
if (alloc[idx] < 1) delete alloc[idx];
|
|
11241
|
+
});
|
|
11242
|
+
});
|
|
11243
|
+
}
|
|
11244
|
+
function maxWidth(table) {
|
|
11245
|
+
let mw = 0;
|
|
11246
|
+
table.forEach(function(row) {
|
|
11247
|
+
row.forEach(function(cell) {
|
|
11248
|
+
mw = Math.max(mw, cell.x + (cell.colSpan || 1));
|
|
11249
|
+
});
|
|
11250
|
+
});
|
|
11251
|
+
return mw;
|
|
11252
|
+
}
|
|
11253
|
+
function maxHeight(table) {
|
|
11254
|
+
return table.length;
|
|
11255
|
+
}
|
|
11256
|
+
function cellsConflict(cell1, cell2) {
|
|
11257
|
+
let yMin1 = cell1.y;
|
|
11258
|
+
let yMax1 = cell1.y - 1 + (cell1.rowSpan || 1);
|
|
11259
|
+
let yMin2 = cell2.y;
|
|
11260
|
+
let yMax2 = cell2.y - 1 + (cell2.rowSpan || 1);
|
|
11261
|
+
let yConflict = !(yMin1 > yMax2 || yMin2 > yMax1);
|
|
11262
|
+
let xMin1 = cell1.x;
|
|
11263
|
+
let xMax1 = cell1.x - 1 + (cell1.colSpan || 1);
|
|
11264
|
+
let xMin2 = cell2.x;
|
|
11265
|
+
let xMax2 = cell2.x - 1 + (cell2.colSpan || 1);
|
|
11266
|
+
let xConflict = !(xMin1 > xMax2 || xMin2 > xMax1);
|
|
11267
|
+
return yConflict && xConflict;
|
|
11268
|
+
}
|
|
11269
|
+
function conflictExists(rows, x, y) {
|
|
11270
|
+
let i_max = Math.min(rows.length - 1, y);
|
|
11271
|
+
let cell = {
|
|
11272
|
+
x,
|
|
11273
|
+
y
|
|
11274
|
+
};
|
|
11275
|
+
for (let i = 0; i <= i_max; i++) {
|
|
11276
|
+
let row = rows[i];
|
|
11277
|
+
for (let j = 0; j < row.length; j++) if (cellsConflict(cell, row[j])) return true;
|
|
11278
|
+
}
|
|
11279
|
+
return false;
|
|
11280
|
+
}
|
|
11281
|
+
function allBlank(rows, y, xMin, xMax) {
|
|
11282
|
+
for (let x = xMin; x < xMax; x++) if (conflictExists(rows, x, y)) return false;
|
|
11283
|
+
return true;
|
|
11284
|
+
}
|
|
11285
|
+
function addRowSpanCells(table) {
|
|
11286
|
+
table.forEach(function(row, rowIndex) {
|
|
11287
|
+
row.forEach(function(cell) {
|
|
11288
|
+
for (let i = 1; i < cell.rowSpan; i++) {
|
|
11289
|
+
let rowSpanCell = new RowSpanCell(cell);
|
|
11290
|
+
rowSpanCell.x = cell.x;
|
|
11291
|
+
rowSpanCell.y = cell.y + i;
|
|
11292
|
+
rowSpanCell.colSpan = cell.colSpan;
|
|
11293
|
+
insertCell(rowSpanCell, table[rowIndex + i]);
|
|
11294
|
+
}
|
|
11295
|
+
});
|
|
11296
|
+
});
|
|
11297
|
+
}
|
|
11298
|
+
function addColSpanCells(cellRows) {
|
|
11299
|
+
for (let rowIndex = cellRows.length - 1; rowIndex >= 0; rowIndex--) {
|
|
11300
|
+
let cellColumns = cellRows[rowIndex];
|
|
11301
|
+
for (let columnIndex = 0; columnIndex < cellColumns.length; columnIndex++) {
|
|
11302
|
+
let cell = cellColumns[columnIndex];
|
|
11303
|
+
for (let k = 1; k < cell.colSpan; k++) {
|
|
11304
|
+
let colSpanCell = new ColSpanCell();
|
|
11305
|
+
colSpanCell.x = cell.x + k;
|
|
11306
|
+
colSpanCell.y = cell.y;
|
|
11307
|
+
cellColumns.splice(columnIndex + 1, 0, colSpanCell);
|
|
11308
|
+
}
|
|
11309
|
+
}
|
|
11310
|
+
}
|
|
11311
|
+
}
|
|
11312
|
+
function insertCell(cell, row) {
|
|
11313
|
+
let x = 0;
|
|
11314
|
+
while (x < row.length && row[x].x < cell.x) x++;
|
|
11315
|
+
row.splice(x, 0, cell);
|
|
11316
|
+
}
|
|
11317
|
+
function fillInTable(table) {
|
|
11318
|
+
let h_max = maxHeight(table);
|
|
11319
|
+
let w_max = maxWidth(table);
|
|
11320
|
+
debug$1(`Max rows: ${h_max}; Max cols: ${w_max}`);
|
|
11321
|
+
for (let y = 0; y < h_max; y++) for (let x = 0; x < w_max; x++) if (!conflictExists(table, x, y)) {
|
|
11322
|
+
let opts = {
|
|
11323
|
+
x,
|
|
11324
|
+
y,
|
|
11325
|
+
colSpan: 1,
|
|
11326
|
+
rowSpan: 1
|
|
11327
|
+
};
|
|
11328
|
+
x++;
|
|
11329
|
+
while (x < w_max && !conflictExists(table, x, y)) {
|
|
11330
|
+
opts.colSpan++;
|
|
11331
|
+
x++;
|
|
11332
|
+
}
|
|
11333
|
+
let y2 = y + 1;
|
|
11334
|
+
while (y2 < h_max && allBlank(table, y2, opts.x, opts.x + opts.colSpan)) {
|
|
11335
|
+
opts.rowSpan++;
|
|
11336
|
+
y2++;
|
|
11337
|
+
}
|
|
11338
|
+
let cell = new Cell(opts);
|
|
11339
|
+
cell.x = opts.x;
|
|
11340
|
+
cell.y = opts.y;
|
|
11341
|
+
warn(`Missing cell at ${cell.y}-${cell.x}.`);
|
|
11342
|
+
insertCell(cell, table[y]);
|
|
11343
|
+
}
|
|
11344
|
+
}
|
|
11345
|
+
function generateCells(rows) {
|
|
11346
|
+
return rows.map(function(row) {
|
|
11347
|
+
if (!Array.isArray(row)) {
|
|
11348
|
+
let key = Object.keys(row)[0];
|
|
11349
|
+
row = row[key];
|
|
11350
|
+
if (Array.isArray(row)) {
|
|
11351
|
+
row = row.slice();
|
|
11352
|
+
row.unshift(key);
|
|
11353
|
+
} else row = [key, row];
|
|
11354
|
+
}
|
|
11355
|
+
return row.map(function(cell) {
|
|
11356
|
+
return new Cell(cell);
|
|
11357
|
+
});
|
|
11358
|
+
});
|
|
11359
|
+
}
|
|
11360
|
+
function makeTableLayout(rows) {
|
|
11361
|
+
let cellRows = generateCells(rows);
|
|
11362
|
+
layoutTable(cellRows);
|
|
11363
|
+
fillInTable(cellRows);
|
|
11364
|
+
addRowSpanCells(cellRows);
|
|
11365
|
+
addColSpanCells(cellRows);
|
|
11366
|
+
return cellRows;
|
|
11367
|
+
}
|
|
11368
|
+
module.exports = {
|
|
11369
|
+
makeTableLayout,
|
|
11370
|
+
layoutTable,
|
|
11371
|
+
addRowSpanCells,
|
|
11372
|
+
maxWidth,
|
|
11373
|
+
fillInTable,
|
|
11374
|
+
computeWidths: makeComputeWidths("colSpan", "desiredWidth", "x", 1),
|
|
11375
|
+
computeHeights: makeComputeWidths("rowSpan", "desiredHeight", "y", 1)
|
|
11376
|
+
};
|
|
11377
|
+
})();
|
|
11378
|
+
function makeComputeWidths(colSpan, desiredWidth, x, forcedMin) {
|
|
11379
|
+
return function(vals, table) {
|
|
11380
|
+
let result = [];
|
|
11381
|
+
let spanners = [];
|
|
11382
|
+
let auto = {};
|
|
11383
|
+
table.forEach(function(row) {
|
|
11384
|
+
row.forEach(function(cell) {
|
|
11385
|
+
if ((cell[colSpan] || 1) > 1) spanners.push(cell);
|
|
11386
|
+
else result[cell[x]] = Math.max(result[cell[x]] || 0, cell[desiredWidth] || 0, forcedMin);
|
|
11387
|
+
});
|
|
11388
|
+
});
|
|
11389
|
+
vals.forEach(function(val, index$1) {
|
|
11390
|
+
if (typeof val === "number") result[index$1] = val;
|
|
11391
|
+
});
|
|
11392
|
+
for (let k = spanners.length - 1; k >= 0; k--) {
|
|
11393
|
+
let cell = spanners[k];
|
|
11394
|
+
let span = cell[colSpan];
|
|
11395
|
+
let col = cell[x];
|
|
11396
|
+
let existingWidth = result[col];
|
|
11397
|
+
let editableCols = typeof vals[col] === "number" ? 0 : 1;
|
|
11398
|
+
if (typeof existingWidth === "number") for (let i = 1; i < span; i++) {
|
|
11399
|
+
existingWidth += 1 + result[col + i];
|
|
11400
|
+
if (typeof vals[col + i] !== "number") editableCols++;
|
|
11401
|
+
}
|
|
11402
|
+
else {
|
|
11403
|
+
existingWidth = desiredWidth === "desiredWidth" ? cell.desiredWidth - 1 : 1;
|
|
11404
|
+
if (!auto[col] || auto[col] < existingWidth) auto[col] = existingWidth;
|
|
11405
|
+
}
|
|
11406
|
+
if (cell[desiredWidth] > existingWidth) {
|
|
11407
|
+
let i = 0;
|
|
11408
|
+
while (editableCols > 0 && cell[desiredWidth] > existingWidth) {
|
|
11409
|
+
if (typeof vals[col + i] !== "number") {
|
|
11410
|
+
let dif = Math.round((cell[desiredWidth] - existingWidth) / editableCols);
|
|
11411
|
+
existingWidth += dif;
|
|
11412
|
+
result[col + i] += dif;
|
|
11413
|
+
editableCols--;
|
|
11414
|
+
}
|
|
11415
|
+
i++;
|
|
11416
|
+
}
|
|
11417
|
+
}
|
|
11418
|
+
}
|
|
11419
|
+
Object.assign(vals, result, auto);
|
|
11420
|
+
for (let j = 0; j < vals.length; j++) vals[j] = Math.max(forcedMin, vals[j] || 0);
|
|
11421
|
+
};
|
|
11422
|
+
}
|
|
11423
|
+
} });
|
|
11424
|
+
|
|
11425
|
+
//#endregion
|
|
11426
|
+
//#region ../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/table.js
|
|
11427
|
+
var require_table = __commonJS({ "../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/src/table.js"(exports, module) {
|
|
11428
|
+
const debug = require_debug();
|
|
11429
|
+
const utils = require_utils();
|
|
11430
|
+
const tableLayout = require_layout_manager();
|
|
11431
|
+
var Table$1 = class extends Array {
|
|
11432
|
+
constructor(opts) {
|
|
11433
|
+
super();
|
|
11434
|
+
const options = utils.mergeOptions(opts);
|
|
11435
|
+
Object.defineProperty(this, "options", {
|
|
11436
|
+
value: options,
|
|
11437
|
+
enumerable: options.debug
|
|
11438
|
+
});
|
|
11439
|
+
if (options.debug) {
|
|
11440
|
+
switch (typeof options.debug) {
|
|
11441
|
+
case "boolean":
|
|
11442
|
+
debug.setDebugLevel(debug.WARN);
|
|
11443
|
+
break;
|
|
11444
|
+
case "number":
|
|
11445
|
+
debug.setDebugLevel(options.debug);
|
|
11446
|
+
break;
|
|
11447
|
+
case "string":
|
|
11448
|
+
debug.setDebugLevel(parseInt(options.debug, 10));
|
|
11449
|
+
break;
|
|
11450
|
+
default:
|
|
11451
|
+
debug.setDebugLevel(debug.WARN);
|
|
11452
|
+
debug.warn(`Debug option is expected to be boolean, number, or string. Received a ${typeof options.debug}`);
|
|
11453
|
+
}
|
|
11454
|
+
Object.defineProperty(this, "messages", { get() {
|
|
11455
|
+
return debug.debugMessages();
|
|
11456
|
+
} });
|
|
11457
|
+
}
|
|
11458
|
+
}
|
|
11459
|
+
toString() {
|
|
11460
|
+
let array = this;
|
|
11461
|
+
let headersPresent = this.options.head && this.options.head.length;
|
|
11462
|
+
if (headersPresent) {
|
|
11463
|
+
array = [this.options.head];
|
|
11464
|
+
if (this.length) array.push.apply(array, this);
|
|
11465
|
+
} else this.options.style.head = [];
|
|
11466
|
+
let cells = tableLayout.makeTableLayout(array);
|
|
11467
|
+
cells.forEach(function(row) {
|
|
11468
|
+
row.forEach(function(cell) {
|
|
11469
|
+
cell.mergeTableOptions(this.options, cells);
|
|
11470
|
+
}, this);
|
|
11471
|
+
}, this);
|
|
11472
|
+
tableLayout.computeWidths(this.options.colWidths, cells);
|
|
11473
|
+
tableLayout.computeHeights(this.options.rowHeights, cells);
|
|
11474
|
+
cells.forEach(function(row) {
|
|
11475
|
+
row.forEach(function(cell) {
|
|
11476
|
+
cell.init(this.options);
|
|
11477
|
+
}, this);
|
|
11478
|
+
}, this);
|
|
11479
|
+
let result = [];
|
|
11480
|
+
for (let rowIndex = 0; rowIndex < cells.length; rowIndex++) {
|
|
11481
|
+
let row = cells[rowIndex];
|
|
11482
|
+
let heightOfRow = this.options.rowHeights[rowIndex];
|
|
11483
|
+
if (rowIndex === 0 || !this.options.style.compact || rowIndex == 1 && headersPresent) doDraw(row, "top", result);
|
|
11484
|
+
for (let lineNum = 0; lineNum < heightOfRow; lineNum++) doDraw(row, lineNum, result);
|
|
11485
|
+
if (rowIndex + 1 == cells.length) doDraw(row, "bottom", result);
|
|
11486
|
+
}
|
|
11487
|
+
return result.join("\n");
|
|
11488
|
+
}
|
|
11489
|
+
get width() {
|
|
11490
|
+
let str = this.toString().split("\n");
|
|
11491
|
+
return str[0].length;
|
|
11492
|
+
}
|
|
11493
|
+
};
|
|
11494
|
+
Table$1.reset = () => debug.reset();
|
|
11495
|
+
function doDraw(row, lineNum, result) {
|
|
11496
|
+
let line = [];
|
|
11497
|
+
row.forEach(function(cell) {
|
|
11498
|
+
line.push(cell.draw(lineNum));
|
|
11499
|
+
});
|
|
11500
|
+
let str = line.join("");
|
|
11501
|
+
if (str.length) result.push(str);
|
|
11502
|
+
}
|
|
11503
|
+
module.exports = Table$1;
|
|
11504
|
+
} });
|
|
11505
|
+
|
|
11506
|
+
//#endregion
|
|
11507
|
+
//#region ../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/index.js
|
|
11508
|
+
var require_cli_table3 = __commonJS({ "../../../node_modules/.bun/cli-table3@0.6.5/node_modules/cli-table3/index.js"(exports, module) {
|
|
11509
|
+
module.exports = require_table();
|
|
11510
|
+
} });
|
|
11511
|
+
|
|
11512
|
+
//#endregion
|
|
11513
|
+
//#region src/utils/format.ts
|
|
11514
|
+
var import_cli_table3 = __toESM(require_cli_table3(), 1);
|
|
11515
|
+
/**
|
|
11516
|
+
* Validates a port number string (single or comma-separated).
|
|
11517
|
+
* Valid: "3000", "3000,3001", "80,443,8080"
|
|
11518
|
+
* Invalid: "abc", "99999", "0", "-1", "3000,", ",3000"
|
|
11519
|
+
*
|
|
11520
|
+
* @param ports - Port string to validate
|
|
11521
|
+
* @returns Object with valid flag, parsed ports, and error message
|
|
11522
|
+
*/
|
|
11523
|
+
function validatePorts(ports) {
|
|
11524
|
+
if (!ports || !ports.trim()) return {
|
|
11525
|
+
valid: false,
|
|
11526
|
+
ports: [],
|
|
11527
|
+
error: "Port string is empty"
|
|
11528
|
+
};
|
|
11529
|
+
const parts = ports.split(",").map((p) => p.trim());
|
|
11530
|
+
const parsed = [];
|
|
11531
|
+
for (const part of parts) {
|
|
11532
|
+
if (!/^\d+$/.test(part)) return {
|
|
11533
|
+
valid: false,
|
|
11534
|
+
ports: [],
|
|
11535
|
+
error: `Invalid port "${part}" — must be a number`
|
|
11536
|
+
};
|
|
11537
|
+
const num = parseInt(part, 10);
|
|
11538
|
+
if (num < 1 || num > 65535) return {
|
|
11539
|
+
valid: false,
|
|
11540
|
+
ports: [],
|
|
11541
|
+
error: `Port ${num} out of range (1-65535)`
|
|
11542
|
+
};
|
|
11543
|
+
parsed.push(num);
|
|
11544
|
+
}
|
|
11545
|
+
const dupes = parsed.filter((p, i) => parsed.indexOf(p) !== i);
|
|
11546
|
+
if (dupes.length > 0) return {
|
|
11547
|
+
valid: false,
|
|
11548
|
+
ports: parsed,
|
|
11549
|
+
error: `Duplicate port: ${dupes[0]}`
|
|
11550
|
+
};
|
|
11551
|
+
return {
|
|
11552
|
+
valid: true,
|
|
11553
|
+
ports: parsed
|
|
11554
|
+
};
|
|
11555
|
+
}
|
|
11556
|
+
/**
|
|
11557
|
+
* Validates a .coolify.json state object (single-app format).
|
|
11558
|
+
* Checks required fields, types, and port validity.
|
|
11559
|
+
*
|
|
11560
|
+
* @param state - The parsed JSON object
|
|
11561
|
+
* @returns Object with valid flag, warnings, and errors
|
|
11562
|
+
*/
|
|
11563
|
+
function validateCoolifyState(state) {
|
|
11564
|
+
const errors = [];
|
|
11565
|
+
const warnings = [];
|
|
11566
|
+
const isMultiApp = Array.isArray(state.apps);
|
|
11567
|
+
const isSingleApp = typeof state.appUuid === "string";
|
|
11568
|
+
if (!isMultiApp && !isSingleApp) {
|
|
11569
|
+
errors.push("Invalid format: must have \"appUuid\" (single-app) or \"apps\" array (multi-app)");
|
|
11570
|
+
return {
|
|
11571
|
+
valid: false,
|
|
11572
|
+
errors,
|
|
11573
|
+
warnings
|
|
11574
|
+
};
|
|
11575
|
+
}
|
|
11576
|
+
const commonRequired = [
|
|
11577
|
+
"serverUuid",
|
|
11578
|
+
"projectUuid",
|
|
11579
|
+
"environmentUuid"
|
|
11580
|
+
];
|
|
11581
|
+
for (const field of commonRequired) if (!state[field] || typeof state[field] !== "string") errors.push(`Missing or invalid required field: ${field}`);
|
|
11582
|
+
if (isSingleApp) {
|
|
11583
|
+
if (state.portsExposes && typeof state.portsExposes === "string") {
|
|
11584
|
+
const portResult = validatePorts(state.portsExposes);
|
|
11585
|
+
if (!portResult.valid) warnings.push(`portsExposes: ${portResult.error}`);
|
|
11586
|
+
}
|
|
11587
|
+
if (state.buildPack && typeof state.buildPack === "string") {
|
|
11588
|
+
const validBuildPacks = [
|
|
11589
|
+
"dockerfile",
|
|
11590
|
+
"nixpacks",
|
|
11591
|
+
"static",
|
|
11592
|
+
"dockercompose"
|
|
11593
|
+
];
|
|
11594
|
+
if (!validBuildPacks.includes(state.buildPack)) warnings.push(`Unknown buildPack "${state.buildPack}" — expected: ${validBuildPacks.join(", ")}`);
|
|
11595
|
+
}
|
|
11596
|
+
}
|
|
11597
|
+
if (isMultiApp) {
|
|
11598
|
+
const apps = state.apps;
|
|
11599
|
+
if (apps.length === 0) errors.push("Multi-app format requires at least one app");
|
|
11600
|
+
for (let i = 0; i < apps.length; i++) {
|
|
11601
|
+
const app = apps[i];
|
|
11602
|
+
if (!app.uuid || typeof app.uuid !== "string") errors.push(`apps[${i}]: missing or invalid "uuid"`);
|
|
11603
|
+
if (!app.name || typeof app.name !== "string") errors.push(`apps[${i}]: missing or invalid "name"`);
|
|
11604
|
+
if (!app.service || typeof app.service !== "string") errors.push(`apps[${i}]: missing or invalid "service"`);
|
|
11605
|
+
if (app.port !== void 0) {
|
|
11606
|
+
const port = app.port;
|
|
11607
|
+
if (typeof port !== "number" || port < 1 || port > 65535) warnings.push(`apps[${i}] (${app.name}): invalid port ${port}`);
|
|
11608
|
+
}
|
|
11609
|
+
}
|
|
11610
|
+
const uuids = apps.map((a) => a.uuid).filter(Boolean);
|
|
11611
|
+
const dupeUuids = uuids.filter((u, i) => uuids.indexOf(u) !== i);
|
|
11612
|
+
if (dupeUuids.length > 0) errors.push(`Duplicate app UUIDs: ${dupeUuids.join(", ")}`);
|
|
11613
|
+
}
|
|
11614
|
+
return {
|
|
11615
|
+
valid: errors.length === 0,
|
|
11616
|
+
errors,
|
|
11617
|
+
warnings
|
|
11618
|
+
};
|
|
11619
|
+
}
|
|
11620
|
+
|
|
9584
11621
|
//#endregion
|
|
9585
11622
|
//#region src/cli/coolify-state.ts
|
|
9586
11623
|
const STATE_FILE = ".coolify.json";
|
|
@@ -9620,6 +11657,9 @@ function loadCoolifyState() {
|
|
|
9620
11657
|
return null;
|
|
9621
11658
|
}
|
|
9622
11659
|
if (!state.appUuid) return null;
|
|
11660
|
+
const validation = validateCoolifyState(state);
|
|
11661
|
+
if (!validation.valid) console.error(`Warning: .coolify.json has errors: ${validation.errors.join("; ")}`);
|
|
11662
|
+
if (validation.warnings.length > 0) for (const w of validation.warnings) console.error(`Warning: .coolify.json — ${w}`);
|
|
9623
11663
|
return state;
|
|
9624
11664
|
} catch {
|
|
9625
11665
|
return null;
|