@foxford/cli 1.4.1 → 1.4.3
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/README.mdx +2 -2
- package/fox.cjs +67 -66
- package/fox.cjs.map +1 -1
- package/package.json +3 -3
package/README.mdx
CHANGED
|
@@ -54,9 +54,9 @@ Fox-cli может быть расширен плагинами. Плагин -
|
|
|
54
54
|
"license": "MIT",
|
|
55
55
|
"exports": {
|
|
56
56
|
".": {
|
|
57
|
-
"import": "./dist/index.
|
|
57
|
+
"import": "./dist/index.js",
|
|
58
58
|
"types": "./dist/index.d.ts",
|
|
59
|
-
"default": "./dist/index.
|
|
59
|
+
"default": "./dist/index.cjs"
|
|
60
60
|
}
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
package/fox.cjs
CHANGED
|
@@ -30,10 +30,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
30
30
|
mod
|
|
31
31
|
));
|
|
32
32
|
|
|
33
|
-
// ../../node_modules/.pnpm/tsup@8.5.
|
|
33
|
+
// ../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.18_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js
|
|
34
34
|
var getImportMetaUrl, importMetaUrl;
|
|
35
35
|
var init_cjs_shims = __esm({
|
|
36
|
-
"../../node_modules/.pnpm/tsup@8.5.
|
|
36
|
+
"../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.18_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js"() {
|
|
37
37
|
"use strict";
|
|
38
38
|
getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
|
|
39
39
|
importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
|
|
@@ -875,12 +875,13 @@ var init_versioning = __esm({
|
|
|
875
875
|
});
|
|
876
876
|
|
|
877
877
|
// src/processes/deploy/providers/abstract.provider.ts
|
|
878
|
-
var
|
|
878
|
+
var import_node_fs, import_node_path5, DeployProvider;
|
|
879
879
|
var init_abstract_provider = __esm({
|
|
880
880
|
"src/processes/deploy/providers/abstract.provider.ts"() {
|
|
881
881
|
"use strict";
|
|
882
882
|
init_cjs_shims();
|
|
883
|
-
|
|
883
|
+
import_node_fs = __toESM(require("fs"), 1);
|
|
884
|
+
import_node_path5 = __toESM(require("path"), 1);
|
|
884
885
|
init_logger();
|
|
885
886
|
init_versioning();
|
|
886
887
|
DeployProvider = class {
|
|
@@ -911,12 +912,12 @@ var init_abstract_provider = __esm({
|
|
|
911
912
|
* @returns Распарсенное содержимое файла package.json или null.
|
|
912
913
|
*/
|
|
913
914
|
readPackageJson(pkgPath) {
|
|
914
|
-
const packageJsonPath =
|
|
915
|
-
if (!
|
|
915
|
+
const packageJsonPath = import_node_path5.default.resolve(pkgPath, "package.json");
|
|
916
|
+
if (!import_node_fs.default.existsSync(packageJsonPath)) {
|
|
916
917
|
return null;
|
|
917
918
|
}
|
|
918
919
|
try {
|
|
919
|
-
const packageJsonContent =
|
|
920
|
+
const packageJsonContent = import_node_fs.default.readFileSync(packageJsonPath, "utf-8");
|
|
920
921
|
return JSON.parse(packageJsonContent);
|
|
921
922
|
} catch (error) {
|
|
922
923
|
this.logger.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0447\u0442\u0435\u043D\u0438\u0438 \u0438\u043B\u0438 \u043F\u0430\u0440\u0441\u0438\u043D\u0433\u0435 package.json: ${error.message}`);
|
|
@@ -1007,12 +1008,12 @@ function sleep(ms) {
|
|
|
1007
1008
|
}
|
|
1008
1009
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
1009
1010
|
}
|
|
1010
|
-
var
|
|
1011
|
+
var import_zx2, NpmDeploy;
|
|
1011
1012
|
var init_npm = __esm({
|
|
1012
1013
|
"src/processes/deploy/providers/npm.ts"() {
|
|
1013
1014
|
"use strict";
|
|
1014
1015
|
init_cjs_shims();
|
|
1015
|
-
|
|
1016
|
+
import_zx2 = require("zx");
|
|
1016
1017
|
init_abstract_provider();
|
|
1017
1018
|
init_logger();
|
|
1018
1019
|
init_resolve_workspace_deps();
|
|
@@ -1029,7 +1030,7 @@ var init_npm = __esm({
|
|
|
1029
1030
|
* @returns Промис, который разрешается строкой сообщения об устаревании.
|
|
1030
1031
|
*/
|
|
1031
1032
|
async getDeprecationMessage() {
|
|
1032
|
-
const commitSha = (await
|
|
1033
|
+
const commitSha = (await import_zx2.$`git rev-parse --short HEAD`).toString().trim();
|
|
1033
1034
|
return `deprecated by ${commitSha}`;
|
|
1034
1035
|
}
|
|
1035
1036
|
/**
|
|
@@ -1044,7 +1045,7 @@ var init_npm = __esm({
|
|
|
1044
1045
|
*/
|
|
1045
1046
|
async touchNpmrc() {
|
|
1046
1047
|
const authStr = "//registry.npmjs.org/:_authToken=${NPM_TOKEN}";
|
|
1047
|
-
await
|
|
1048
|
+
await import_zx2.$`echo ${authStr} >> .npmrc`;
|
|
1048
1049
|
}
|
|
1049
1050
|
/**
|
|
1050
1051
|
* Фильтрует устаревшие версии из заданного списка версий пакета.
|
|
@@ -1060,7 +1061,7 @@ var init_npm = __esm({
|
|
|
1060
1061
|
const notDeprecatedVersions = [];
|
|
1061
1062
|
for (const ver of versions) {
|
|
1062
1063
|
const cmd = ["npm", "view", `${pkgName}@${ver}`, "deprecated"];
|
|
1063
|
-
const result = await
|
|
1064
|
+
const result = await import_zx2.$`${cmd}`;
|
|
1064
1065
|
if (!result.toString().trim().includes("deprecated by")) {
|
|
1065
1066
|
notDeprecatedVersions.push(ver);
|
|
1066
1067
|
}
|
|
@@ -1088,7 +1089,7 @@ var init_npm = __esm({
|
|
|
1088
1089
|
logger.info("Getting versions list...");
|
|
1089
1090
|
let outputProcess;
|
|
1090
1091
|
try {
|
|
1091
|
-
outputProcess = await
|
|
1092
|
+
outputProcess = await import_zx2.$`npm view ${pkgName} versions --json`;
|
|
1092
1093
|
} catch (error) {
|
|
1093
1094
|
const errorText = String(error);
|
|
1094
1095
|
if (errorText.includes("E404")) {
|
|
@@ -1154,7 +1155,7 @@ var init_npm = __esm({
|
|
|
1154
1155
|
(item) => item !== ""
|
|
1155
1156
|
);
|
|
1156
1157
|
logger.info("\u041F\u043E\u043C\u0435\u0447\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u043A\u0430\u043A deprecated:", cmd);
|
|
1157
|
-
await
|
|
1158
|
+
await import_zx2.$`${cmd}`;
|
|
1158
1159
|
}
|
|
1159
1160
|
} catch (error) {
|
|
1160
1161
|
logger.error(error);
|
|
@@ -1186,12 +1187,12 @@ var init_npm = __esm({
|
|
|
1186
1187
|
(item) => item !== ""
|
|
1187
1188
|
);
|
|
1188
1189
|
logger.info("\u041F\u043E\u043C\u0435\u0447\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u043A\u0430\u043A deprecated:", deprecate);
|
|
1189
|
-
await
|
|
1190
|
+
await import_zx2.$`${deprecate}`;
|
|
1190
1191
|
const unpublish = ["npm", "unpublish", `${packageJson.name}@${ver}`, "--force", this.dry].filter(
|
|
1191
1192
|
(item) => item !== ""
|
|
1192
1193
|
);
|
|
1193
1194
|
logger.info("\u0420\u0430\u0437\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u044B\u0432\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E:", unpublish);
|
|
1194
|
-
await
|
|
1195
|
+
await import_zx2.$`${unpublish}`;
|
|
1195
1196
|
} catch (error) {
|
|
1196
1197
|
logger.error(error);
|
|
1197
1198
|
continue;
|
|
@@ -1221,8 +1222,8 @@ var init_npm = __esm({
|
|
|
1221
1222
|
async deploy(params) {
|
|
1222
1223
|
logger.info("\u041D\u0430\u0447\u0438\u043D\u0430\u0435\u043C \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0434\u0435\u043F\u043B\u043E\u044F \u0432 NPM", params);
|
|
1223
1224
|
const packageDir = process.cwd();
|
|
1224
|
-
const localDir =
|
|
1225
|
-
if (!
|
|
1225
|
+
const localDir = import_zx2.path.join(packageDir, params.localDir ?? this.buildDir);
|
|
1226
|
+
if (!import_zx2.fs.existsSync(localDir)) {
|
|
1226
1227
|
logger.error(`\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F "${localDir}" \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442`);
|
|
1227
1228
|
process.exit(1);
|
|
1228
1229
|
}
|
|
@@ -1234,9 +1235,9 @@ var init_npm = __esm({
|
|
|
1234
1235
|
if (params.dry === true) this.dry = "--dry-run";
|
|
1235
1236
|
if (params.skipGitChecks) this.noGitChecks = "--no-git-checks";
|
|
1236
1237
|
logger.info("\u041C\u0435\u043D\u044F\u0435\u043C \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044E \u043D\u0430", localDir);
|
|
1237
|
-
(0,
|
|
1238
|
+
(0, import_zx2.cd)(localDir);
|
|
1238
1239
|
logger.info("\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u043C sha \u043A\u043E\u043C\u043C\u0438\u0442\u0430");
|
|
1239
|
-
const commitSha = (await
|
|
1240
|
+
const commitSha = (await import_zx2.$`git rev-parse --short HEAD`).toString().replace("\n", "");
|
|
1240
1241
|
logger.info("\u041A\u043E\u043C\u043C\u0438\u0442:", commitSha);
|
|
1241
1242
|
const target = params.target ?? "beta";
|
|
1242
1243
|
logger.info("\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F:", target);
|
|
@@ -1265,7 +1266,7 @@ var init_npm = __esm({
|
|
|
1265
1266
|
);
|
|
1266
1267
|
process.exit(1);
|
|
1267
1268
|
}
|
|
1268
|
-
const workspaceRoot = (await
|
|
1269
|
+
const workspaceRoot = (await import_zx2.$`git rev-parse --show-toplevel`).toString().trim();
|
|
1269
1270
|
const affectedPackages = params.affected ? params.affected.split(",").map((s) => s.trim()) : void 0;
|
|
1270
1271
|
await resolveWorkspaceAndCatalogDeps(packageJson, {
|
|
1271
1272
|
affected: affectedPackages,
|
|
@@ -1277,7 +1278,7 @@ var init_npm = __esm({
|
|
|
1277
1278
|
logger.info("Workspace/catalog \u0437\u0430\u0432\u0438\u0441\u0438\u043C\u043E\u0441\u0442\u0438 \u0437\u0430\u0440\u0435\u0437\u043E\u043B\u0432\u043B\u0435\u043D\u044B", packageJson);
|
|
1278
1279
|
}
|
|
1279
1280
|
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", packageJson);
|
|
1280
|
-
await
|
|
1281
|
+
await import_zx2.fs.writeJson("package.json", packageJson, {
|
|
1281
1282
|
spaces: 2
|
|
1282
1283
|
});
|
|
1283
1284
|
const cmd = [
|
|
@@ -1289,7 +1290,7 @@ var init_npm = __esm({
|
|
|
1289
1290
|
this.noGitChecks
|
|
1290
1291
|
].filter((item) => item !== "");
|
|
1291
1292
|
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C \u0441 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u0430\u043C\u0438:", cmd);
|
|
1292
|
-
await
|
|
1293
|
+
await import_zx2.$`${cmd}`;
|
|
1293
1294
|
if (target === "beta") {
|
|
1294
1295
|
await this.deprecatePrevBetaVersions(packageJson);
|
|
1295
1296
|
} else {
|
|
@@ -1301,12 +1302,12 @@ var init_npm = __esm({
|
|
|
1301
1302
|
});
|
|
1302
1303
|
|
|
1303
1304
|
// src/processes/deploy/providers/s3.ts
|
|
1304
|
-
var
|
|
1305
|
+
var import_zx3, S3Deploy;
|
|
1305
1306
|
var init_s3 = __esm({
|
|
1306
1307
|
"src/processes/deploy/providers/s3.ts"() {
|
|
1307
1308
|
"use strict";
|
|
1308
1309
|
init_cjs_shims();
|
|
1309
|
-
|
|
1310
|
+
import_zx3 = require("zx");
|
|
1310
1311
|
init_abstract_provider();
|
|
1311
1312
|
init_logger();
|
|
1312
1313
|
S3Deploy = class extends DeployProvider {
|
|
@@ -1330,7 +1331,7 @@ var init_s3 = __esm({
|
|
|
1330
1331
|
* @returns Путь для цели развертывания.
|
|
1331
1332
|
*/
|
|
1332
1333
|
getRemotePath(...segments) {
|
|
1333
|
-
return segments.filter(Boolean).join(
|
|
1334
|
+
return segments.filter(Boolean).join(import_zx3.path.posix.sep).replace(/[/\\]+/g, import_zx3.path.posix.sep).replace(/^\//, "");
|
|
1334
1335
|
}
|
|
1335
1336
|
/**
|
|
1336
1337
|
* Выполняет команду rclone copy.
|
|
@@ -1352,7 +1353,7 @@ var init_s3 = __esm({
|
|
|
1352
1353
|
cmd.push(...flags);
|
|
1353
1354
|
}
|
|
1354
1355
|
logger.info("\u0417\u0430\u043F\u0443\u0441\u043A \u0434\u0435\u043F\u043B\u043E\u044F:", cmd);
|
|
1355
|
-
await
|
|
1356
|
+
await import_zx3.$`${cmd}`;
|
|
1356
1357
|
logger.info("\u0414\u0435\u043F\u043B\u043E\u0439 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D:", cmd);
|
|
1357
1358
|
}
|
|
1358
1359
|
/**
|
|
@@ -1407,8 +1408,8 @@ var init_s3 = __esm({
|
|
|
1407
1408
|
}
|
|
1408
1409
|
process.exit(1);
|
|
1409
1410
|
}
|
|
1410
|
-
const localDir =
|
|
1411
|
-
if (!
|
|
1411
|
+
const localDir = import_zx3.path.join(process.cwd(), params.localDir ?? this.buildDir);
|
|
1412
|
+
if (!import_zx3.fs.existsSync(localDir)) {
|
|
1412
1413
|
logger.error(`\u0414\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F "${localDir}" \u043D\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442`);
|
|
1413
1414
|
process.exit(1);
|
|
1414
1415
|
}
|
|
@@ -1421,7 +1422,7 @@ var init_s3 = __esm({
|
|
|
1421
1422
|
const packageJson = this.readPackageJson(localDir);
|
|
1422
1423
|
const remoteDirs = [];
|
|
1423
1424
|
if (packageJson) {
|
|
1424
|
-
const commitSha = (await
|
|
1425
|
+
const commitSha = (await import_zx3.$`git rev-parse --short HEAD`).toString().replace("\n", "");
|
|
1425
1426
|
logger.info("\u041A\u043E\u043C\u043C\u0438\u0442:", commitSha);
|
|
1426
1427
|
if (params.packageName) {
|
|
1427
1428
|
packageJson.name = params.packageName;
|
|
@@ -1441,7 +1442,7 @@ var init_s3 = __esm({
|
|
|
1441
1442
|
packageJson.scripts = {};
|
|
1442
1443
|
}
|
|
1443
1444
|
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", packageJson);
|
|
1444
|
-
await
|
|
1445
|
+
await import_zx3.fs.writeJson(import_zx3.path.resolve(localDir, "package.json"), packageJson, {
|
|
1445
1446
|
spaces: 2
|
|
1446
1447
|
});
|
|
1447
1448
|
remoteDirs.push(
|
|
@@ -1455,12 +1456,12 @@ var init_s3 = __esm({
|
|
|
1455
1456
|
}
|
|
1456
1457
|
}
|
|
1457
1458
|
logger.info("\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438:", remoteDirs);
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
1461
|
-
|
|
1462
|
-
|
|
1463
|
-
|
|
1459
|
+
import_zx3.$.env.RCLONE_CONFIG_MYREMOTE_TYPE = "s3";
|
|
1460
|
+
import_zx3.$.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = "Other";
|
|
1461
|
+
import_zx3.$.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = accessKey;
|
|
1462
|
+
import_zx3.$.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = secretKey;
|
|
1463
|
+
import_zx3.$.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? "s3.ru-1.storage.selcloud.ru";
|
|
1464
|
+
import_zx3.$.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? "ru-1";
|
|
1464
1465
|
const execFlags = ["--progress"];
|
|
1465
1466
|
if (params.verbose) execFlags.push("-vv");
|
|
1466
1467
|
if (params.dry) {
|
|
@@ -1527,7 +1528,7 @@ var init_command2 = __esm({
|
|
|
1527
1528
|
const localDirOption = new import_commander3.Option("--local-dir <path>", "\u0418\u0437 \u043A\u0430\u043A\u043E\u0439 \u043B\u043E\u043A\u0430\u043B\u044C\u043D\u043E\u0439 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u0441\u043E\u0434\u0435\u0440\u0436\u0438\u043C\u043E\u0435");
|
|
1528
1529
|
const dryOption = new import_commander3.Option("--dry", "\u0417\u0430\u043F\u0443\u0441\u043A \u0431\u0435\u0437 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043E\u043F\u0435\u0440\u0430\u0446\u0438\u0438").default(false);
|
|
1529
1530
|
const verboseOption = new import_commander3.Option("--verbose", "\u0412\u044B\u0432\u043E\u0434 \u0434\u0435\u0431\u0430\u0433 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438").default(false);
|
|
1530
|
-
const s3Command = new import_commander3.Command("s3").description("\u0414\u0435\u043F\u043B\u043E\u0439 \u043F\u0430\u043A\u0435\u0442\u0430 \u043F\u043E s3 \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435").option("--bucket <name>", "\u0412 \u043A\u0430\u043A\u043E\u0439 \u0431\u0430\u043A\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442").option("--package-name <name>", "\u0418\u043C\u044F \u043F\u0430\u043A\u0435\u0442\u0430 \u0432\u043C\u0435\u0441\u0442\u043E packageJson.name").option("--remote-dir <dir>", "\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435").option("--region <name>", "\u0420\u0435\u0433\u0438\u043E\u043D S3").option("--endpoint <url>", "Endpoint S3").action(async (params) => {
|
|
1531
|
+
const s3Command = new import_commander3.Command("s3").description("\u0414\u0435\u043F\u043B\u043E\u0439 \u043F\u0430\u043A\u0435\u0442\u0430 \u043F\u043E s3 \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435").option("--bucket <name>", "\u0412 \u043A\u0430\u043A\u043E\u0439 \u0431\u0430\u043A\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442").option("--package-name <name>", "\u0418\u043C\u044F \u043F\u0430\u043A\u0435\u0442\u0430 \u0432\u043C\u0435\u0441\u0442\u043E packageJson.name").option("--remote-dir <dir>", "\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044F \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435").option("--access-key <key>", "\u0422\u043E\u043A\u0435\u043D \u0434\u043E\u0441\u0442\u0443\u043F\u0430").option("--secret-key <secret>", "\u0421\u0435\u043A\u0440\u0435\u0442\u043D\u044B\u0439 \u0442\u043E\u043A\u0435\u043D").option("--region <name>", "\u0420\u0435\u0433\u0438\u043E\u043D S3").option("--endpoint <url>", "Endpoint S3").action(async (params) => {
|
|
1531
1532
|
await this.action.handle({ ...params, provider: "s3" });
|
|
1532
1533
|
});
|
|
1533
1534
|
s3Command.addOption(targetOption);
|
|
@@ -1575,7 +1576,7 @@ var init_deploy = __esm({
|
|
|
1575
1576
|
});
|
|
1576
1577
|
|
|
1577
1578
|
// src/processes/info/action.ts
|
|
1578
|
-
var import_os, import_chalk8, import_filesize, import_systeminformation,
|
|
1579
|
+
var import_os, import_chalk8, import_filesize, import_systeminformation, import_zx4, InfoAction;
|
|
1579
1580
|
var init_action3 = __esm({
|
|
1580
1581
|
"src/processes/info/action.ts"() {
|
|
1581
1582
|
"use strict";
|
|
@@ -1584,7 +1585,7 @@ var init_action3 = __esm({
|
|
|
1584
1585
|
import_chalk8 = __toESM(require("chalk"), 1);
|
|
1585
1586
|
import_filesize = require("filesize");
|
|
1586
1587
|
import_systeminformation = require("systeminformation");
|
|
1587
|
-
|
|
1588
|
+
import_zx4 = require("zx");
|
|
1588
1589
|
init_ui();
|
|
1589
1590
|
init_program2();
|
|
1590
1591
|
InfoAction = class extends AbstractAction {
|
|
@@ -1600,7 +1601,7 @@ var init_action3 = __esm({
|
|
|
1600
1601
|
console.info(import_chalk8.default.green("[System Information]"));
|
|
1601
1602
|
console.info("OS Version :", import_chalk8.default.blue(osName.default((0, import_os.platform)(), (0, import_os.release)())));
|
|
1602
1603
|
console.info("NodeJS Version :", import_chalk8.default.blue(process.version));
|
|
1603
|
-
const where = await
|
|
1604
|
+
const where = await import_zx4.$`which node`;
|
|
1604
1605
|
console.info("NodeJS path :", where.toString());
|
|
1605
1606
|
console.info("NODE_OPTIONS :", import_chalk8.default.blue(process.env.NODE_OPTIONS));
|
|
1606
1607
|
if (where.toString().includes("nvm")) {
|
|
@@ -1667,13 +1668,13 @@ var init_info = __esm({
|
|
|
1667
1668
|
});
|
|
1668
1669
|
|
|
1669
1670
|
// src/processes/optimize/action.ts
|
|
1670
|
-
var import_fs2,
|
|
1671
|
+
var import_fs2, import_node_path6, import_chalk9, import_cli_progress, import_cli_table32, import_filesize2, import_glob, OptimizeAction;
|
|
1671
1672
|
var init_action4 = __esm({
|
|
1672
1673
|
"src/processes/optimize/action.ts"() {
|
|
1673
1674
|
"use strict";
|
|
1674
1675
|
init_cjs_shims();
|
|
1675
1676
|
import_fs2 = __toESM(require("fs"), 1);
|
|
1676
|
-
|
|
1677
|
+
import_node_path6 = __toESM(require("path"), 1);
|
|
1677
1678
|
import_chalk9 = __toESM(require("chalk"), 1);
|
|
1678
1679
|
import_cli_progress = require("cli-progress");
|
|
1679
1680
|
import_cli_table32 = __toESM(require("cli-table3"), 1);
|
|
@@ -1716,7 +1717,7 @@ var init_action4 = __esm({
|
|
|
1716
1717
|
};
|
|
1717
1718
|
}
|
|
1718
1719
|
async handle(options, extraFlags = []) {
|
|
1719
|
-
const resources = await (0, import_glob.glob)(
|
|
1720
|
+
const resources = await (0, import_glob.glob)(import_node_path6.default.join(process.cwd(), options.filePath), { ignore: "node_modules/**" });
|
|
1720
1721
|
console.log(import_chalk9.default.white(`\u041D\u0430\u0439\u0434\u0435\u043D\u043E ${import_chalk9.default.green(resources.length)} \u0440\u0435\u0441\u0443\u0440\u0441\u043E\u0432 \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438`));
|
|
1721
1722
|
console.log(
|
|
1722
1723
|
import_chalk9.default.yellowBright(`\u0415\u0441\u043B\u0438 \u0432\u044B \u0445\u043E\u0442\u0438\u0442\u0435 \u0443\u0432\u0438\u0434\u0435\u0442\u044C \u0441\u043F\u0438\u0441\u043E\u043A \u0440\u0435\u0441\u0443\u0440\u0441\u043E\u0432, \u0432\u043E\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435\u0441\u044C \u043E\u043F\u0446\u0438\u0435\u0439 ${import_chalk9.default.green("--list")}`)
|
|
@@ -1750,7 +1751,7 @@ var init_action4 = __esm({
|
|
|
1750
1751
|
};
|
|
1751
1752
|
const { mime } = fileType;
|
|
1752
1753
|
let runner;
|
|
1753
|
-
const outputPath = options.replace ? resource :
|
|
1754
|
+
const outputPath = options.replace ? resource : import_node_path6.default.join(import_node_path6.default.dirname(resource), `${options.prefix ?? ""}${import_node_path6.default.basename(resource)}`);
|
|
1754
1755
|
switch (mime) {
|
|
1755
1756
|
case "image/png":
|
|
1756
1757
|
case "image/jpeg":
|
|
@@ -1886,7 +1887,7 @@ var import_chalk12 = __toESM(require("chalk"), 1);
|
|
|
1886
1887
|
// package.json
|
|
1887
1888
|
var package_default = {
|
|
1888
1889
|
name: "@foxford/cli",
|
|
1889
|
-
version: "1.4.
|
|
1890
|
+
version: "1.4.3",
|
|
1890
1891
|
description: "Foxford Cli",
|
|
1891
1892
|
keywords: [
|
|
1892
1893
|
"foxford",
|
|
@@ -1905,7 +1906,7 @@ var package_default = {
|
|
|
1905
1906
|
{
|
|
1906
1907
|
name: "Roman Olin",
|
|
1907
1908
|
email: "r.v.olin@foxford.ru",
|
|
1908
|
-
team: "
|
|
1909
|
+
team: "core-frontend"
|
|
1909
1910
|
}
|
|
1910
1911
|
],
|
|
1911
1912
|
main: "./README.mdx",
|
|
@@ -1927,7 +1928,7 @@ var package_default = {
|
|
|
1927
1928
|
postbuild: "pnpm run build-dts",
|
|
1928
1929
|
"build-dts": "dts-bundle-generator -o build/fox.d.ts src/types/index.ts --no-banner --external-inlines=commander loglevel --sort --inline-declare-externals",
|
|
1929
1930
|
"============================ DEPLOY =============================": "",
|
|
1930
|
-
deploy: "fox deploy npm",
|
|
1931
|
+
deploy: "fox deploy npm --skip-git-checks",
|
|
1931
1932
|
"============================ LINT =============================": "",
|
|
1932
1933
|
"lint:clean": "rm -f .eslintcache",
|
|
1933
1934
|
"lint:type-check": "tsc --noEmit --pretty",
|
|
@@ -1984,10 +1985,10 @@ init_program2();
|
|
|
1984
1985
|
|
|
1985
1986
|
// src/program/loader.ts
|
|
1986
1987
|
init_cjs_shims();
|
|
1987
|
-
var
|
|
1988
|
+
var import_node_fs2 = require("fs");
|
|
1988
1989
|
var import_promises = require("fs/promises");
|
|
1989
1990
|
var import_node_module2 = require("module");
|
|
1990
|
-
var
|
|
1991
|
+
var import_node_path7 = __toESM(require("path"), 1);
|
|
1991
1992
|
var import_node_url2 = require("url");
|
|
1992
1993
|
var import_chalk11 = __toESM(require("chalk"), 1);
|
|
1993
1994
|
var import_fs_extra3 = require("fs-extra");
|
|
@@ -1995,7 +1996,7 @@ init_ui();
|
|
|
1995
1996
|
init_logger();
|
|
1996
1997
|
var log2 = logger.getLogger("command-loader");
|
|
1997
1998
|
var require3 = (0, import_node_module2.createRequire)(importMetaUrl);
|
|
1998
|
-
var __dirname2 =
|
|
1999
|
+
var __dirname2 = import_node_path7.default.dirname((0, import_node_url2.fileURLToPath)(importMetaUrl));
|
|
1999
2000
|
var _CommandLoader = class _CommandLoader {
|
|
2000
2001
|
static async load(program) {
|
|
2001
2002
|
if (true) {
|
|
@@ -2041,7 +2042,7 @@ var _CommandLoader = class _CommandLoader {
|
|
|
2041
2042
|
for (const processName of processes) {
|
|
2042
2043
|
try {
|
|
2043
2044
|
log2.debug(`\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u044C: ${import_chalk11.default.cyan(processName)}`);
|
|
2044
|
-
const modulePath =
|
|
2045
|
+
const modulePath = import_node_path7.default.join(_CommandLoader.PROCESSES_DIR, processName);
|
|
2045
2046
|
const module2 = require3(modulePath);
|
|
2046
2047
|
module2.default(program);
|
|
2047
2048
|
} catch (err) {
|
|
@@ -2085,31 +2086,31 @@ var _CommandLoader = class _CommandLoader {
|
|
|
2085
2086
|
const plugins = await program.getPluginPaths();
|
|
2086
2087
|
for (const plugin of plugins) {
|
|
2087
2088
|
log2.debug(`\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u044C: ${import_chalk11.default.cyan(plugin.pkgJson.name)}`);
|
|
2088
|
-
const dirname =
|
|
2089
|
+
const dirname = import_node_path7.default.dirname(plugin.path);
|
|
2089
2090
|
if (false) {
|
|
2090
2091
|
const module2 = require3(`${plugin.pkgJson.name}`);
|
|
2091
2092
|
module2.default(program);
|
|
2092
2093
|
continue;
|
|
2093
2094
|
}
|
|
2094
|
-
let targetPath =
|
|
2095
|
-
if ((0,
|
|
2096
|
-
targetPath =
|
|
2095
|
+
let targetPath = import_node_path7.default.resolve(dirname);
|
|
2096
|
+
if ((0, import_node_fs2.existsSync)(import_node_path7.default.resolve(targetPath, "build"))) {
|
|
2097
|
+
targetPath = import_node_path7.default.resolve(targetPath, "build");
|
|
2097
2098
|
}
|
|
2098
|
-
if ((0,
|
|
2099
|
-
const packageJson = require3(
|
|
2099
|
+
if ((0, import_node_fs2.existsSync)(import_node_path7.default.join(targetPath, "package.json"))) {
|
|
2100
|
+
const packageJson = require3(import_node_path7.default.join(targetPath, "package.json"));
|
|
2100
2101
|
try {
|
|
2101
2102
|
const require4 = (0, import_node_module2.createRequire)(__filename);
|
|
2102
2103
|
let module2;
|
|
2103
2104
|
const modulePath = this.getModulePath(packageJson);
|
|
2104
2105
|
if (packageJson.type === "module") {
|
|
2105
|
-
module2 = await import(
|
|
2106
|
+
module2 = await import(import_node_path7.default.join(targetPath, modulePath));
|
|
2106
2107
|
} else {
|
|
2107
|
-
module2 = require4(
|
|
2108
|
+
module2 = require4(import_node_path7.default.join(targetPath, modulePath));
|
|
2108
2109
|
}
|
|
2109
2110
|
if (typeof module2.default === "function") {
|
|
2110
|
-
module2.default(program);
|
|
2111
|
+
await module2.default(program);
|
|
2111
2112
|
} else if (typeof module2 === "function") {
|
|
2112
|
-
module2(program);
|
|
2113
|
+
await module2(program);
|
|
2113
2114
|
} else {
|
|
2114
2115
|
log2.warn(`\u041C\u043E\u0434\u0443\u043B\u044C "${plugin.pkgJson.name}" \u043D\u0435 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0444\u0443\u043D\u043A\u0446\u0438\u044E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E`);
|
|
2115
2116
|
}
|
|
@@ -2122,10 +2123,10 @@ var _CommandLoader = class _CommandLoader {
|
|
|
2122
2123
|
static async getProcesses(processesPath) {
|
|
2123
2124
|
const files = await (0, import_promises.readdir)(processesPath);
|
|
2124
2125
|
return files.filter((file) => {
|
|
2125
|
-
const filePath =
|
|
2126
|
-
const stat = (0,
|
|
2126
|
+
const filePath = import_node_path7.default.join(processesPath, file, "index.ts");
|
|
2127
|
+
const stat = (0, import_node_fs2.statSync)(filePath);
|
|
2127
2128
|
return stat.isFile();
|
|
2128
|
-
}).map((file) =>
|
|
2129
|
+
}).map((file) => import_node_path7.default.parse(file).name);
|
|
2129
2130
|
}
|
|
2130
2131
|
static handleInvalidCommand(program) {
|
|
2131
2132
|
program.on("command:*", () => {
|
|
@@ -2137,7 +2138,7 @@ ${ERROR_PREFIX} \u041D\u0435\u0432\u0435\u0440\u043D\u0430\u044F \u043A\u043E\u0
|
|
|
2137
2138
|
});
|
|
2138
2139
|
}
|
|
2139
2140
|
};
|
|
2140
|
-
_CommandLoader.PROCESSES_DIR =
|
|
2141
|
+
_CommandLoader.PROCESSES_DIR = import_node_path7.default.resolve(__dirname2, "..", "processes");
|
|
2141
2142
|
var CommandLoader = _CommandLoader;
|
|
2142
2143
|
|
|
2143
2144
|
// src/bin/fox.ts
|
package/fox.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js","../src/logger/index.ts","../src/program/abstract.action.ts","../src/program/abstract.command.ts","../src/lib/runners/runner.ts","../src/lib/runners/ffmpeg.runner.ts","../src/lib/runners/shell.runner.ts","../src/lib/runners/node.runner.ts","../src/lib/runners/npm.runner.ts","../src/lib/runners/pnpm.runner.ts","../src/helpers/env.ts","../src/helpers/logger.ts","../src/lib/runners/script.runner.ts","../src/lib/runners/tinypng.runner.ts","../src/lib/runners/runner.factory.ts","../src/lib/runners/index.ts","../src/program/program.ts","../src/program/index.ts","../src/lib/ui/banner.ts","../src/lib/ui/prefixes.ts","../src/lib/ui/index.ts","../src/processes/codemod/action.ts","../src/lib/collection/collection.ts","../src/lib/collection/abstract.collection.ts","../src/lib/utils/formatting.ts","../src/lib/collection/fox-codemod.collection.ts","../src/lib/collection/collection.factory.ts","../src/lib/collection/index.ts","../src/processes/codemod/command.ts","../src/processes/codemod/index.ts","../src/utils/versioning.ts","../src/processes/deploy/providers/abstract.provider.ts","../src/processes/deploy/utils/resolve-workspace-deps.ts","../src/processes/deploy/providers/npm.ts","../src/processes/deploy/providers/s3.ts","../src/processes/deploy/action.ts","../src/processes/deploy/command.ts","../src/processes/deploy/index.ts","../src/processes/info/action.ts","../src/processes/info/command.ts","../src/processes/info/index.ts","../src/processes/optimize/action.ts","../src/processes/optimize/command.ts","../src/processes/optimize/index.ts","../src/bin/fox.ts","../package.json","../src/program/loader.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { log } from '@foxford/logger'\n\nimport type { HierarchicalLogger } from '@foxford/logger'\n\nconst logger: HierarchicalLogger = log.getLogger('cli')\nlogger.setLevel('info')\n\nexport { logger }\n","import type * as FoxfordTools from '../types'\n\nexport abstract class AbstractAction<Options = FoxfordTools.ProcessInput[]> {\n constructor(protected program: FoxfordTools.Program) {}\n public abstract handle(options?: Options, params?: string[]): Promise<void>\n}\n","import type { AbstractAction } from './abstract.action'\nimport type * as FoxfordTools from '../types'\n\nexport abstract class AbstractCommand<Options = unknown> {\n constructor(protected action: AbstractAction<Options>) {}\n\n public abstract id: string\n\n public abstract load(program: FoxfordTools.Program): Promise<void> | void\n}\n","export enum Runner {\n NPM = 'NPM',\n PNPM = 'PNPM',\n FFMPEG = 'FFMPEG',\n TINYPNG = 'TINYPNG',\n NODE = 'NODE',\n PACKAGE_JSON_SCRIPT = 'PACKAGE_JSON_SCRIPT',\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport ffmpeg from 'fluent-ffmpeg'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class FFMpegRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n public async run(payload: RunnerPayload): Promise<string | null> {\n return new Promise<null | string>((resolve, reject) => {\n ffmpeg(payload.resource)\n .output(payload.output ?? path.basename(payload.resource))\n .outputOptions([\n '-hide_banner',\n '-movflags +faststart',\n '-pix_fmt yuv420p',\n '-c:v libx264',\n '-preset:v veryslow',\n '-profile:v high',\n '-level 3.1',\n '-tune:v ssim',\n '-r 30',\n '-g 180',\n '-keyint_min 180',\n '-sc_threshold 0',\n '-max_muxing_queue_size 1024',\n // '-vf scale=1920:-1',\n '-f mp4',\n ...(payload.extraFlags ?? []),\n ])\n .on('end', function () {\n resolve(payload.resource)\n })\n .on('error', function (err) {\n console.log()\n console.log(chalk.redBright('Cannot process video: ' + err.message))\n reject(err)\n })\n .run()\n })\n }\n}\n","import { spawn, execSync } from 'child_process'\n\nimport chalk from 'chalk'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type { ChildProcess, SpawnOptions, ExecSyncOptionsWithStringEncoding } from 'child_process'\n\nexport class ShellRunner {\n protected binary: string\n protected options: RunnerOptions\n\n constructor(binary: string, options?: RunnerOptions) {\n this.binary = binary\n this.options = options ?? { cwd: process.cwd() }\n }\n\n public async run(\n command: string,\n args: string[] = [],\n options: SpawnOptions = {},\n collect = false\n ): Promise<unknown> {\n const spawnOptions: SpawnOptions = {\n cwd: this.options.cwd,\n shell: true,\n stdio: collect ? 'pipe' : 'inherit',\n ...options,\n }\n return new Promise((resolve, reject) => {\n const child: ChildProcess = spawn(`${this.binary}`, [command, ...args], spawnOptions)\n if (collect && child.stdout) {\n child.stdout.on('data', (data) => resolve(data.toString().replace(/\\r\\n|\\n/, '')))\n }\n child.on('close', (code) => {\n if (code === 0) {\n resolve(child.stdout)\n } else {\n console.error(chalk.red(`\\n Не удалось выполнить команду: ${this.binary} ${command} ${args} `))\n reject(code)\n }\n })\n })\n }\n\n public runSync(command: string): string {\n const spawnOptions: ExecSyncOptionsWithStringEncoding = {\n cwd: this.options.cwd,\n encoding: 'utf-8',\n }\n return execSync(`${this.binary} ${command}`, spawnOptions)\n }\n\n /**\n * @param command\n * @returns The entire command that will be ran when calling `run(command)`.\n */\n public rawFullCommand(command: string): string {\n const commandArgs: string[] = [command]\n return `${this.binary} ${commandArgs.join(' ')}`\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NodeRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('node', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('npm', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class PnpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('pnpm', options)\n }\n}\n","import path from 'node:path'\n\nimport { config as dotenvConfig } from 'dotenv'\nimport { expand as dotenvExpand } from 'dotenv-expand'\nimport fs from 'fs-extra'\n\ntype Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T\n\nfunction truthy<T>(value: T): value is Truthy<T> {\n return !!value\n}\n\nexport function loadEnv(pkgPath: string) {\n const dotenvFiles = [\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}.local`),\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}`),\n Boolean(process.env.NODE_ENV) === false && path.join(pkgPath, `.env.development`),\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n process.env.NODE_ENV !== 'test' && path.join(pkgPath, `.env.local`),\n path.join(pkgPath, '.env'),\n ].filter(truthy)\n\n dotenvFiles.forEach((dotenvFile) => {\n if (fs.existsSync(dotenvFile)) {\n dotenvExpand(\n dotenvConfig({\n path: dotenvFile,\n })\n )\n }\n })\n\n return dotenvFiles\n}\n","import type { Chalk } from 'chalk'\n\nexport const label = (chalk: Chalk, label: string) => chalk.black(` ${label} `)\n","import chalk from 'chalk'\n\nimport { PnpmRunner } from './pnpm.runner'\nimport { loadEnv } from '../../helpers/env'\nimport { label } from '../../helpers/logger'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type * as FoxfordTools from '../../types'\n\nconst getLabel = (pkgName: string) => {\n return label(chalk.bgGreen, pkgName) + chalk.white(' ')\n}\n\nconst getFailLabel = (pkgName: string) => {\n return label(chalk.bgRed, pkgName) + chalk.white(' ')\n}\n\ninterface RunnerPayload {\n pkg: FoxfordTools.Package\n}\n\nexport class ScriptRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n async run(script: string, { pkg }: RunnerPayload) {\n const label = getLabel(pkg.localName.toUpperCase())\n const failLabel = getFailLabel(pkg.localName.toUpperCase())\n console.log(label + chalk.blue(`Start ${chalk.white.underline(script)} process`))\n if (this.options.verbose) {\n console.log(label + chalk.blue(`Print typescript config`))\n console.log()\n }\n console.log(\n label + chalk.blue(`Env ${chalk.magenta('process.env.NODE_ENV')} is ${chalk.yellow(process.env.NODE_ENV)}`)\n )\n console.log(\n label +\n chalk.blue(`Env ${chalk.magenta('process.env.NODE_OPTIONS')} is ${chalk.yellow(process.env.NODE_OPTIONS)}`)\n )\n try {\n console.log(label + chalk.blue(`Load .env files`))\n const envFiles = loadEnv(pkg.path)\n console.log(JSON.stringify(envFiles, null, 2))\n } catch (err) {\n if (err instanceof Error) {\n console.log(failLabel + chalk.red(err.message))\n process.exit(1)\n }\n }\n\n const pnpmRunner = new PnpmRunner()\n\n pnpmRunner.run('run', [`--filter ${pkg.localName}`, script], {\n cwd: pkg.path,\n env: Object.assign(process.env, { FORCE_COLOR: '1' }),\n })\n }\n}\n","import chalk from 'chalk'\nimport tinify from 'tinify'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface TinyPngRunnerOptions extends RunnerOptions {\n token?: string\n}\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class TinyPngRunner {\n options: TinyPngRunnerOptions\n\n constructor(options?: TinyPngRunnerOptions) {\n this.options = options ?? ({} as TinyPngRunnerOptions)\n\n if (!options?.token) throw new Error('You must specify process.env.TINIFY_API_KEY env variable with tinify key')\n }\n\n public async run(payload: RunnerPayload): Promise<null | string> {\n const source = tinify.fromFile(payload.resource)\n tinify.key = this.options?.token ?? ''\n\n try {\n await source.toFile(payload.output ?? payload.resource)\n } catch (err) {\n if (err instanceof Error) console.log(chalk.redBright('Cannot compress resource with tinify: ' + err.message))\n }\n\n return payload.resource\n }\n\n public runSync(): string {\n throw new TypeError('this method not implemented')\n }\n}\n","import { FFMpegRunner } from './ffmpeg.runner'\nimport { NodeRunner } from './node.runner'\nimport { NpmRunner } from './npm.runner'\nimport { PnpmRunner } from './pnpm.runner'\nimport { Runner } from './runner'\nimport { ScriptRunner } from './script.runner'\nimport { TinyPngRunner } from './tinypng.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nconst RunnerMap = {\n [Runner.NPM]: NpmRunner,\n [Runner.PNPM]: PnpmRunner,\n [Runner.NODE]: NodeRunner,\n [Runner.PACKAGE_JSON_SCRIPT]: ScriptRunner,\n [Runner.FFMPEG]: FFMpegRunner,\n [Runner.TINYPNG]: TinyPngRunner,\n}\n\ntype RunnerTypeMap = typeof RunnerMap\n\nexport class RunnerFactory {\n public static create<R extends Runner>(\n runner: R,\n options?: ConstructorParameters<RunnerTypeMap[R]>[0]\n ): InstanceType<RunnerTypeMap[R]> {\n const RunnerClass = RunnerMap[runner]\n\n if (!RunnerClass) {\n throw new Error(`Unknown runner ${runner}`)\n }\n\n return new RunnerClass(options as RunnerOptions) as InstanceType<RunnerTypeMap[R]>\n }\n}\n","export * from './runner'\nexport * from './runner.factory'\nexport type * from './abstract.runner'\n","import { existsSync } from 'fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command } from 'commander'\nimport { config as dotenvConfig } from 'dotenv'\nimport { $, fs } from 'zx'\n\nimport { Runner, RunnerFactory } from '../lib/runners/index'\nimport { logger } from '../logger'\n\nimport type { AbstractCommand } from './abstract.command'\nimport type * as FoxfordTools from '../types'\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class Program extends Command implements FoxfordTools.Program {\n packageManager: string\n rootPath: string\n logger = logger\n private commandList: Array<AbstractCommand> = []\n\n constructor(packageManager: string, rootPath: string) {\n super()\n\n $.verbose = false\n\n const dotenvFiles = [\n path.resolve('./.env.local'),\n path.resolve('./.env'),\n path.resolve(__dirname, '../.env.local'),\n path.resolve(__dirname, '../.env'),\n ]\n\n dotenvFiles.forEach((dotenvFile) => {\n if (existsSync(dotenvFile)) {\n dotenvConfig({\n path: dotenvFile,\n })\n }\n })\n\n this.packageManager = packageManager\n this.rootPath = rootPath\n }\n\n static async init(): Promise<Program> {\n const detector = await import('package-manager-detector')\n\n let packageManager: string = 'npm'\n let rootPath: string = process.cwd()\n\n const detectResult = await detector.detect({\n strategies: ['packageManager-field', 'devEngines-field', 'lockfile', 'install-metadata'],\n })\n\n if (detectResult) {\n packageManager = detectResult.name\n logger.info(`Определен менеджер пакетов: \"${packageManager}\"`)\n } else {\n logger.warn(`Невозможно определить менеджер пакетов. Дефолт: \"${packageManager}\"`)\n }\n\n if (packageManager === 'npm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.NPM).runSync('root'))\n } else if (packageManager === 'pnpm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.PNPM).runSync('root'))\n }\n\n return new Program(packageManager, rootPath)\n }\n\n public async getPluginPaths(): Promise<Array<{ path: string; pkgJson: FoxfordTools.PackageJson }>> {\n const nodeModulesPlugins = []\n const readPkgUp = await import('read-package-up')\n const result = await readPkgUp.readPackageUp({ cwd: this.rootPath })\n\n if (!result) {\n throw new Error('Unable to find package.json')\n }\n const { packageJson } = result\n\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies }\n\n for (const [name] of Object.entries(dependencies)) {\n // Игнорируем пакеты с типами и другие специфические пакеты\n if (this.shouldSkipPackage(name)) continue\n if (name === packageJson.name) continue\n\n let packageDir: string | null = null\n\n // Попытка найти пакет с помощью require.resolve\n try {\n const packagePath = require.resolve(name, { paths: [this.rootPath] })\n packageDir = path.dirname(packagePath)\n } catch {\n // logger.debug(`Error resolving package ${name} with require.resolve:`, error)\n }\n\n // Fallback: если require.resolve не сработал, пробуем найти пакет вручную\n if (!packageDir) {\n try {\n packageDir = path.join(this.rootPath, 'node_modules', name)\n if (!(await fs.pathExists(packageDir))) {\n logger.debug(`Package directory not found for ${name}`)\n continue\n }\n } catch (error) {\n logger.debug(`Error finding package directory for ${name}:`, error)\n continue\n }\n }\n\n // Теперь у нас есть packageDir, пробуем прочитать package.json\n try {\n const result = await readPkgUp.readPackageUp({ cwd: packageDir })\n if (!result) {\n logger.debug(`Unable to find package.json for ${name}`)\n continue\n }\n\n const { packageJson, path: packageJsonPath } = result\n\n if (packageJson.keywords && packageJson.keywords.includes('foxford-cli-plugin')) {\n nodeModulesPlugins.push({\n path: packageJsonPath,\n pkgJson: packageJson as FoxfordTools.PackageJson,\n })\n }\n } catch (error) {\n logger.debug(`Error reading package.json for ${name}:`, error)\n }\n }\n\n return nodeModulesPlugins\n }\n\n private shouldSkipPackage(name: string): boolean {\n return (\n name.startsWith('@types/') ||\n name.startsWith('@foxford/types') ||\n name === '@foxford/cli' ||\n name === 'typescript' ||\n name.includes('eslint') ||\n name.includes('@babel') ||\n name.includes('react')\n )\n }\n\n defineCommand(command: AbstractCommand) {\n this.commandList.push(command)\n }\n\n getCommands() {\n return this.commandList\n }\n}\n","export * from './abstract.action'\nexport * from './abstract.command'\nexport * from './program'\n","export const BANNER = `\n·▄▄▄ ▐▄• ▄ ·▄▄▄ ▄▄▄ ·▄▄▄▄ \n▐▄▄·▪ █▌█▌▪▐▄▄·▪ ▀▄ █·██▪ ██ \n██▪ ▄█▀▄ ·██· ██▪ ▄█▀▄ ▐▀▀▄ ▐█· ▐█▌\n██▌.▐█▌.▐▌▪▐█·█▌██▌.▐█▌.▐▌▐█•█▌██. ██ \n▀▀▀ ▀█▄▀▪•▀▀ ▀▀▀▀▀ ▀█▄▀▪.▀ ▀▀▀▀▀▀• \n`\n","import chalk from 'chalk'\n\nexport const ERROR_PREFIX = chalk.bgRgb(210, 0, 75).bold.rgb(0, 0, 0)(' Error ')\nexport const INFO_PREFIX = chalk.bgRgb(60, 190, 100).bold.rgb(0, 0, 0)(' Info ')\n","export * from './banner'\nexport * from './prefixes'\n","import { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { CodemodOptions } from './types'\n\nexport class CodemodAction extends AbstractAction<CodemodOptions> {\n public async handle(options: CodemodOptions) {\n const flags = []\n\n if (options.dry) flags.push('--dry')\n if (options.verbose) flags.push('--verbose')\n\n console.log('options', options)\n console.log('flags', flags)\n console.log('extra', options.extra)\n\n const runner = RunnerFactory.create(Runner.NODE, {\n verbose: options.verbose,\n })\n\n runner.run('', [], {\n cwd: process.cwd(),\n })\n\n return\n }\n}\n","export enum Collection {\n FOX_CODEMODS = '@foxford/codemods',\n}\n","import type * as FoxfordTools from '../../types'\n\nexport interface CollectionItem {\n name: string\n alias: string\n description: string\n}\n\nexport abstract class AbstractCollection {\n constructor(protected collection: string) {}\n\n public async execute(_name: string, _inputs: FoxfordTools.ProcessInput[], _extraFlags?: string[], _cwd?: string) {\n return\n }\n\n public abstract getItems(): Promise<CollectionItem[]>\n}\n","/**\n *\n * @param str\n * @returns formated string\n * @description normalizes input to supported path and file name format.\n * Changes camelCase strings to kebab-case, replaces spaces with dash and keeps underscores.\n */\nexport function normalizeToKebabOrSnakeCase(str: string) {\n const STRING_DASHERIZE_REGEXP = /\\s/g\n const STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g\n return str.replace(STRING_DECAMELIZE_REGEXP, '$1-$2').toLowerCase().replace(STRING_DASHERIZE_REGEXP, '-')\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport fs from 'fs-extra'\n\nimport { AbstractCollection } from './abstract.collection'\nimport { Collection } from './collection'\nimport { normalizeToKebabOrSnakeCase } from '../utils/formatting'\n\nimport type { CollectionItem } from './abstract.collection'\n\ninterface Codemod extends CollectionItem {\n runner: string\n}\n\nexport class FoxCodemodCollection extends AbstractCollection {\n private codemods: Codemod[] = []\n private loaded = false\n\n constructor() {\n super(Collection.FOX_CODEMODS)\n }\n\n private async load() {\n const pathCollection = require.resolve(Collection.FOX_CODEMODS)\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgJson = require(path.join(path.dirname(pathCollection), 'package.json'))\n\n if (!pkgJson.codemods) {\n console.log(\n chalk.red('May be you must specify \"codemods\" section in your package.json with path to collection.json')\n )\n process.exit(1)\n }\n\n const collectionPath = path.join(path.dirname(pathCollection), pkgJson.codemods ?? '')\n\n if (!fs.existsSync(collectionPath)) {\n console.log(\n chalk.red('Collection path specified in \"codemods\" section in your package.json is not valid: ', collectionPath)\n )\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const collectionJson = require(collectionPath)\n this.codemods = collectionJson.codemods.map((codemod: Codemod) => ({\n ...codemod,\n name: normalizeToKebabOrSnakeCase(codemod.name),\n }))\n } catch {\n console.log(chalk.red('Collection json is not valid'))\n }\n\n this.loaded = true\n }\n\n public async getItems(): Promise<Codemod[]> {\n if (!this.loaded) {\n try {\n await this.load()\n } catch {\n //\n }\n }\n return this.codemods\n }\n}\n","// import { Runner, RunnerFactory } from '../runners'\n// import { SchematicRunner } from '../runners/schematic.runner'\nimport { Collection } from './collection'\nimport { FoxCodemodCollection } from './fox-codemod.collection'\n\nimport type { AbstractCollection } from './abstract.collection'\n\nexport class CollectionFactory {\n public static create(collection: Collection | string): AbstractCollection {\n // const schematicRunner = RunnerFactory.create(Runner.SCHEMATIC) as SchematicRunner\n\n if (collection === Collection.FOX_CODEMODS) {\n return new FoxCodemodCollection()\n }\n\n return new FoxCodemodCollection()\n }\n}\n","export * from './collection.factory'\nexport * from './collection'\nexport * from './abstract.collection'\n","import chalk from 'chalk'\nimport Table from 'cli-table3'\nimport { Option, Command } from 'commander'\n\nimport { Collection, CollectionFactory } from '../../lib/collection'\nimport { AbstractCommand } from '../../program'\n\nimport type { CodemodOptions } from './types'\nimport type { CollectionItem, AbstractCollection } from '../../lib/collection'\nimport type * as FoxfordTools from '../../types'\n\nexport class CodemodCommand extends AbstractCommand<CodemodOptions> {\n id = 'codemod'\n\n private items: CollectionItem[] = []\n\n private buildRunCommand() {\n const verbose = new Option('--verbose', 'Вывод данных')\n const dry = new Option('--dry', 'Прогон без изменений')\n\n const run = new Command('run')\n\n run\n .description('Запусить кодмод с именем <name>')\n .argument('<name>', 'Имя кодмода (codemod --list)')\n .argument('<input...>', 'Glob паттерн файлов для которых будет применим кодмод')\n .addOption(verbose)\n .addOption(dry)\n .allowUnknownOption(true)\n .showHelpAfterError()\n .action(async (name: string, input: string[], options: CodemodOptions, command: FoxfordTools.Program) => {\n // console.log('extra', extra)\n if (!this.items.filter((item) => item.name === name)) {\n console.error('Name not found')\n return\n }\n\n const unknownOptions = command.parseOptions(command.args)?.unknown ?? []\n\n const paths = input.filter((item) => !unknownOptions.includes(item))\n\n if (unknownOptions.length) {\n options.extra = unknownOptions\n }\n\n options.paths = paths\n\n await this.action.handle(options)\n })\n\n return run\n }\n\n private buildListCommand() {\n const run = new Command('list')\n\n run\n .description('Вывести полный список доступных кодмодов')\n .showHelpAfterError()\n .action(async () => {\n const list = await this.getCollectionItems()\n console.log(\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` + this.buildSchematicsListAsTable(list)\n )\n })\n\n return run\n }\n\n private async getCollectionItems() {\n const list = await this.getItems(this.getCollection())\n this.items = list\n return list\n }\n\n public async load(program: FoxfordTools.Program) {\n const codemod = new Command('codemod')\n codemod\n .addHelpText(\n 'before',\n `\\n---------------------------------------\\n${chalk.greenBright(\n '🛠 Codemod manager'\n )}\\n---------------------------------------\\n`\n )\n .usage('<command>')\n .helpOption(false)\n // .allowUnknownOption()\n .description(await this.buildDescription())\n .summary('Управление кодмодами')\n .addCommand(this.buildRunCommand())\n .addCommand(this.buildListCommand())\n .action(async (options) => {\n if (!options || Object.keys(options).length === 0) {\n codemod.outputHelp()\n return\n }\n\n await this.action.handle(options)\n })\n\n program.addCommand(codemod)\n }\n\n private buildSchematicsListAsTable(items: CollectionItem[]): string {\n const leftMargin = ' '\n const tableConfig = {\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['name', 'description'],\n }\n const table: Table.Table = new Table(tableConfig)\n for (const item of items) {\n table.push([chalk.green(item.name), item.description])\n }\n\n return table.toString()\n }\n\n private getCollection(): string {\n return Collection.FOX_CODEMODS\n }\n\n private async getItems(collection: string): Promise<CollectionItem[]> {\n const abstractCollection: AbstractCollection = CollectionFactory.create(collection)\n this.items = await abstractCollection.getItems()\n return this.items\n }\n\n private async buildDescription(): Promise<string> {\n const list = await this.getCollectionItems()\n const shortList = list.slice(0, 20)\n return (\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` +\n this.buildSchematicsListAsTable(shortList) +\n chalk.yellowBright(`\\n\\nЧтобы увидеть полный список кодмодов используйте команду `) +\n chalk.greenBright(`codemod list`)\n )\n }\n}\n","import { CodemodAction } from './action'\nimport { CodemodCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new CodemodCommand(new CodemodAction(program)))\n}\n","/**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * @param version - Базовая версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n *\n * @example\n * getBetaPackageVersion('1.2.3', 'abc123') // '1.2.3-beta-abc123-20260311'\n */\nexport function getBetaPackageVersion(version: string, sha: string): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n const date = `${year}${month}${day}`\n return `${version}-beta-${sha}-${date}`\n}\n","import { fs, path } from 'zx'\n\nimport { logger } from '../../../logger'\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployOptions } from '../types'\nimport type { HierarchicalLogger } from '@foxford/logger'\n\n/**\n *\n * Методы провайдера не выбрасывают ошибки.\n *\n * Обработка ошибок должна происходить в методах классов, которые наследуются от класса провайдера.\n */\nexport abstract class DeployProvider {\n cwd: string\n logger: HierarchicalLogger\n buildDir: string\n\n constructor(public providerName: string) {\n this.cwd = process.cwd()\n this.logger = logger.getLogger(providerName)\n this.buildDir = './build'\n }\n\n /**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * Делегирует вызов утилитной функции {@link getBetaPackageVersion} для обратной совместимости.\n *\n * @param version - Версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n */\n public getBetaPackageVersion(version: string, sha: string): string {\n return getBetaPackageVersion(version, sha)\n }\n\n /**\n * Читает и парсит файл package.json из текущей рабочей директории.\n *\n * Эта функция пытается найти и прочитать файл package.json в текущей\n * рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.\n *\n * @returns Распарсенное содержимое файла package.json или null.\n */\n public readPackageJson(pkgPath: string): FoxfordTools.PackageJson | null {\n const packageJsonPath = path.resolve(pkgPath, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n return null\n }\n\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(packageJsonContent)\n } catch (error) {\n this.logger.error(`Ошибка при чтении или парсинге package.json: ${(error as Error).message}`)\n return null\n }\n }\n\n public abstract deploy(params: Omit<DeployOptions, 'provider'>): Promise<void>\n}\n","import { getCatalogsFromWorkspaceManifest } from '@pnpm/catalogs.config'\nimport { createExportableManifest } from '@pnpm/exportable-manifest'\nimport { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'\n\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\n\n/** Секции зависимостей, которые участвуют в резолве (devDependencies удаляются ранее) */\ntype DepSection = 'dependencies' | 'peerDependencies' | 'optionalDependencies'\n\n/** Секции, которые проверяются и резолвятся */\nconst DEP_SECTIONS: DepSection[] = ['dependencies', 'peerDependencies', 'optionalDependencies']\n\n/**\n * Опции для функции резолва зависимостей.\n */\nexport interface ResolveWorkspaceDepsOptions {\n /** Цель деплоя: beta или latest */\n target: 'beta' | 'latest'\n /** Короткий SHA коммита (для генерации бета-версии) */\n commitSha: string\n /**\n * Список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей.\n */\n affected?: string[]\n /** Путь к корню воркспейса (директория с pnpm-workspace.yaml) */\n workspaceRoot: string\n /**\n * Директория пакета — содержит node_modules со ссылками на workspace-пакеты.\n * Используется @pnpm/exportable-manifest для резолва workspace: протоколов.\n */\n packageDir: string\n}\n\n/**\n * Проверяет, содержит ли packageJson зависимости с workspace: или catalog: префиксами.\n * Проверяются только dependencies, peerDependencies и optionalDependencies.\n *\n * @param packageJson - Объект package.json пакета\n * @returns true если найдены нерезолвенные workspace: или catalog: зависимости\n */\nexport function hasWorkspaceOrCatalogDeps(packageJson: FoxfordTools.PackageJson): boolean {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n for (const version of Object.values(deps)) {\n if (version.startsWith('workspace:') || version.startsWith('catalog:')) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Резолвит зависимости с workspace: и catalog: префиксами через @pnpm/exportable-manifest.\n * Мутирует переданный packageJson на месте.\n *\n * Поведение:\n * - `catalog:dev` / `catalog:cli` — берёт версию из соответствующей секции pnpm-workspace.yaml\n * - `workspace:*` — резолвит в точную версию `X.Y.Z` (через node_modules пакета)\n * - `workspace:^` — резолвит в `^X.Y.Z`\n * - `workspace:~` — резолвит в `~X.Y.Z`\n * - Если пакет входит в `affected` и `target === 'beta'` — получает бета-версию (post-processing)\n * - devDependencies не трогаются (должны быть удалены до вызова)\n *\n * @param packageJson - Объект package.json (мутируется in-place)\n * @param options - Параметры резолва\n */\nexport async function resolveWorkspaceAndCatalogDeps(\n packageJson: FoxfordTools.PackageJson,\n options: ResolveWorkspaceDepsOptions\n): Promise<void> {\n if (!hasWorkspaceOrCatalogDeps(packageJson)) return\n\n const { target, commitSha, affected = [], workspaceRoot, packageDir } = options\n\n /**\n * Сохраняем исходные workspace: спецификаторы до резолва,\n * чтобы использовать их при post-processing affected/beta зависимостей.\n */\n const workspaceDeps = new Map<string, Map<string, string>>()\n\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const sectionMap = new Map<string, string>()\n for (const [depName, spec] of Object.entries(deps)) {\n if (spec.startsWith('workspace:')) {\n sectionMap.set(depName, spec)\n }\n }\n\n if (sectionMap.size > 0) {\n workspaceDeps.set(section, sectionMap)\n }\n }\n\n /** Читаем pnpm-workspace.yaml и получаем catalogs через @pnpm/* пакеты */\n const workspaceManifest = await readWorkspaceManifest(workspaceRoot)\n\n if (workspaceManifest === null) {\n throw new Error(`pnpm-workspace.yaml не найден в директории: ${workspaceRoot}`)\n }\n\n const catalogs = getCatalogsFromWorkspaceManifest(workspaceManifest)\n\n /**\n * createExportableManifest резолвит workspace:, catalog: и jsr: протоколы,\n * используя node_modules из packageDir для поиска версий workspace-пакетов.\n * Тип второго аргумента берётся из сигнатуры функции, чтобы не импортировать\n * @pnpm/types напрямую (он является транзитивной зависимостью).\n */\n type PnpmProjectManifest = Parameters<typeof createExportableManifest>[1]\n const resolved = await createExportableManifest(packageDir, packageJson as unknown as PnpmProjectManifest, {\n catalogs,\n })\n\n /** Копируем резолвенные секции зависимостей обратно в packageJson */\n for (const section of DEP_SECTIONS) {\n if (resolved[section] != null) {\n packageJson[section] = resolved[section] as Record<string, string>\n }\n }\n\n /**\n * Post-processing: для affected-пакетов при target=beta заменяем\n * резолвенную версию на бета-версию. createExportableManifest не знает\n * о бета-публикациях, поэтому эта логика применяется отдельно.\n */\n if (target === 'beta' && affected.length > 0) {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const originalSpecs = workspaceDeps.get(section)\n if (!originalSpecs) continue\n\n for (const depName of Object.keys(deps)) {\n if (!affected.includes(depName)) continue\n if (!originalSpecs.has(depName)) continue\n\n const resolvedVersion = deps[depName]!\n /** Сохраняем префикс ^ или ~ если он был применён createExportableManifest */\n const prefix = resolvedVersion.startsWith('^') ? '^' : resolvedVersion.startsWith('~') ? '~' : ''\n const baseVersion = resolvedVersion.slice(prefix.length)\n deps[depName] = `${prefix}${getBetaPackageVersion(baseVersion, commitSha)}`\n }\n }\n }\n}\n","/* eslint-disable max-lines */\nimport { fs, $, path, cd } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\nimport { hasWorkspaceOrCatalogDeps, resolveWorkspaceAndCatalogDeps } from '../utils/resolve-workspace-deps'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployNpmOptions } from '../types'\nimport type { ProcessOutput } from 'zx'\n\nfunction sleep(ms: number) {\n if (process.env.NODE_ENV === 'test') {\n return Promise.resolve()\n }\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport class NpmDeploy extends DeployProvider {\n versionLists: string[] = []\n dry: string = ''\n noGitChecks: string = ''\n\n constructor() {\n super('npm')\n }\n\n /**\n * Возвращает сообщение об устаревании с текущим SHA коммита.\n *\n * @returns Промис, который разрешается строкой сообщения об устаревании.\n */\n private async getDeprecationMessage(): Promise<string> {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().trim()\n return `deprecated by ${commitSha}`\n }\n\n /**\n * Создает или обновляет файл .npmrc с токеном аутентификации для реестра npm.\n *\n * Этот метод добавляет конфигурацию аутентификации в файл .npmrc,\n * обеспечивая безопасный доступ к реестру npm для публикации пакетов.\n * Он использует переменную окружения NPM_TOKEN для аутентификации.\n *\n * @returns Промис, который разрешается, когда файл .npmrc успешно обновлен.\n * @throws Выбрасывает ошибку, если операция с файлом не удалась или если NPM_TOKEN не установлен.\n */\n private async touchNpmrc(): Promise<void> {\n const authStr = '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'\n await $`echo ${authStr} >> .npmrc`\n }\n\n /**\n * Фильтрует устаревшие версии из заданного списка версий пакета.\n *\n * Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.\n * Он использует команду `npm view` для получения статуса устаревания каждой версии.\n *\n * @param pkgName - Имя пакета в регистре.\n * @param versions - Массив строк версий для проверки на устаревание.\n * @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.\n */\n private async getNotDeprecatedVersions(pkgName: string, versions: string[]): Promise<string[]> {\n const notDeprecatedVersions = []\n for (const ver of versions) {\n const cmd = ['npm', 'view', `${pkgName}@${ver}`, 'deprecated']\n const result = await $`${cmd}`\n\n if (!result.toString().trim().includes('deprecated by')) {\n notDeprecatedVersions.push(ver)\n }\n }\n return notDeprecatedVersions\n }\n\n /**\n * Получает список всех версий текущего пакета из реестра npm.\n *\n * Этот метод выполняет команду npm для получения всех версий пакета,\n * указанного в файле package.json. Затем он парсит JSON-ответ\n * и сохраняет результат в свойстве `versionLists` класса.\n *\n * Если пакет ещё не опубликован в npm (HTTP 404), метод возвращает пустой\n * массив и логирует информационное сообщение — процесс деплоя продолжается\n * без очистки beta-версий.\n *\n * @param pkgName - Имя пакета в регистре.\n *\n * @returns Промис, который разрешается в массив строк, где каждая строка\n * представляет версию пакета. Если пакет не найден или парсинг\n * не удался, возвращает пустой массив.\n */\n private async getVersionsList(pkgName: string): Promise<string[]> {\n logger.info('Getting versions list...')\n\n let outputProcess: ProcessOutput\n\n try {\n outputProcess = await $`npm view ${pkgName} versions --json`\n } catch (error) {\n const errorText = String(error)\n\n if (errorText.includes('E404')) {\n logger.info(`Пакет ${pkgName} ещё не опубликован в npm, пропускаем очистку beta-версий`)\n } else {\n logger.warn(`Не удалось получить список версий: ${errorText}`)\n }\n\n return []\n }\n\n const versionsListPo = outputProcess.toString()\n logger.info('Versions list recieved', versionsListPo)\n\n try {\n const parsed = JSON.parse(versionsListPo)\n\n if (Array.isArray(parsed)) {\n return parsed\n } else {\n // Если это не массив, но валидный JSON (например, строка), возвращаем её в массиве\n return [parsed]\n }\n } catch {\n logger.error('Error parsing versions list')\n return []\n }\n }\n\n /**\n * Получает список бэта версий на текущую версию из списка всех версий.\n *\n * @param currentVersion - Строка текущей версии для сравнения.\n * @returns Массив строк похожих версий.\n */\n private getBetaVersions(currentVersion: string): string[] {\n return this.versionLists.filter((ver) => {\n if (!ver.includes('beta')) return false\n if (ver === currentVersion) return false\n\n const semverFromVersion = currentVersion.match(/^[0-9]{1,9}.[0-9]{1,9}.[0-9]{1,9}/gi)\n if (!semverFromVersion) return false\n\n const matchedVersion = semverFromVersion[0] ?? null\n if (!matchedVersion) return false\n\n return ver.includes(matchedVersion)\n })\n }\n\n /**\n * Помечает предыдущие похожие версии пакета как устаревшие.\n *\n * Этот метод находит похожие версии на текущую версию, фильтрует уже устаревшие версии,\n * а затем помечает оставшиеся версии как устаревшие, используя команду npm deprecate.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.\n */\n private async deprecatePrevBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Отмечаем предыдущие бэта версии как deprecated')\n\n this.versionLists = await this.getVersionsList(packageJson.name)\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Найдены beta версии:', betaVersions)\n\n const notDeprecatedVersions = await this.getNotDeprecatedVersions(packageJson.name, betaVersions)\n logger.info('Beta версии без deprecated:', notDeprecatedVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of notDeprecatedVersions) {\n await sleep(500)\n try {\n if (!this.dry) {\n const cmd = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', cmd)\n await $`${cmd}`\n }\n } catch (error) {\n logger.error(error)\n continue\n }\n }\n }\n\n /**\n * Удаляет бета-версии пакета, которые похожи на текущую версию.\n *\n * Этот метод получает все версии пакета, находит похожие версии на текущую,\n * и удаляет те, которые являются бета-версиями. Он использует команду npm unpublish с флагом --force.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.\n * @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.\n */\n private async unpublishBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Разпубликовываем beta версии')\n this.versionLists = await this.getVersionsList(packageJson.name)\n logger.info('Список версий: ', this.versionLists)\n\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Список для разпубликации и депрекейта: ', betaVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of betaVersions) {\n if (!ver.includes('beta')) continue\n\n try {\n const deprecate = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', deprecate)\n await $`${deprecate}`\n\n const unpublish = ['npm', 'unpublish', `${packageJson.name}@${ver}`, '--force', this.dry].filter(\n (item) => item !== ''\n )\n logger.info('Разпубликовывем версию:', unpublish)\n await $`${unpublish}`\n } catch (error) {\n logger.error(error)\n continue\n }\n\n await sleep(500)\n }\n }\n\n /**\n * Разворачивает пакет в реестре npm.\n *\n * Этот метод обрабатывает весь процесс развертывания, включая управление версиями,\n * обновление package.json, публикацию npm и пост-публикационные действия, такие как пометка\n * предыдущих версий как устаревших или удаление бета-версий.\n *\n * Если в package.json присутствуют зависимости с префиксами `workspace:` или `catalog:`,\n * они автоматически резолвятся в конкретные версии перед публикацией.\n *\n * @param params - Параметры развертывания.\n * @param params.dry - Если true, выполняет пробный запуск без фактической публикации.\n * @param params.target - Цель развертывания, либо 'beta', либо 'latest'. По умолчанию 'beta'.\n * @param params.affected - Comma-separated список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей при target=beta.\n *\n * @throws Завершает процесс, если директория сборки не найдена.\n * @returns Промис, который разрешается, когда процесс развертывания завершен.\n */\n async deploy(params: DeployNpmOptions) {\n logger.info('Начинаем процесс деплоя в NPM', params)\n const packageDir = process.cwd()\n const localDir = path.join(packageDir, params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const packageJson = this.readPackageJson(localDir)\n\n if (!packageJson) {\n logger.error('package.json не найден в текущей директории')\n process.exit(1)\n }\n\n if (params.dry === true) this.dry = '--dry-run'\n if (params.skipGitChecks) this.noGitChecks = '--no-git-checks'\n\n logger.info('Меняем директорию на', localDir)\n cd(localDir)\n\n logger.info('Получаем sha коммита')\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n const target = params.target ?? 'beta'\n logger.info('Целевая версия:', target)\n\n await this.touchNpmrc()\n logger.info('Создаем .npmrc')\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n\n packageJson.sha = commitSha\n logger.info('Версия пакета:', packageJson.version)\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies\n }\n\n // Предварительная проверка до вызова git-подпроцесса: внутри resolveWorkspaceAndCatalogDeps\n // есть идентичный guard, но здесь он позволяет избежать запуска `git rev-parse --show-toplevel`\n // для пакетов без workspace/catalog зависимостей.\n if (hasWorkspaceOrCatalogDeps(packageJson)) {\n logger.info('Обнаружены workspace/catalog зависимости, запускаем резолв...')\n\n /**\n * Резолв workspace/catalog протоколов поддерживается только в pnpm.\n * Если packageManager не определён или не является 'pnpm' — завершаем процесс с ошибкой.\n */\n if (params.packageManager !== 'pnpm') {\n logger.error(\n `Резолв workspace: и catalog: зависимостей поддерживается только при использовании pnpm. ` +\n `Текущий packageManager: \"${params.packageManager ?? 'не определён'}\". ` +\n `Используйте pnpm для публикации пакетов с workspace/catalog зависимостями.`\n )\n process.exit(1)\n }\n\n const workspaceRoot = (await $`git rev-parse --show-toplevel`).toString().trim()\n\n const affectedPackages = params.affected ? params.affected.split(',').map((s) => s.trim()) : undefined\n\n await resolveWorkspaceAndCatalogDeps(packageJson, {\n affected: affectedPackages,\n commitSha,\n packageDir,\n target,\n workspaceRoot,\n })\n\n logger.info('Workspace/catalog зависимости зарезолвлены', packageJson)\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson('package.json', packageJson, {\n spaces: 2,\n })\n\n const cmd = [\n params.packageManager ?? 'npm',\n 'publish',\n '--access=public',\n `--tag=${target}`,\n this.dry,\n this.noGitChecks,\n ].filter((item) => item !== '')\n logger.info('Публикуем с аргументами:', cmd)\n\n await $`${cmd}`\n\n if (target === 'beta') {\n await this.deprecatePrevBetaVersions(packageJson)\n } else {\n await this.unpublishBetaVersions(packageJson)\n }\n }\n}\n","import { fs, $, path } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\n\nimport type { DeployS3Options } from '../types'\n\nexport class S3Deploy extends DeployProvider {\n constructor() {\n super('s3')\n }\n\n /**\n * Определяет цель развертывания на основе текущей ветки Git.\n *\n * @returns {'latest' | 'beta'} 'latest' для ветки master, 'beta' для всех остальных.\n */\n getTarget(): 'latest' | 'beta' {\n const { GITHUB_REF_NAME } = process.env\n\n if (GITHUB_REF_NAME === 'master') return 'latest'\n\n return 'beta'\n }\n\n /**\n * Формирует путь для ресурсов в хранилище.\n *\n * @param segments - Cегменты пути.\n * @returns Путь для цели развертывания.\n */\n getRemotePath(...segments: (string | undefined)[]): string {\n return segments\n .filter(Boolean)\n .join(path.posix.sep)\n .replace(/[/\\\\]+/g, path.posix.sep)\n .replace(/^\\//, '')\n }\n\n /**\n * Выполняет команду rclone copy.\n *\n * @param localDir - Путь до локальных ресурсов.\n * @param bucket - Имя бакета в хранилище.\n * @param remoteDir - Удаленный путь для загрузки ресурсов.\n * @param flags - Дополнительные аргументы.\n * @returns Результат выполнения команды.\n */\n async exec(localDir: string, bucket: string, remoteDir?: string, flags?: string[]): Promise<void> {\n const cmd = ['rclone', 'copy', localDir]\n\n if (remoteDir) {\n cmd.push(`myremote:${bucket}/${remoteDir}`)\n } else {\n cmd.push(`myremote:${bucket}/`)\n }\n\n if (flags) {\n cmd.push(...flags)\n }\n\n logger.info('Запуск деплоя:', cmd)\n\n await $`${cmd}`\n\n logger.info('Деплой успешно завершен:', cmd)\n }\n\n /**\n * Получает учетные данные для S3 из параметров или переменных окружения\n * @param options - Опции команды\n * @returns Объект с accessKey и secretKey\n * @throws Error если учетные данные не найдены\n */\n getS3Credentials(options: Partial<DeployS3Options>): { accessKey: string; secretKey: string } {\n const accessKey = options.accessKey ?? process.env.ACCESS_KEY ?? process.env.SELECTEL_USER\n const secretKey = options.secretKey ?? process.env.SECRET_KEY ?? process.env.SELECTEL_PASSWORD\n\n if (!accessKey || !secretKey) {\n throw new Error(\n 'Не указаны учетные данные для S3. ' +\n 'Используйте параметры --access-key и --secret-key или установите переменные окружения ACCESS_KEY и SECRET_KEY'\n )\n }\n\n return { accessKey, secretKey }\n }\n\n /**\n * Выполняет процесс развертывания в хранилище по S3.\n *\n * Этот метод копирует файлы из локальной директории в удаленные директории хранилища,\n * используя rclone. Он обрабатывает как версионные, так и целевые пути.\n *\n * @param {DeployS3Options} params - Параметры развертывания.\n * @param {string} [params.localDir] - Локальная директория для копирования (по умолчанию this.buildDir).\n * @param {string} [params.bucket] - Имя бакета хранилища (по умолчанию из env или 'dist.ngcdn.ru').\n * @param {string} [params.packageName] - Имя пакета (по умолчанию из package.json).\n * @param {string} [params.endpoint] - Endpoint хранилища.\n * @param {string} [params.region] - Регион хранилища.\n * @param {string} [params.accessKey] - Токен доступа.\n * @param {string} [params.secretKey] - Секрет.\n * @param {boolean} [params.verbose] - Вывод дебаг информации.\n * @param {'latest' | 'beta'} [params.target] - Цель развертывания (по умолчанию определяется автоматически).\n * @param {boolean} [params.dry] - Если true, выполняет пробный запуск без фактической загрузки.\n *\n * @throws Завершает процесс, если локальная директория не существует.\n */\n async deploy(params: DeployS3Options) {\n logger.info('Начинаем процесс деплоя в хранилище', params)\n const { BUCKET } = process.env\n\n let accessKey, secretKey\n\n try {\n const credentials = this.getS3Credentials(params)\n accessKey = credentials.accessKey\n secretKey = credentials.secretKey\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.toString())\n } else {\n logger.error(error)\n }\n process.exit(1)\n }\n\n const localDir = path.join(process.cwd(), params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const bucket = params.bucket ?? BUCKET\n\n if (!bucket) {\n logger.error('Бакет не определен')\n process.exit(1)\n }\n\n logger.info('Бакет:', bucket)\n\n const packageJson = this.readPackageJson(localDir)\n\n const remoteDirs = []\n\n if (packageJson) {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n if (params.packageName) {\n packageJson.name = params.packageName\n }\n\n const target = params.target ?? this.getTarget()\n logger.info('Целевая версия:', target)\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n logger.info('Версия пакета:', packageJson.version)\n\n packageJson.sha = commitSha\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson(path.resolve(localDir, 'package.json'), packageJson, {\n spaces: 2,\n })\n\n remoteDirs.push(\n this.getRemotePath(params.remoteDir, packageJson.name, packageJson.version),\n this.getRemotePath(params.remoteDir, packageJson.name, target)\n )\n } else {\n logger.warn('package.json не найден в текущей директории')\n\n if (params.remoteDir) {\n remoteDirs.push(params.remoteDir)\n }\n }\n\n logger.info('Удаленные директории:', remoteDirs)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = accessKey\n $.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = secretKey\n $.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? 's3.ru-1.storage.selcloud.ru'\n $.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? 'ru-1'\n\n const execFlags = ['--progress']\n\n if (params.verbose) execFlags.push('-vv')\n\n if (params.dry) {\n execFlags.push('--dry-run')\n }\n\n if (!remoteDirs.length) {\n await this.exec(localDir, bucket, undefined, execFlags)\n process.exit(0)\n }\n\n await Promise.all(\n remoteDirs.map((remoteDir) => {\n return this.exec(localDir, bucket, remoteDir, execFlags)\n })\n )\n }\n}\n","import { AbstractAction } from '../../program'\nimport { NpmDeploy } from './providers/npm'\nimport { S3Deploy } from './providers/s3'\n\nimport type { DeployProvider } from './providers/abstract.provider'\nimport type { DeployOptions } from './types'\n\nexport class DeployAction extends AbstractAction<DeployOptions> {\n public async handle(params: DeployOptions) {\n let provider: DeployProvider\n\n switch (params.provider) {\n case 'npm':\n provider = new NpmDeploy()\n break\n case 's3':\n provider = new S3Deploy()\n break\n default:\n throw new Error(`Unsupported deploy provider: ${params.provider}`)\n }\n\n await provider.deploy(params)\n }\n}\n","import { Command, Option } from 'commander'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { DeployOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class DeployCommand extends AbstractCommand<DeployOptions> {\n id = 'deploy'\n public async load(program: FoxfordTools.Program) {\n const deployCommand = new Command('deploy').description('Задеплоить пакет')\n\n const targetOption = new Option('--target <target>', 'Релиз beta или latest')\n .choices(['beta', 'latest'])\n .default('beta')\n const localDirOption = new Option('--local-dir <path>', 'Из какой локальной директории загрузить содержимое')\n const dryOption = new Option('--dry', 'Запуск без выполнения операции').default(false)\n const verboseOption = new Option('--verbose', 'Вывод дебаг информации').default(false)\n\n const s3Command = new Command('s3')\n .description('Деплой пакета по s3 в хранилище')\n .option('--bucket <name>', 'В какой бакет загрузить пакет')\n .option('--package-name <name>', 'Имя пакета вместо packageJson.name')\n .option('--remote-dir <dir>', 'Целевая директория в хранилище')\n .option('--region <name>', 'Регион S3')\n .option('--endpoint <url>', 'Endpoint S3')\n .action(async (params) => {\n await this.action.handle({ ...params, provider: 's3' })\n })\n\n s3Command.addOption(targetOption)\n s3Command.addOption(localDirOption)\n s3Command.addOption(dryOption)\n s3Command.addOption(verboseOption)\n\n const skipGitChecksOption = new Option('--skip-git-checks', 'Отключение git проверок при публикации')\n const affectedOption = new Option(\n '--affected <packages>',\n 'Comma-separated список affected-пакетов, публикуемых в текущем цикле (для резолва бета-версий workspace-зависимостей)'\n )\n\n const npmCommand = new Command('npm').description('Деплой пакета в npm').action(async (params) => {\n await this.action.handle({ ...params, packageManager: program.packageManager, provider: 'npm' })\n })\n\n npmCommand.addOption(targetOption)\n npmCommand.addOption(localDirOption)\n npmCommand.addOption(dryOption)\n npmCommand.addOption(verboseOption)\n npmCommand.addOption(skipGitChecksOption)\n npmCommand.addOption(affectedOption)\n\n deployCommand.addCommand(s3Command)\n deployCommand.addCommand(npmCommand)\n\n program.addCommand(deployCommand)\n }\n}\n","import { DeployAction } from './action'\nimport { DeployCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new DeployCommand(new DeployAction(program)))\n}\n","import { platform, release } from 'os'\n\nimport chalk from 'chalk'\nimport { filesize } from 'filesize'\nimport { cpu, mem } from 'systeminformation'\nimport { $ } from 'zx'\n\nimport { BANNER } from '../../lib/ui'\nimport { AbstractAction } from '../../program'\n\nexport class InfoAction extends AbstractAction {\n public async handle() {\n this.displayBanner()\n await this.displaySystemInformation()\n }\n\n private displayBanner() {\n console.info(chalk.red(BANNER))\n }\n\n private async displaySystemInformation(): Promise<void> {\n const osName = await import('os-name')\n console.info(chalk.green('[System Information]'))\n console.info('OS Version :', chalk.blue(osName.default(platform(), release())))\n console.info('NodeJS Version :', chalk.blue(process.version))\n const where = await $`which node`\n console.info('NodeJS path :', where.toString())\n console.info('NODE_OPTIONS :', chalk.blue(process.env.NODE_OPTIONS))\n if (where.toString().includes('nvm')) {\n console.info('NVM_DIR :', chalk.blue(process.env.NVM_DIR))\n }\n console.log()\n const cpuDevice = await cpu()\n const memDevice = await mem()\n console.info('CPU Family:', chalk.blue(`${cpuDevice.vendor} ${cpuDevice.brand}`))\n console.info('CPU Ph Cores:', chalk.blue(cpuDevice.cores))\n console.info('CPU Speed:', chalk.blue(`${cpuDevice.speed}GHz`))\n console.info('Memory:', chalk.blue(`${filesize(memDevice.total)}`))\n console.info('Memory Free:', chalk.blue(`${filesize(memDevice.free)}`))\n console.info('Memory Used:', chalk.blue(`${filesize(memDevice.used)}`))\n console.info('Memory Available:', chalk.blue(`${filesize(memDevice.available)}`))\n }\n\n rightPad(name: string, length: number): string {\n while (name.length < length) {\n // eslint-disable-next-line no-param-reassign\n name = name.concat(' ')\n }\n return name\n }\n}\n","import { AbstractCommand } from '../../program'\n\nimport type { Command } from 'commander'\n\nexport class InfoCommand extends AbstractCommand {\n id = 'info'\n public async load(program: Command) {\n program\n .command('info')\n .alias('i')\n .description('Показать инфо')\n .action(async () => {\n await this.action.handle()\n })\n }\n}\n","import { InfoAction } from './action'\nimport { InfoCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new InfoCommand(new InfoAction(program)))\n}\n","import fs from 'fs'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\nimport { SingleBar, Presets } from 'cli-progress'\nimport Table from 'cli-table3'\nimport { filesize } from 'filesize'\nimport { glob } from 'glob'\n\nimport { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { OptimizeOptions } from './types'\n\ninterface ResourceTask {\n __originalPath: string\n __originalStat?: fs.Stats\n __optimizedStat?: fs.Stats\n __optimizedPath: string\n err?: string | Error\n status: boolean\n diff?: string\n}\n\nexport class OptimizeAction extends AbstractAction<OptimizeOptions> {\n public async handle(options: OptimizeOptions, extraFlags: string[] = []) {\n const resources = await glob(path.join(process.cwd(), options.filePath!), { ignore: 'node_modules/**' })\n\n console.log(chalk.white(`Найдено ${chalk.green(resources.length)} ресурсов для оптимизации`))\n console.log(\n chalk.yellowBright(`Если вы хотите увидеть список ресурсов, воспользуйтесь опцией ${chalk.green('--list')}`)\n )\n\n if (options.list) console.log(resources)\n\n const inquirer = await import('inquirer')\n\n const answers = await inquirer.default.prompt([\n {\n choices: [\n { name: 'Yes', value: 1 },\n { name: 'No', value: 0 },\n ],\n default: 1,\n message: 'Продолжить?',\n name: 'continue',\n type: 'list',\n },\n ])\n\n if (!answers.continue) return\n\n console.log()\n const bar = new SingleBar({ fps: 25 }, Presets.shades_classic)\n bar.start(resources.length, 0)\n\n const ft = await import('file-type')\n\n const promises = resources.map(async (resource) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const fileType = await ft.fileTypeFromFile(resource)\n if (!fileType)\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n\n const { mime } = fileType\n\n let runner\n\n const outputPath = options.replace\n ? resource\n : path.join(path.dirname(resource), `${options.prefix ?? ''}${path.basename(resource)}`)\n\n switch (mime) {\n case 'image/png':\n case 'image/jpeg':\n runner = RunnerFactory.create(Runner.TINYPNG, {\n token: process.env.TINIFY_API_KEY ?? '',\n verbose: true,\n })\n break\n case 'video/mp4':\n runner = RunnerFactory.create(Runner.FFMPEG, {\n verbose: true,\n })\n break\n default:\n console.log(chalk.yellowBright(`Unsupported mime type for ${chalk.white(resource)}`))\n }\n\n if (!runner) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n }\n\n try {\n const beforeStat = fs.statSync(resource)\n await runner.run({\n extraFlags,\n output: outputPath,\n resource,\n })\n const afterStat = fs.statSync(outputPath)\n\n return {\n __optimizedPath: resource,\n __optimizedStat: afterStat,\n __originalPath: resource,\n __originalStat: beforeStat,\n status: true,\n }\n } catch (err) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n err: err as string,\n status: false,\n }\n } finally {\n bar.increment()\n }\n })\n\n try {\n const result = await Promise.all(promises)\n bar.stop()\n console.log()\n this.printResult(result)\n } catch (err) {\n bar.stop()\n console.log()\n console.log(chalk.redBright('Ошибка при оптимизации:', err))\n }\n }\n\n private printResult(result: ResourceTask[]) {\n const statusTable = this.buildStatusTable(result)\n console.log(statusTable)\n this.showUncompletedFiles(result)\n }\n\n private showUncompletedFiles(results: ResourceTask[]) {\n const failed = results.filter((item) => item.status === false)\n if (failed.length > 0) {\n console.log(chalk.redBright('Список необработанных файлов'))\n console.log(failed.map((item) => item.__originalPath))\n }\n }\n\n private buildStatusTable = (results: ResourceTask[]) => {\n const success = results.filter((item) => item.status === true)\n const failed = results.filter((item) => item.status === false)\n const leftMargin = ''\n const table = new Table({\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['Обработано', 'Не обработано', 'Изменение размера'],\n })\n\n const sumFilesize = results.reduce((acc, task) => {\n if (task.__originalStat && task.__optimizedStat) {\n // eslint-disable-next-line no-param-reassign\n acc += task.__originalStat.size - task.__optimizedStat.size\n }\n return acc\n }, 0)\n\n const sumPrefix = sumFilesize >= 0 ? '-' : '+'\n\n table.push([\n chalk.greenBright(success.length),\n chalk.redBright(failed.length),\n sumFilesize >= 0\n ? chalk.greenBright(`${sumPrefix}${filesize(sumFilesize)}`)\n : chalk.redBright(`${sumPrefix}${filesize(Math.abs(sumFilesize))}`),\n ])\n\n return table.toString()\n }\n}\n","import chalk from 'chalk'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { OptimizeOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class OptimizeCommand extends AbstractCommand<OptimizeOptions> {\n id = 'optimize'\n\n public async load(program: FoxfordTools.Program) {\n program\n .command('optimize [path] [extraFlags...]')\n .alias('opt')\n .option('-l, --list', 'Вывести список файлов для оптимизации', false)\n .option('-r, --replace', 'Заменить исходный файл', false)\n .option('-p, --prefix', 'Префикс в имени оптимайзнутого файла', '__')\n .description('Оптимизировать ресурс(jpg,png,mp4)')\n .action(async (path: string, extraFlags: string[], option) => {\n if (!path) {\n console.log(chalk.yellow('Укажите путь до ресурса(поддерживается glob)'))\n process.exit(1)\n }\n\n await this.action.handle(\n {\n filePath: path,\n list: option.list,\n prefix: option.prefix,\n replace: option.replace,\n },\n extraFlags\n )\n })\n }\n}\n","import { OptimizeAction } from './action'\nimport { OptimizeCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new OptimizeCommand(new OptimizeAction(program)))\n}\n","#!/usr/bin/env node\nimport chalk from 'chalk'\n\nimport pkg from '../../package.json'\nimport { logger } from '../logger'\nimport { Program } from '../program'\nimport { CommandLoader } from '../program/loader'\n\nconst PROGRAM_NAME = 'fox'\n\nconst welcomeText = `${chalk.green(`Привет✌️ , Foxford разработчик🤓`)}\n${chalk.magenta(`Эта штука призвана помочь тебе в кодогенерации и в чем-нибудь ещё🍿`)}\n${chalk.yellowBright('Чай наливай себе сам 🍮🍪')}\n`\n\nconst bootstrap = async () => {\n logger.debug('Start program')\n const program = await Program.init()\n\n program\n .version(pkg.version, '-v, --version', 'Показать текущую версию тулзы')\n .name(PROGRAM_NAME)\n .description(welcomeText)\n .usage('<command> [options]')\n .helpOption(false)\n .addHelpCommand(false)\n\n logger.debug('Load processes')\n await CommandLoader.load(program)\n logger.debug('Loading complete')\n\n logger.debug('Parse process.argv', process.argv)\n await program.parseAsync(process.argv)\n\n if (!process.argv.slice(2).length) {\n program.outputHelp()\n }\n}\n\nbootstrap()\n","{\n \"name\": \"@foxford/cli\",\n \"version\": \"1.4.1\",\n \"description\": \"Foxford Cli\",\n \"keywords\": [\n \"foxford\",\n \"cli\",\n \"tool\"\n ],\n \"homepage\": \"https://github.com/foxford/frontend-platform\",\n \"bugs\": \"https://github.com/foxford/frontend-platform/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/foxford/frontend-platform.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Foxford Co\",\n \"maintainers\": [\n {\n \"name\": \"Roman Olin\",\n \"email\": \"r.v.olin@foxford.ru\",\n \"team\": \"@frontend/core\"\n }\n ],\n \"main\": \"./README.mdx\",\n \"types\": \"./src/types/index.ts\",\n \"type\": \"module\",\n \"exports\": {\n \"./README.mdx\": \"./README.mdx\",\n \".\": {\n \"types\": \"./src/types/index.ts\"\n }\n },\n \"bin\": {\n \"fox-dev\": \"./scripts/dev.cjs\",\n \"fox\": \"./scripts/prod.cjs\"\n },\n \"scripts\": {\n \"============================ BUILD =============================\": \"\",\n \"build\": \"tsup\",\n \"postbuild\": \"pnpm run build-dts\",\n \"build-dts\": \"dts-bundle-generator -o build/fox.d.ts src/types/index.ts --no-banner --external-inlines=commander loglevel --sort --inline-declare-externals\",\n \"============================ DEPLOY =============================\": \"\",\n \"deploy\": \"fox deploy npm\",\n \"============================ LINT =============================\": \"\",\n \"lint:clean\": \"rm -f .eslintcache\",\n \"lint:type-check\": \"tsc --noEmit --pretty\",\n \"lint:eslint\": \"eslint --cache --cache-strategy content --max-warnings=0 ./\",\n \"============================ TEST =============================\": \"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@foxford/logger\": \"workspace:*\",\n \"@pnpm/catalogs.config\": \"1000.0.5\",\n \"@pnpm/exportable-manifest\": \"1000.4.1\",\n \"@pnpm/workspace.read-manifest\": \"1000.3.0\",\n \"@tsconfig/node16\": \"16.1.3\",\n \"chalk\": \"4.1.0\",\n \"cli-progress\": \"catalog:cli\",\n \"cli-table3\": \"catalog:cli\",\n \"commander\": \"catalog:cli\",\n \"dotenv\": \"16.4.5\",\n \"dotenv-expand\": \"11.0.6\",\n \"file-type\": \"21.3.2\",\n \"filesize\": \"10.1.2\",\n \"fluent-ffmpeg\": \"2.1.2\",\n \"fs-extra\": \"catalog:dev\",\n \"glob\": \"catalog:dev\",\n \"inquirer\": \"12.4.3\",\n \"os-name\": \"7.0.0\",\n \"package-manager-detector\": \"1.3.0\",\n \"read-package-up\": \"11.0.0\",\n \"systeminformation\": \"5.31.1\",\n \"tinify\": \"1.7.1\",\n \"tsx\": \"4.21.0\",\n \"typescript\": \"catalog:dev\",\n \"yaml\": \"2.4.5\",\n \"zx\": \"catalog:dev\"\n },\n \"devDependencies\": {\n \"@foxford/eslint-config\": \"workspace:*\",\n \"@foxford/prettier-config\": \"workspace:*\",\n \"@foxford/typescript-config\": \"workspace:*\",\n \"@foxford/vitest-config\": \"workspace:*\",\n \"@types/cli-progress\": \"catalog:cli\",\n \"@types/fluent-ffmpeg\": \"2.1.24\",\n \"@types/fs-extra\": \"11.0.4\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"tsup\": \"catalog:dev\",\n \"vitest\": \"catalog:dev\"\n }\n}","import { existsSync, statSync } from 'node:fs'\nimport { readdir } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport chalk from 'chalk'\nimport { pathExists } from 'fs-extra'\n\nimport { ERROR_PREFIX } from '../lib/ui'\nimport { logger } from '../logger'\n\nimport type * as FoxfordTools from '../types'\nimport type { NormalizedPackageJson } from 'read-package-up'\n\nconst log = logger.getLogger('command-loader')\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class CommandLoader {\n static PROCESSES_DIR = path.resolve(__dirname, '..', 'processes')\n\n public static async load(program: FoxfordTools.Program): Promise<void> {\n if (process.env.NODE_ENV === 'production') {\n await this.loadProductionProcesses(program)\n } else {\n await this.loadDevelopmentProcesses(program)\n }\n\n await Promise.all(program.getCommands().map(async (command) => await command.load(program)))\n this.handleInvalidCommand(program)\n }\n\n static async loadProductionProcesses(program: FoxfordTools.Program) {\n try {\n for (const [processName, moduleLoader] of Object.entries({\n codemod: () => import('../processes/codemod'),\n deploy: () => import('../processes/deploy'),\n info: () => import('../processes/info'),\n optimize: () => import('../processes/optimize')\n })) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const module = await moduleLoader()\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при загрузке процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n static async loadDevelopmentProcesses(program: FoxfordTools.Program) {\n if (!(await pathExists(CommandLoader.PROCESSES_DIR))) {\n log.error(`Директория процессов не найдена: ${CommandLoader.PROCESSES_DIR}`)\n return\n }\n\n try {\n const processes = await this.getProcesses(CommandLoader.PROCESSES_DIR)\n for (const processName of processes) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const modulePath = path.join(CommandLoader.PROCESSES_DIR, processName)\n\n const module = require(modulePath)\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при чтении процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n private static getModulePath(packageJson: NormalizedPackageJson): string {\n let modulePath: string = ''\n\n if (packageJson.exports) {\n // Используем exports для определения точки входа\n if (typeof packageJson.exports === 'string') {\n modulePath = packageJson.exports\n } else if ((packageJson.exports as Record<string, unknown>)['.']) {\n // Если есть экспорт по умолчанию\n const defaultExport = (packageJson.exports as Record<string, string>)['.'] as string | Record<string, string>\n if (typeof defaultExport === 'string') {\n modulePath = defaultExport\n } else {\n if (packageJson.type === 'module') {\n modulePath = defaultExport.import as string\n } else {\n modulePath = defaultExport.require as string\n }\n }\n }\n } else if (packageJson.main) {\n // Fallback на main, если exports не определен\n modulePath = packageJson.main as string\n } else {\n // Если ни exports, ни main не определены, используем index.js\n modulePath = 'index.js'\n }\n\n return modulePath\n }\n\n private static async loadPlugins(program: FoxfordTools.Program) {\n const plugins = await program.getPluginPaths()\n\n for (const plugin of plugins) {\n log.debug(`Загружаем модуль: ${chalk.cyan(plugin.pkgJson.name)}`)\n const dirname = path.dirname(plugin.path)\n\n if (process.env.NODE_ENV === 'development') {\n const module = require(`${plugin.pkgJson.name}`)\n module.default(program)\n continue\n }\n\n let targetPath = path.resolve(dirname)\n\n if (existsSync(path.resolve(targetPath, 'build'))) {\n targetPath = path.resolve(targetPath, 'build')\n }\n\n if (existsSync(path.join(targetPath, 'package.json'))) {\n const packageJson = require(path.join(targetPath, 'package.json'))\n\n try {\n const require = createRequire(__filename)\n let module\n\n const modulePath = this.getModulePath(packageJson)\n\n if (packageJson.type === 'module') {\n // Если это ES модуль\n module = await import(path.join(targetPath, modulePath))\n } else {\n // Если это CommonJS модуль\n module = require(path.join(targetPath, modulePath))\n }\n\n if (typeof module.default === 'function') {\n module.default(program)\n } else if (typeof module === 'function') {\n module(program)\n } else {\n log.warn(`Модуль \"${plugin.pkgJson.name}\" не экспортирует функцию по умолчанию`)\n }\n } catch (error) {\n log.error(`Ошибка при загрузке модуля \"${plugin.pkgJson.name}\":`, error)\n }\n }\n }\n }\n\n private static async getProcesses(processesPath: string): Promise<string[]> {\n const files = await readdir(processesPath)\n\n return files\n .filter((file) => {\n const filePath = path.join(processesPath, file as string, 'index.ts')\n const stat = statSync(filePath)\n return stat.isFile()\n })\n .map((file) => path.parse(file as string).name)\n }\n\n private static handleInvalidCommand(program: FoxfordTools.Program) {\n program.on('command:*', () => {\n console.error(`\\n${ERROR_PREFIX} Неверная команда: ${chalk.red('%s')}`, program.args.join(' '))\n console.log(`Смотри ${chalk.red('--help')} для вывода доступного списка команд.\\n`)\n process.exit(1)\n })\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAKM,kBAOO;AAZb;AAAA;AAAA;AAKA,IAAM,mBAAmB,MACvB,OAAO,aAAa,cAChB,IAAI,IAAI,QAAQ,UAAU,EAAE,EAAE,OAC7B,SAAS,iBAAiB,SAAS,cAAc,QAAQ,YAAY,MAAM,WAC1E,SAAS,cAAc,MACvB,IAAI,IAAI,WAAW,SAAS,OAAO,EAAE;AAEtC,IAAM,gBAAgC,iCAAiB;AAAA;AAAA;;;ACZ9D,mBAIM;AAJN;AAAA;AAAA;AAAA;AAAA,oBAAoB;AAIpB,IAAM,SAA6B,kBAAI,UAAU,KAAK;AACtD,WAAO,SAAS,MAAM;AAAA;AAAA;;;ACLtB,IAEsB;AAFtB;AAAA;AAAA;AAAA;AAEO,IAAe,iBAAf,MAAqE;AAAA,MAC1E,YAAsB,SAA+B;AAA/B;AAAA,MAAgC;AAAA,IAExD;AAAA;AAAA;;;ACLA,IAGsB;AAHtB;AAAA;AAAA;AAAA;AAGO,IAAe,kBAAf,MAAkD;AAAA,MACvD,YAAsB,QAAiC;AAAjC;AAAA,MAAkC;AAAA,IAK1D;AAAA;AAAA;;;ACTA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,sBAEA,cACA,sBAUa;AAbb;AAAA;AAAA;AAAA;AAAA,uBAAiB;AAEjB,mBAAkB;AAClB,2BAAmB;AAUZ,IAAM,eAAN,MAAmB;AAAA,MAGxB,YAAY,SAAyB;AACnC,aAAK,UAAU,WAAY,CAAC;AAAA,MAC9B;AAAA,MAEA,MAAa,IAAI,SAAgD;AAC/D,eAAO,IAAI,QAAuB,CAAC,SAAS,WAAW;AACrD,mCAAAA,SAAO,QAAQ,QAAQ,EACpB,OAAO,QAAQ,UAAU,iBAAAC,QAAK,SAAS,QAAQ,QAAQ,CAAC,EACxD,cAAc;AAAA,YACb;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,YAEA;AAAA,YACA,GAAI,QAAQ,cAAc,CAAC;AAAA,UAC7B,CAAC,EACA,GAAG,OAAO,WAAY;AACrB,oBAAQ,QAAQ,QAAQ;AAAA,UAC1B,CAAC,EACA,GAAG,SAAS,SAAU,KAAK;AAC1B,oBAAQ,IAAI;AACZ,oBAAQ,IAAI,aAAAC,QAAM,UAAU,2BAA2B,IAAI,OAAO,CAAC;AACnE,mBAAO,GAAG;AAAA,UACZ,CAAC,EACA,IAAI;AAAA,QACT,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;ACrDA,0BAEAC,eAKa;AAPb;AAAA;AAAA;AAAA;AAAA,2BAAgC;AAEhC,IAAAA,gBAAkB;AAKX,IAAM,cAAN,MAAkB;AAAA,MAIvB,YAAY,QAAgB,SAAyB;AACnD,aAAK,SAAS;AACd,aAAK,UAAU,WAAW,EAAE,KAAK,QAAQ,IAAI,EAAE;AAAA,MACjD;AAAA,MAEA,MAAa,IACX,SACA,OAAiB,CAAC,GAClB,UAAwB,CAAC,GACzB,UAAU,OACQ;AAClB,cAAM,eAA6B;AAAA,UACjC,KAAK,KAAK,QAAQ;AAAA,UAClB,OAAO;AAAA,UACP,OAAO,UAAU,SAAS;AAAA,UAC1B,GAAG;AAAA,QACL;AACA,eAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,gBAAM,YAAsB,4BAAM,GAAG,KAAK,MAAM,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,YAAY;AACpF,cAAI,WAAW,MAAM,QAAQ;AAC3B,kBAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,QAAQ,KAAK,SAAS,EAAE,QAAQ,WAAW,EAAE,CAAC,CAAC;AAAA,UACnF;AACA,gBAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,gBAAI,SAAS,GAAG;AACd,sBAAQ,MAAM,MAAM;AAAA,YACtB,OAAO;AACL,sBAAQ,MAAM,cAAAC,QAAM,IAAI;AAAA,8JAAoC,KAAK,MAAM,IAAI,OAAO,IAAI,IAAI,GAAG,CAAC;AAC9F,qBAAO,IAAI;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAAA,MAEO,QAAQ,SAAyB;AACtC,cAAM,eAAkD;AAAA,UACtD,KAAK,KAAK,QAAQ;AAAA,UAClB,UAAU;AAAA,QACZ;AACA,mBAAO,+BAAS,GAAG,KAAK,MAAM,IAAI,OAAO,IAAI,YAAY;AAAA,MAC3D;AAAA;AAAA;AAAA;AAAA;AAAA,MAMO,eAAe,SAAyB;AAC7C,cAAM,cAAwB,CAAC,OAAO;AACtC,eAAO,GAAG,KAAK,MAAM,IAAI,YAAY,KAAK,GAAG,CAAC;AAAA,MAChD;AAAA,IACF;AAAA;AAAA;;;AC5DA,IAIa;AAJb;AAAA;AAAA;AAAA;AAAA;AAIO,IAAM,aAAN,cAAyB,YAAY;AAAA,MAC1C,YAAY,SAAyB;AACnC,cAAM,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;;;ACRA,IAIa;AAJb;AAAA;AAAA;AAAA;AAAA;AAIO,IAAM,YAAN,cAAwB,YAAY;AAAA,MACzC,YAAY,SAAyB;AACnC,cAAM,OAAO,OAAO;AAAA,MACtB;AAAA,IACF;AAAA;AAAA;;;ACRA,IAIa;AAJb;AAAA;AAAA;AAAA;AAAA;AAIO,IAAM,aAAN,cAAyB,YAAY;AAAA,MAC1C,YAAY,SAAyB;AACnC,cAAM,QAAQ,OAAO;AAAA,MACvB;AAAA,IACF;AAAA;AAAA;;;ACAA,SAAS,OAAU,OAA8B;AAC/C,SAAO,CAAC,CAAC;AACX;AAEO,SAAS,QAAQ,SAAiB;AACvC,QAAM,cAAc;AAAA,IAClB,QAAQ,YAAoB,KAAK,kBAAAC,QAAK,KAAK,SAAS,QAAQ,YAAoB,QAAQ;AAAA,IACxF,QAAQ,YAAoB,KAAK,kBAAAA,QAAK,KAAK,SAAS,QAAQ,YAAoB,EAAE;AAAA,IAClF,QAAQ,YAAoB,MAAM,SAAS,kBAAAA,QAAK,KAAK,SAAS,kBAAkB;AAAA,IAI7C,kBAAAA,QAAK,KAAK,SAAS,YAAY;AAAA,IAClE,kBAAAA,QAAK,KAAK,SAAS,MAAM;AAAA,EAC3B,EAAE,OAAO,MAAM;AAEf,cAAY,QAAQ,CAAC,eAAe;AAClC,QAAI,gBAAAC,QAAG,WAAW,UAAU,GAAG;AAC7B,+BAAAC;AAAA,YACE,cAAAC,QAAa;AAAA,UACX,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAnCA,IAAAC,mBAEA,eACA,sBACA;AAJA;AAAA;AAAA;AAAA;AAAA,IAAAA,oBAAiB;AAEjB,oBAAuC;AACvC,2BAAuC;AACvC,sBAAe;AAAA;AAAA;;;ACJf,IAEa;AAFb,IAAAC,eAAA;AAAA;AAAA;AAAA;AAEO,IAAM,QAAQ,CAACC,SAAcC,WAAkBD,QAAM,MAAM,IAAIC,MAAK,GAAG;AAAA;AAAA;;;ACF9E,IAAAC,eASM,UAIA,cAQO;AArBb;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAkB;AAElB;AACA;AACA,IAAAC;AAKA,IAAM,WAAW,CAAC,YAAoB;AACpC,aAAO,MAAM,cAAAC,QAAM,SAAS,OAAO,IAAI,cAAAA,QAAM,MAAM,GAAG;AAAA,IACxD;AAEA,IAAM,eAAe,CAAC,YAAoB;AACxC,aAAO,MAAM,cAAAA,QAAM,OAAO,OAAO,IAAI,cAAAA,QAAM,MAAM,GAAG;AAAA,IACtD;AAMO,IAAM,eAAN,MAAmB;AAAA,MAGxB,YAAY,SAAyB;AACnC,aAAK,UAAU,WAAY,CAAC;AAAA,MAC9B;AAAA,MAEA,MAAM,IAAI,QAAgB,EAAE,IAAI,GAAkB;AAChD,cAAMC,SAAQ,SAAS,IAAI,UAAU,YAAY,CAAC;AAClD,cAAM,YAAY,aAAa,IAAI,UAAU,YAAY,CAAC;AAC1D,gBAAQ,IAAIA,SAAQ,cAAAD,QAAM,KAAK,SAAS,cAAAA,QAAM,MAAM,UAAU,MAAM,CAAC,UAAU,CAAC;AAChF,YAAI,KAAK,QAAQ,SAAS;AACxB,kBAAQ,IAAIC,SAAQ,cAAAD,QAAM,KAAK,yBAAyB,CAAC;AACzD,kBAAQ,IAAI;AAAA,QACd;AACA,gBAAQ;AAAA,UACNC,SAAQ,cAAAD,QAAM,KAAK,OAAO,cAAAA,QAAM,QAAQ,sBAAsB,CAAC,OAAO,cAAAA,QAAM,OAAO,YAAoB,CAAC,EAAE;AAAA,QAC5G;AACA,gBAAQ;AAAA,UACNC,SACE,cAAAD,QAAM,KAAK,OAAO,cAAAA,QAAM,QAAQ,0BAA0B,CAAC,OAAO,cAAAA,QAAM,OAAO,QAAQ,IAAI,YAAY,CAAC,EAAE;AAAA,QAC9G;AACA,YAAI;AACF,kBAAQ,IAAIC,SAAQ,cAAAD,QAAM,KAAK,iBAAiB,CAAC;AACjD,gBAAM,WAAW,QAAQ,IAAI,IAAI;AACjC,kBAAQ,IAAI,KAAK,UAAU,UAAU,MAAM,CAAC,CAAC;AAAA,QAC/C,SAAS,KAAK;AACZ,cAAI,eAAe,OAAO;AACxB,oBAAQ,IAAI,YAAY,cAAAA,QAAM,IAAI,IAAI,OAAO,CAAC;AAC9C,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAAA,QACF;AAEA,cAAM,aAAa,IAAI,WAAW;AAElC,mBAAW,IAAI,OAAO,CAAC,YAAY,IAAI,SAAS,IAAI,MAAM,GAAG;AAAA,UAC3D,KAAK,IAAI;AAAA,UACT,KAAK,OAAO,OAAO,QAAQ,KAAK,EAAE,aAAa,IAAI,CAAC;AAAA,QACtD,CAAC;AAAA,MACH;AAAA,IACF;AAAA;AAAA;;;AC7DA,IAAAE,eACA,eAca;AAfb;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAkB;AAClB,oBAAmB;AAcZ,IAAM,gBAAN,MAAoB;AAAA,MAGzB,YAAY,SAAgC;AAC1C,aAAK,UAAU,WAAY,CAAC;AAE5B,YAAI,CAAC,SAAS,MAAO,OAAM,IAAI,MAAM,0EAA0E;AAAA,MACjH;AAAA,MAEA,MAAa,IAAI,SAAgD;AAC/D,cAAM,SAAS,cAAAC,QAAO,SAAS,QAAQ,QAAQ;AAC/C,sBAAAA,QAAO,MAAM,KAAK,SAAS,SAAS;AAEpC,YAAI;AACF,gBAAM,OAAO,OAAO,QAAQ,UAAU,QAAQ,QAAQ;AAAA,QACxD,SAAS,KAAK;AACZ,cAAI,eAAe,MAAO,SAAQ,IAAI,cAAAC,QAAM,UAAU,2CAA2C,IAAI,OAAO,CAAC;AAAA,QAC/G;AAEA,eAAO,QAAQ;AAAA,MACjB;AAAA,MAEO,UAAkB;AACvB,cAAM,IAAI,UAAU,6BAA6B;AAAA,MACnD;AAAA,IACF;AAAA;AAAA;;;ACxCA,IAUM,WAWO;AArBb;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA,IAAM,YAAY;AAAA,MAChB,gBAAW,GAAG;AAAA,MACd,kBAAY,GAAG;AAAA,MACf,kBAAY,GAAG;AAAA,MACf,gDAA2B,GAAG;AAAA,MAC9B,sBAAc,GAAG;AAAA,MACjB,wBAAe,GAAG;AAAA,IACpB;AAIO,IAAM,gBAAN,MAAoB;AAAA,MACzB,OAAc,OACZ,QACA,SACgC;AAChC,cAAM,cAAc,UAAU,MAAM;AAEpC,YAAI,CAAC,aAAa;AAChB,gBAAM,IAAI,MAAM,kBAAkB,MAAM,EAAE;AAAA,QAC5C;AAEA,eAAO,IAAI,YAAY,OAAwB;AAAA,MACjD;AAAA,IACF;AAAA;AAAA;;;AClCA;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,eACA,oBACAC,mBACA,iBAEA,kBACAC,gBACA,WAQMC,UACA,WAEO;AAlBb;AAAA;AAAA;AAAA;AAAA,gBAA2B;AAC3B,yBAA8B;AAC9B,IAAAF,oBAAiB;AACjB,sBAA8B;AAE9B,uBAAwB;AACxB,IAAAC,iBAAuC;AACvC,gBAAsB;AAEtB;AACA;AAKA,IAAMC,eAAU,kCAAc,aAAe;AAC7C,IAAM,YAAY,kBAAAC,QAAK,YAAQ,+BAAc,aAAe,CAAC;AAEtD,IAAM,UAAN,MAAM,iBAAgB,yBAAwC;AAAA,MAMnE,YAAY,gBAAwB,UAAkB;AACpD,cAAM;AAJR,sBAAS;AACT,aAAQ,cAAsC,CAAC;AAK7C,oBAAE,UAAU;AAEZ,cAAM,cAAc;AAAA,UAClB,kBAAAA,QAAK,QAAQ,cAAc;AAAA,UAC3B,kBAAAA,QAAK,QAAQ,QAAQ;AAAA,UACrB,kBAAAA,QAAK,QAAQ,WAAW,eAAe;AAAA,UACvC,kBAAAA,QAAK,QAAQ,WAAW,SAAS;AAAA,QACnC;AAEA,oBAAY,QAAQ,CAAC,eAAe;AAClC,kBAAI,sBAAW,UAAU,GAAG;AAC1B,+BAAAC,QAAa;AAAA,cACX,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,QACF,CAAC;AAED,aAAK,iBAAiB;AACtB,aAAK,WAAW;AAAA,MAClB;AAAA,MAEA,aAAa,OAAyB;AACpC,cAAM,WAAW,MAAM,OAAO,0BAA0B;AAExD,YAAI,iBAAyB;AAC7B,YAAI,WAAmB,QAAQ,IAAI;AAEnC,cAAM,eAAe,MAAM,SAAS,OAAO;AAAA,UACzC,YAAY,CAAC,wBAAwB,oBAAoB,YAAY,kBAAkB;AAAA,QACzF,CAAC;AAED,YAAI,cAAc;AAChB,2BAAiB,aAAa;AAC9B,iBAAO,KAAK,wJAAgC,cAAc,GAAG;AAAA,QAC/D,OAAO;AACL,iBAAO,KAAK,iQAAoD,cAAc,GAAG;AAAA,QACnF;AAEA,YAAI,mBAAmB,OAAO;AAC5B,qBAAW,kBAAAD,QAAK,QAAQ,cAAc,sBAAiB,EAAE,QAAQ,MAAM,CAAC;AAAA,QAC1E,WAAW,mBAAmB,QAAQ;AACpC,qBAAW,kBAAAA,QAAK,QAAQ,cAAc,wBAAkB,EAAE,QAAQ,MAAM,CAAC;AAAA,QAC3E;AAEA,eAAO,IAAI,SAAQ,gBAAgB,QAAQ;AAAA,MAC7C;AAAA,MAEA,MAAa,iBAAsF;AACjG,cAAM,qBAAqB,CAAC;AAC5B,cAAM,YAAY,MAAM,OAAO,iBAAiB;AAChD,cAAM,SAAS,MAAM,UAAU,cAAc,EAAE,KAAK,KAAK,SAAS,CAAC;AAEnE,YAAI,CAAC,QAAQ;AACX,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AACA,cAAM,EAAE,YAAY,IAAI;AAExB,cAAM,eAAe,EAAE,GAAG,YAAY,cAAc,GAAG,YAAY,gBAAgB;AAEnF,mBAAW,CAAC,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AAEjD,cAAI,KAAK,kBAAkB,IAAI,EAAG;AAClC,cAAI,SAAS,YAAY,KAAM;AAE/B,cAAI,aAA4B;AAGhC,cAAI;AACF,kBAAM,cAAcD,SAAQ,QAAQ,MAAM,EAAE,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;AACpE,yBAAa,kBAAAC,QAAK,QAAQ,WAAW;AAAA,UACvC,QAAQ;AAAA,UAER;AAGA,cAAI,CAAC,YAAY;AACf,gBAAI;AACF,2BAAa,kBAAAA,QAAK,KAAK,KAAK,UAAU,gBAAgB,IAAI;AAC1D,kBAAI,CAAE,MAAM,aAAG,WAAW,UAAU,GAAI;AACtC,uBAAO,MAAM,mCAAmC,IAAI,EAAE;AACtD;AAAA,cACF;AAAA,YACF,SAAS,OAAO;AACd,qBAAO,MAAM,uCAAuC,IAAI,KAAK,KAAK;AAClE;AAAA,YACF;AAAA,UACF;AAGA,cAAI;AACF,kBAAME,UAAS,MAAM,UAAU,cAAc,EAAE,KAAK,WAAW,CAAC;AAChE,gBAAI,CAACA,SAAQ;AACX,qBAAO,MAAM,mCAAmC,IAAI,EAAE;AACtD;AAAA,YACF;AAEA,kBAAM,EAAE,aAAAC,cAAa,MAAM,gBAAgB,IAAID;AAE/C,gBAAIC,aAAY,YAAYA,aAAY,SAAS,SAAS,oBAAoB,GAAG;AAC/E,iCAAmB,KAAK;AAAA,gBACtB,MAAM;AAAA,gBACN,SAASA;AAAA,cACX,CAAC;AAAA,YACH;AAAA,UACF,SAAS,OAAO;AACd,mBAAO,MAAM,kCAAkC,IAAI,KAAK,KAAK;AAAA,UAC/D;AAAA,QACF;AAEA,eAAO;AAAA,MACT;AAAA,MAEQ,kBAAkB,MAAuB;AAC/C,eACE,KAAK,WAAW,SAAS,KACzB,KAAK,WAAW,gBAAgB,KAChC,SAAS,kBACT,SAAS,gBACT,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,QAAQ,KACtB,KAAK,SAAS,OAAO;AAAA,MAEzB;AAAA,MAEA,cAAc,SAA0B;AACtC,aAAK,YAAY,KAAK,OAAO;AAAA,MAC/B;AAAA,MAEA,cAAc;AACZ,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;AC9JA,IAAAC,gBAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;;;ACFA,IAAa;AAAb;AAAA;AAAA;AAAA;AAAO,IAAM,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAtB,IAAAC,eAEa,cACA;AAHb;AAAA;AAAA;AAAA;AAAA,IAAAA,gBAAkB;AAEX,IAAM,eAAe,cAAAC,QAAM,MAAM,KAAK,GAAG,EAAE,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,SAAS;AACxE,IAAM,cAAc,cAAAA,QAAM,MAAM,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,QAAQ;AAAA;AAAA;;;ACH/E;AAAA;AAAA;AAAA;AAAA;AACA;AAAA;AAAA;;;ACDA,IAKa;AALb;AAAA;AAAA;AAAA;AAAA;AACA,IAAAC;AAIO,IAAM,gBAAN,cAA4B,eAA+B;AAAA,MAChE,MAAa,OAAO,SAAyB;AAC3C,cAAM,QAAQ,CAAC;AAEf,YAAI,QAAQ,IAAK,OAAM,KAAK,OAAO;AACnC,YAAI,QAAQ,QAAS,OAAM,KAAK,WAAW;AAE3C,gBAAQ,IAAI,WAAW,OAAO;AAC9B,gBAAQ,IAAI,SAAS,KAAK;AAC1B,gBAAQ,IAAI,SAAS,QAAQ,KAAK;AAElC,cAAM,SAAS,cAAc,0BAAoB;AAAA,UAC/C,SAAS,QAAQ;AAAA,QACnB,CAAC;AAED,eAAO,IAAI,IAAI,CAAC,GAAG;AAAA,UACjB,KAAK,QAAQ,IAAI;AAAA,QACnB,CAAC;AAED;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC1BA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAQsB;AARtB;AAAA;AAAA;AAAA;AAQO,IAAe,qBAAf,MAAkC;AAAA,MACvC,YAAsB,YAAoB;AAApB;AAAA,MAAqB;AAAA,MAE3C,MAAa,QAAQ,OAAe,SAAsC,aAAwB,MAAe;AAC/G;AAAA,MACF;AAAA,IAGF;AAAA;AAAA;;;ACTO,SAAS,4BAA4B,KAAa;AACvD,QAAM,0BAA0B;AAChC,QAAM,2BAA2B;AACjC,SAAO,IAAI,QAAQ,0BAA0B,OAAO,EAAE,YAAY,EAAE,QAAQ,yBAAyB,GAAG;AAC1G;AAXA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAC,mBAEAC,eACAC,kBAYa;AAfb;AAAA;AAAA;AAAA;AAAA,IAAAF,oBAAiB;AAEjB,IAAAC,gBAAkB;AAClB,IAAAC,mBAAe;AAEf;AACA;AACA;AAQO,IAAM,uBAAN,cAAmC,mBAAmB;AAAA,MAI3D,cAAc;AACZ,oDAA6B;AAJ/B,aAAQ,WAAsB,CAAC;AAC/B,aAAQ,SAAS;AAAA,MAIjB;AAAA,MAEA,MAAc,OAAO;AACnB,cAAM,iBAAiB,QAAQ,8CAA+B;AAG9D,cAAM,UAAU,QAAQ,kBAAAC,QAAK,KAAK,kBAAAA,QAAK,QAAQ,cAAc,GAAG,cAAc,CAAC;AAE/E,YAAI,CAAC,QAAQ,UAAU;AACrB,kBAAQ;AAAA,YACN,cAAAC,QAAM,IAAI,8FAA8F;AAAA,UAC1G;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,iBAAiB,kBAAAD,QAAK,KAAK,kBAAAA,QAAK,QAAQ,cAAc,GAAG,QAAQ,YAAY,EAAE;AAErF,YAAI,CAAC,iBAAAE,QAAG,WAAW,cAAc,GAAG;AAClC,kBAAQ;AAAA,YACN,cAAAD,QAAM,IAAI,uFAAuF,cAAc;AAAA,UACjH;AAAA,QACF;AAEA,YAAI;AAEF,gBAAM,iBAAiB,QAAQ,cAAc;AAC7C,eAAK,WAAW,eAAe,SAAS,IAAI,CAAC,aAAsB;AAAA,YACjE,GAAG;AAAA,YACH,MAAM,4BAA4B,QAAQ,IAAI;AAAA,UAChD,EAAE;AAAA,QACJ,QAAQ;AACN,kBAAQ,IAAI,cAAAA,QAAM,IAAI,8BAA8B,CAAC;AAAA,QACvD;AAEA,aAAK,SAAS;AAAA,MAChB;AAAA,MAEA,MAAa,WAA+B;AAC1C,YAAI,CAAC,KAAK,QAAQ;AAChB,cAAI;AACF,kBAAM,KAAK,KAAK;AAAA,UAClB,QAAQ;AAAA,UAER;AAAA,QACF;AACA,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAAA;AAAA;;;ACpEA,IAOa;AAPb;AAAA;AAAA;AAAA;AAEA;AACA;AAIO,IAAM,oBAAN,MAAwB;AAAA,MAC7B,OAAc,OAAO,YAAqD;AAGxE,YAAI,uDAAwC;AAC1C,iBAAO,IAAI,qBAAqB;AAAA,QAClC;AAEA,eAAO,IAAI,qBAAqB;AAAA,MAClC;AAAA,IACF;AAAA;AAAA;;;ACjBA,IAAAE,mBAAA;AAAA;AAAA;AAAA;AAAA;AACA;AACA;AAAA;AAAA;;;ACFA,IAAAC,eACA,mBACAC,mBASa;AAXb;AAAA;AAAA;AAAA;AAAA,IAAAD,gBAAkB;AAClB,wBAAkB;AAClB,IAAAC,oBAAgC;AAEhC,IAAAC;AACA,IAAAC;AAMO,IAAM,iBAAN,cAA6B,gBAAgC;AAAA,MAA7D;AAAA;AACL,kBAAK;AAEL,aAAQ,QAA0B,CAAC;AAAA;AAAA,MAE3B,kBAAkB;AACxB,cAAM,UAAU,IAAI,yBAAO,aAAa,qEAAc;AACtD,cAAM,MAAM,IAAI,yBAAO,SAAS,gHAAsB;AAEtD,cAAM,MAAM,IAAI,0BAAQ,KAAK;AAE7B,YACG,YAAY,0IAAiC,EAC7C,SAAS,UAAU,gFAA8B,EACjD,SAAS,cAAc,yQAAuD,EAC9E,UAAU,OAAO,EACjB,UAAU,GAAG,EACb,mBAAmB,IAAI,EACvB,mBAAmB,EACnB,OAAO,OAAO,MAAc,OAAiB,SAAyB,YAAkC;AAEvG,cAAI,CAAC,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,IAAI,GAAG;AACpD,oBAAQ,MAAM,gBAAgB;AAC9B;AAAA,UACF;AAEA,gBAAM,iBAAiB,QAAQ,aAAa,QAAQ,IAAI,GAAG,WAAW,CAAC;AAEvE,gBAAM,QAAQ,MAAM,OAAO,CAAC,SAAS,CAAC,eAAe,SAAS,IAAI,CAAC;AAEnE,cAAI,eAAe,QAAQ;AACzB,oBAAQ,QAAQ;AAAA,UAClB;AAEA,kBAAQ,QAAQ;AAEhB,gBAAM,KAAK,OAAO,OAAO,OAAO;AAAA,QAClC,CAAC;AAEH,eAAO;AAAA,MACT;AAAA,MAEQ,mBAAmB;AACzB,cAAM,MAAM,IAAI,0BAAQ,MAAM;AAE9B,YACG,YAAY,8NAA0C,EACtD,mBAAmB,EACnB,OAAO,YAAY;AAClB,gBAAM,OAAO,MAAM,KAAK,mBAAmB;AAC3C,kBAAQ;AAAA,YACN,kHAAwB,cAAAC,QAAM,KAAK,KAAK,cAAc,CAAC,CAAC;AAAA,IAAQ,KAAK,2BAA2B,IAAI;AAAA,UACtG;AAAA,QACF,CAAC;AAEH,eAAO;AAAA,MACT;AAAA,MAEA,MAAc,qBAAqB;AACjC,cAAM,OAAO,MAAM,KAAK,SAAS,KAAK,cAAc,CAAC;AACrD,aAAK,QAAQ;AACb,eAAO;AAAA,MACT;AAAA,MAEA,MAAa,KAAK,SAA+B;AAC/C,cAAM,UAAU,IAAI,0BAAQ,SAAS;AACrC,gBACG;AAAA,UACC;AAAA,UACA;AAAA;AAAA,EAA8C,cAAAA,QAAM;AAAA,YAClD;AAAA,UACF,CAAC;AAAA;AAAA;AAAA,QACH,EACC,MAAM,WAAW,EACjB,WAAW,KAAK,EAEhB,YAAY,MAAM,KAAK,iBAAiB,CAAC,EACzC,QAAQ,qHAAsB,EAC9B,WAAW,KAAK,gBAAgB,CAAC,EACjC,WAAW,KAAK,iBAAiB,CAAC,EAClC,OAAO,OAAO,YAAY;AACzB,cAAI,CAAC,WAAW,OAAO,KAAK,OAAO,EAAE,WAAW,GAAG;AACjD,oBAAQ,WAAW;AACnB;AAAA,UACF;AAEA,gBAAM,KAAK,OAAO,OAAO,OAAO;AAAA,QAClC,CAAC;AAEH,gBAAQ,WAAW,OAAO;AAAA,MAC5B;AAAA,MAEQ,2BAA2B,OAAiC;AAClE,cAAM,aAAa;AACnB,cAAM,cAAc;AAAA,UAClB,OAAO;AAAA,YACL,eAAe,WAAW,OAAO,QAAG;AAAA,YACpC,MAAM,WAAW,OAAO,QAAG;AAAA,YAC3B,YAAY;AAAA,YACZ,KAAK;AAAA,YACL,WAAW;AAAA,YACX,aAAa;AAAA,YACb,YAAY,WAAW,OAAO,QAAG;AAAA,UACnC;AAAA,UACA,MAAM,CAAC,QAAQ,aAAa;AAAA,QAC9B;AACA,cAAM,QAAqB,IAAI,kBAAAC,QAAM,WAAW;AAChD,mBAAW,QAAQ,OAAO;AACxB,gBAAM,KAAK,CAAC,cAAAD,QAAM,MAAM,KAAK,IAAI,GAAG,KAAK,WAAW,CAAC;AAAA,QACvD;AAEA,eAAO,MAAM,SAAS;AAAA,MACxB;AAAA,MAEQ,gBAAwB;AAC9B;AAAA,MACF;AAAA,MAEA,MAAc,SAAS,YAA+C;AACpE,cAAM,qBAAyC,kBAAkB,OAAO,UAAU;AAClF,aAAK,QAAQ,MAAM,mBAAmB,SAAS;AAC/C,eAAO,KAAK;AAAA,MACd;AAAA,MAEA,MAAc,mBAAoC;AAChD,cAAM,OAAO,MAAM,KAAK,mBAAmB;AAC3C,cAAM,YAAY,KAAK,MAAM,GAAG,EAAE;AAClC,eACE,kHAAwB,cAAAA,QAAM,KAAK,KAAK,cAAc,CAAC,CAAC;AAAA,IACxD,KAAK,2BAA2B,SAAS,IACzC,cAAAA,QAAM,aAAa;AAAA;AAAA,oTAA+D,IAClF,cAAAA,QAAM,YAAY,cAAc;AAAA,MAEpC;AAAA,IACF;AAAA;AAAA;;;ACjJA;AAAA;AAAA;AAAA;AAAA,IAKO;AALP;AAAA;AAAA;AAAA;AAAA;AACA;AAIA,IAAO,kBAAQ,CAAC,YAAkC;AAChD,cAAQ,cAAc,IAAI,eAAe,IAAI,cAAc,OAAO,CAAC,CAAC;AAAA,IACtE;AAAA;AAAA;;;ACGO,SAAS,sBAAsB,SAAiB,KAAqB;AAC1E,QAAM,MAAM,oBAAI,KAAK;AACrB,QAAM,OAAO,IAAI,YAAY;AAC7B,QAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,CAAC,EAAE,SAAS,GAAG,GAAG;AACxD,QAAM,MAAM,OAAO,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AACjD,QAAM,OAAO,GAAG,IAAI,GAAG,KAAK,GAAG,GAAG;AAClC,SAAO,GAAG,OAAO,SAAS,GAAG,IAAI,IAAI;AACvC;AAjBA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAE,YAesB;AAftB;AAAA;AAAA;AAAA;AAAA,IAAAA,aAAyB;AAEzB;AACA;AAYO,IAAe,iBAAf,MAA8B;AAAA,MAKnC,YAAmB,cAAsB;AAAtB;AACjB,aAAK,MAAM,QAAQ,IAAI;AACvB,aAAK,SAAS,OAAO,UAAU,YAAY;AAC3C,aAAK,WAAW;AAAA,MAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWO,sBAAsB,SAAiB,KAAqB;AACjE,eAAO,sBAAsB,SAAS,GAAG;AAAA,MAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAUO,gBAAgB,SAAkD;AACvE,cAAM,kBAAkB,gBAAK,QAAQ,SAAS,cAAc;AAE5D,YAAI,CAAC,cAAG,WAAW,eAAe,GAAG;AACnC,iBAAO;AAAA,QACT;AAEA,YAAI;AACF,gBAAM,qBAAqB,cAAG,aAAa,iBAAiB,OAAO;AACnE,iBAAO,KAAK,MAAM,kBAAkB;AAAA,QACtC,SAAS,OAAO;AACd,eAAK,OAAO,MAAM,kLAAiD,MAAgB,OAAO,EAAE;AAC5F,iBAAO;AAAA,QACT;AAAA,MACF;AAAA,IAGF;AAAA;AAAA;;;ACrBO,SAAS,0BAA0B,aAAgD;AACxF,aAAW,WAAW,cAAc;AAClC,UAAM,OAAO,YAAY,OAAO;AAChC,QAAI,CAAC,KAAM;AAEX,eAAW,WAAW,OAAO,OAAO,IAAI,GAAG;AACzC,UAAI,QAAQ,WAAW,YAAY,KAAK,QAAQ,WAAW,UAAU,GAAG;AACtE,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAiBA,eAAsB,+BACpB,aACA,SACe;AACf,MAAI,CAAC,0BAA0B,WAAW,EAAG;AAE7C,QAAM,EAAE,QAAQ,WAAW,WAAW,CAAC,GAAG,eAAe,WAAW,IAAI;AAMxE,QAAM,gBAAgB,oBAAI,IAAiC;AAE3D,aAAW,WAAW,cAAc;AAClC,UAAM,OAAO,YAAY,OAAO;AAChC,QAAI,CAAC,KAAM;AAEX,UAAM,aAAa,oBAAI,IAAoB;AAC3C,eAAW,CAAC,SAAS,IAAI,KAAK,OAAO,QAAQ,IAAI,GAAG;AAClD,UAAI,KAAK,WAAW,YAAY,GAAG;AACjC,mBAAW,IAAI,SAAS,IAAI;AAAA,MAC9B;AAAA,IACF;AAEA,QAAI,WAAW,OAAO,GAAG;AACvB,oBAAc,IAAI,SAAS,UAAU;AAAA,IACvC;AAAA,EACF;AAGA,QAAM,oBAAoB,UAAM,wCAAsB,aAAa;AAEnE,MAAI,sBAAsB,MAAM;AAC9B,UAAM,IAAI,MAAM,8IAA+C,aAAa,EAAE;AAAA,EAChF;AAEA,QAAM,eAAW,kDAAiC,iBAAiB;AASnE,QAAM,WAAW,UAAM,qDAAyB,YAAY,aAA+C;AAAA,IACzG;AAAA,EACF,CAAC;AAGD,aAAW,WAAW,cAAc;AAClC,QAAI,SAAS,OAAO,KAAK,MAAM;AAC7B,kBAAY,OAAO,IAAI,SAAS,OAAO;AAAA,IACzC;AAAA,EACF;AAOA,MAAI,WAAW,UAAU,SAAS,SAAS,GAAG;AAC5C,eAAW,WAAW,cAAc;AAClC,YAAM,OAAO,YAAY,OAAO;AAChC,UAAI,CAAC,KAAM;AAEX,YAAM,gBAAgB,cAAc,IAAI,OAAO;AAC/C,UAAI,CAAC,cAAe;AAEpB,iBAAW,WAAW,OAAO,KAAK,IAAI,GAAG;AACvC,YAAI,CAAC,SAAS,SAAS,OAAO,EAAG;AACjC,YAAI,CAAC,cAAc,IAAI,OAAO,EAAG;AAEjC,cAAM,kBAAkB,KAAK,OAAO;AAEpC,cAAM,SAAS,gBAAgB,WAAW,GAAG,IAAI,MAAM,gBAAgB,WAAW,GAAG,IAAI,MAAM;AAC/F,cAAM,cAAc,gBAAgB,MAAM,OAAO,MAAM;AACvD,aAAK,OAAO,IAAI,GAAG,MAAM,GAAG,sBAAsB,aAAa,SAAS,CAAC;AAAA,MAC3E;AAAA,IACF;AAAA,EACF;AACF;AA3JA,qBACA,4BACA,kBAUM;AAZN;AAAA;AAAA;AAAA;AAAA,sBAAiD;AACjD,iCAAyC;AACzC,uBAAsC;AAEtC;AAQA,IAAM,eAA6B,CAAC,gBAAgB,oBAAoB,sBAAsB;AAAA;AAAA;;;ACD9F,SAAS,MAAM,IAAY;AACzB,MAAI,OAAiC;AACnC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AACA,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC;AACzD;AAhBA,IACAC,YAiBa;AAlBb;AAAA;AAAA;AAAA;AACA,IAAAA,aAAgC;AAEhC;AACA;AACA;AAaO,IAAM,YAAN,cAAwB,eAAe;AAAA,MAK5C,cAAc;AACZ,cAAM,KAAK;AALb,4BAAyB,CAAC;AAC1B,mBAAc;AACd,2BAAsB;AAAA,MAItB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,MAAc,wBAAyC;AACrD,cAAM,aAAa,MAAM,0CAA+B,SAAS,EAAE,KAAK;AACxE,eAAO,iBAAiB,SAAS;AAAA,MACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAc,aAA4B;AACxC,cAAM,UAAU;AAChB,cAAM,oBAAS,OAAO;AAAA,MACxB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAc,yBAAyB,SAAiB,UAAuC;AAC7F,cAAM,wBAAwB,CAAC;AAC/B,mBAAW,OAAO,UAAU;AAC1B,gBAAM,MAAM,CAAC,OAAO,QAAQ,GAAG,OAAO,IAAI,GAAG,IAAI,YAAY;AAC7D,gBAAM,SAAS,MAAM,eAAI,GAAG;AAE5B,cAAI,CAAC,OAAO,SAAS,EAAE,KAAK,EAAE,SAAS,eAAe,GAAG;AACvD,kCAAsB,KAAK,GAAG;AAAA,UAChC;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAmBA,MAAc,gBAAgB,SAAoC;AAChE,eAAO,KAAK,0BAA0B;AAEtC,YAAI;AAEJ,YAAI;AACF,0BAAgB,MAAM,wBAAa,OAAO;AAAA,QAC5C,SAAS,OAAO;AACd,gBAAM,YAAY,OAAO,KAAK;AAE9B,cAAI,UAAU,SAAS,MAAM,GAAG;AAC9B,mBAAO,KAAK,kCAAS,OAAO,mQAA2D;AAAA,UACzF,OAAO;AACL,mBAAO,KAAK,uLAAsC,SAAS,EAAE;AAAA,UAC/D;AAEA,iBAAO,CAAC;AAAA,QACV;AAEA,cAAM,iBAAiB,cAAc,SAAS;AAC9C,eAAO,KAAK,0BAA0B,cAAc;AAEpD,YAAI;AACF,gBAAM,SAAS,KAAK,MAAM,cAAc;AAExC,cAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,mBAAO;AAAA,UACT,OAAO;AAEL,mBAAO,CAAC,MAAM;AAAA,UAChB;AAAA,QACF,QAAQ;AACN,iBAAO,MAAM,6BAA6B;AAC1C,iBAAO,CAAC;AAAA,QACV;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQQ,gBAAgB,gBAAkC;AACxD,eAAO,KAAK,aAAa,OAAO,CAAC,QAAQ;AACvC,cAAI,CAAC,IAAI,SAAS,MAAM,EAAG,QAAO;AAClC,cAAI,QAAQ,eAAgB,QAAO;AAEnC,gBAAM,oBAAoB,eAAe,MAAM,qCAAqC;AACpF,cAAI,CAAC,kBAAmB,QAAO;AAE/B,gBAAM,iBAAiB,kBAAkB,CAAC,KAAK;AAC/C,cAAI,CAAC,eAAgB,QAAO;AAE5B,iBAAO,IAAI,SAAS,cAAc;AAAA,QACpC,CAAC;AAAA,MACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAc,0BAA0B,aAAsD;AAC5F,eAAO,KAAK,2MAAgD;AAE5D,aAAK,eAAe,MAAM,KAAK,gBAAgB,YAAY,IAAI;AAC/D,cAAM,eAAe,KAAK,gBAAgB,YAAY,OAAO;AAC7D,eAAO,KAAK,yFAAwB,YAAY;AAEhD,cAAM,wBAAwB,MAAM,KAAK,yBAAyB,YAAY,MAAM,YAAY;AAChG,eAAO,KAAK,4EAA+B,qBAAqB;AAEhE,cAAM,qBAAqB,MAAM,KAAK,sBAAsB;AAE5D,mBAAW,OAAO,uBAAuB;AACvC,gBAAM,MAAM,GAAG;AACf,cAAI;AACF,gBAAI,CAAC,KAAK,KAAK;AACb,oBAAM,MAAM,CAAC,OAAO,aAAa,GAAG,YAAY,IAAI,IAAI,GAAG,IAAI,kBAAkB,EAAE;AAAA,gBACjF,CAAC,SAAS,SAAS;AAAA,cACrB;AACA,qBAAO,KAAK,wHAAmC,GAAG;AAClD,oBAAM,eAAI,GAAG;AAAA,YACf;AAAA,UACF,SAAS,OAAO;AACd,mBAAO,MAAM,KAAK;AAClB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAYA,MAAc,sBAAsB,aAAsD;AACxF,eAAO,KAAK,4IAA8B;AAC1C,aAAK,eAAe,MAAM,KAAK,gBAAgB,YAAY,IAAI;AAC/D,eAAO,KAAK,+EAAmB,KAAK,YAAY;AAEhD,cAAM,eAAe,KAAK,gBAAgB,YAAY,OAAO;AAC7D,eAAO,KAAK,gNAA2C,YAAY;AAEnE,cAAM,qBAAqB,MAAM,KAAK,sBAAsB;AAE5D,mBAAW,OAAO,cAAc;AAC9B,cAAI,CAAC,IAAI,SAAS,MAAM,EAAG;AAE3B,cAAI;AACF,kBAAM,YAAY,CAAC,OAAO,aAAa,GAAG,YAAY,IAAI,IAAI,GAAG,IAAI,kBAAkB,EAAE;AAAA,cACvF,CAAC,SAAS,SAAS;AAAA,YACrB;AACA,mBAAO,KAAK,wHAAmC,SAAS;AACxD,kBAAM,eAAI,SAAS;AAEnB,kBAAM,YAAY,CAAC,OAAO,aAAa,GAAG,YAAY,IAAI,IAAI,GAAG,IAAI,WAAW,KAAK,GAAG,EAAE;AAAA,cACxF,CAAC,SAAS,SAAS;AAAA,YACrB;AACA,mBAAO,KAAK,oIAA2B,SAAS;AAChD,kBAAM,eAAI,SAAS;AAAA,UACrB,SAAS,OAAO;AACd,mBAAO,MAAM,KAAK;AAClB;AAAA,UACF;AAEA,gBAAM,MAAM,GAAG;AAAA,QACjB;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAqBA,MAAM,OAAO,QAA0B;AACrC,eAAO,KAAK,+IAAiC,MAAM;AACnD,cAAM,aAAa,QAAQ,IAAI;AAC/B,cAAM,WAAW,gBAAK,KAAK,YAAY,OAAO,YAAY,KAAK,QAAQ;AAEvE,YAAI,CAAC,cAAG,WAAW,QAAQ,GAAG;AAC5B,iBAAO,MAAM,iEAAe,QAAQ,6EAAiB;AACrD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,cAAc,KAAK,gBAAgB,QAAQ;AAEjD,YAAI,CAAC,aAAa;AAChB,iBAAO,MAAM,+KAA6C;AAC1D,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,YAAI,OAAO,QAAQ,KAAM,MAAK,MAAM;AACpC,YAAI,OAAO,cAAe,MAAK,cAAc;AAE7C,eAAO,KAAK,kHAAwB,QAAQ;AAC5C,2BAAG,QAAQ;AAEX,eAAO,KAAK,iGAAsB;AAClC,cAAM,aAAa,MAAM,0CAA+B,SAAS,EAAE,QAAQ,MAAM,EAAE;AACnF,eAAO,KAAK,yCAAW,SAAS;AAEhC,cAAM,SAAS,OAAO,UAAU;AAChC,eAAO,KAAK,oFAAmB,MAAM;AAErC,cAAM,KAAK,WAAW;AACtB,eAAO,KAAK,mDAAgB;AAE5B,YAAI,WAAW,QAAQ;AACrB,sBAAY,UAAU,YAAY,QAAQ,SAAS,MAAM,IACrD,YAAY,UACZ,KAAK,sBAAsB,YAAY,SAAS,SAAS;AAAA,QAC/D;AAEA,oBAAY,MAAM;AAClB,eAAO,KAAK,8EAAkB,YAAY,OAAO;AAEjD,YAAI,YAAY,WAAW,YAAY,QAAQ,aAAa;AAC1D,sBAAY,UAAU;AAAA,YACpB,aAAa,YAAY,QAAQ;AAAA,UACnC;AAAA,QACF,OAAO;AACL,sBAAY,UAAU,CAAC;AAAA,QACzB;AAEA,YAAI,YAAY,iBAAiB;AAC/B,iBAAO,YAAY;AAAA,QACrB;AAKA,YAAI,0BAA0B,WAAW,GAAG;AAC1C,iBAAO,KAAK,mPAA+D;AAM3E,cAAI,OAAO,mBAAmB,QAAQ;AACpC,mBAAO;AAAA,cACL,0aAC8B,OAAO,kBAAkB,qEAAc;AAAA,YAEvE;AACA,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAEA,gBAAM,iBAAiB,MAAM,6CAAkC,SAAS,EAAE,KAAK;AAE/E,gBAAM,mBAAmB,OAAO,WAAW,OAAO,SAAS,MAAM,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI;AAE7F,gBAAM,+BAA+B,aAAa;AAAA,YAChD,UAAU;AAAA,YACV;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,CAAC;AAED,iBAAO,KAAK,iKAA8C,WAAW;AAAA,QACvE;AAEA,eAAO,KAAK,mFAA4B,WAAW;AAEnD,cAAM,cAAG,UAAU,gBAAgB,aAAa;AAAA,UAC9C,QAAQ;AAAA,QACV,CAAC;AAED,cAAM,MAAM;AAAA,UACV,OAAO,kBAAkB;AAAA,UACzB;AAAA,UACA;AAAA,UACA,SAAS,MAAM;AAAA,UACf,KAAK;AAAA,UACL,KAAK;AAAA,QACP,EAAE,OAAO,CAAC,SAAS,SAAS,EAAE;AAC9B,eAAO,KAAK,qIAA4B,GAAG;AAE3C,cAAM,eAAI,GAAG;AAEb,YAAI,WAAW,QAAQ;AACrB,gBAAM,KAAK,0BAA0B,WAAW;AAAA,QAClD,OAAO;AACL,gBAAM,KAAK,sBAAsB,WAAW;AAAA,QAC9C;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC3WA,IAAAC,YAOa;AAPb;AAAA;AAAA;AAAA;AAAA,IAAAA,aAA4B;AAE5B;AACA;AAIO,IAAM,WAAN,cAAuB,eAAe;AAAA,MAC3C,cAAc;AACZ,cAAM,IAAI;AAAA,MACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAOA,YAA+B;AAC7B,cAAM,EAAE,gBAAgB,IAAI,QAAQ;AAEpC,YAAI,oBAAoB,SAAU,QAAO;AAEzC,eAAO;AAAA,MACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,iBAAiB,UAA0C;AACzD,eAAO,SACJ,OAAO,OAAO,EACd,KAAK,gBAAK,MAAM,GAAG,EACnB,QAAQ,WAAW,gBAAK,MAAM,GAAG,EACjC,QAAQ,OAAO,EAAE;AAAA,MACtB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAWA,MAAM,KAAK,UAAkB,QAAgB,WAAoB,OAAiC;AAChG,cAAM,MAAM,CAAC,UAAU,QAAQ,QAAQ;AAEvC,YAAI,WAAW;AACb,cAAI,KAAK,YAAY,MAAM,IAAI,SAAS,EAAE;AAAA,QAC5C,OAAO;AACL,cAAI,KAAK,YAAY,MAAM,GAAG;AAAA,QAChC;AAEA,YAAI,OAAO;AACT,cAAI,KAAK,GAAG,KAAK;AAAA,QACnB;AAEA,eAAO,KAAK,8EAAkB,GAAG;AAEjC,cAAM,eAAI,GAAG;AAEb,eAAO,KAAK,qIAA4B,GAAG;AAAA,MAC7C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAQA,iBAAiB,SAA6E;AAC5F,cAAM,YAAY,QAAQ,aAAa,QAAQ,IAAI,cAAc,QAAQ,IAAI;AAC7E,cAAM,YAAY,QAAQ,aAAa,QAAQ,IAAI,cAAc,QAAQ,IAAI;AAE7E,YAAI,CAAC,aAAa,CAAC,WAAW;AAC5B,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AAEA,eAAO,EAAE,WAAW,UAAU;AAAA,MAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAsBA,MAAM,OAAO,QAAyB;AACpC,eAAO,KAAK,kMAAuC,MAAM;AACzD,cAAM,EAAE,OAAO,IAAI,QAAQ;AAE3B,YAAI,WAAW;AAEf,YAAI;AACF,gBAAM,cAAc,KAAK,iBAAiB,MAAM;AAChD,sBAAY,YAAY;AACxB,sBAAY,YAAY;AAAA,QAC1B,SAAS,OAAO;AACd,cAAI,iBAAiB,OAAO;AAC1B,mBAAO,MAAM,MAAM,SAAS,CAAC;AAAA,UAC/B,OAAO;AACL,mBAAO,MAAM,KAAK;AAAA,UACpB;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,WAAW,gBAAK,KAAK,QAAQ,IAAI,GAAG,OAAO,YAAY,KAAK,QAAQ;AAE1E,YAAI,CAAC,cAAG,WAAW,QAAQ,GAAG;AAC5B,iBAAO,MAAM,iEAAe,QAAQ,6EAAiB;AACrD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,SAAS,OAAO,UAAU;AAEhC,YAAI,CAAC,QAAQ;AACX,iBAAO,MAAM,oGAAoB;AACjC,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,eAAO,KAAK,mCAAU,MAAM;AAE5B,cAAM,cAAc,KAAK,gBAAgB,QAAQ;AAEjD,cAAM,aAAa,CAAC;AAEpB,YAAI,aAAa;AACf,gBAAM,aAAa,MAAM,0CAA+B,SAAS,EAAE,QAAQ,MAAM,EAAE;AACnF,iBAAO,KAAK,yCAAW,SAAS;AAEhC,cAAI,OAAO,aAAa;AACtB,wBAAY,OAAO,OAAO;AAAA,UAC5B;AAEA,gBAAM,SAAS,OAAO,UAAU,KAAK,UAAU;AAC/C,iBAAO,KAAK,oFAAmB,MAAM;AAErC,cAAI,WAAW,QAAQ;AACrB,wBAAY,UAAU,YAAY,QAAQ,SAAS,MAAM,IACrD,YAAY,UACZ,KAAK,sBAAsB,YAAY,SAAS,SAAS;AAAA,UAC/D;AACA,iBAAO,KAAK,8EAAkB,YAAY,OAAO;AAEjD,sBAAY,MAAM;AAElB,cAAI,YAAY,WAAW,YAAY,QAAQ,aAAa;AAC1D,wBAAY,UAAU;AAAA,cACpB,aAAa,YAAY,QAAQ;AAAA,YACnC;AAAA,UACF,OAAO;AACL,wBAAY,UAAU,CAAC;AAAA,UACzB;AAEA,iBAAO,KAAK,mFAA4B,WAAW;AAEnD,gBAAM,cAAG,UAAU,gBAAK,QAAQ,UAAU,cAAc,GAAG,aAAa;AAAA,YACtE,QAAQ;AAAA,UACV,CAAC;AAED,qBAAW;AAAA,YACT,KAAK,cAAc,OAAO,WAAW,YAAY,MAAM,YAAY,OAAO;AAAA,YAC1E,KAAK,cAAc,OAAO,WAAW,YAAY,MAAM,MAAM;AAAA,UAC/D;AAAA,QACF,OAAO;AACL,iBAAO,KAAK,+KAA6C;AAEzD,cAAI,OAAO,WAAW;AACpB,uBAAW,KAAK,OAAO,SAAS;AAAA,UAClC;AAAA,QACF;AAEA,eAAO,KAAK,wHAAyB,UAAU;AAE/C,qBAAE,IAAI,8BAA8B;AACpC,qBAAE,IAAI,kCAAkC;AACxC,qBAAE,IAAI,uCAAuC;AAC7C,qBAAE,IAAI,2CAA2C;AACjD,qBAAE,IAAI,kCAAkC,OAAO,YAAY;AAC3D,qBAAE,IAAI,gCAAgC,OAAO,UAAU;AAEvD,cAAM,YAAY,CAAC,YAAY;AAE/B,YAAI,OAAO,QAAS,WAAU,KAAK,KAAK;AAExC,YAAI,OAAO,KAAK;AACd,oBAAU,KAAK,WAAW;AAAA,QAC5B;AAEA,YAAI,CAAC,WAAW,QAAQ;AACtB,gBAAM,KAAK,KAAK,UAAU,QAAQ,QAAW,SAAS;AACtD,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,QAAQ;AAAA,UACZ,WAAW,IAAI,CAAC,cAAc;AAC5B,mBAAO,KAAK,KAAK,UAAU,QAAQ,WAAW,SAAS;AAAA,UACzD,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;AC7NA,IAOa;AAPb,IAAAC,eAAA;AAAA;AAAA;AAAA;AAAA,IAAAC;AACA;AACA;AAKO,IAAM,eAAN,cAA2B,eAA8B;AAAA,MAC9D,MAAa,OAAO,QAAuB;AACzC,YAAI;AAEJ,gBAAQ,OAAO,UAAU;AAAA,UACvB,KAAK;AACH,uBAAW,IAAI,UAAU;AACzB;AAAA,UACF,KAAK;AACH,uBAAW,IAAI,SAAS;AACxB;AAAA,UACF;AACE,kBAAM,IAAI,MAAM,gCAAgC,OAAO,QAAQ,EAAE;AAAA,QACrE;AAEA,cAAM,SAAS,OAAO,MAAM;AAAA,MAC9B;AAAA,IACF;AAAA;AAAA;;;ACxBA,IAAAC,mBAOa;AAPb,IAAAC,gBAAA;AAAA;AAAA;AAAA;AAAA,IAAAD,oBAAgC;AAEhC,IAAAE;AAKO,IAAM,gBAAN,cAA4B,gBAA+B;AAAA,MAA3D;AAAA;AACL,kBAAK;AAAA;AAAA,MACL,MAAa,KAAK,SAA+B;AAC/C,cAAM,gBAAgB,IAAI,0BAAQ,QAAQ,EAAE,YAAY,6FAAkB;AAE1E,cAAM,eAAe,IAAI,yBAAO,qBAAqB,+DAAuB,EACzE,QAAQ,CAAC,QAAQ,QAAQ,CAAC,EAC1B,QAAQ,MAAM;AACjB,cAAM,iBAAiB,IAAI,yBAAO,sBAAsB,qRAAoD;AAC5G,cAAM,YAAY,IAAI,yBAAO,SAAS,uKAAgC,EAAE,QAAQ,KAAK;AACrF,cAAM,gBAAgB,IAAI,yBAAO,aAAa,4HAAwB,EAAE,QAAQ,KAAK;AAErF,cAAM,YAAY,IAAI,0BAAQ,IAAI,EAC/B,YAAY,yJAAiC,EAC7C,OAAO,mBAAmB,4JAA+B,EACzD,OAAO,yBAAyB,+GAAoC,EACpE,OAAO,sBAAsB,uKAAgC,EAC7D,OAAO,mBAAmB,yCAAW,EACrC,OAAO,oBAAoB,aAAa,EACxC,OAAO,OAAO,WAAW;AACxB,gBAAM,KAAK,OAAO,OAAO,EAAE,GAAG,QAAQ,UAAU,KAAK,CAAC;AAAA,QACxD,CAAC;AAEH,kBAAU,UAAU,YAAY;AAChC,kBAAU,UAAU,cAAc;AAClC,kBAAU,UAAU,SAAS;AAC7B,kBAAU,UAAU,aAAa;AAEjC,cAAM,sBAAsB,IAAI,yBAAO,qBAAqB,mMAAwC;AACpG,cAAM,iBAAiB,IAAI;AAAA,UACzB;AAAA,UACA;AAAA,QACF;AAEA,cAAM,aAAa,IAAI,0BAAQ,KAAK,EAAE,YAAY,sFAAqB,EAAE,OAAO,OAAO,WAAW;AAChG,gBAAM,KAAK,OAAO,OAAO,EAAE,GAAG,QAAQ,gBAAgB,QAAQ,gBAAgB,UAAU,MAAM,CAAC;AAAA,QACjG,CAAC;AAED,mBAAW,UAAU,YAAY;AACjC,mBAAW,UAAU,cAAc;AACnC,mBAAW,UAAU,SAAS;AAC9B,mBAAW,UAAU,aAAa;AAClC,mBAAW,UAAU,mBAAmB;AACxC,mBAAW,UAAU,cAAc;AAEnC,sBAAc,WAAW,SAAS;AAClC,sBAAc,WAAW,UAAU;AAEnC,gBAAQ,WAAW,aAAa;AAAA,MAClC;AAAA,IACF;AAAA;AAAA;;;ACzDA;AAAA;AAAA;AAAA;AAAA,IAKO;AALP;AAAA;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAIA,IAAO,iBAAQ,CAAC,YAAkC;AAChD,cAAQ,cAAc,IAAI,cAAc,IAAI,aAAa,OAAO,CAAC,CAAC;AAAA,IACpE;AAAA;AAAA;;;ACPA,eAEAC,eACA,iBACA,0BACAC,YAKa;AAVb,IAAAC,eAAA;AAAA;AAAA;AAAA;AAAA,gBAAkC;AAElC,IAAAF,gBAAkB;AAClB,sBAAyB;AACzB,+BAAyB;AACzB,IAAAC,aAAkB;AAElB;AACA,IAAAE;AAEO,IAAM,aAAN,cAAyB,eAAe;AAAA,MAC7C,MAAa,SAAS;AACpB,aAAK,cAAc;AACnB,cAAM,KAAK,yBAAyB;AAAA,MACtC;AAAA,MAEQ,gBAAgB;AACtB,gBAAQ,KAAK,cAAAC,QAAM,IAAI,MAAM,CAAC;AAAA,MAChC;AAAA,MAEA,MAAc,2BAA0C;AACtD,cAAM,SAAS,MAAM,OAAO,SAAS;AACrC,gBAAQ,KAAK,cAAAA,QAAM,MAAM,sBAAsB,CAAC;AAChD,gBAAQ,KAAK,oBAAoB,cAAAA,QAAM,KAAK,OAAO,YAAQ,oBAAS,OAAG,mBAAQ,CAAC,CAAC,CAAC;AAClF,gBAAQ,KAAK,oBAAoB,cAAAA,QAAM,KAAK,QAAQ,OAAO,CAAC;AAC5D,cAAM,QAAQ,MAAM;AACpB,gBAAQ,KAAK,iBAAiB,MAAM,SAAS,CAAC;AAC9C,gBAAQ,KAAK,kBAAkB,cAAAA,QAAM,KAAK,QAAQ,IAAI,YAAY,CAAC;AACnE,YAAI,MAAM,SAAS,EAAE,SAAS,KAAK,GAAG;AACpC,kBAAQ,KAAK,aAAa,cAAAA,QAAM,KAAK,QAAQ,IAAI,OAAO,CAAC;AAAA,QAC3D;AACA,gBAAQ,IAAI;AACZ,cAAM,YAAY,UAAM,8BAAI;AAC5B,cAAM,YAAY,UAAM,8BAAI;AAC5B,gBAAQ,KAAK,eAAe,cAAAA,QAAM,KAAK,GAAG,UAAU,MAAM,IAAI,UAAU,KAAK,EAAE,CAAC;AAChF,gBAAQ,KAAK,iBAAiB,cAAAA,QAAM,KAAK,UAAU,KAAK,CAAC;AACzD,gBAAQ,KAAK,cAAc,cAAAA,QAAM,KAAK,GAAG,UAAU,KAAK,KAAK,CAAC;AAC9D,gBAAQ,KAAK,WAAW,cAAAA,QAAM,KAAK,OAAG,0BAAS,UAAU,KAAK,CAAC,EAAE,CAAC;AAClE,gBAAQ,KAAK,gBAAgB,cAAAA,QAAM,KAAK,OAAG,0BAAS,UAAU,IAAI,CAAC,EAAE,CAAC;AACtE,gBAAQ,KAAK,gBAAgB,cAAAA,QAAM,KAAK,OAAG,0BAAS,UAAU,IAAI,CAAC,EAAE,CAAC;AACtE,gBAAQ,KAAK,qBAAqB,cAAAA,QAAM,KAAK,OAAG,0BAAS,UAAU,SAAS,CAAC,EAAE,CAAC;AAAA,MAClF;AAAA,MAEA,SAAS,MAAc,QAAwB;AAC7C,eAAO,KAAK,SAAS,QAAQ;AAE3B,iBAAO,KAAK,OAAO,GAAG;AAAA,QACxB;AACA,eAAO;AAAA,MACT;AAAA,IACF;AAAA;AAAA;;;AClDA,IAIa;AAJb,IAAAC,gBAAA;AAAA;AAAA;AAAA;AAAA,IAAAC;AAIO,IAAM,cAAN,cAA0B,gBAAgB;AAAA,MAA1C;AAAA;AACL,kBAAK;AAAA;AAAA,MACL,MAAa,KAAK,SAAkB;AAClC,gBACG,QAAQ,MAAM,EACd,MAAM,GAAG,EACT,YAAY,2EAAe,EAC3B,OAAO,YAAY;AAClB,gBAAM,KAAK,OAAO,OAAO;AAAA,QAC3B,CAAC;AAAA,MACL;AAAA,IACF;AAAA;AAAA;;;ACfA;AAAA;AAAA;AAAA;AAAA,IAKO;AALP;AAAA;AAAA;AAAA;AAAA,IAAAC;AACA,IAAAC;AAIA,IAAO,eAAQ,CAAC,YAAkC;AAChD,cAAQ,cAAc,IAAI,YAAY,IAAI,WAAW,OAAO,CAAC,CAAC;AAAA,IAChE;AAAA;AAAA;;;ACPA,IAAAC,YACAC,mBAEAC,eACA,qBACAC,oBACAC,kBACA,aAiBa;AAxBb,IAAAC,eAAA;AAAA;AAAA;AAAA;AAAA,IAAAL,aAAe;AACf,IAAAC,oBAAiB;AAEjB,IAAAC,gBAAkB;AAClB,0BAAmC;AACnC,IAAAC,qBAAkB;AAClB,IAAAC,mBAAyB;AACzB,kBAAqB;AAErB;AACA,IAAAE;AAcO,IAAM,iBAAN,cAA6B,eAAgC;AAAA,MAA7D;AAAA;AAoIL,aAAQ,mBAAmB,CAAC,YAA4B;AACtD,gBAAM,UAAU,QAAQ,OAAO,CAAC,SAAS,KAAK,WAAW,IAAI;AAC7D,gBAAM,SAAS,QAAQ,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK;AAC7D,gBAAM,aAAa;AACnB,gBAAM,QAAQ,IAAI,mBAAAC,QAAM;AAAA,YACtB,OAAO;AAAA,cACL,eAAe,WAAW,OAAO,QAAG;AAAA,cACpC,MAAM,WAAW,OAAO,QAAG;AAAA,cAC3B,YAAY;AAAA,cACZ,KAAK;AAAA,cACL,WAAW;AAAA,cACX,aAAa;AAAA,cACb,YAAY,WAAW,OAAO,QAAG;AAAA,YACnC;AAAA,YACA,MAAM,CAAC,gEAAc,6EAAiB,mGAAmB;AAAA,UAC3D,CAAC;AAED,gBAAM,cAAc,QAAQ,OAAO,CAAC,KAAK,SAAS;AAChD,gBAAI,KAAK,kBAAkB,KAAK,iBAAiB;AAE/C,qBAAO,KAAK,eAAe,OAAO,KAAK,gBAAgB;AAAA,YACzD;AACA,mBAAO;AAAA,UACT,GAAG,CAAC;AAEJ,gBAAM,YAAY,eAAe,IAAI,MAAM;AAE3C,gBAAM,KAAK;AAAA,YACT,cAAAC,QAAM,YAAY,QAAQ,MAAM;AAAA,YAChC,cAAAA,QAAM,UAAU,OAAO,MAAM;AAAA,YAC7B,eAAe,IACX,cAAAA,QAAM,YAAY,GAAG,SAAS,OAAG,2BAAS,WAAW,CAAC,EAAE,IACxD,cAAAA,QAAM,UAAU,GAAG,SAAS,OAAG,2BAAS,KAAK,IAAI,WAAW,CAAC,CAAC,EAAE;AAAA,UACtE,CAAC;AAED,iBAAO,MAAM,SAAS;AAAA,QACxB;AAAA;AAAA,MAvKA,MAAa,OAAO,SAA0B,aAAuB,CAAC,GAAG;AACvE,cAAM,YAAY,UAAM,kBAAK,kBAAAC,QAAK,KAAK,QAAQ,IAAI,GAAG,QAAQ,QAAS,GAAG,EAAE,QAAQ,kBAAkB,CAAC;AAEvG,gBAAQ,IAAI,cAAAD,QAAM,MAAM,8CAAW,cAAAA,QAAM,MAAM,UAAU,MAAM,CAAC,yIAA2B,CAAC;AAC5F,gBAAQ;AAAA,UACN,cAAAA,QAAM,aAAa,0UAAiE,cAAAA,QAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,QAC7G;AAEA,YAAI,QAAQ,KAAM,SAAQ,IAAI,SAAS;AAEvC,cAAM,WAAW,MAAM,OAAO,UAAU;AAExC,cAAM,UAAU,MAAM,SAAS,QAAQ,OAAO;AAAA,UAC5C;AAAA,YACE,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,OAAO,EAAE;AAAA,cACxB,EAAE,MAAM,MAAM,OAAO,EAAE;AAAA,YACzB;AAAA,YACA,SAAS;AAAA,YACT,SAAS;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,CAAC,QAAQ,SAAU;AAEvB,gBAAQ,IAAI;AACZ,cAAM,MAAM,IAAI,8BAAU,EAAE,KAAK,GAAG,GAAG,4BAAQ,cAAc;AAC7D,YAAI,MAAM,UAAU,QAAQ,CAAC;AAE7B,cAAM,KAAK,MAAM,OAAO,WAAW;AAEnC,cAAM,WAAW,UAAU,IAAI,OAAO,aAAa;AAGjD,gBAAM,WAAW,MAAM,GAAG,iBAAiB,QAAQ;AACnD,cAAI,CAAC;AACH,mBAAO;AAAA,cACL,iBAAiB;AAAA,cACjB,gBAAgB;AAAA,cAChB,QAAQ;AAAA,YACV;AAEF,gBAAM,EAAE,KAAK,IAAI;AAEjB,cAAI;AAEJ,gBAAM,aAAa,QAAQ,UACvB,WACA,kBAAAC,QAAK,KAAK,kBAAAA,QAAK,QAAQ,QAAQ,GAAG,GAAG,QAAQ,UAAU,EAAE,GAAG,kBAAAA,QAAK,SAAS,QAAQ,CAAC,EAAE;AAEzF,kBAAQ,MAAM;AAAA,YACZ,KAAK;AAAA,YACL,KAAK;AACH,uBAAS,cAAc,gCAAuB;AAAA,gBAC5C,OAAO,QAAQ,IAAI,kBAAkB;AAAA,gBACrC,SAAS;AAAA,cACX,CAAC;AACD;AAAA,YACF,KAAK;AACH,uBAAS,cAAc,8BAAsB;AAAA,gBAC3C,SAAS;AAAA,cACX,CAAC;AACD;AAAA,YACF;AACE,sBAAQ,IAAI,cAAAD,QAAM,aAAa,6BAA6B,cAAAA,QAAM,MAAM,QAAQ,CAAC,EAAE,CAAC;AAAA,UACxF;AAEA,cAAI,CAAC,QAAQ;AACX,mBAAO;AAAA,cACL,iBAAiB;AAAA,cACjB,gBAAgB;AAAA,cAChB,QAAQ;AAAA,YACV;AAAA,UACF;AAEA,cAAI;AACF,kBAAM,aAAa,WAAAE,QAAG,SAAS,QAAQ;AACvC,kBAAM,OAAO,IAAI;AAAA,cACf;AAAA,cACA,QAAQ;AAAA,cACR;AAAA,YACF,CAAC;AACD,kBAAM,YAAY,WAAAA,QAAG,SAAS,UAAU;AAExC,mBAAO;AAAA,cACL,iBAAiB;AAAA,cACjB,iBAAiB;AAAA,cACjB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,QAAQ;AAAA,YACV;AAAA,UACF,SAAS,KAAK;AACZ,mBAAO;AAAA,cACL,iBAAiB;AAAA,cACjB,gBAAgB;AAAA,cAChB;AAAA,cACA,QAAQ;AAAA,YACV;AAAA,UACF,UAAE;AACA,gBAAI,UAAU;AAAA,UAChB;AAAA,QACF,CAAC;AAED,YAAI;AACF,gBAAM,SAAS,MAAM,QAAQ,IAAI,QAAQ;AACzC,cAAI,KAAK;AACT,kBAAQ,IAAI;AACZ,eAAK,YAAY,MAAM;AAAA,QACzB,SAAS,KAAK;AACZ,cAAI,KAAK;AACT,kBAAQ,IAAI;AACZ,kBAAQ,IAAI,cAAAF,QAAM,UAAU,+HAA2B,GAAG,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,MAEQ,YAAY,QAAwB;AAC1C,cAAM,cAAc,KAAK,iBAAiB,MAAM;AAChD,gBAAQ,IAAI,WAAW;AACvB,aAAK,qBAAqB,MAAM;AAAA,MAClC;AAAA,MAEQ,qBAAqB,SAAyB;AACpD,cAAM,SAAS,QAAQ,OAAO,CAAC,SAAS,KAAK,WAAW,KAAK;AAC7D,YAAI,OAAO,SAAS,GAAG;AACrB,kBAAQ,IAAI,cAAAA,QAAM,UAAU,gKAA8B,CAAC;AAC3D,kBAAQ,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,cAAc,CAAC;AAAA,QACvD;AAAA,MACF;AAAA,IAuCF;AAAA;AAAA;;;ACjMA,IAAAG,gBAOa;AAPb,IAAAC,gBAAA;AAAA;AAAA;AAAA;AAAA,IAAAD,iBAAkB;AAElB,IAAAE;AAKO,IAAM,kBAAN,cAA8B,gBAAiC;AAAA,MAA/D;AAAA;AACL,kBAAK;AAAA;AAAA,MAEL,MAAa,KAAK,SAA+B;AAC/C,gBACG,QAAQ,iCAAiC,EACzC,MAAM,KAAK,EACX,OAAO,cAAc,8MAAyC,KAAK,EACnE,OAAO,iBAAiB,8HAA0B,KAAK,EACvD,OAAO,gBAAgB,wMAAwC,IAAI,EACnE,YAAY,wIAAoC,EAChD,OAAO,OAAOC,QAAc,YAAsB,WAAW;AAC5D,cAAI,CAACA,QAAM;AACT,oBAAQ,IAAI,eAAAC,QAAM,OAAO,wNAA8C,CAAC;AACxE,oBAAQ,KAAK,CAAC;AAAA,UAChB;AAEA,gBAAM,KAAK,OAAO;AAAA,YAChB;AAAA,cACE,UAAUD;AAAA,cACV,MAAM,OAAO;AAAA,cACb,QAAQ,OAAO;AAAA,cACf,SAAS,OAAO;AAAA,YAClB;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACL;AAAA,IACF;AAAA;AAAA;;;ACnCA;AAAA;AAAA;AAAA;AAAA,IAKO;AALP;AAAA;AAAA;AAAA;AAAA,IAAAE;AACA,IAAAC;AAIA,IAAO,mBAAQ,CAAC,YAAkC;AAChD,cAAQ,cAAc,IAAI,gBAAgB,IAAI,eAAe,OAAO,CAAC,CAAC;AAAA,IACxE;AAAA;AAAA;;;ACPA;AACA,IAAAC,iBAAkB;;;ACDlB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,UAAY;AAAA,EACZ,MAAQ;AAAA,EACR,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,SAAW;AAAA,EACX,QAAU;AAAA,EACV,aAAe;AAAA,IACb;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,MACT,MAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,MAAQ;AAAA,EACR,SAAW;AAAA,IACT,gBAAgB;AAAA,IAChB,KAAK;AAAA,MACH,OAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,KAAO;AAAA,IACL,WAAW;AAAA,IACX,KAAO;AAAA,EACT;AAAA,EACA,SAAW;AAAA,IACT,oEAAoE;AAAA,IACpE,OAAS;AAAA,IACT,WAAa;AAAA,IACb,aAAa;AAAA,IACb,qEAAqE;AAAA,IACrE,QAAU;AAAA,IACV,mEAAmE;AAAA,IACnE,cAAc;AAAA,IACd,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,mEAAmE;AAAA,IACnE,MAAQ;AAAA,IACR,cAAc;AAAA,EAChB;AAAA,EACA,cAAgB;AAAA,IACd,mBAAmB;AAAA,IACnB,yBAAyB;AAAA,IACzB,6BAA6B;AAAA,IAC7B,iCAAiC;AAAA,IACjC,oBAAoB;AAAA,IACpB,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,WAAa;AAAA,IACb,QAAU;AAAA,IACV,iBAAiB;AAAA,IACjB,aAAa;AAAA,IACb,UAAY;AAAA,IACZ,iBAAiB;AAAA,IACjB,YAAY;AAAA,IACZ,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,WAAW;AAAA,IACX,4BAA4B;AAAA,IAC5B,mBAAmB;AAAA,IACnB,mBAAqB;AAAA,IACrB,QAAU;AAAA,IACV,KAAO;AAAA,IACP,YAAc;AAAA,IACd,MAAQ;AAAA,IACR,IAAM;AAAA,EACR;AAAA,EACA,iBAAmB;AAAA,IACjB,0BAA0B;AAAA,IAC1B,4BAA4B;AAAA,IAC5B,8BAA8B;AAAA,IAC9B,0BAA0B;AAAA,IAC1B,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,mBAAmB;AAAA,IACnB,wBAAwB;AAAA,IACxB,MAAQ;AAAA,IACR,QAAU;AAAA,EACZ;AACF;;;ADxFA;AACAC;;;AELA;AAAA,qBAAqC;AACrC,sBAAwB;AACxB,IAAAC,sBAA8B;AAC9B,IAAAC,oBAAiB;AACjB,IAAAC,mBAA8B;AAE9B,IAAAC,iBAAkB;AAClB,IAAAC,mBAA2B;AAE3B;AACA;AAKA,IAAMC,OAAM,OAAO,UAAU,gBAAgB;AAE7C,IAAMC,eAAU,mCAAc,aAAe;AAC7C,IAAMC,aAAY,kBAAAC,QAAK,YAAQ,gCAAc,aAAe,CAAC;AAEtD,IAAM,iBAAN,MAAM,eAAc;AAAA,EAGzB,aAAoB,KAAK,SAA8C;AACrE,QAAI,MAAuC;AACzC,YAAM,KAAK,wBAAwB,OAAO;AAAA,IAC5C,OAAO;AACL,YAAM,KAAK,yBAAyB,OAAO;AAAA,IAC7C;AAEA,UAAM,QAAQ,IAAI,QAAQ,YAAY,EAAE,IAAI,OAAO,YAAY,MAAM,QAAQ,KAAK,OAAO,CAAC,CAAC;AAC3F,SAAK,qBAAqB,OAAO;AAAA,EACnC;AAAA,EAEA,aAAa,wBAAwB,SAA+B;AAClE,QAAI;AACF,iBAAW,CAAC,aAAa,YAAY,KAAK,OAAO,QAAQ;AAAA,QACnD,SAAS,MAAM;AAAA,QACzB,QAAQ,MAAM;AAAA,QACd,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,MACR,CAAC,GAAG;AACN,YAAI;AACF,UAAAH,KAAI,MAAM,gGAAqB,eAAAI,QAAM,KAAK,WAAW,CAAC,EAAE;AACxD,gBAAMC,UAAS,MAAM,aAAa;AAClC,UAAAA,QAAO,QAAQ,OAAO;AAAA,QACxB,SAAS,KAAK;AACZ,UAAAL,KAAI,MAAM,kJAA+B,WAAW,MAAM,GAAG;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,MAAAA,KAAI,MAAM,oKAAkC,GAAG;AAAA,IACjD;AAEA,QAAI;AACF,YAAM,KAAK,YAAY,OAAO;AAAA,IAChC,SAAS,KAAK;AACZ,MAAAA,KAAI,MAAM,4IAA8B,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,aAAa,yBAAyB,SAA+B;AACnE,QAAI,CAAE,UAAM,6BAAW,eAAc,aAAa,GAAI;AACpD,MAAAA,KAAI,MAAM,gLAAoC,eAAc,aAAa,EAAE;AAC3E;AAAA,IACF;AAEA,QAAI;AACF,YAAM,YAAY,MAAM,KAAK,aAAa,eAAc,aAAa;AACrE,iBAAW,eAAe,WAAW;AACnC,YAAI;AACF,UAAAA,KAAI,MAAM,gGAAqB,eAAAI,QAAM,KAAK,WAAW,CAAC,EAAE;AACxD,gBAAM,aAAa,kBAAAD,QAAK,KAAK,eAAc,eAAe,WAAW;AAErE,gBAAME,UAASJ,SAAQ,UAAU;AACjC,UAAAI,QAAO,QAAQ,OAAO;AAAA,QACxB,SAAS,KAAK;AACZ,UAAAL,KAAI,MAAM,kJAA+B,WAAW,MAAM,GAAG;AAAA,QAC/D;AAAA,MACF;AAAA,IACF,SAAS,KAAK;AACZ,MAAAA,KAAI,MAAM,wJAAgC,GAAG;AAAA,IAC/C;AAEA,QAAI;AACF,YAAM,KAAK,YAAY,OAAO;AAAA,IAChC,SAAS,KAAK;AACZ,MAAAA,KAAI,MAAM,4IAA8B,GAAG;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,OAAe,cAAc,aAA4C;AACvE,QAAI,aAAqB;AAEzB,QAAI,YAAY,SAAS;AAEvB,UAAI,OAAO,YAAY,YAAY,UAAU;AAC3C,qBAAa,YAAY;AAAA,MAC3B,WAAY,YAAY,QAAoC,GAAG,GAAG;AAEhE,cAAM,gBAAiB,YAAY,QAAmC,GAAG;AACzE,YAAI,OAAO,kBAAkB,UAAU;AACrC,uBAAa;AAAA,QACf,OAAO;AACL,cAAI,YAAY,SAAS,UAAU;AACjC,yBAAa,cAAc;AAAA,UAC7B,OAAO;AACL,yBAAa,cAAc;AAAA,UAC7B;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,YAAY,MAAM;AAE3B,mBAAa,YAAY;AAAA,IAC3B,OAAO;AAEL,mBAAa;AAAA,IACf;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,aAAqB,YAAY,SAA+B;AAC9D,UAAM,UAAU,MAAM,QAAQ,eAAe;AAE7C,eAAW,UAAU,SAAS;AAC5B,MAAAA,KAAI,MAAM,gGAAqB,eAAAI,QAAM,KAAK,OAAO,QAAQ,IAAI,CAAC,EAAE;AAChE,YAAM,UAAU,kBAAAD,QAAK,QAAQ,OAAO,IAAI;AAExC,UAAI,OAAwC;AAC1C,cAAME,UAASJ,SAAQ,GAAG,OAAO,QAAQ,IAAI,EAAE;AAC/C,QAAAI,QAAO,QAAQ,OAAO;AACtB;AAAA,MACF;AAEA,UAAI,aAAa,kBAAAF,QAAK,QAAQ,OAAO;AAErC,cAAI,2BAAW,kBAAAA,QAAK,QAAQ,YAAY,OAAO,CAAC,GAAG;AACjD,qBAAa,kBAAAA,QAAK,QAAQ,YAAY,OAAO;AAAA,MAC/C;AAEA,cAAI,2BAAW,kBAAAA,QAAK,KAAK,YAAY,cAAc,CAAC,GAAG;AACrD,cAAM,cAAcF,SAAQ,kBAAAE,QAAK,KAAK,YAAY,cAAc,CAAC;AAEjE,YAAI;AACF,gBAAMF,eAAU,mCAAc,UAAU;AACxC,cAAII;AAEJ,gBAAM,aAAa,KAAK,cAAc,WAAW;AAEjD,cAAI,YAAY,SAAS,UAAU;AAEjC,YAAAA,UAAS,MAAM,OAAO,kBAAAF,QAAK,KAAK,YAAY,UAAU;AAAA,UACxD,OAAO;AAEL,YAAAE,UAASJ,SAAQ,kBAAAE,QAAK,KAAK,YAAY,UAAU,CAAC;AAAA,UACpD;AAEA,cAAI,OAAOE,QAAO,YAAY,YAAY;AACxC,YAAAA,QAAO,QAAQ,OAAO;AAAA,UACxB,WAAW,OAAOA,YAAW,YAAY;AACvC,YAAAA,QAAO,OAAO;AAAA,UAChB,OAAO;AACL,YAAAL,KAAI,KAAK,yCAAW,OAAO,QAAQ,IAAI,wMAAwC;AAAA,UACjF;AAAA,QACF,SAAS,OAAO;AACd,UAAAA,KAAI,MAAM,kJAA+B,OAAO,QAAQ,IAAI,MAAM,KAAK;AAAA,QACzE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAqB,aAAa,eAA0C;AAC1E,UAAM,QAAQ,UAAM,yBAAQ,aAAa;AAEzC,WAAO,MACJ,OAAO,CAAC,SAAS;AAChB,YAAM,WAAW,kBAAAG,QAAK,KAAK,eAAe,MAAgB,UAAU;AACpE,YAAM,WAAO,yBAAS,QAAQ;AAC9B,aAAO,KAAK,OAAO;AAAA,IACrB,CAAC,EACA,IAAI,CAAC,SAAS,kBAAAA,QAAK,MAAM,IAAc,EAAE,IAAI;AAAA,EAClD;AAAA,EAEA,OAAe,qBAAqB,SAA+B;AACjE,YAAQ,GAAG,aAAa,MAAM;AAC5B,cAAQ,MAAM;AAAA,EAAK,YAAY,iGAAsB,eAAAC,QAAM,IAAI,IAAI,CAAC,IAAI,QAAQ,KAAK,KAAK,GAAG,CAAC;AAC9F,cAAQ,IAAI,wCAAU,eAAAA,QAAM,IAAI,QAAQ,CAAC;AAAA,CAAyC;AAClF,cAAQ,KAAK,CAAC;AAAA,IAChB,CAAC;AAAA,EACH;AACF;AA3Ka,eACJ,gBAAgB,kBAAAD,QAAK,QAAQD,YAAW,MAAM,WAAW;AAD3D,IAAM,gBAAN;;;AFZP,IAAM,eAAe;AAErB,IAAM,cAAc,GAAG,eAAAI,QAAM,MAAM,wIAAkC,CAAC;AAAA,EACpE,eAAAA,QAAM,QAAQ,0VAAqE,CAAC;AAAA,EACpF,eAAAA,QAAM,aAAa,8HAA2B,CAAC;AAAA;AAGjD,IAAM,YAAY,YAAY;AAC5B,SAAO,MAAM,eAAe;AAC5B,QAAM,UAAU,MAAM,QAAQ,KAAK;AAEnC,UACG,QAAQ,gBAAI,SAAS,iBAAiB,iKAA+B,EACrE,KAAK,YAAY,EACjB,YAAY,WAAW,EACvB,MAAM,qBAAqB,EAC3B,WAAW,KAAK,EAChB,eAAe,KAAK;AAEvB,SAAO,MAAM,gBAAgB;AAC7B,QAAM,cAAc,KAAK,OAAO;AAChC,SAAO,MAAM,kBAAkB;AAE/B,SAAO,MAAM,sBAAsB,QAAQ,IAAI;AAC/C,QAAM,QAAQ,WAAW,QAAQ,IAAI;AAErC,MAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,YAAQ,WAAW;AAAA,EACrB;AACF;AAEA,UAAU;","names":["ffmpeg","path","chalk","import_chalk","chalk","path","fs","dotenvExpand","dotenvConfig","import_node_path","init_logger","chalk","label","import_chalk","init_logger","chalk","label","import_chalk","tinify","chalk","import_node_path","import_dotenv","require","path","dotenvConfig","result","packageJson","init_program","import_chalk","chalk","init_program","import_node_path","import_chalk","import_fs_extra","path","chalk","fs","init_collection","import_chalk","import_commander","init_collection","init_program","chalk","Table","import_zx","import_zx","import_zx","init_action","init_program","import_commander","init_command","init_program","init_action","init_command","import_chalk","import_zx","init_action","init_program","chalk","init_command","init_program","init_action","init_command","import_fs","import_node_path","import_chalk","import_cli_table3","import_filesize","init_action","init_program","Table","chalk","path","fs","import_chalk","init_command","init_program","path","chalk","init_action","init_command","import_chalk","init_program","import_node_module","import_node_path","import_node_url","import_chalk","import_fs_extra","log","require","__dirname","path","chalk","module","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.18_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js","../src/logger/index.ts","../src/program/abstract.action.ts","../src/program/abstract.command.ts","../src/lib/runners/runner.ts","../src/lib/runners/ffmpeg.runner.ts","../src/lib/runners/shell.runner.ts","../src/lib/runners/node.runner.ts","../src/lib/runners/npm.runner.ts","../src/lib/runners/pnpm.runner.ts","../src/helpers/env.ts","../src/helpers/logger.ts","../src/lib/runners/script.runner.ts","../src/lib/runners/tinypng.runner.ts","../src/lib/runners/runner.factory.ts","../src/lib/runners/index.ts","../src/program/program.ts","../src/program/index.ts","../src/lib/ui/banner.ts","../src/lib/ui/prefixes.ts","../src/lib/ui/index.ts","../src/processes/codemod/action.ts","../src/lib/collection/collection.ts","../src/lib/collection/abstract.collection.ts","../src/lib/utils/formatting.ts","../src/lib/collection/fox-codemod.collection.ts","../src/lib/collection/collection.factory.ts","../src/lib/collection/index.ts","../src/processes/codemod/command.ts","../src/processes/codemod/index.ts","../src/utils/versioning.ts","../src/processes/deploy/providers/abstract.provider.ts","../src/processes/deploy/utils/resolve-workspace-deps.ts","../src/processes/deploy/providers/npm.ts","../src/processes/deploy/providers/s3.ts","../src/processes/deploy/action.ts","../src/processes/deploy/command.ts","../src/processes/deploy/index.ts","../src/processes/info/action.ts","../src/processes/info/command.ts","../src/processes/info/index.ts","../src/processes/optimize/action.ts","../src/processes/optimize/command.ts","../src/processes/optimize/index.ts","../src/bin/fox.ts","../package.json","../src/program/loader.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { log } from '@foxford/logger'\n\nimport type { HierarchicalLogger } from '@foxford/logger'\n\nconst logger: HierarchicalLogger = log.getLogger('cli')\nlogger.setLevel('info')\n\nexport { logger }\n","import type * as FoxfordTools from '../types'\n\nexport abstract class AbstractAction<Options = FoxfordTools.ProcessInput[]> {\n constructor(protected program: FoxfordTools.Program) {}\n public abstract handle(options?: Options, params?: string[]): Promise<void>\n}\n","import type { AbstractAction } from './abstract.action'\nimport type * as FoxfordTools from '../types'\n\nexport abstract class AbstractCommand<Options = unknown> {\n constructor(protected action: AbstractAction<Options>) {}\n\n public abstract id: string\n\n public abstract load(program: FoxfordTools.Program): Promise<void> | void\n}\n","export enum Runner {\n NPM = 'NPM',\n PNPM = 'PNPM',\n FFMPEG = 'FFMPEG',\n TINYPNG = 'TINYPNG',\n NODE = 'NODE',\n PACKAGE_JSON_SCRIPT = 'PACKAGE_JSON_SCRIPT',\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport ffmpeg from 'fluent-ffmpeg'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class FFMpegRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n public async run(payload: RunnerPayload): Promise<string | null> {\n return new Promise<null | string>((resolve, reject) => {\n ffmpeg(payload.resource)\n .output(payload.output ?? path.basename(payload.resource))\n .outputOptions([\n '-hide_banner',\n '-movflags +faststart',\n '-pix_fmt yuv420p',\n '-c:v libx264',\n '-preset:v veryslow',\n '-profile:v high',\n '-level 3.1',\n '-tune:v ssim',\n '-r 30',\n '-g 180',\n '-keyint_min 180',\n '-sc_threshold 0',\n '-max_muxing_queue_size 1024',\n // '-vf scale=1920:-1',\n '-f mp4',\n ...(payload.extraFlags ?? []),\n ])\n .on('end', function () {\n resolve(payload.resource)\n })\n .on('error', function (err) {\n console.log()\n console.log(chalk.redBright('Cannot process video: ' + err.message))\n reject(err)\n })\n .run()\n })\n }\n}\n","import { spawn, execSync } from 'child_process'\n\nimport chalk from 'chalk'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type { ChildProcess, SpawnOptions, ExecSyncOptionsWithStringEncoding } from 'child_process'\n\nexport class ShellRunner {\n protected binary: string\n protected options: RunnerOptions\n\n constructor(binary: string, options?: RunnerOptions) {\n this.binary = binary\n this.options = options ?? { cwd: process.cwd() }\n }\n\n public async run(\n command: string,\n args: string[] = [],\n options: SpawnOptions = {},\n collect = false\n ): Promise<unknown> {\n const spawnOptions: SpawnOptions = {\n cwd: this.options.cwd,\n shell: true,\n stdio: collect ? 'pipe' : 'inherit',\n ...options,\n }\n return new Promise((resolve, reject) => {\n const child: ChildProcess = spawn(`${this.binary}`, [command, ...args], spawnOptions)\n if (collect && child.stdout) {\n child.stdout.on('data', (data) => resolve(data.toString().replace(/\\r\\n|\\n/, '')))\n }\n child.on('close', (code) => {\n if (code === 0) {\n resolve(child.stdout)\n } else {\n console.error(chalk.red(`\\n Не удалось выполнить команду: ${this.binary} ${command} ${args} `))\n reject(code)\n }\n })\n })\n }\n\n public runSync(command: string): string {\n const spawnOptions: ExecSyncOptionsWithStringEncoding = {\n cwd: this.options.cwd,\n encoding: 'utf-8',\n }\n return execSync(`${this.binary} ${command}`, spawnOptions)\n }\n\n /**\n * @param command\n * @returns The entire command that will be ran when calling `run(command)`.\n */\n public rawFullCommand(command: string): string {\n const commandArgs: string[] = [command]\n return `${this.binary} ${commandArgs.join(' ')}`\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NodeRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('node', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('npm', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class PnpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('pnpm', options)\n }\n}\n","import path from 'node:path'\n\nimport { config as dotenvConfig } from 'dotenv'\nimport { expand as dotenvExpand } from 'dotenv-expand'\nimport fs from 'fs-extra'\n\ntype Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T\n\nfunction truthy<T>(value: T): value is Truthy<T> {\n return !!value\n}\n\nexport function loadEnv(pkgPath: string) {\n const dotenvFiles = [\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}.local`),\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}`),\n Boolean(process.env.NODE_ENV) === false && path.join(pkgPath, `.env.development`),\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n process.env.NODE_ENV !== 'test' && path.join(pkgPath, `.env.local`),\n path.join(pkgPath, '.env'),\n ].filter(truthy)\n\n dotenvFiles.forEach((dotenvFile) => {\n if (fs.existsSync(dotenvFile)) {\n dotenvExpand(\n dotenvConfig({\n path: dotenvFile,\n })\n )\n }\n })\n\n return dotenvFiles\n}\n","import type { Chalk } from 'chalk'\n\nexport const label = (chalk: Chalk, label: string) => chalk.black(` ${label} `)\n","import chalk from 'chalk'\n\nimport { PnpmRunner } from './pnpm.runner'\nimport { loadEnv } from '../../helpers/env'\nimport { label } from '../../helpers/logger'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type * as FoxfordTools from '../../types'\n\nconst getLabel = (pkgName: string) => {\n return label(chalk.bgGreen, pkgName) + chalk.white(' ')\n}\n\nconst getFailLabel = (pkgName: string) => {\n return label(chalk.bgRed, pkgName) + chalk.white(' ')\n}\n\ninterface RunnerPayload {\n pkg: FoxfordTools.Package\n}\n\nexport class ScriptRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n async run(script: string, { pkg }: RunnerPayload) {\n const label = getLabel(pkg.localName.toUpperCase())\n const failLabel = getFailLabel(pkg.localName.toUpperCase())\n console.log(label + chalk.blue(`Start ${chalk.white.underline(script)} process`))\n if (this.options.verbose) {\n console.log(label + chalk.blue(`Print typescript config`))\n console.log()\n }\n console.log(\n label + chalk.blue(`Env ${chalk.magenta('process.env.NODE_ENV')} is ${chalk.yellow(process.env.NODE_ENV)}`)\n )\n console.log(\n label +\n chalk.blue(`Env ${chalk.magenta('process.env.NODE_OPTIONS')} is ${chalk.yellow(process.env.NODE_OPTIONS)}`)\n )\n try {\n console.log(label + chalk.blue(`Load .env files`))\n const envFiles = loadEnv(pkg.path)\n console.log(JSON.stringify(envFiles, null, 2))\n } catch (err) {\n if (err instanceof Error) {\n console.log(failLabel + chalk.red(err.message))\n process.exit(1)\n }\n }\n\n const pnpmRunner = new PnpmRunner()\n\n pnpmRunner.run('run', [`--filter ${pkg.localName}`, script], {\n cwd: pkg.path,\n env: Object.assign(process.env, { FORCE_COLOR: '1' }),\n })\n }\n}\n","import chalk from 'chalk'\nimport tinify from 'tinify'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface TinyPngRunnerOptions extends RunnerOptions {\n token?: string\n}\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class TinyPngRunner {\n options: TinyPngRunnerOptions\n\n constructor(options?: TinyPngRunnerOptions) {\n this.options = options ?? ({} as TinyPngRunnerOptions)\n\n if (!options?.token) throw new Error('You must specify process.env.TINIFY_API_KEY env variable with tinify key')\n }\n\n public async run(payload: RunnerPayload): Promise<null | string> {\n const source = tinify.fromFile(payload.resource)\n tinify.key = this.options?.token ?? ''\n\n try {\n await source.toFile(payload.output ?? payload.resource)\n } catch (err) {\n if (err instanceof Error) console.log(chalk.redBright('Cannot compress resource with tinify: ' + err.message))\n }\n\n return payload.resource\n }\n\n public runSync(): string {\n throw new TypeError('this method not implemented')\n }\n}\n","import { FFMpegRunner } from './ffmpeg.runner'\nimport { NodeRunner } from './node.runner'\nimport { NpmRunner } from './npm.runner'\nimport { PnpmRunner } from './pnpm.runner'\nimport { Runner } from './runner'\nimport { ScriptRunner } from './script.runner'\nimport { TinyPngRunner } from './tinypng.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nconst RunnerMap = {\n [Runner.NPM]: NpmRunner,\n [Runner.PNPM]: PnpmRunner,\n [Runner.NODE]: NodeRunner,\n [Runner.PACKAGE_JSON_SCRIPT]: ScriptRunner,\n [Runner.FFMPEG]: FFMpegRunner,\n [Runner.TINYPNG]: TinyPngRunner,\n}\n\ntype RunnerTypeMap = typeof RunnerMap\n\nexport class RunnerFactory {\n public static create<R extends Runner>(\n runner: R,\n options?: ConstructorParameters<RunnerTypeMap[R]>[0]\n ): InstanceType<RunnerTypeMap[R]> {\n const RunnerClass = RunnerMap[runner]\n\n if (!RunnerClass) {\n throw new Error(`Unknown runner ${runner}`)\n }\n\n return new RunnerClass(options as RunnerOptions) as InstanceType<RunnerTypeMap[R]>\n }\n}\n","export * from './runner'\nexport * from './runner.factory'\nexport type * from './abstract.runner'\n","import { existsSync } from 'fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command } from 'commander'\nimport { config as dotenvConfig } from 'dotenv'\nimport { $, fs } from 'zx'\n\nimport { Runner, RunnerFactory } from '../lib/runners/index'\nimport { logger } from '../logger'\n\nimport type { AbstractCommand } from './abstract.command'\nimport type * as FoxfordTools from '../types'\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class Program extends Command implements FoxfordTools.Program {\n packageManager: string\n rootPath: string\n logger = logger\n private commandList: Array<AbstractCommand> = []\n\n constructor(packageManager: string, rootPath: string) {\n super()\n\n $.verbose = false\n\n const dotenvFiles = [\n path.resolve('./.env.local'),\n path.resolve('./.env'),\n path.resolve(__dirname, '../.env.local'),\n path.resolve(__dirname, '../.env'),\n ]\n\n dotenvFiles.forEach((dotenvFile) => {\n if (existsSync(dotenvFile)) {\n dotenvConfig({\n path: dotenvFile,\n })\n }\n })\n\n this.packageManager = packageManager\n this.rootPath = rootPath\n }\n\n static async init(): Promise<Program> {\n const detector = await import('package-manager-detector')\n\n let packageManager: string = 'npm'\n let rootPath: string = process.cwd()\n\n const detectResult = await detector.detect({\n strategies: ['packageManager-field', 'devEngines-field', 'lockfile', 'install-metadata'],\n })\n\n if (detectResult) {\n packageManager = detectResult.name\n logger.info(`Определен менеджер пакетов: \"${packageManager}\"`)\n } else {\n logger.warn(`Невозможно определить менеджер пакетов. Дефолт: \"${packageManager}\"`)\n }\n\n if (packageManager === 'npm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.NPM).runSync('root'))\n } else if (packageManager === 'pnpm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.PNPM).runSync('root'))\n }\n\n return new Program(packageManager, rootPath)\n }\n\n public async getPluginPaths(): Promise<Array<{ path: string; pkgJson: FoxfordTools.PackageJson }>> {\n const nodeModulesPlugins = []\n const readPkgUp = await import('read-package-up')\n const result = await readPkgUp.readPackageUp({ cwd: this.rootPath })\n\n if (!result) {\n throw new Error('Unable to find package.json')\n }\n const { packageJson } = result\n\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies }\n\n for (const [name] of Object.entries(dependencies)) {\n // Игнорируем пакеты с типами и другие специфические пакеты\n if (this.shouldSkipPackage(name)) continue\n if (name === packageJson.name) continue\n\n let packageDir: string | null = null\n\n // Попытка найти пакет с помощью require.resolve\n try {\n const packagePath = require.resolve(name, { paths: [this.rootPath] })\n packageDir = path.dirname(packagePath)\n } catch {\n // logger.debug(`Error resolving package ${name} with require.resolve:`, error)\n }\n\n // Fallback: если require.resolve не сработал, пробуем найти пакет вручную\n if (!packageDir) {\n try {\n packageDir = path.join(this.rootPath, 'node_modules', name)\n if (!(await fs.pathExists(packageDir))) {\n logger.debug(`Package directory not found for ${name}`)\n continue\n }\n } catch (error) {\n logger.debug(`Error finding package directory for ${name}:`, error)\n continue\n }\n }\n\n // Теперь у нас есть packageDir, пробуем прочитать package.json\n try {\n const result = await readPkgUp.readPackageUp({ cwd: packageDir })\n if (!result) {\n logger.debug(`Unable to find package.json for ${name}`)\n continue\n }\n\n const { packageJson, path: packageJsonPath } = result\n\n if (packageJson.keywords && packageJson.keywords.includes('foxford-cli-plugin')) {\n nodeModulesPlugins.push({\n path: packageJsonPath,\n pkgJson: packageJson as FoxfordTools.PackageJson,\n })\n }\n } catch (error) {\n logger.debug(`Error reading package.json for ${name}:`, error)\n }\n }\n\n return nodeModulesPlugins\n }\n\n private shouldSkipPackage(name: string): boolean {\n return (\n name.startsWith('@types/') ||\n name.startsWith('@foxford/types') ||\n name === '@foxford/cli' ||\n name === 'typescript' ||\n name.includes('eslint') ||\n name.includes('@babel') ||\n name.includes('react')\n )\n }\n\n defineCommand(command: AbstractCommand) {\n this.commandList.push(command)\n }\n\n getCommands() {\n return this.commandList\n }\n}\n","export * from './abstract.action'\nexport * from './abstract.command'\nexport * from './program'\n","export const BANNER = `\n·▄▄▄ ▐▄• ▄ ·▄▄▄ ▄▄▄ ·▄▄▄▄ \n▐▄▄·▪ █▌█▌▪▐▄▄·▪ ▀▄ █·██▪ ██ \n██▪ ▄█▀▄ ·██· ██▪ ▄█▀▄ ▐▀▀▄ ▐█· ▐█▌\n██▌.▐█▌.▐▌▪▐█·█▌██▌.▐█▌.▐▌▐█•█▌██. ██ \n▀▀▀ ▀█▄▀▪•▀▀ ▀▀▀▀▀ ▀█▄▀▪.▀ ▀▀▀▀▀▀• \n`\n","import chalk from 'chalk'\n\nexport const ERROR_PREFIX = chalk.bgRgb(210, 0, 75).bold.rgb(0, 0, 0)(' Error ')\nexport const INFO_PREFIX = chalk.bgRgb(60, 190, 100).bold.rgb(0, 0, 0)(' Info ')\n","export * from './banner'\nexport * from './prefixes'\n","import { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { CodemodOptions } from './types'\n\nexport class CodemodAction extends AbstractAction<CodemodOptions> {\n public async handle(options: CodemodOptions) {\n const flags = []\n\n if (options.dry) flags.push('--dry')\n if (options.verbose) flags.push('--verbose')\n\n console.log('options', options)\n console.log('flags', flags)\n console.log('extra', options.extra)\n\n const runner = RunnerFactory.create(Runner.NODE, {\n verbose: options.verbose,\n })\n\n runner.run('', [], {\n cwd: process.cwd(),\n })\n\n return\n }\n}\n","export enum Collection {\n FOX_CODEMODS = '@foxford/codemods',\n}\n","import type * as FoxfordTools from '../../types'\n\nexport interface CollectionItem {\n name: string\n alias: string\n description: string\n}\n\nexport abstract class AbstractCollection {\n constructor(protected collection: string) {}\n\n public async execute(_name: string, _inputs: FoxfordTools.ProcessInput[], _extraFlags?: string[], _cwd?: string) {\n return\n }\n\n public abstract getItems(): Promise<CollectionItem[]>\n}\n","/**\n *\n * @param str\n * @returns formated string\n * @description normalizes input to supported path and file name format.\n * Changes camelCase strings to kebab-case, replaces spaces with dash and keeps underscores.\n */\nexport function normalizeToKebabOrSnakeCase(str: string) {\n const STRING_DASHERIZE_REGEXP = /\\s/g\n const STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g\n return str.replace(STRING_DECAMELIZE_REGEXP, '$1-$2').toLowerCase().replace(STRING_DASHERIZE_REGEXP, '-')\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport fs from 'fs-extra'\n\nimport { AbstractCollection } from './abstract.collection'\nimport { Collection } from './collection'\nimport { normalizeToKebabOrSnakeCase } from '../utils/formatting'\n\nimport type { CollectionItem } from './abstract.collection'\n\ninterface Codemod extends CollectionItem {\n runner: string\n}\n\nexport class FoxCodemodCollection extends AbstractCollection {\n private codemods: Codemod[] = []\n private loaded = false\n\n constructor() {\n super(Collection.FOX_CODEMODS)\n }\n\n private async load() {\n const pathCollection = require.resolve(Collection.FOX_CODEMODS)\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgJson = require(path.join(path.dirname(pathCollection), 'package.json'))\n\n if (!pkgJson.codemods) {\n console.log(\n chalk.red('May be you must specify \"codemods\" section in your package.json with path to collection.json')\n )\n process.exit(1)\n }\n\n const collectionPath = path.join(path.dirname(pathCollection), pkgJson.codemods ?? '')\n\n if (!fs.existsSync(collectionPath)) {\n console.log(\n chalk.red('Collection path specified in \"codemods\" section in your package.json is not valid: ', collectionPath)\n )\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const collectionJson = require(collectionPath)\n this.codemods = collectionJson.codemods.map((codemod: Codemod) => ({\n ...codemod,\n name: normalizeToKebabOrSnakeCase(codemod.name),\n }))\n } catch {\n console.log(chalk.red('Collection json is not valid'))\n }\n\n this.loaded = true\n }\n\n public async getItems(): Promise<Codemod[]> {\n if (!this.loaded) {\n try {\n await this.load()\n } catch {\n //\n }\n }\n return this.codemods\n }\n}\n","// import { Runner, RunnerFactory } from '../runners'\n// import { SchematicRunner } from '../runners/schematic.runner'\nimport { Collection } from './collection'\nimport { FoxCodemodCollection } from './fox-codemod.collection'\n\nimport type { AbstractCollection } from './abstract.collection'\n\nexport class CollectionFactory {\n public static create(collection: Collection | string): AbstractCollection {\n // const schematicRunner = RunnerFactory.create(Runner.SCHEMATIC) as SchematicRunner\n\n if (collection === Collection.FOX_CODEMODS) {\n return new FoxCodemodCollection()\n }\n\n return new FoxCodemodCollection()\n }\n}\n","export * from './collection.factory'\nexport * from './collection'\nexport * from './abstract.collection'\n","import chalk from 'chalk'\nimport Table from 'cli-table3'\nimport { Option, Command } from 'commander'\n\nimport { Collection, CollectionFactory } from '../../lib/collection'\nimport { AbstractCommand } from '../../program'\n\nimport type { CodemodOptions } from './types'\nimport type { CollectionItem, AbstractCollection } from '../../lib/collection'\nimport type * as FoxfordTools from '../../types'\n\nexport class CodemodCommand extends AbstractCommand<CodemodOptions> {\n id = 'codemod'\n\n private items: CollectionItem[] = []\n\n private buildRunCommand() {\n const verbose = new Option('--verbose', 'Вывод данных')\n const dry = new Option('--dry', 'Прогон без изменений')\n\n const run = new Command('run')\n\n run\n .description('Запусить кодмод с именем <name>')\n .argument('<name>', 'Имя кодмода (codemod --list)')\n .argument('<input...>', 'Glob паттерн файлов для которых будет применим кодмод')\n .addOption(verbose)\n .addOption(dry)\n .allowUnknownOption(true)\n .showHelpAfterError()\n .action(async (name: string, input: string[], options: CodemodOptions, command: FoxfordTools.Program) => {\n // console.log('extra', extra)\n if (!this.items.filter((item) => item.name === name)) {\n console.error('Name not found')\n return\n }\n\n const unknownOptions = command.parseOptions(command.args)?.unknown ?? []\n\n const paths = input.filter((item) => !unknownOptions.includes(item))\n\n if (unknownOptions.length) {\n options.extra = unknownOptions\n }\n\n options.paths = paths\n\n await this.action.handle(options)\n })\n\n return run\n }\n\n private buildListCommand() {\n const run = new Command('list')\n\n run\n .description('Вывести полный список доступных кодмодов')\n .showHelpAfterError()\n .action(async () => {\n const list = await this.getCollectionItems()\n console.log(\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` + this.buildSchematicsListAsTable(list)\n )\n })\n\n return run\n }\n\n private async getCollectionItems() {\n const list = await this.getItems(this.getCollection())\n this.items = list\n return list\n }\n\n public async load(program: FoxfordTools.Program) {\n const codemod = new Command('codemod')\n codemod\n .addHelpText(\n 'before',\n `\\n---------------------------------------\\n${chalk.greenBright(\n '🛠 Codemod manager'\n )}\\n---------------------------------------\\n`\n )\n .usage('<command>')\n .helpOption(false)\n // .allowUnknownOption()\n .description(await this.buildDescription())\n .summary('Управление кодмодами')\n .addCommand(this.buildRunCommand())\n .addCommand(this.buildListCommand())\n .action(async (options) => {\n if (!options || Object.keys(options).length === 0) {\n codemod.outputHelp()\n return\n }\n\n await this.action.handle(options)\n })\n\n program.addCommand(codemod)\n }\n\n private buildSchematicsListAsTable(items: CollectionItem[]): string {\n const leftMargin = ' '\n const tableConfig = {\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['name', 'description'],\n }\n const table: Table.Table = new Table(tableConfig)\n for (const item of items) {\n table.push([chalk.green(item.name), item.description])\n }\n\n return table.toString()\n }\n\n private getCollection(): string {\n return Collection.FOX_CODEMODS\n }\n\n private async getItems(collection: string): Promise<CollectionItem[]> {\n const abstractCollection: AbstractCollection = CollectionFactory.create(collection)\n this.items = await abstractCollection.getItems()\n return this.items\n }\n\n private async buildDescription(): Promise<string> {\n const list = await this.getCollectionItems()\n const shortList = list.slice(0, 20)\n return (\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` +\n this.buildSchematicsListAsTable(shortList) +\n chalk.yellowBright(`\\n\\nЧтобы увидеть полный список кодмодов используйте команду `) +\n chalk.greenBright(`codemod list`)\n )\n }\n}\n","import { CodemodAction } from './action'\nimport { CodemodCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new CodemodCommand(new CodemodAction(program)))\n}\n","/**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * @param version - Базовая версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n *\n * @example\n * getBetaPackageVersion('1.2.3', 'abc123') // '1.2.3-beta-abc123-20260311'\n */\nexport function getBetaPackageVersion(version: string, sha: string): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n const date = `${year}${month}${day}`\n return `${version}-beta-${sha}-${date}`\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { logger } from '../../../logger'\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployOptions } from '../types'\nimport type { HierarchicalLogger } from '@foxford/logger'\n\n/**\n *\n * Методы провайдера не выбрасывают ошибки.\n *\n * Обработка ошибок должна происходить в методах классов, которые наследуются от класса провайдера.\n */\nexport abstract class DeployProvider {\n cwd: string\n logger: HierarchicalLogger\n buildDir: string\n\n constructor(public providerName: string) {\n this.cwd = process.cwd()\n this.logger = logger.getLogger(providerName)\n this.buildDir = './build'\n }\n\n /**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * Делегирует вызов утилитной функции {@link getBetaPackageVersion} для обратной совместимости.\n *\n * @param version - Версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n */\n public getBetaPackageVersion(version: string, sha: string): string {\n return getBetaPackageVersion(version, sha)\n }\n\n /**\n * Читает и парсит файл package.json из текущей рабочей директории.\n *\n * Эта функция пытается найти и прочитать файл package.json в текущей\n * рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.\n *\n * @returns Распарсенное содержимое файла package.json или null.\n */\n public readPackageJson(pkgPath: string): FoxfordTools.PackageJson | null {\n const packageJsonPath = path.resolve(pkgPath, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n return null\n }\n\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(packageJsonContent)\n } catch (error) {\n this.logger.error(`Ошибка при чтении или парсинге package.json: ${(error as Error).message}`)\n return null\n }\n }\n\n public abstract deploy(params: Omit<DeployOptions, 'provider'>): Promise<void>\n}\n","import { getCatalogsFromWorkspaceManifest } from '@pnpm/catalogs.config'\nimport { createExportableManifest } from '@pnpm/exportable-manifest'\nimport { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'\n\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\n\n/** Секции зависимостей, которые участвуют в резолве (devDependencies удаляются ранее) */\ntype DepSection = 'dependencies' | 'peerDependencies' | 'optionalDependencies'\n\n/** Секции, которые проверяются и резолвятся */\nconst DEP_SECTIONS: DepSection[] = ['dependencies', 'peerDependencies', 'optionalDependencies']\n\n/**\n * Опции для функции резолва зависимостей.\n */\nexport interface ResolveWorkspaceDepsOptions {\n /** Цель деплоя: beta или latest */\n target: 'beta' | 'latest'\n /** Короткий SHA коммита (для генерации бета-версии) */\n commitSha: string\n /**\n * Список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей.\n */\n affected?: string[]\n /** Путь к корню воркспейса (директория с pnpm-workspace.yaml) */\n workspaceRoot: string\n /**\n * Директория пакета — содержит node_modules со ссылками на workspace-пакеты.\n * Используется @pnpm/exportable-manifest для резолва workspace: протоколов.\n */\n packageDir: string\n}\n\n/**\n * Проверяет, содержит ли packageJson зависимости с workspace: или catalog: префиксами.\n * Проверяются только dependencies, peerDependencies и optionalDependencies.\n *\n * @param packageJson - Объект package.json пакета\n * @returns true если найдены нерезолвенные workspace: или catalog: зависимости\n */\nexport function hasWorkspaceOrCatalogDeps(packageJson: FoxfordTools.PackageJson): boolean {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n for (const version of Object.values(deps)) {\n if (version.startsWith('workspace:') || version.startsWith('catalog:')) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Резолвит зависимости с workspace: и catalog: префиксами через @pnpm/exportable-manifest.\n * Мутирует переданный packageJson на месте.\n *\n * Поведение:\n * - `catalog:dev` / `catalog:cli` — берёт версию из соответствующей секции pnpm-workspace.yaml\n * - `workspace:*` — резолвит в точную версию `X.Y.Z` (через node_modules пакета)\n * - `workspace:^` — резолвит в `^X.Y.Z`\n * - `workspace:~` — резолвит в `~X.Y.Z`\n * - Если пакет входит в `affected` и `target === 'beta'` — получает бета-версию (post-processing)\n * - devDependencies не трогаются (должны быть удалены до вызова)\n *\n * @param packageJson - Объект package.json (мутируется in-place)\n * @param options - Параметры резолва\n */\nexport async function resolveWorkspaceAndCatalogDeps(\n packageJson: FoxfordTools.PackageJson,\n options: ResolveWorkspaceDepsOptions\n): Promise<void> {\n if (!hasWorkspaceOrCatalogDeps(packageJson)) return\n\n const { target, commitSha, affected = [], workspaceRoot, packageDir } = options\n\n /**\n * Сохраняем исходные workspace: спецификаторы до резолва,\n * чтобы использовать их при post-processing affected/beta зависимостей.\n */\n const workspaceDeps = new Map<string, Map<string, string>>()\n\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const sectionMap = new Map<string, string>()\n for (const [depName, spec] of Object.entries(deps)) {\n if (spec.startsWith('workspace:')) {\n sectionMap.set(depName, spec)\n }\n }\n\n if (sectionMap.size > 0) {\n workspaceDeps.set(section, sectionMap)\n }\n }\n\n /** Читаем pnpm-workspace.yaml и получаем catalogs через @pnpm/* пакеты */\n const workspaceManifest = await readWorkspaceManifest(workspaceRoot)\n\n if (workspaceManifest === null) {\n throw new Error(`pnpm-workspace.yaml не найден в директории: ${workspaceRoot}`)\n }\n\n const catalogs = getCatalogsFromWorkspaceManifest(workspaceManifest)\n\n /**\n * createExportableManifest резолвит workspace:, catalog: и jsr: протоколы,\n * используя node_modules из packageDir для поиска версий workspace-пакетов.\n * Тип второго аргумента берётся из сигнатуры функции, чтобы не импортировать\n * @pnpm/types напрямую (он является транзитивной зависимостью).\n */\n type PnpmProjectManifest = Parameters<typeof createExportableManifest>[1]\n const resolved = await createExportableManifest(packageDir, packageJson as unknown as PnpmProjectManifest, {\n catalogs,\n })\n\n /** Копируем резолвенные секции зависимостей обратно в packageJson */\n for (const section of DEP_SECTIONS) {\n if (resolved[section] != null) {\n packageJson[section] = resolved[section] as Record<string, string>\n }\n }\n\n /**\n * Post-processing: для affected-пакетов при target=beta заменяем\n * резолвенную версию на бета-версию. createExportableManifest не знает\n * о бета-публикациях, поэтому эта логика применяется отдельно.\n */\n if (target === 'beta' && affected.length > 0) {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const originalSpecs = workspaceDeps.get(section)\n if (!originalSpecs) continue\n\n for (const depName of Object.keys(deps)) {\n if (!affected.includes(depName)) continue\n if (!originalSpecs.has(depName)) continue\n\n const resolvedVersion = deps[depName]!\n /** Сохраняем префикс ^ или ~ если он был применён createExportableManifest */\n const prefix = resolvedVersion.startsWith('^') ? '^' : resolvedVersion.startsWith('~') ? '~' : ''\n const baseVersion = resolvedVersion.slice(prefix.length)\n deps[depName] = `${prefix}${getBetaPackageVersion(baseVersion, commitSha)}`\n }\n }\n }\n}\n","/* eslint-disable max-lines */\nimport { fs, $, path, cd } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\nimport { hasWorkspaceOrCatalogDeps, resolveWorkspaceAndCatalogDeps } from '../utils/resolve-workspace-deps'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployNpmOptions } from '../types'\nimport type { ProcessOutput } from 'zx'\n\nfunction sleep(ms: number) {\n if (process.env.NODE_ENV === 'test') {\n return Promise.resolve()\n }\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport class NpmDeploy extends DeployProvider {\n versionLists: string[] = []\n dry: string = ''\n noGitChecks: string = ''\n\n constructor() {\n super('npm')\n }\n\n /**\n * Возвращает сообщение об устаревании с текущим SHA коммита.\n *\n * @returns Промис, который разрешается строкой сообщения об устаревании.\n */\n private async getDeprecationMessage(): Promise<string> {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().trim()\n return `deprecated by ${commitSha}`\n }\n\n /**\n * Создает или обновляет файл .npmrc с токеном аутентификации для реестра npm.\n *\n * Этот метод добавляет конфигурацию аутентификации в файл .npmrc,\n * обеспечивая безопасный доступ к реестру npm для публикации пакетов.\n * Он использует переменную окружения NPM_TOKEN для аутентификации.\n *\n * @returns Промис, который разрешается, когда файл .npmrc успешно обновлен.\n * @throws Выбрасывает ошибку, если операция с файлом не удалась или если NPM_TOKEN не установлен.\n */\n private async touchNpmrc(): Promise<void> {\n const authStr = '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'\n await $`echo ${authStr} >> .npmrc`\n }\n\n /**\n * Фильтрует устаревшие версии из заданного списка версий пакета.\n *\n * Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.\n * Он использует команду `npm view` для получения статуса устаревания каждой версии.\n *\n * @param pkgName - Имя пакета в регистре.\n * @param versions - Массив строк версий для проверки на устаревание.\n * @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.\n */\n private async getNotDeprecatedVersions(pkgName: string, versions: string[]): Promise<string[]> {\n const notDeprecatedVersions = []\n for (const ver of versions) {\n const cmd = ['npm', 'view', `${pkgName}@${ver}`, 'deprecated']\n const result = await $`${cmd}`\n\n if (!result.toString().trim().includes('deprecated by')) {\n notDeprecatedVersions.push(ver)\n }\n }\n return notDeprecatedVersions\n }\n\n /**\n * Получает список всех версий текущего пакета из реестра npm.\n *\n * Этот метод выполняет команду npm для получения всех версий пакета,\n * указанного в файле package.json. Затем он парсит JSON-ответ\n * и сохраняет результат в свойстве `versionLists` класса.\n *\n * Если пакет ещё не опубликован в npm (HTTP 404), метод возвращает пустой\n * массив и логирует информационное сообщение — процесс деплоя продолжается\n * без очистки beta-версий.\n *\n * @param pkgName - Имя пакета в регистре.\n *\n * @returns Промис, который разрешается в массив строк, где каждая строка\n * представляет версию пакета. Если пакет не найден или парсинг\n * не удался, возвращает пустой массив.\n */\n private async getVersionsList(pkgName: string): Promise<string[]> {\n logger.info('Getting versions list...')\n\n let outputProcess: ProcessOutput\n\n try {\n outputProcess = await $`npm view ${pkgName} versions --json`\n } catch (error) {\n const errorText = String(error)\n\n if (errorText.includes('E404')) {\n logger.info(`Пакет ${pkgName} ещё не опубликован в npm, пропускаем очистку beta-версий`)\n } else {\n logger.warn(`Не удалось получить список версий: ${errorText}`)\n }\n\n return []\n }\n\n const versionsListPo = outputProcess.toString()\n logger.info('Versions list recieved', versionsListPo)\n\n try {\n const parsed = JSON.parse(versionsListPo)\n\n if (Array.isArray(parsed)) {\n return parsed\n } else {\n // Если это не массив, но валидный JSON (например, строка), возвращаем её в массиве\n return [parsed]\n }\n } catch {\n logger.error('Error parsing versions list')\n return []\n }\n }\n\n /**\n * Получает список бэта версий на текущую версию из списка всех версий.\n *\n * @param currentVersion - Строка текущей версии для сравнения.\n * @returns Массив строк похожих версий.\n */\n private getBetaVersions(currentVersion: string): string[] {\n return this.versionLists.filter((ver) => {\n if (!ver.includes('beta')) return false\n if (ver === currentVersion) return false\n\n const semverFromVersion = currentVersion.match(/^[0-9]{1,9}.[0-9]{1,9}.[0-9]{1,9}/gi)\n if (!semverFromVersion) return false\n\n const matchedVersion = semverFromVersion[0] ?? null\n if (!matchedVersion) return false\n\n return ver.includes(matchedVersion)\n })\n }\n\n /**\n * Помечает предыдущие похожие версии пакета как устаревшие.\n *\n * Этот метод находит похожие версии на текущую версию, фильтрует уже устаревшие версии,\n * а затем помечает оставшиеся версии как устаревшие, используя команду npm deprecate.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.\n */\n private async deprecatePrevBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Отмечаем предыдущие бэта версии как deprecated')\n\n this.versionLists = await this.getVersionsList(packageJson.name)\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Найдены beta версии:', betaVersions)\n\n const notDeprecatedVersions = await this.getNotDeprecatedVersions(packageJson.name, betaVersions)\n logger.info('Beta версии без deprecated:', notDeprecatedVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of notDeprecatedVersions) {\n await sleep(500)\n try {\n if (!this.dry) {\n const cmd = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', cmd)\n await $`${cmd}`\n }\n } catch (error) {\n logger.error(error)\n continue\n }\n }\n }\n\n /**\n * Удаляет бета-версии пакета, которые похожи на текущую версию.\n *\n * Этот метод получает все версии пакета, находит похожие версии на текущую,\n * и удаляет те, которые являются бета-версиями. Он использует команду npm unpublish с флагом --force.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.\n * @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.\n */\n private async unpublishBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Разпубликовываем beta версии')\n this.versionLists = await this.getVersionsList(packageJson.name)\n logger.info('Список версий: ', this.versionLists)\n\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Список для разпубликации и депрекейта: ', betaVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of betaVersions) {\n if (!ver.includes('beta')) continue\n\n try {\n const deprecate = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', deprecate)\n await $`${deprecate}`\n\n const unpublish = ['npm', 'unpublish', `${packageJson.name}@${ver}`, '--force', this.dry].filter(\n (item) => item !== ''\n )\n logger.info('Разпубликовывем версию:', unpublish)\n await $`${unpublish}`\n } catch (error) {\n logger.error(error)\n continue\n }\n\n await sleep(500)\n }\n }\n\n /**\n * Разворачивает пакет в реестре npm.\n *\n * Этот метод обрабатывает весь процесс развертывания, включая управление версиями,\n * обновление package.json, публикацию npm и пост-публикационные действия, такие как пометка\n * предыдущих версий как устаревших или удаление бета-версий.\n *\n * Если в package.json присутствуют зависимости с префиксами `workspace:` или `catalog:`,\n * они автоматически резолвятся в конкретные версии перед публикацией.\n *\n * @param params - Параметры развертывания.\n * @param params.dry - Если true, выполняет пробный запуск без фактической публикации.\n * @param params.target - Цель развертывания, либо 'beta', либо 'latest'. По умолчанию 'beta'.\n * @param params.affected - Comma-separated список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей при target=beta.\n *\n * @throws Завершает процесс, если директория сборки не найдена.\n * @returns Промис, который разрешается, когда процесс развертывания завершен.\n */\n async deploy(params: DeployNpmOptions) {\n logger.info('Начинаем процесс деплоя в NPM', params)\n const packageDir = process.cwd()\n const localDir = path.join(packageDir, params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const packageJson = this.readPackageJson(localDir)\n\n if (!packageJson) {\n logger.error('package.json не найден в текущей директории')\n process.exit(1)\n }\n\n if (params.dry === true) this.dry = '--dry-run'\n if (params.skipGitChecks) this.noGitChecks = '--no-git-checks'\n\n logger.info('Меняем директорию на', localDir)\n cd(localDir)\n\n logger.info('Получаем sha коммита')\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n const target = params.target ?? 'beta'\n logger.info('Целевая версия:', target)\n\n await this.touchNpmrc()\n logger.info('Создаем .npmrc')\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n\n packageJson.sha = commitSha\n logger.info('Версия пакета:', packageJson.version)\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies\n }\n\n // Предварительная проверка до вызова git-подпроцесса: внутри resolveWorkspaceAndCatalogDeps\n // есть идентичный guard, но здесь он позволяет избежать запуска `git rev-parse --show-toplevel`\n // для пакетов без workspace/catalog зависимостей.\n if (hasWorkspaceOrCatalogDeps(packageJson)) {\n logger.info('Обнаружены workspace/catalog зависимости, запускаем резолв...')\n\n /**\n * Резолв workspace/catalog протоколов поддерживается только в pnpm.\n * Если packageManager не определён или не является 'pnpm' — завершаем процесс с ошибкой.\n */\n if (params.packageManager !== 'pnpm') {\n logger.error(\n `Резолв workspace: и catalog: зависимостей поддерживается только при использовании pnpm. ` +\n `Текущий packageManager: \"${params.packageManager ?? 'не определён'}\". ` +\n `Используйте pnpm для публикации пакетов с workspace/catalog зависимостями.`\n )\n process.exit(1)\n }\n\n const workspaceRoot = (await $`git rev-parse --show-toplevel`).toString().trim()\n\n const affectedPackages = params.affected ? params.affected.split(',').map((s) => s.trim()) : undefined\n\n await resolveWorkspaceAndCatalogDeps(packageJson, {\n affected: affectedPackages,\n commitSha,\n packageDir,\n target,\n workspaceRoot,\n })\n\n logger.info('Workspace/catalog зависимости зарезолвлены', packageJson)\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson('package.json', packageJson, {\n spaces: 2,\n })\n\n const cmd = [\n params.packageManager ?? 'npm',\n 'publish',\n '--access=public',\n `--tag=${target}`,\n this.dry,\n this.noGitChecks,\n ].filter((item) => item !== '')\n logger.info('Публикуем с аргументами:', cmd)\n\n await $`${cmd}`\n\n if (target === 'beta') {\n await this.deprecatePrevBetaVersions(packageJson)\n } else {\n await this.unpublishBetaVersions(packageJson)\n }\n }\n}\n","import { fs, $, path } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\n\nimport type { DeployS3Options } from '../types'\n\nexport class S3Deploy extends DeployProvider {\n constructor() {\n super('s3')\n }\n\n /**\n * Определяет цель развертывания на основе текущей ветки Git.\n *\n * @returns {'latest' | 'beta'} 'latest' для ветки master, 'beta' для всех остальных.\n */\n getTarget(): 'latest' | 'beta' {\n const { GITHUB_REF_NAME } = process.env\n\n if (GITHUB_REF_NAME === 'master') return 'latest'\n\n return 'beta'\n }\n\n /**\n * Формирует путь для ресурсов в хранилище.\n *\n * @param segments - Cегменты пути.\n * @returns Путь для цели развертывания.\n */\n getRemotePath(...segments: (string | undefined)[]): string {\n return segments\n .filter(Boolean)\n .join(path.posix.sep)\n .replace(/[/\\\\]+/g, path.posix.sep)\n .replace(/^\\//, '')\n }\n\n /**\n * Выполняет команду rclone copy.\n *\n * @param localDir - Путь до локальных ресурсов.\n * @param bucket - Имя бакета в хранилище.\n * @param remoteDir - Удаленный путь для загрузки ресурсов.\n * @param flags - Дополнительные аргументы.\n * @returns Результат выполнения команды.\n */\n async exec(localDir: string, bucket: string, remoteDir?: string, flags?: string[]): Promise<void> {\n const cmd = ['rclone', 'copy', localDir]\n\n if (remoteDir) {\n cmd.push(`myremote:${bucket}/${remoteDir}`)\n } else {\n cmd.push(`myremote:${bucket}/`)\n }\n\n if (flags) {\n cmd.push(...flags)\n }\n\n logger.info('Запуск деплоя:', cmd)\n\n await $`${cmd}`\n\n logger.info('Деплой успешно завершен:', cmd)\n }\n\n /**\n * Получает учетные данные для S3 из параметров или переменных окружения\n * @param options - Опции команды\n * @returns Объект с accessKey и secretKey\n * @throws Error если учетные данные не найдены\n */\n getS3Credentials(options: Partial<DeployS3Options>): { accessKey: string; secretKey: string } {\n const accessKey = options.accessKey ?? process.env.ACCESS_KEY ?? process.env.SELECTEL_USER\n const secretKey = options.secretKey ?? process.env.SECRET_KEY ?? process.env.SELECTEL_PASSWORD\n\n if (!accessKey || !secretKey) {\n throw new Error(\n 'Не указаны учетные данные для S3. ' +\n 'Используйте параметры --access-key и --secret-key или установите переменные окружения ACCESS_KEY и SECRET_KEY'\n )\n }\n\n return { accessKey, secretKey }\n }\n\n /**\n * Выполняет процесс развертывания в хранилище по S3.\n *\n * Этот метод копирует файлы из локальной директории в удаленные директории хранилища,\n * используя rclone. Он обрабатывает как версионные, так и целевые пути.\n *\n * @param {DeployS3Options} params - Параметры развертывания.\n * @param {string} [params.localDir] - Локальная директория для копирования (по умолчанию this.buildDir).\n * @param {string} [params.bucket] - Имя бакета хранилища (по умолчанию из env или 'dist.ngcdn.ru').\n * @param {string} [params.packageName] - Имя пакета (по умолчанию из package.json).\n * @param {string} [params.endpoint] - Endpoint хранилища.\n * @param {string} [params.region] - Регион хранилища.\n * @param {string} [params.accessKey] - Токен доступа.\n * @param {string} [params.secretKey] - Секрет.\n * @param {boolean} [params.verbose] - Вывод дебаг информации.\n * @param {'latest' | 'beta'} [params.target] - Цель развертывания (по умолчанию определяется автоматически).\n * @param {boolean} [params.dry] - Если true, выполняет пробный запуск без фактической загрузки.\n *\n * @throws Завершает процесс, если локальная директория не существует.\n */\n async deploy(params: DeployS3Options) {\n logger.info('Начинаем процесс деплоя в хранилище', params)\n const { BUCKET } = process.env\n\n let accessKey, secretKey\n\n try {\n const credentials = this.getS3Credentials(params)\n accessKey = credentials.accessKey\n secretKey = credentials.secretKey\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.toString())\n } else {\n logger.error(error)\n }\n process.exit(1)\n }\n\n const localDir = path.join(process.cwd(), params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const bucket = params.bucket ?? BUCKET\n\n if (!bucket) {\n logger.error('Бакет не определен')\n process.exit(1)\n }\n\n logger.info('Бакет:', bucket)\n\n const packageJson = this.readPackageJson(localDir)\n\n const remoteDirs = []\n\n if (packageJson) {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n if (params.packageName) {\n packageJson.name = params.packageName\n }\n\n const target = params.target ?? this.getTarget()\n logger.info('Целевая версия:', target)\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n logger.info('Версия пакета:', packageJson.version)\n\n packageJson.sha = commitSha\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson(path.resolve(localDir, 'package.json'), packageJson, {\n spaces: 2,\n })\n\n remoteDirs.push(\n this.getRemotePath(params.remoteDir, packageJson.name, packageJson.version),\n this.getRemotePath(params.remoteDir, packageJson.name, target)\n )\n } else {\n logger.warn('package.json не найден в текущей директории')\n\n if (params.remoteDir) {\n remoteDirs.push(params.remoteDir)\n }\n }\n\n logger.info('Удаленные директории:', remoteDirs)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = accessKey\n $.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = secretKey\n $.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? 's3.ru-1.storage.selcloud.ru'\n $.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? 'ru-1'\n\n const execFlags = ['--progress']\n\n if (params.verbose) execFlags.push('-vv')\n\n if (params.dry) {\n execFlags.push('--dry-run')\n }\n\n if (!remoteDirs.length) {\n await this.exec(localDir, bucket, undefined, execFlags)\n process.exit(0)\n }\n\n await Promise.all(\n remoteDirs.map((remoteDir) => {\n return this.exec(localDir, bucket, remoteDir, execFlags)\n })\n )\n }\n}\n","import { AbstractAction } from '../../program'\nimport { NpmDeploy } from './providers/npm'\nimport { S3Deploy } from './providers/s3'\n\nimport type { DeployProvider } from './providers/abstract.provider'\nimport type { DeployOptions } from './types'\n\nexport class DeployAction extends AbstractAction<DeployOptions> {\n public async handle(params: DeployOptions) {\n let provider: DeployProvider\n\n switch (params.provider) {\n case 'npm':\n provider = new NpmDeploy()\n break\n case 's3':\n provider = new S3Deploy()\n break\n default:\n throw new Error(`Unsupported deploy provider: ${params.provider}`)\n }\n\n await provider.deploy(params)\n }\n}\n","import { Command, Option } from 'commander'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { DeployOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class DeployCommand extends AbstractCommand<DeployOptions> {\n id = 'deploy'\n public async load(program: FoxfordTools.Program) {\n const deployCommand = new Command('deploy').description('Задеплоить пакет')\n\n const targetOption = new Option('--target <target>', 'Релиз beta или latest')\n .choices(['beta', 'latest'])\n .default('beta')\n const localDirOption = new Option('--local-dir <path>', 'Из какой локальной директории загрузить содержимое')\n const dryOption = new Option('--dry', 'Запуск без выполнения операции').default(false)\n const verboseOption = new Option('--verbose', 'Вывод дебаг информации').default(false)\n\n const s3Command = new Command('s3')\n .description('Деплой пакета по s3 в хранилище')\n .option('--bucket <name>', 'В какой бакет загрузить пакет')\n .option('--package-name <name>', 'Имя пакета вместо packageJson.name')\n .option('--remote-dir <dir>', 'Целевая директория в хранилище')\n .option('--access-key <key>', 'Токен доступа')\n .option('--secret-key <secret>', 'Секретный токен')\n .option('--region <name>', 'Регион S3')\n .option('--endpoint <url>', 'Endpoint S3')\n .action(async (params) => {\n await this.action.handle({ ...params, provider: 's3' })\n })\n\n s3Command.addOption(targetOption)\n s3Command.addOption(localDirOption)\n s3Command.addOption(dryOption)\n s3Command.addOption(verboseOption)\n\n const skipGitChecksOption = new Option('--skip-git-checks', 'Отключение git проверок при публикации')\n const affectedOption = new Option(\n '--affected <packages>',\n 'Comma-separated список affected-пакетов, публикуемых в текущем цикле (для резолва бета-версий workspace-зависимостей)'\n )\n\n const npmCommand = new Command('npm').description('Деплой пакета в npm').action(async (params) => {\n await this.action.handle({ ...params, packageManager: program.packageManager, provider: 'npm' })\n })\n\n npmCommand.addOption(targetOption)\n npmCommand.addOption(localDirOption)\n npmCommand.addOption(dryOption)\n npmCommand.addOption(verboseOption)\n npmCommand.addOption(skipGitChecksOption)\n npmCommand.addOption(affectedOption)\n\n deployCommand.addCommand(s3Command)\n deployCommand.addCommand(npmCommand)\n\n program.addCommand(deployCommand)\n }\n}\n","import { DeployAction } from './action'\nimport { DeployCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new DeployCommand(new DeployAction(program)))\n}\n","import { platform, release } from 'os'\n\nimport chalk from 'chalk'\nimport { filesize } from 'filesize'\nimport { cpu, mem } from 'systeminformation'\nimport { $ } from 'zx'\n\nimport { BANNER } from '../../lib/ui'\nimport { AbstractAction } from '../../program'\n\nexport class InfoAction extends AbstractAction {\n public async handle() {\n this.displayBanner()\n await this.displaySystemInformation()\n }\n\n private displayBanner() {\n console.info(chalk.red(BANNER))\n }\n\n private async displaySystemInformation(): Promise<void> {\n const osName = await import('os-name')\n console.info(chalk.green('[System Information]'))\n console.info('OS Version :', chalk.blue(osName.default(platform(), release())))\n console.info('NodeJS Version :', chalk.blue(process.version))\n const where = await $`which node`\n console.info('NodeJS path :', where.toString())\n console.info('NODE_OPTIONS :', chalk.blue(process.env.NODE_OPTIONS))\n if (where.toString().includes('nvm')) {\n console.info('NVM_DIR :', chalk.blue(process.env.NVM_DIR))\n }\n console.log()\n const cpuDevice = await cpu()\n const memDevice = await mem()\n console.info('CPU Family:', chalk.blue(`${cpuDevice.vendor} ${cpuDevice.brand}`))\n console.info('CPU Ph Cores:', chalk.blue(cpuDevice.cores))\n console.info('CPU Speed:', chalk.blue(`${cpuDevice.speed}GHz`))\n console.info('Memory:', chalk.blue(`${filesize(memDevice.total)}`))\n console.info('Memory Free:', chalk.blue(`${filesize(memDevice.free)}`))\n console.info('Memory Used:', chalk.blue(`${filesize(memDevice.used)}`))\n console.info('Memory Available:', chalk.blue(`${filesize(memDevice.available)}`))\n }\n\n rightPad(name: string, length: number): string {\n while (name.length < length) {\n // eslint-disable-next-line no-param-reassign\n name = name.concat(' ')\n }\n return name\n }\n}\n","import { AbstractCommand } from '../../program'\n\nimport type { Command } from 'commander'\n\nexport class InfoCommand extends AbstractCommand {\n id = 'info'\n public async load(program: Command) {\n program\n .command('info')\n .alias('i')\n .description('Показать инфо')\n .action(async () => {\n await this.action.handle()\n })\n }\n}\n","import { InfoAction } from './action'\nimport { InfoCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new InfoCommand(new InfoAction(program)))\n}\n","import fs from 'fs'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\nimport { SingleBar, Presets } from 'cli-progress'\nimport Table from 'cli-table3'\nimport { filesize } from 'filesize'\nimport { glob } from 'glob'\n\nimport { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { OptimizeOptions } from './types'\n\ninterface ResourceTask {\n __originalPath: string\n __originalStat?: fs.Stats\n __optimizedStat?: fs.Stats\n __optimizedPath: string\n err?: string | Error\n status: boolean\n diff?: string\n}\n\nexport class OptimizeAction extends AbstractAction<OptimizeOptions> {\n public async handle(options: OptimizeOptions, extraFlags: string[] = []) {\n const resources = await glob(path.join(process.cwd(), options.filePath!), { ignore: 'node_modules/**' })\n\n console.log(chalk.white(`Найдено ${chalk.green(resources.length)} ресурсов для оптимизации`))\n console.log(\n chalk.yellowBright(`Если вы хотите увидеть список ресурсов, воспользуйтесь опцией ${chalk.green('--list')}`)\n )\n\n if (options.list) console.log(resources)\n\n const inquirer = await import('inquirer')\n\n const answers = await inquirer.default.prompt([\n {\n choices: [\n { name: 'Yes', value: 1 },\n { name: 'No', value: 0 },\n ],\n default: 1,\n message: 'Продолжить?',\n name: 'continue',\n type: 'list',\n },\n ])\n\n if (!answers.continue) return\n\n console.log()\n const bar = new SingleBar({ fps: 25 }, Presets.shades_classic)\n bar.start(resources.length, 0)\n\n const ft = await import('file-type')\n\n const promises = resources.map(async (resource) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const fileType = await ft.fileTypeFromFile(resource)\n if (!fileType)\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n\n const { mime } = fileType\n\n let runner\n\n const outputPath = options.replace\n ? resource\n : path.join(path.dirname(resource), `${options.prefix ?? ''}${path.basename(resource)}`)\n\n switch (mime) {\n case 'image/png':\n case 'image/jpeg':\n runner = RunnerFactory.create(Runner.TINYPNG, {\n token: process.env.TINIFY_API_KEY ?? '',\n verbose: true,\n })\n break\n case 'video/mp4':\n runner = RunnerFactory.create(Runner.FFMPEG, {\n verbose: true,\n })\n break\n default:\n console.log(chalk.yellowBright(`Unsupported mime type for ${chalk.white(resource)}`))\n }\n\n if (!runner) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n }\n\n try {\n const beforeStat = fs.statSync(resource)\n await runner.run({\n extraFlags,\n output: outputPath,\n resource,\n })\n const afterStat = fs.statSync(outputPath)\n\n return {\n __optimizedPath: resource,\n __optimizedStat: afterStat,\n __originalPath: resource,\n __originalStat: beforeStat,\n status: true,\n }\n } catch (err) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n err: err as string,\n status: false,\n }\n } finally {\n bar.increment()\n }\n })\n\n try {\n const result = await Promise.all(promises)\n bar.stop()\n console.log()\n this.printResult(result)\n } catch (err) {\n bar.stop()\n console.log()\n console.log(chalk.redBright('Ошибка при оптимизации:', err))\n }\n }\n\n private printResult(result: ResourceTask[]) {\n const statusTable = this.buildStatusTable(result)\n console.log(statusTable)\n this.showUncompletedFiles(result)\n }\n\n private showUncompletedFiles(results: ResourceTask[]) {\n const failed = results.filter((item) => item.status === false)\n if (failed.length > 0) {\n console.log(chalk.redBright('Список необработанных файлов'))\n console.log(failed.map((item) => item.__originalPath))\n }\n }\n\n private buildStatusTable = (results: ResourceTask[]) => {\n const success = results.filter((item) => item.status === true)\n const failed = results.filter((item) => item.status === false)\n const leftMargin = ''\n const table = new Table({\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['Обработано', 'Не обработано', 'Изменение размера'],\n })\n\n const sumFilesize = results.reduce((acc, task) => {\n if (task.__originalStat && task.__optimizedStat) {\n // eslint-disable-next-line no-param-reassign\n acc += task.__originalStat.size - task.__optimizedStat.size\n }\n return acc\n }, 0)\n\n const sumPrefix = sumFilesize >= 0 ? '-' : '+'\n\n table.push([\n chalk.greenBright(success.length),\n chalk.redBright(failed.length),\n sumFilesize >= 0\n ? chalk.greenBright(`${sumPrefix}${filesize(sumFilesize)}`)\n : chalk.redBright(`${sumPrefix}${filesize(Math.abs(sumFilesize))}`),\n ])\n\n return table.toString()\n }\n}\n","import chalk from 'chalk'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { OptimizeOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class OptimizeCommand extends AbstractCommand<OptimizeOptions> {\n id = 'optimize'\n\n public async load(program: FoxfordTools.Program) {\n program\n .command('optimize [path] [extraFlags...]')\n .alias('opt')\n .option('-l, --list', 'Вывести список файлов для оптимизации', false)\n .option('-r, --replace', 'Заменить исходный файл', false)\n .option('-p, --prefix', 'Префикс в имени оптимайзнутого файла', '__')\n .description('Оптимизировать ресурс(jpg,png,mp4)')\n .action(async (path: string, extraFlags: string[], option) => {\n if (!path) {\n console.log(chalk.yellow('Укажите путь до ресурса(поддерживается glob)'))\n process.exit(1)\n }\n\n await this.action.handle(\n {\n filePath: path,\n list: option.list,\n prefix: option.prefix,\n replace: option.replace,\n },\n extraFlags\n )\n })\n }\n}\n","import { OptimizeAction } from './action'\nimport { OptimizeCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new OptimizeCommand(new OptimizeAction(program)))\n}\n","#!/usr/bin/env node\nimport chalk from 'chalk'\n\nimport pkg from '../../package.json'\nimport { logger } from '../logger'\nimport { Program } from '../program'\nimport { CommandLoader } from '../program/loader'\n\nconst PROGRAM_NAME = 'fox'\n\nconst welcomeText = `${chalk.green(`Привет✌️ , Foxford разработчик🤓`)}\n${chalk.magenta(`Эта штука призвана помочь тебе в кодогенерации и в чем-нибудь ещё🍿`)}\n${chalk.yellowBright('Чай наливай себе сам 🍮🍪')}\n`\n\nconst bootstrap = async () => {\n logger.debug('Start program')\n const program = await Program.init()\n\n program\n .version(pkg.version, '-v, --version', 'Показать текущую версию тулзы')\n .name(PROGRAM_NAME)\n .description(welcomeText)\n .usage('<command> [options]')\n .helpOption(false)\n .addHelpCommand(false)\n\n logger.debug('Load processes')\n await CommandLoader.load(program)\n logger.debug('Loading complete')\n\n logger.debug('Parse process.argv', process.argv)\n await program.parseAsync(process.argv)\n\n if (!process.argv.slice(2).length) {\n program.outputHelp()\n }\n}\n\nbootstrap()\n","{\n \"name\": \"@foxford/cli\",\n \"version\": \"1.4.3\",\n \"description\": \"Foxford Cli\",\n \"keywords\": [\n \"foxford\",\n \"cli\",\n \"tool\"\n ],\n \"homepage\": \"https://github.com/foxford/frontend-platform\",\n \"bugs\": \"https://github.com/foxford/frontend-platform/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/foxford/frontend-platform.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Foxford Co\",\n \"maintainers\": [\n {\n \"name\": \"Roman Olin\",\n \"email\": \"r.v.olin@foxford.ru\",\n \"team\": \"core-frontend\"\n }\n ],\n \"main\": \"./README.mdx\",\n \"types\": \"./src/types/index.ts\",\n \"type\": \"module\",\n \"exports\": {\n \"./README.mdx\": \"./README.mdx\",\n \".\": {\n \"types\": \"./src/types/index.ts\"\n }\n },\n \"bin\": {\n \"fox-dev\": \"./scripts/dev.cjs\",\n \"fox\": \"./scripts/prod.cjs\"\n },\n \"scripts\": {\n \"============================ BUILD =============================\": \"\",\n \"build\": \"tsup\",\n \"postbuild\": \"pnpm run build-dts\",\n \"build-dts\": \"dts-bundle-generator -o build/fox.d.ts src/types/index.ts --no-banner --external-inlines=commander loglevel --sort --inline-declare-externals\",\n \"============================ DEPLOY =============================\": \"\",\n \"deploy\": \"fox deploy npm --skip-git-checks\",\n \"============================ LINT =============================\": \"\",\n \"lint:clean\": \"rm -f .eslintcache\",\n \"lint:type-check\": \"tsc --noEmit --pretty\",\n \"lint:eslint\": \"eslint --cache --cache-strategy content --max-warnings=0 ./\",\n \"============================ TEST =============================\": \"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@foxford/logger\": \"workspace:*\",\n \"@pnpm/catalogs.config\": \"1000.0.5\",\n \"@pnpm/exportable-manifest\": \"1000.4.1\",\n \"@pnpm/workspace.read-manifest\": \"1000.3.0\",\n \"@tsconfig/node16\": \"16.1.3\",\n \"chalk\": \"4.1.0\",\n \"cli-progress\": \"catalog:cli\",\n \"cli-table3\": \"catalog:cli\",\n \"commander\": \"catalog:cli\",\n \"dotenv\": \"16.4.5\",\n \"dotenv-expand\": \"11.0.6\",\n \"file-type\": \"21.3.2\",\n \"filesize\": \"10.1.2\",\n \"fluent-ffmpeg\": \"2.1.2\",\n \"fs-extra\": \"catalog:dev\",\n \"glob\": \"catalog:dev\",\n \"inquirer\": \"12.4.3\",\n \"os-name\": \"7.0.0\",\n \"package-manager-detector\": \"1.3.0\",\n \"read-package-up\": \"11.0.0\",\n \"systeminformation\": \"5.31.1\",\n \"tinify\": \"1.7.1\",\n \"tsx\": \"4.21.0\",\n \"typescript\": \"catalog:dev\",\n \"yaml\": \"2.4.5\",\n \"zx\": \"catalog:dev\"\n },\n \"devDependencies\": {\n \"@foxford/eslint-config\": \"workspace:*\",\n \"@foxford/prettier-config\": \"workspace:*\",\n \"@foxford/typescript-config\": \"workspace:*\",\n \"@foxford/vitest-config\": \"workspace:*\",\n \"@types/cli-progress\": \"catalog:cli\",\n \"@types/fluent-ffmpeg\": \"2.1.24\",\n \"@types/fs-extra\": \"11.0.4\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"tsup\": \"catalog:dev\",\n \"vitest\": \"catalog:dev\"\n }\n}","import { existsSync, statSync } from 'node:fs'\nimport { readdir } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport chalk from 'chalk'\nimport { pathExists } from 'fs-extra'\n\nimport { ERROR_PREFIX } from '../lib/ui'\nimport { logger } from '../logger'\n\nimport type * as FoxfordTools from '../types'\nimport type { NormalizedPackageJson } from 'read-package-up'\n\nconst log = logger.getLogger('command-loader')\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class CommandLoader {\n static PROCESSES_DIR = path.resolve(__dirname, '..', 'processes')\n\n public static async load(program: FoxfordTools.Program): Promise<void> {\n if (process.env.NODE_ENV === 'production') {\n await this.loadProductionProcesses(program)\n } else {\n await this.loadDevelopmentProcesses(program)\n }\n\n await Promise.all(program.getCommands().map(async (command) => await command.load(program)))\n this.handleInvalidCommand(program)\n }\n\n static async loadProductionProcesses(program: FoxfordTools.Program) {\n try {\n for (const [processName, moduleLoader] of Object.entries({\n codemod: () => import('../processes/codemod'),\n deploy: () => import('../processes/deploy'),\n info: () => import('../processes/info'),\n optimize: () => import('../processes/optimize')\n })) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const module = await moduleLoader()\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при загрузке процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n static async loadDevelopmentProcesses(program: FoxfordTools.Program) {\n if (!(await pathExists(CommandLoader.PROCESSES_DIR))) {\n log.error(`Директория процессов не найдена: ${CommandLoader.PROCESSES_DIR}`)\n return\n }\n\n try {\n const processes = await this.getProcesses(CommandLoader.PROCESSES_DIR)\n for (const processName of processes) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const modulePath = path.join(CommandLoader.PROCESSES_DIR, processName)\n\n const module = require(modulePath)\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при чтении процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n private static getModulePath(packageJson: NormalizedPackageJson): string {\n let modulePath: string = ''\n\n if (packageJson.exports) {\n // Используем exports для определения точки входа\n if (typeof packageJson.exports === 'string') {\n modulePath = packageJson.exports\n } else if ((packageJson.exports as Record<string, unknown>)['.']) {\n // Если есть экспорт по умолчанию\n const defaultExport = (packageJson.exports as Record<string, string>)['.'] as string | Record<string, string>\n if (typeof defaultExport === 'string') {\n modulePath = defaultExport\n } else {\n if (packageJson.type === 'module') {\n modulePath = defaultExport.import as string\n } else {\n modulePath = defaultExport.require as string\n }\n }\n }\n } else if (packageJson.main) {\n // Fallback на main, если exports не определен\n modulePath = packageJson.main as string\n } else {\n // Если ни exports, ни main не определены, используем index.js\n modulePath = 'index.js'\n }\n\n return modulePath\n }\n\n private static async loadPlugins(program: FoxfordTools.Program) {\n const plugins = await program.getPluginPaths()\n\n for (const plugin of plugins) {\n log.debug(`Загружаем модуль: ${chalk.cyan(plugin.pkgJson.name)}`)\n const dirname = path.dirname(plugin.path)\n\n if (process.env.NODE_ENV === 'development') {\n const module = require(`${plugin.pkgJson.name}`)\n module.default(program)\n continue\n }\n\n let targetPath = path.resolve(dirname)\n\n if (existsSync(path.resolve(targetPath, 'build'))) {\n targetPath = path.resolve(targetPath, 'build')\n }\n\n if (existsSync(path.join(targetPath, 'package.json'))) {\n const packageJson = require(path.join(targetPath, 'package.json'))\n\n try {\n const require = createRequire(__filename)\n let module\n\n const modulePath = this.getModulePath(packageJson)\n\n if (packageJson.type === 'module') {\n // Если это ES модуль\n module = await import(path.join(targetPath, modulePath))\n } else {\n // Если это CommonJS модуль\n module = require(path.join(targetPath, modulePath))\n }\n\n if (typeof module.default === 'function') {\n await module.default(program)\n } else if (typeof module === 'function') {\n await module(program)\n } else {\n log.warn(`Модуль \"${plugin.pkgJson.name}\" не экспортирует функцию по умолчанию`)\n }\n } catch (error) {\n log.error(`Ошибка при загрузке модуля \"${plugin.pkgJson.name}\":`, error)\n }\n }\n }\n }\n\n private static async getProcesses(processesPath: string): Promise<string[]> {\n const files = await readdir(processesPath)\n\n return files\n .filter((file) => {\n const filePath = path.join(processesPath, file as string, 'index.ts')\n const stat = statSync(filePath)\n return stat.isFile()\n })\n .map((file) => path.parse(file as string).name)\n }\n\n private static handleInvalidCommand(program: FoxfordTools.Program) {\n program.on('command:*', () => {\n console.error(`\\n${ERROR_PREFIX} Неверная команда: ${chalk.red('%s')}`, program.args.join(' '))\n console.log(`Смотри ${chalk.red('--help')} для вывода доступного списка команд.\\n`)\n process.exit(1)\n })\n }\n}\n"],"mappings":"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","names":["ffmpeg","path","chalk","import_chalk","chalk","path","fs","dotenvExpand","dotenvConfig","import_node_path","init_logger","chalk","label","import_chalk","init_logger","chalk","label","import_chalk","tinify","chalk","import_node_path","import_dotenv","require","path","dotenvConfig","result","packageJson","init_program","import_chalk","chalk","init_program","import_node_path","import_chalk","import_fs_extra","path","chalk","fs","init_collection","import_chalk","import_commander","init_collection","init_program","chalk","Table","import_node_path","path","fs","import_zx","import_zx","init_action","init_program","import_commander","init_command","init_program","init_action","init_command","import_chalk","import_zx","init_action","init_program","chalk","init_command","init_program","init_action","init_command","import_fs","import_node_path","import_chalk","import_cli_table3","import_filesize","init_action","init_program","Table","chalk","path","fs","import_chalk","init_command","init_program","path","chalk","init_action","init_command","import_chalk","init_program","import_node_fs","import_node_module","import_node_path","import_node_url","import_chalk","import_fs_extra","log","require","__dirname","path","chalk","module","chalk"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foxford/cli",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.3",
|
|
4
4
|
"description": "Foxford Cli",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"foxford",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
{
|
|
20
20
|
"name": "Roman Olin",
|
|
21
21
|
"email": "r.v.olin@foxford.ru",
|
|
22
|
-
"team": "
|
|
22
|
+
"team": "core-frontend"
|
|
23
23
|
}
|
|
24
24
|
],
|
|
25
25
|
"type": "module",
|
|
@@ -63,6 +63,6 @@
|
|
|
63
63
|
],
|
|
64
64
|
"main": "./fox.cjs",
|
|
65
65
|
"types": "./fox.d.ts",
|
|
66
|
-
"sha": "
|
|
66
|
+
"sha": "29fe5fe",
|
|
67
67
|
"scripts": {}
|
|
68
68
|
}
|