@foxford/cli 1.1.1 → 1.2.1
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/fox.d.ts +1 -0
- package/fox.js +136 -103
- package/fox.js.map +1 -1
- package/package.json +4 -4
package/fox.d.ts
CHANGED
package/fox.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
#!/bin/env node
|
|
2
1
|
"use strict";
|
|
3
2
|
var __create = Object.create;
|
|
4
3
|
var __defProp = Object.defineProperty;
|
|
@@ -381,22 +380,20 @@ var init_runners = __esm({
|
|
|
381
380
|
});
|
|
382
381
|
|
|
383
382
|
// src/program/program.ts
|
|
384
|
-
var import_node_path3, import_commander,
|
|
383
|
+
var import_node_path3, import_commander, import_dotenv2, import_fs_extra2, import_zx, Program;
|
|
385
384
|
var init_program = __esm({
|
|
386
385
|
"src/program/program.ts"() {
|
|
387
386
|
"use strict";
|
|
388
387
|
import_node_path3 = __toESM(require("path"));
|
|
389
388
|
import_commander = require("commander");
|
|
390
|
-
import_detect_package_manager = require("detect-package-manager");
|
|
391
389
|
import_dotenv2 = __toESM(require("dotenv"));
|
|
392
390
|
import_fs_extra2 = require("fs-extra");
|
|
393
391
|
import_zx = require("zx");
|
|
394
392
|
init_runners();
|
|
395
393
|
init_logger();
|
|
396
|
-
Program = class extends import_commander.Command {
|
|
397
|
-
constructor() {
|
|
394
|
+
Program = class _Program extends import_commander.Command {
|
|
395
|
+
constructor(packageManager, rootPath) {
|
|
398
396
|
super();
|
|
399
|
-
this.rootPath = process.cwd();
|
|
400
397
|
this.logger = logger;
|
|
401
398
|
this.commandList = [];
|
|
402
399
|
import_zx.$.verbose = false;
|
|
@@ -413,7 +410,28 @@ var init_program = __esm({
|
|
|
413
410
|
});
|
|
414
411
|
}
|
|
415
412
|
});
|
|
416
|
-
this.
|
|
413
|
+
this.packageManager = packageManager;
|
|
414
|
+
this.rootPath = rootPath;
|
|
415
|
+
}
|
|
416
|
+
static async init() {
|
|
417
|
+
const detector = await import("package-manager-detector");
|
|
418
|
+
let packageManager = "npm";
|
|
419
|
+
let rootPath = process.cwd();
|
|
420
|
+
const detectResult = await detector.detect({
|
|
421
|
+
strategies: ["packageManager-field", "devEngines-field", "lockfile", "install-metadata"]
|
|
422
|
+
});
|
|
423
|
+
if (detectResult) {
|
|
424
|
+
packageManager = detectResult.name;
|
|
425
|
+
logger.info(`\u041E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u043F\u0430\u043A\u0435\u0442\u043E\u0432: "${packageManager}"`);
|
|
426
|
+
} else {
|
|
427
|
+
logger.warn(`\u041D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u043D\u043E \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0438\u0442\u044C \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u043F\u0430\u043A\u0435\u0442\u043E\u0432. \u0414\u0435\u0444\u043E\u043B\u0442: "${packageManager}"`);
|
|
428
|
+
}
|
|
429
|
+
if (packageManager === "npm") {
|
|
430
|
+
rootPath = import_node_path3.default.dirname(RunnerFactory.create("NPM" /* NPM */).runSync("root"));
|
|
431
|
+
} else if (packageManager === "pnpm") {
|
|
432
|
+
rootPath = import_node_path3.default.dirname(RunnerFactory.create("PNPM" /* PNPM */).runSync("root"));
|
|
433
|
+
}
|
|
434
|
+
return new _Program(packageManager, rootPath);
|
|
417
435
|
}
|
|
418
436
|
async getPluginPaths() {
|
|
419
437
|
const nodeModulesPlugins = [];
|
|
@@ -467,17 +485,6 @@ var init_program = __esm({
|
|
|
467
485
|
shouldSkipPackage(name) {
|
|
468
486
|
return name.startsWith("@types/") || name.startsWith("@foxford/types") || name === "@foxford/cli" || name === "typescript" || name.includes("eslint") || name.includes("@babel") || name.includes("react");
|
|
469
487
|
}
|
|
470
|
-
async determineRootPath() {
|
|
471
|
-
const packageManager = await (0, import_detect_package_manager.detect)();
|
|
472
|
-
switch (packageManager) {
|
|
473
|
-
case "npm":
|
|
474
|
-
return import_node_path3.default.dirname(RunnerFactory.create("NPM" /* NPM */).runSync("root"));
|
|
475
|
-
case "pnpm":
|
|
476
|
-
return import_node_path3.default.dirname(RunnerFactory.create("PNPM" /* PNPM */).runSync("root"));
|
|
477
|
-
default:
|
|
478
|
-
return process.cwd();
|
|
479
|
-
}
|
|
480
|
-
}
|
|
481
488
|
defineCommand(command) {
|
|
482
489
|
this.commandList.push(command);
|
|
483
490
|
}
|
|
@@ -820,26 +827,24 @@ var init_abstract_provider = __esm({
|
|
|
820
827
|
this.cwd = process.cwd();
|
|
821
828
|
this.logger = logger.getLogger(providerName);
|
|
822
829
|
this.buildDir = "./build";
|
|
823
|
-
this.packageJson = this.readPackageJson();
|
|
824
830
|
}
|
|
825
831
|
/**
|
|
826
832
|
* Генерирует строку версии пакета на основе цели и SHA коммита.
|
|
827
833
|
*
|
|
828
|
-
* @param
|
|
829
|
-
* Определяет, возвращать ли бета-версию или текущую версию пакета.
|
|
834
|
+
* @param version - Версия пакета из package.json
|
|
830
835
|
* @param sha - Короткий SHA коммита, используемый в строке бета-версии.
|
|
831
836
|
* @returns Строка, представляющая версию пакета.
|
|
832
837
|
* Для цели 'latest' возвращает текущую версию пакета.
|
|
833
838
|
* Для цели 'beta' возвращает строку версии в формате:
|
|
834
839
|
* "<текущая_версия>-beta-<sha>-<текущая_дата>"
|
|
835
840
|
*/
|
|
836
|
-
getBetaPackageVersion(sha) {
|
|
841
|
+
getBetaPackageVersion(version, sha) {
|
|
837
842
|
const now = /* @__PURE__ */ new Date();
|
|
838
843
|
const year = now.getFullYear();
|
|
839
844
|
const month = String(now.getMonth() + 1).padStart(2, "0");
|
|
840
845
|
const day = String(now.getDate()).padStart(2, "0");
|
|
841
846
|
const date = `${year}${month}${day}`;
|
|
842
|
-
return `${
|
|
847
|
+
return `${version}-beta-${sha}-${date}`;
|
|
843
848
|
}
|
|
844
849
|
/**
|
|
845
850
|
* Читает и парсит файл package.json из текущей рабочей директории.
|
|
@@ -847,20 +852,19 @@ var init_abstract_provider = __esm({
|
|
|
847
852
|
* Эта функция пытается найти и прочитать файл package.json в текущей
|
|
848
853
|
* рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.
|
|
849
854
|
*
|
|
850
|
-
* @
|
|
851
|
-
* или если возникла ошибка при чтении/парсинге файла.
|
|
852
|
-
* @returns {FoxfordTools.PackageJson} Распарсенное содержимое файла package.json.
|
|
855
|
+
* @returns Распарсенное содержимое файла package.json или null.
|
|
853
856
|
*/
|
|
854
|
-
readPackageJson(
|
|
855
|
-
const packageJsonPath = import_zx2.path.resolve(
|
|
857
|
+
readPackageJson(pkgPath) {
|
|
858
|
+
const packageJsonPath = import_zx2.path.resolve(pkgPath, "package.json");
|
|
856
859
|
if (!import_zx2.fs.existsSync(packageJsonPath)) {
|
|
857
|
-
|
|
860
|
+
return null;
|
|
858
861
|
}
|
|
859
862
|
try {
|
|
860
863
|
const packageJsonContent = import_zx2.fs.readFileSync(packageJsonPath, "utf-8");
|
|
861
864
|
return JSON.parse(packageJsonContent);
|
|
862
865
|
} catch (error) {
|
|
863
|
-
|
|
866
|
+
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}`);
|
|
867
|
+
return null;
|
|
864
868
|
}
|
|
865
869
|
}
|
|
866
870
|
};
|
|
@@ -886,6 +890,7 @@ var init_npm = __esm({
|
|
|
886
890
|
super("npm");
|
|
887
891
|
this.versionLists = [];
|
|
888
892
|
this.dry = "";
|
|
893
|
+
this.noGitChecks = "";
|
|
889
894
|
}
|
|
890
895
|
/**
|
|
891
896
|
* Возвращает сообщение об устаревании с текущим SHA коммита.
|
|
@@ -907,7 +912,8 @@ var init_npm = __esm({
|
|
|
907
912
|
* @throws Выбрасывает ошибку, если операция с файлом не удалась или если NPM_TOKEN не установлен.
|
|
908
913
|
*/
|
|
909
914
|
async touchNpmrc() {
|
|
910
|
-
|
|
915
|
+
const authStr = "//registry.npmjs.org/:_authToken=${NPM_TOKEN}";
|
|
916
|
+
await import_zx3.$`echo ${authStr} >> .npmrc`;
|
|
911
917
|
}
|
|
912
918
|
/**
|
|
913
919
|
* Фильтрует устаревшие версии из заданного списка версий пакета.
|
|
@@ -915,13 +921,14 @@ var init_npm = __esm({
|
|
|
915
921
|
* Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.
|
|
916
922
|
* Он использует команду `npm view` для получения статуса устаревания каждой версии.
|
|
917
923
|
*
|
|
924
|
+
* @param pkgName - Имя пакета в регистре.
|
|
918
925
|
* @param versions - Массив строк версий для проверки на устаревание.
|
|
919
926
|
* @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.
|
|
920
927
|
*/
|
|
921
|
-
async getNotDeprecatedVersions(versions) {
|
|
928
|
+
async getNotDeprecatedVersions(pkgName, versions) {
|
|
922
929
|
const notDeprecatedVersions = [];
|
|
923
930
|
for (const ver of versions) {
|
|
924
|
-
const cmd = ["npm", "view", `${
|
|
931
|
+
const cmd = ["npm", "view", `${pkgName}@${ver}`, "deprecated"];
|
|
925
932
|
const result = await import_zx3.$`${cmd}`;
|
|
926
933
|
if (!result.toString().trim().includes("deprecated by")) {
|
|
927
934
|
notDeprecatedVersions.push(ver);
|
|
@@ -936,6 +943,8 @@ var init_npm = __esm({
|
|
|
936
943
|
* указанного в файле package.json. Затем он парсит JSON-ответ
|
|
937
944
|
* и сохраняет результат в свойстве `versionLists` класса.
|
|
938
945
|
*
|
|
946
|
+
* @param pkgName - Имя пакета в регистре.
|
|
947
|
+
*
|
|
939
948
|
* @returns Промис, который разрешается в массив строк, где каждая строка
|
|
940
949
|
* представляет версию пакета. Если парсинг не удался, возвращает
|
|
941
950
|
* пустой массив.
|
|
@@ -943,9 +952,9 @@ var init_npm = __esm({
|
|
|
943
952
|
* @throws Записывает ошибку в консоль, если парсинг JSON не удался, но не
|
|
944
953
|
* выбрасывает исключение.
|
|
945
954
|
*/
|
|
946
|
-
async getVersionsList() {
|
|
955
|
+
async getVersionsList(pkgName) {
|
|
947
956
|
logger.info("Getting versions list...");
|
|
948
|
-
const outputProcess = await import_zx3.$`npm view ${
|
|
957
|
+
const outputProcess = await import_zx3.$`npm view ${pkgName} versions --json`;
|
|
949
958
|
const versionsListPo = outputProcess.toString();
|
|
950
959
|
logger.info("Versions list recieved", versionsListPo);
|
|
951
960
|
try {
|
|
@@ -983,22 +992,22 @@ var init_npm = __esm({
|
|
|
983
992
|
* Этот метод находит похожие версии на текущую версию, фильтрует уже устаревшие версии,
|
|
984
993
|
* а затем помечает оставшиеся версии как устаревшие, используя команду npm deprecate.
|
|
985
994
|
*
|
|
986
|
-
* @param
|
|
995
|
+
* @param packageJson - package.json пакета.
|
|
987
996
|
* @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.
|
|
988
997
|
*/
|
|
989
|
-
async deprecatePrevBetaVersions(
|
|
998
|
+
async deprecatePrevBetaVersions(packageJson) {
|
|
990
999
|
logger.info("\u041E\u0442\u043C\u0435\u0447\u0430\u0435\u043C \u043F\u0440\u0435\u0434\u044B\u0434\u0443\u0449\u0438\u0435 \u0431\u044D\u0442\u0430 \u0432\u0435\u0440\u0441\u0438\u0438 \u043A\u0430\u043A deprecated");
|
|
991
|
-
this.versionLists = await this.getVersionsList();
|
|
992
|
-
const betaVersions = this.getBetaVersions(
|
|
1000
|
+
this.versionLists = await this.getVersionsList(packageJson.name);
|
|
1001
|
+
const betaVersions = this.getBetaVersions(packageJson.version);
|
|
993
1002
|
logger.info("\u041D\u0430\u0439\u0434\u0435\u043D\u044B beta \u0432\u0435\u0440\u0441\u0438\u0438:", betaVersions);
|
|
994
|
-
const notDeprecatedVersions = await this.getNotDeprecatedVersions(betaVersions);
|
|
1003
|
+
const notDeprecatedVersions = await this.getNotDeprecatedVersions(packageJson.name, betaVersions);
|
|
995
1004
|
logger.info("Beta \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0435\u0437 deprecated:", notDeprecatedVersions);
|
|
996
1005
|
const deprecationMessage = await this.getDeprecationMessage();
|
|
997
1006
|
for (const ver of notDeprecatedVersions) {
|
|
998
1007
|
await sleep(500);
|
|
999
1008
|
try {
|
|
1000
1009
|
if (!this.dry) {
|
|
1001
|
-
const cmd = ["npm", "deprecate", `${
|
|
1010
|
+
const cmd = ["npm", "deprecate", `${packageJson.name}@${ver}`, deprecationMessage].filter(
|
|
1002
1011
|
(item) => item !== ""
|
|
1003
1012
|
);
|
|
1004
1013
|
logger.info("\u041F\u043E\u043C\u0435\u0447\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u043A\u0430\u043A deprecated:", cmd);
|
|
@@ -1016,26 +1025,26 @@ var init_npm = __esm({
|
|
|
1016
1025
|
* Этот метод получает все версии пакета, находит похожие версии на текущую,
|
|
1017
1026
|
* и удаляет те, которые являются бета-версиями. Он использует команду npm unpublish с флагом --force.
|
|
1018
1027
|
*
|
|
1019
|
-
* @param
|
|
1028
|
+
* @param packageJson - package.json пакета.
|
|
1020
1029
|
* @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.
|
|
1021
1030
|
* @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.
|
|
1022
1031
|
*/
|
|
1023
|
-
async unpublishBetaVersions(
|
|
1032
|
+
async unpublishBetaVersions(packageJson) {
|
|
1024
1033
|
logger.info("\u0420\u0430\u0437\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u044B\u0432\u0430\u0435\u043C beta \u0432\u0435\u0440\u0441\u0438\u0438");
|
|
1025
|
-
this.versionLists = await this.getVersionsList();
|
|
1034
|
+
this.versionLists = await this.getVersionsList(packageJson.name);
|
|
1026
1035
|
logger.info("\u0421\u043F\u0438\u0441\u043E\u043A \u0432\u0435\u0440\u0441\u0438\u0439: ", this.versionLists);
|
|
1027
|
-
const betaVersions = this.getBetaVersions(
|
|
1036
|
+
const betaVersions = this.getBetaVersions(packageJson.version);
|
|
1028
1037
|
logger.info("\u0421\u043F\u0438\u0441\u043E\u043A \u0434\u043B\u044F \u0440\u0430\u0437\u043F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u043F\u0440\u0435\u043A\u0435\u0439\u0442\u0430: ", betaVersions);
|
|
1029
1038
|
const deprecationMessage = await this.getDeprecationMessage();
|
|
1030
1039
|
for (const ver of betaVersions) {
|
|
1031
1040
|
if (!ver.includes("beta")) continue;
|
|
1032
1041
|
try {
|
|
1033
|
-
const deprecate = ["npm", "deprecate", `${
|
|
1042
|
+
const deprecate = ["npm", "deprecate", `${packageJson.name}@${ver}`, deprecationMessage].filter(
|
|
1034
1043
|
(item) => item !== ""
|
|
1035
1044
|
);
|
|
1036
1045
|
logger.info("\u041F\u043E\u043C\u0435\u0447\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u043A\u0430\u043A deprecated:", deprecate);
|
|
1037
1046
|
await import_zx3.$`${deprecate}`;
|
|
1038
|
-
const unpublish = ["npm", "unpublish", `${
|
|
1047
|
+
const unpublish = ["npm", "unpublish", `${packageJson.name}@${ver}`, "--force", this.dry].filter(
|
|
1039
1048
|
(item) => item !== ""
|
|
1040
1049
|
);
|
|
1041
1050
|
logger.info("\u0420\u0430\u0437\u043F\u0443\u0431\u043B\u0438\u043A\u043E\u0432\u044B\u0432\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E:", unpublish);
|
|
@@ -1068,8 +1077,13 @@ var init_npm = __esm({
|
|
|
1068
1077
|
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`);
|
|
1069
1078
|
process.exit(1);
|
|
1070
1079
|
}
|
|
1071
|
-
|
|
1080
|
+
const packageJson = this.readPackageJson(localDir);
|
|
1081
|
+
if (!packageJson) {
|
|
1082
|
+
logger.error("package.json \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438");
|
|
1083
|
+
process.exit(1);
|
|
1084
|
+
}
|
|
1072
1085
|
if (params.dry === true) this.dry = "--dry-run";
|
|
1086
|
+
if (params.skipGitChecks) this.noGitChecks = "--no-git-checks";
|
|
1073
1087
|
logger.info("\u041C\u0435\u043D\u044F\u0435\u043C \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044E \u043D\u0430", localDir);
|
|
1074
1088
|
(0, import_zx3.cd)(localDir);
|
|
1075
1089
|
logger.info("\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u043C sha \u043A\u043E\u043C\u043C\u0438\u0442\u0430");
|
|
@@ -1080,31 +1094,38 @@ var init_npm = __esm({
|
|
|
1080
1094
|
await this.touchNpmrc();
|
|
1081
1095
|
logger.info("\u0421\u043E\u0437\u0434\u0430\u0435\u043C .npmrc");
|
|
1082
1096
|
if (target === "beta") {
|
|
1083
|
-
|
|
1097
|
+
packageJson.version = packageJson.version.includes("beta") ? packageJson.version : this.getBetaPackageVersion(packageJson.version, commitSha);
|
|
1084
1098
|
}
|
|
1085
|
-
|
|
1086
|
-
logger.info("\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0430\u043A\u0435\u0442\u0430:",
|
|
1087
|
-
if (
|
|
1088
|
-
|
|
1089
|
-
postinstall:
|
|
1099
|
+
packageJson.sha = commitSha;
|
|
1100
|
+
logger.info("\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0430\u043A\u0435\u0442\u0430:", packageJson.version);
|
|
1101
|
+
if (packageJson.scripts && packageJson.scripts.postinstall) {
|
|
1102
|
+
packageJson.scripts = {
|
|
1103
|
+
postinstall: packageJson.scripts.postinstall
|
|
1090
1104
|
};
|
|
1091
1105
|
} else {
|
|
1092
|
-
|
|
1106
|
+
packageJson.scripts = {};
|
|
1093
1107
|
}
|
|
1094
|
-
if (
|
|
1095
|
-
delete
|
|
1108
|
+
if (packageJson.devDependencies) {
|
|
1109
|
+
delete packageJson.devDependencies;
|
|
1096
1110
|
}
|
|
1097
|
-
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json",
|
|
1098
|
-
await import_zx3.fs.writeJson("package.json",
|
|
1111
|
+
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", packageJson);
|
|
1112
|
+
await import_zx3.fs.writeJson("package.json", packageJson, {
|
|
1099
1113
|
spaces: 2
|
|
1100
1114
|
});
|
|
1101
|
-
const cmd = [
|
|
1115
|
+
const cmd = [
|
|
1116
|
+
params.packageManager ?? "npm",
|
|
1117
|
+
"publish",
|
|
1118
|
+
"--access=public",
|
|
1119
|
+
`--tag=${target}`,
|
|
1120
|
+
this.dry,
|
|
1121
|
+
this.noGitChecks
|
|
1122
|
+
].filter((item) => item !== "");
|
|
1102
1123
|
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C \u0441 \u0430\u0440\u0433\u0443\u043C\u0435\u043D\u0442\u0430\u043C\u0438:", cmd);
|
|
1103
1124
|
await import_zx3.$`${cmd}`;
|
|
1104
1125
|
if (target === "beta") {
|
|
1105
|
-
await this.deprecatePrevBetaVersions(
|
|
1126
|
+
await this.deprecatePrevBetaVersions(packageJson);
|
|
1106
1127
|
} else {
|
|
1107
|
-
await this.unpublishBetaVersions(
|
|
1128
|
+
await this.unpublishBetaVersions(packageJson);
|
|
1108
1129
|
}
|
|
1109
1130
|
}
|
|
1110
1131
|
};
|
|
@@ -1138,10 +1159,11 @@ var init_s3 = __esm({
|
|
|
1138
1159
|
*
|
|
1139
1160
|
* @param {string} bucket - Имя бакета.
|
|
1140
1161
|
* @param {string} packageName - Имя пакета.
|
|
1162
|
+
* @param {string} packageVersion - Версия пакета.
|
|
1141
1163
|
* @returns {string} Полный путь для версии пакета.
|
|
1142
1164
|
*/
|
|
1143
|
-
getRemoteDirByVersion(bucket, packageName) {
|
|
1144
|
-
return `${bucket}/libs/${packageName}/${
|
|
1165
|
+
getRemoteDirByVersion(bucket, packageName, packageVersion) {
|
|
1166
|
+
return `${bucket}/libs/${packageName}/${packageVersion}/`;
|
|
1145
1167
|
}
|
|
1146
1168
|
/**
|
|
1147
1169
|
* Формирует удаленный путь для цели развертывания.
|
|
@@ -1174,8 +1196,8 @@ var init_s3 = __esm({
|
|
|
1174
1196
|
async deploy(params) {
|
|
1175
1197
|
logger.info("\u041D\u0430\u0447\u0438\u043D\u0430\u0435\u043C \u043F\u0440\u043E\u0446\u0435\u0441\u0441 \u0434\u0435\u043F\u043B\u043E\u044F \u0432 \u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435", params);
|
|
1176
1198
|
const { SELECTEL_USER, SELECTEL_PASSWORD, BUCKET } = process.env;
|
|
1177
|
-
if (!SELECTEL_USER || !SELECTEL_PASSWORD
|
|
1178
|
-
this.logger.warn("\u041D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F SELECTEL_USER \u0438\u043B\u0438 SELECTEL_PASSWORD
|
|
1199
|
+
if (!SELECTEL_USER || !SELECTEL_PASSWORD) {
|
|
1200
|
+
this.logger.warn("\u041D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B \u043F\u0435\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0435 \u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044F SELECTEL_USER \u0438\u043B\u0438 SELECTEL_PASSWORD");
|
|
1179
1201
|
process.exit(1);
|
|
1180
1202
|
}
|
|
1181
1203
|
const localDir = import_zx4.path.join(process.cwd(), params.localDir ?? this.buildDir);
|
|
@@ -1183,40 +1205,52 @@ var init_s3 = __esm({
|
|
|
1183
1205
|
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`);
|
|
1184
1206
|
process.exit(1);
|
|
1185
1207
|
}
|
|
1186
|
-
this.packageJson = this.readPackageJson(localDir);
|
|
1187
1208
|
const bucket = params.bucket ?? BUCKET ?? "dist.ngcdn.ru";
|
|
1188
|
-
const remoteDirs = [];
|
|
1189
|
-
const packageName = params.packageName ?? this.packageJson.name;
|
|
1190
|
-
logger.info("\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u043C sha \u043A\u043E\u043C\u043C\u0438\u0442\u0430");
|
|
1191
|
-
const commitSha = (await import_zx4.$`git rev-parse --short HEAD`).toString().replace("\n", "");
|
|
1192
|
-
logger.info("\u041A\u043E\u043C\u043C\u0438\u0442:", commitSha);
|
|
1193
|
-
const target = params.target ?? this.getTarget();
|
|
1194
|
-
logger.info("\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F:", target);
|
|
1195
1209
|
logger.info("\u0411\u0430\u043A\u0435\u0442:", bucket);
|
|
1196
|
-
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1210
|
+
const packageJson = this.readPackageJson(localDir);
|
|
1211
|
+
if (packageJson) {
|
|
1212
|
+
const commitSha = (await import_zx4.$`git rev-parse --short HEAD`).toString().replace("\n", "");
|
|
1213
|
+
logger.info("\u041A\u043E\u043C\u043C\u0438\u0442:", commitSha);
|
|
1214
|
+
if (params.packageName) {
|
|
1215
|
+
packageJson.name = params.packageName;
|
|
1216
|
+
}
|
|
1217
|
+
const target = params.target ?? this.getTarget();
|
|
1218
|
+
logger.info("\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F:", target);
|
|
1219
|
+
if (target === "beta") {
|
|
1220
|
+
packageJson.version = packageJson.version.includes("beta") ? packageJson.version : this.getBetaPackageVersion(packageJson.version, commitSha);
|
|
1221
|
+
}
|
|
1222
|
+
logger.info("\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0430\u043A\u0435\u0442\u0430:", packageJson.version);
|
|
1223
|
+
packageJson.sha = commitSha;
|
|
1224
|
+
if (packageJson.scripts && packageJson.scripts.postinstall) {
|
|
1225
|
+
packageJson.scripts = {
|
|
1226
|
+
postinstall: packageJson.scripts.postinstall
|
|
1227
|
+
};
|
|
1228
|
+
} else {
|
|
1229
|
+
packageJson.scripts = {};
|
|
1230
|
+
}
|
|
1231
|
+
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", packageJson);
|
|
1232
|
+
await import_zx4.fs.writeJson(import_zx4.path.resolve(localDir, "package.json"), packageJson, {
|
|
1233
|
+
spaces: 2
|
|
1234
|
+
});
|
|
1205
1235
|
} else {
|
|
1206
|
-
|
|
1236
|
+
logger.warn("package.json \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D \u0432 \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438");
|
|
1237
|
+
}
|
|
1238
|
+
const remoteDirs = [];
|
|
1239
|
+
if (params.remoteDir) {
|
|
1240
|
+
remoteDirs.push(params.remoteDir);
|
|
1241
|
+
} else if (packageJson) {
|
|
1242
|
+
remoteDirs.push(
|
|
1243
|
+
this.getRemoteDirByVersion(bucket, packageJson.name, packageJson.version),
|
|
1244
|
+
this.getRemoteDirByTarget(bucket, packageJson.name, params.target ?? this.getTarget())
|
|
1245
|
+
);
|
|
1246
|
+
}
|
|
1247
|
+
if (!remoteDirs.length) {
|
|
1248
|
+
logger.error("\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438 \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u044B");
|
|
1249
|
+
process.exit(1);
|
|
1207
1250
|
}
|
|
1208
|
-
logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", this.packageJson);
|
|
1209
|
-
await import_zx4.fs.writeJson(import_zx4.path.resolve(localDir, "package.json"), this.packageJson, {
|
|
1210
|
-
spaces: 2
|
|
1211
|
-
});
|
|
1212
|
-
remoteDirs.push(this.getRemoteDirByVersion(bucket, packageName));
|
|
1213
|
-
remoteDirs.push(this.getRemoteDirByTarget(bucket, packageName, target));
|
|
1214
1251
|
logger.info("\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438:", remoteDirs);
|
|
1215
1252
|
await Promise.allSettled(
|
|
1216
1253
|
remoteDirs.map(async (remoteDir) => {
|
|
1217
|
-
const href = `https://${remoteDir}`;
|
|
1218
|
-
const files = this.packageJson.files ?? [];
|
|
1219
|
-
const fileList = files.map((file) => href + file).join("\n ");
|
|
1220
1254
|
const rclone = `rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer`;
|
|
1221
1255
|
logger.info(`\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u0432 ${remoteDir} \u0441 \u043A\u043E\u043C\u0430\u043D\u0434\u043E\u0439:
|
|
1222
1256
|
`, rclone);
|
|
@@ -1225,12 +1259,11 @@ var init_s3 = __esm({
|
|
|
1225
1259
|
import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = SELECTEL_USER;
|
|
1226
1260
|
import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = SELECTEL_PASSWORD;
|
|
1227
1261
|
import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? "s3.ru-1.storage.selcloud.ru";
|
|
1228
|
-
import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_BUCKET_NAME =
|
|
1262
|
+
import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_BUCKET_NAME = bucket;
|
|
1229
1263
|
import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? "ru-1";
|
|
1230
1264
|
await import_zx4.$`rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer ${params.dry ? "--dry-run" : ""}`;
|
|
1231
1265
|
logger.info(`\u041F\u0430\u043A\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043D. \u0420\u0435\u0441\u0443\u0440\u0441\u044B \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B \u043F\u043E \u0430\u0434\u0440\u0435\u0441\u0443:
|
|
1232
|
-
`,
|
|
1233
|
-
logger.info(fileList);
|
|
1266
|
+
`, `https://${remoteDir}`);
|
|
1234
1267
|
})
|
|
1235
1268
|
);
|
|
1236
1269
|
}
|
|
@@ -1280,16 +1313,16 @@ var init_command2 = __esm({
|
|
|
1280
1313
|
async load(program) {
|
|
1281
1314
|
const deployCommand = new import_commander3.Command("deploy").description("\u0417\u0430\u0434\u0435\u043F\u043B\u043E\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442");
|
|
1282
1315
|
const targetOption = new import_commander3.Option("--target <target>", "\u0420\u0435\u043B\u0438\u0437 beta \u0438\u043B\u0438 latest").choices(["beta", "latest"]).default("beta");
|
|
1283
|
-
const localDirOption = new import_commander3.Option("--
|
|
1316
|
+
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");
|
|
1284
1317
|
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);
|
|
1285
|
-
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("--
|
|
1318
|
+
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").action(async (params) => {
|
|
1286
1319
|
await this.action.handle({ ...params, provider: "s3" });
|
|
1287
1320
|
});
|
|
1288
1321
|
s3Command.addOption(targetOption);
|
|
1289
1322
|
s3Command.addOption(localDirOption);
|
|
1290
1323
|
s3Command.addOption(dryOption);
|
|
1291
|
-
const npmCommand = new import_commander3.Command("npm").description("\u0414\u0435\u043F\u043B\u043E\u0439 \u043F\u0430\u043A\u0435\u0442\u0430 \u0432 npm").action(async (params) => {
|
|
1292
|
-
await this.action.handle({ ...params, provider: "npm" });
|
|
1324
|
+
const npmCommand = new import_commander3.Command("npm").description("\u0414\u0435\u043F\u043B\u043E\u0439 \u043F\u0430\u043A\u0435\u0442\u0430 \u0432 npm").option("--skip-git-checks", "\u041E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0435 git \u043F\u0440\u043E\u0432\u0435\u0440\u043E\u043A \u043F\u0440\u0438 \u043F\u0443\u0431\u043B\u0438\u043A\u0430\u0446\u0438\u0438").action(async (params) => {
|
|
1325
|
+
await this.action.handle({ ...params, provider: "npm", packageManager: program.packageManager });
|
|
1293
1326
|
});
|
|
1294
1327
|
npmCommand.addOption(targetOption);
|
|
1295
1328
|
npmCommand.addOption(localDirOption);
|
|
@@ -1624,7 +1657,7 @@ var import_chalk12 = __toESM(require("chalk"));
|
|
|
1624
1657
|
// package.json
|
|
1625
1658
|
var package_default = {
|
|
1626
1659
|
name: "@foxford/cli",
|
|
1627
|
-
version: "1.
|
|
1660
|
+
version: "1.2.1",
|
|
1628
1661
|
description: "Foxford Cli",
|
|
1629
1662
|
keywords: [
|
|
1630
1663
|
"foxford",
|
|
@@ -1683,7 +1716,6 @@ var package_default = {
|
|
|
1683
1716
|
"cli-progress": "3.12.0",
|
|
1684
1717
|
"cli-table3": "0.6.5",
|
|
1685
1718
|
commander: "13.1.0",
|
|
1686
|
-
"detect-package-manager": "3.0.2",
|
|
1687
1719
|
dotenv: "16.4.5",
|
|
1688
1720
|
"dotenv-expand": "11.0.6",
|
|
1689
1721
|
"file-type": "19.0.0",
|
|
@@ -1693,6 +1725,7 @@ var package_default = {
|
|
|
1693
1725
|
glob: "10.4.2",
|
|
1694
1726
|
inquirer: "12.4.3",
|
|
1695
1727
|
"os-name": "4.0.1",
|
|
1728
|
+
"package-manager-detector": "1.3.0",
|
|
1696
1729
|
"read-package-up": "11.0.0",
|
|
1697
1730
|
systeminformation: "5.25.11",
|
|
1698
1731
|
tinify: "1.7.1",
|
|
@@ -1874,7 +1907,7 @@ ${import_chalk12.default.yellowBright("\u0427\u0430\u0439 \u043D\u0430\u043B\u04
|
|
|
1874
1907
|
`;
|
|
1875
1908
|
var bootstrap = async () => {
|
|
1876
1909
|
logger.debug("Start program");
|
|
1877
|
-
const program =
|
|
1910
|
+
const program = await Program.init();
|
|
1878
1911
|
program.version(package_default.version, "-v, --version", "\u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E \u0442\u0443\u043B\u0437\u044B").name(PROGRAM_NAME).description(welcomeText).usage("<command> [options]").helpOption(false).addHelpCommand(false);
|
|
1879
1912
|
logger.debug("Load processes");
|
|
1880
1913
|
await CommandLoader.load(program);
|
package/fox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/processes/deploy/providers/abstract.provider.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":["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 stdio: collect ? 'pipe' : 'inherit',\n shell: true,\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 dotenv from 'dotenv'\nimport 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.expand(\n dotenv.config({\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 env: Object.assign(process.env, { FORCE_COLOR: '1' }),\n cwd: pkg.path,\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 path from 'node:path'\n\nimport { Command } from 'commander'\nimport { detect } from 'detect-package-manager'\nimport dotenv from 'dotenv'\nimport { existsSync } from 'fs-extra'\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\nexport class Program extends Command implements FoxfordTools.Program {\n rootPath: string = process.cwd()\n logger = logger\n private commandList: Array<AbstractCommand> = []\n\n constructor() {\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 dotenv.config({\n path: dotenvFile,\n })\n }\n })\n\n this.determineRootPath().then((path) => (this.rootPath = path))\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 async determineRootPath(): Promise<string> {\n const packageManager = await detect()\n switch (packageManager) {\n case 'npm':\n return path.dirname(RunnerFactory.create(Runner.NPM).runSync('root'))\n case 'pnpm':\n return path.dirname(RunnerFactory.create(Runner.PNPM).runSync('root'))\n default:\n return process.cwd()\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 // eslint-disable-next-line @typescript-eslint/no-var-requires\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 head: ['name', 'description'],\n chars: {\n left: leftMargin.concat('│'),\n 'top-left': leftMargin.concat('┌'),\n 'bottom-left': leftMargin.concat('└'),\n mid: '',\n 'left-mid': '',\n 'mid-mid': '',\n 'right-mid': '',\n },\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","import { fs, path } from 'zx'\n\nimport { logger } from '../../../logger'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployOptions } from '../types'\nimport type { HierarchicalLogger } from '@foxford/logger'\n\nexport abstract class DeployProvider {\n cwd: string\n logger: HierarchicalLogger\n buildDir: string\n packageJson: FoxfordTools.PackageJson\n\n constructor(public providerName: string) {\n this.cwd = process.cwd()\n this.logger = logger.getLogger(providerName)\n this.buildDir = './build'\n this.packageJson = this.readPackageJson()\n }\n\n /**\n * Генерирует строку версии пакета на основе цели и SHA коммита.\n *\n * @param target - Цель развертывания. Может быть 'beta' или 'latest'.\n * Определяет, возвращать ли бета-версию или текущую версию пакета.\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии.\n * @returns Строка, представляющая версию пакета.\n * Для цели 'latest' возвращает текущую версию пакета.\n * Для цели 'beta' возвращает строку версии в формате:\n * \"<текущая_версия>-beta-<sha>-<текущая_дата>\"\n */\n public getBetaPackageVersion(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 `${this.packageJson.version}-beta-${sha}-${date}`\n }\n\n /**\n * Читает и парсит файл package.json из текущей рабочей директории.\n *\n * Эта функция пытается найти и прочитать файл package.json в текущей\n * рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.\n *\n * @throws {Error} Выбрасывает ошибку, если файл package.json не найден в текущей директории\n * или если возникла ошибка при чтении/парсинге файла.\n * @returns {FoxfordTools.PackageJson} Распарсенное содержимое файла package.json.\n */\n readPackageJson(rootPath: string = this.cwd): FoxfordTools.PackageJson {\n const packageJsonPath = path.resolve(rootPath, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n throw new Error('package.json не найден в текущей директории')\n }\n\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(packageJsonContent)\n } catch (error) {\n throw new Error(`Ошибка при чтении или парсинге package.json: ${(error as Error).message}`)\n }\n }\n\n public abstract deploy(params: Omit<DeployOptions, 'provider'>): Promise<void>\n}\n","import { fs, $, path, cd } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\n\nimport type { DeployNpmOptions } from '../types'\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\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 await $`echo \"//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}\" >> .npmrc`\n }\n\n /**\n * Фильтрует устаревшие версии из заданного списка версий пакета.\n *\n * Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.\n * Он использует команду `npm view` для получения статуса устаревания каждой версии.\n *\n * @param versions - Массив строк версий для проверки на устаревание.\n * @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.\n */\n private async getNotDeprecatedVersions(versions: string[]): Promise<string[]> {\n const notDeprecatedVersions = []\n for (const ver of versions) {\n const cmd = ['npm', 'view', `${this.packageJson.name}@${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 * @returns Промис, который разрешается в массив строк, где каждая строка\n * представляет версию пакета. Если парсинг не удался, возвращает\n * пустой массив.\n *\n * @throws Записывает ошибку в консоль, если парсинг JSON не удался, но не\n * выбрасывает исключение.\n */\n private async getVersionsList(): Promise<string[]> {\n logger.info('Getting versions list...')\n const outputProcess = await $`npm view ${this.packageJson.name} versions --json`\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 currentVersion - Текущая версия пакета для сравнения при поиске похожих версий.\n * @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.\n */\n private async deprecatePrevBetaVersions(currentVersion: string): Promise<void> {\n logger.info('Отмечаем предыдущие бэта версии как deprecated')\n\n this.versionLists = await this.getVersionsList()\n const betaVersions = this.getBetaVersions(currentVersion)\n logger.info('Найдены beta версии:', betaVersions)\n\n const notDeprecatedVersions = await this.getNotDeprecatedVersions(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', `${this.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 currentVersion - Текущая версия пакета для сравнения при поиске похожих версий.\n * @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.\n * @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.\n */\n private async unpublishBetaVersions(currentVersion: string): Promise<void> {\n logger.info('Разпубликовываем beta версии')\n this.versionLists = await this.getVersionsList()\n logger.info('Список версий: ', this.versionLists)\n\n const betaVersions = this.getBetaVersions(currentVersion)\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', `${this.packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', deprecate)\n await $`${deprecate}`\n\n const unpublish = ['npm', 'unpublish', `${this.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 * @param params - Параметры развертывания.\n * @param params.dry - Если true, выполняет пробный запуск без фактической публикации.\n * @param params.target - Цель развертывания, либо 'beta', либо 'latest'. По умолчанию 'beta'.\n *\n * @throws Завершает процесс, если директория сборки не найдена.\n * @returns Промис, который разрешается, когда процесс развертывания завершен.\n */\n async deploy(params: DeployNpmOptions) {\n logger.info('Начинаем процесс деплоя в NPM', params)\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 this.packageJson = this.readPackageJson(localDir)\n\n if (params.dry === true) this.dry = '--dry-run'\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 this.packageJson.version = this.packageJson.version.includes('beta')\n ? this.packageJson.version\n : this.getBetaPackageVersion(commitSha)\n }\n\n this.packageJson.sha = commitSha\n logger.info('Версия пакета:', this.packageJson.version)\n\n if (this.packageJson.scripts && this.packageJson.scripts.postinstall) {\n this.packageJson.scripts = {\n postinstall: this.packageJson.scripts.postinstall,\n }\n } else {\n this.packageJson.scripts = {}\n }\n\n if (this.packageJson.devDependencies) {\n delete this.packageJson.devDependencies\n }\n\n logger.info('Публикуемый package.json', this.packageJson)\n\n await fs.writeJson('package.json', this.packageJson, {\n spaces: 2,\n })\n\n const cmd = ['npm', 'publish', '--access=public', `--tag=${target}`, this.dry].filter((item) => item !== '')\n logger.info('Публикуем с аргументами:', cmd)\n\n await $`${cmd}`\n\n if (target === 'beta') {\n await this.deprecatePrevBetaVersions(this.packageJson.version)\n } else {\n await this.unpublishBetaVersions(this.packageJson.version)\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 {string} bucket - Имя бакета.\n * @param {string} packageName - Имя пакета.\n * @returns {string} Полный путь для версии пакета.\n */\n getRemoteDirByVersion(bucket: string, packageName: string): string {\n return `${bucket}/libs/${packageName}/${this.packageJson.version}/`\n }\n\n /**\n * Формирует удаленный путь для цели развертывания.\n *\n * @param {string} bucket - Имя бакета.\n * @param {string} packageName - Имя пакета.\n * @param {string} target - Цель развертывания ('latest' или 'beta').\n * @returns {string} Полный путь для цели развертывания.\n */\n getRemoteDirByTarget(bucket: string, packageName: string, target: string): string {\n return `${bucket}/libs/${packageName}/${target}/`\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 {'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 { SELECTEL_USER, SELECTEL_PASSWORD, BUCKET } = process.env\n\n if (!SELECTEL_USER || !SELECTEL_PASSWORD || !BUCKET) {\n this.logger.warn('Не указаны переменные окружения SELECTEL_USER или SELECTEL_PASSWORD или BUCKET')\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 this.packageJson = this.readPackageJson(localDir)\n\n const bucket = params.bucket ?? BUCKET ?? 'dist.ngcdn.ru'\n const remoteDirs = []\n const packageName = params.packageName ?? this.packageJson.name\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 ?? this.getTarget()\n\n logger.info('Целевая версия:', target)\n logger.info('Бакет:', bucket)\n\n if (target === 'beta') {\n this.packageJson.version = this.packageJson.version.includes('beta')\n ? this.packageJson.version\n : this.getBetaPackageVersion(commitSha)\n }\n\n this.packageJson.sha = commitSha\n logger.info('Версия пакета:', this.packageJson.version)\n\n if (this.packageJson.scripts && this.packageJson.scripts.postinstall) {\n this.packageJson.scripts = {\n postinstall: this.packageJson.scripts.postinstall,\n }\n } else {\n this.packageJson.scripts = {}\n }\n\n logger.info('Публикуемый package.json', this.packageJson)\n\n await fs.writeJson(path.resolve(localDir, 'package.json'), this.packageJson, {\n spaces: 2,\n })\n\n remoteDirs.push(this.getRemoteDirByVersion(bucket, packageName))\n remoteDirs.push(this.getRemoteDirByTarget(bucket, packageName, target))\n\n logger.info('Удаленные директории:', remoteDirs)\n\n await Promise.allSettled(\n remoteDirs.map(async (remoteDir) => {\n const href = `https://${remoteDir}`\n const files = this.packageJson.files ?? []\n const fileList = files.map((file) => href + file).join('\\n\\t')\n const rclone = `rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer`\n logger.info(`Загружаем версию в ${remoteDir} с командой:\\n\\t`, rclone)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = SELECTEL_USER\n $.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = SELECTEL_PASSWORD\n $.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? 's3.ru-1.storage.selcloud.ru'\n $.env.RCLONE_CONFIG_MYREMOTE_BUCKET_NAME = BUCKET\n $.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? 'ru-1'\n\n await $`rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer ${params.dry ? '--dry-run' : ''}`\n\n logger.info(`Пакет загружен. Ресурсы доступны по адресу:\\n\\t`, href)\n logger.info(fileList)\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'\n\nexport class DeployCommand extends AbstractCommand<DeployOptions> {\n id = 'deploy'\n public async load(program: Command) {\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('--localDir <path>', 'Из какой локальной директории загрузить содержимое')\n const dryOption = new Option('--dry', 'Запуск без выполнения операции').default(false)\n\n const s3Command = new Command('s3')\n .description('Деплой пакета по s3 в хранилище')\n .option('--bucket <name>', 'В какой бакет загрузить пакет')\n .option('--packageName <name>', 'Имя пакета вместо packageJson.name')\n\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\n const npmCommand = new Command('npm').description('Деплой пакета в npm').action(async (params) => {\n await this.action.handle({ ...params, provider: 'npm' })\n })\n\n npmCommand.addOption(targetOption)\n npmCommand.addOption(localDirOption)\n npmCommand.addOption(dryOption)\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 osName from 'os-name'\nimport si 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 console.info(chalk.green('[System Information]'))\n console.info('OS Version :', chalk.blue(osName(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 cpu = await si.cpu()\n const mem = await si.mem()\n console.info('CPU Family:', chalk.blue(`${cpu.vendor} ${cpu.brand}`))\n console.info('CPU Ph Cores:', chalk.blue(cpu.cores))\n console.info('CPU Speed:', chalk.blue(`${cpu.speed}GHz`))\n console.info('Memory:', chalk.blue(`${filesize(mem.total)}`))\n console.info('Memory Free:', chalk.blue(`${filesize(mem.free)}`))\n console.info('Memory Used:', chalk.blue(`${filesize(mem.used)}`))\n console.info('Memory Available:', chalk.blue(`${filesize(mem.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 progress from 'cli-progress'\nimport Table from 'cli-table3'\nimport { filesize } from 'filesize'\nimport { glob } from 'glob'\nimport inquirer from 'inquirer'\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 answers = await inquirer.prompt([\n {\n type: 'list',\n message: 'Продолжить?',\n choices: [\n { name: 'Yes', value: 1 },\n { name: 'No', value: 0 },\n ],\n default: 1,\n name: 'continue',\n },\n ])\n\n if (!answers.continue) return\n\n console.log()\n const bar = new progress.SingleBar({ fps: 25 }, progress.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 __originalPath: resource,\n __optimizedPath: 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 __originalPath: resource,\n __optimizedPath: resource,\n status: false,\n }\n }\n\n try {\n const beforeStat = fs.statSync(resource)\n await runner.run({\n resource,\n output: outputPath,\n extraFlags,\n })\n const afterStat = fs.statSync(outputPath)\n\n return {\n __originalPath: resource,\n __originalStat: beforeStat,\n __optimizedPath: resource,\n __optimizedStat: afterStat,\n status: true,\n }\n } catch (err) {\n return {\n __originalPath: resource,\n __optimizedPath: resource,\n status: false,\n err: err as string,\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 head: ['Обработано', 'Не обработано', 'Изменение размера'],\n chars: {\n left: leftMargin.concat('│'),\n 'top-left': leftMargin.concat('┌'),\n 'bottom-left': leftMargin.concat('└'),\n mid: '',\n 'left-mid': '',\n 'mid-mid': '',\n 'right-mid': '',\n },\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 replace: option.replace,\n prefix: option.prefix,\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","#!/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 = new Program()\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.1.1\",\n \"description\": \"Foxford Cli\",\n \"keywords\": [\n \"foxford\",\n \"cli\",\n \"tool\"\n ],\n \"homepage\": \"https://github.com/foxford/stoege\",\n \"bugs\": \"https://github.com/foxford/stoege/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/foxford/stoege.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 \"exports\": {\n \"./README.mdx\": \"./README.mdx\",\n \".\": {\n \"types\": \"./src/types/index.ts\"\n }\n },\n \"bin\": {\n \"fox-dev\": \"./scripts/dev.js\",\n \"fox\": \"./scripts/prod.js\"\n },\n \"scripts\": {\n \"============================ BUILD =============================\": \"\",\n \"build\": \"tsup\",\n \"prebuild\": \"pnpm -w run build:workspace-deps \\\"$PWD\\\"\",\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 \"@tsconfig/node16\": \"16.1.3\",\n \"@types/cli-progress\": \"3.11.5\",\n \"@types/fluent-ffmpeg\": \"2.1.24\",\n \"chalk\": \"4.1.0\",\n \"cli-progress\": \"3.12.0\",\n \"cli-table3\": \"0.6.5\",\n \"commander\": \"13.1.0\",\n \"detect-package-manager\": \"3.0.2\",\n \"dotenv\": \"16.4.5\",\n \"dotenv-expand\": \"11.0.6\",\n \"file-type\": \"19.0.0\",\n \"filesize\": \"10.1.2\",\n \"fluent-ffmpeg\": \"2.1.2\",\n \"fs-extra\": \"11.2.0\",\n \"glob\": \"10.4.2\",\n \"inquirer\": \"12.4.3\",\n \"os-name\": \"4.0.1\",\n \"read-package-up\": \"11.0.0\",\n \"systeminformation\": \"5.25.11\",\n \"tinify\": \"1.7.1\",\n \"tsx\": \"4.15.7\",\n \"typescript\": \"5.8.3\",\n \"yaml\": \"2.4.5\",\n \"zx\": \"8.5.4\"\n },\n \"devDependencies\": {\n \"@foxford/eslint-config\": \"workspace:*\",\n \"@foxford/typescript-config\": \"workspace:*\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"tsup\": \"8.4.0\",\n \"vitest\": \"3.0.9\"\n }\n}\n","import { createRequire } from 'node:module'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\nimport fs 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\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 fs.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 // eslint-disable-next-line @typescript-eslint/no-require-imports\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 // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require(`${plugin.pkgJson.name}`)\n module.default(program)\n continue\n }\n\n let targetPath = path.resolve(dirname)\n\n if (fs.existsSync(path.resolve(targetPath, 'build'))) {\n targetPath = path.resolve(targetPath, 'build')\n }\n\n if (fs.existsSync(path.join(targetPath, 'package.json'))) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\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 fs.readdir(processesPath)\n\n return files\n .filter((file) => {\n const filePath = path.join(processesPath, file, 'index.ts')\n const stat = fs.statSync(filePath)\n return stat.isFile()\n })\n .map((file) => path.parse(file).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","dotenv","import_node_path","init_logger","chalk","label","import_chalk","init_logger","chalk","label","import_chalk","tinify","chalk","import_node_path","import_dotenv","import_fs_extra","path","dotenv","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","osName","si","init_command","init_program","init_action","init_command","import_node_path","import_chalk","import_cli_table3","import_filesize","init_action","init_program","Table","chalk","path","inquirer","progress","fs","import_chalk","init_command","init_program","path","chalk","init_action","init_command","import_chalk","init_program","import_node_path","import_chalk","import_fs_extra","log","chalk","module","fs","path","require","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../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/processes/deploy/providers/abstract.provider.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":["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 stdio: collect ? 'pipe' : 'inherit',\n shell: true,\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 dotenv from 'dotenv'\nimport 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.expand(\n dotenv.config({\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 env: Object.assign(process.env, { FORCE_COLOR: '1' }),\n cwd: pkg.path,\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 path from 'node:path'\n\nimport { Command } from 'commander'\nimport dotenv from 'dotenv'\nimport { existsSync } from 'fs-extra'\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\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 dotenv.config({\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 // eslint-disable-next-line @typescript-eslint/no-var-requires\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 head: ['name', 'description'],\n chars: {\n left: leftMargin.concat('│'),\n 'top-left': leftMargin.concat('┌'),\n 'bottom-left': leftMargin.concat('└'),\n mid: '',\n 'left-mid': '',\n 'mid-mid': '',\n 'right-mid': '',\n },\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","import { fs, path } from 'zx'\n\nimport { logger } from '../../../logger'\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 * @param version - Версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии.\n * @returns Строка, представляющая версию пакета.\n * Для цели 'latest' возвращает текущую версию пакета.\n * Для цели 'beta' возвращает строку версии в формате:\n * \"<текущая_версия>-beta-<sha>-<текущая_дата>\"\n */\n public 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\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 { fs, $, path, cd } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployNpmOptions } from '../types'\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 * @param pkgName - Имя пакета в регистре.\n *\n * @returns Промис, который разрешается в массив строк, где каждая строка\n * представляет версию пакета. Если парсинг не удался, возвращает\n * пустой массив.\n *\n * @throws Записывает ошибку в консоль, если парсинг JSON не удался, но не\n * выбрасывает исключение.\n */\n private async getVersionsList(pkgName: string): Promise<string[]> {\n logger.info('Getting versions list...')\n const outputProcess = await $`npm view ${pkgName} versions --json`\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 * @param params - Параметры развертывания.\n * @param params.dry - Если true, выполняет пробный запуск без фактической публикации.\n * @param params.target - Цель развертывания, либо 'beta', либо 'latest'. По умолчанию 'beta'.\n *\n * @throws Завершает процесс, если директория сборки не найдена.\n * @returns Промис, который разрешается, когда процесс развертывания завершен.\n */\n async deploy(params: DeployNpmOptions) {\n logger.info('Начинаем процесс деплоя в NPM', params)\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 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 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 {string} bucket - Имя бакета.\n * @param {string} packageName - Имя пакета.\n * @param {string} packageVersion - Версия пакета.\n * @returns {string} Полный путь для версии пакета.\n */\n getRemoteDirByVersion(bucket: string, packageName: string, packageVersion: string): string {\n return `${bucket}/libs/${packageName}/${packageVersion}/`\n }\n\n /**\n * Формирует удаленный путь для цели развертывания.\n *\n * @param {string} bucket - Имя бакета.\n * @param {string} packageName - Имя пакета.\n * @param {string} target - Цель развертывания ('latest' или 'beta').\n * @returns {string} Полный путь для цели развертывания.\n */\n getRemoteDirByTarget(bucket: string, packageName: string, target: string): string {\n return `${bucket}/libs/${packageName}/${target}/`\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 {'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 { SELECTEL_USER, SELECTEL_PASSWORD, BUCKET } = process.env\n\n if (!SELECTEL_USER || !SELECTEL_PASSWORD) {\n this.logger.warn('Не указаны переменные окружения SELECTEL_USER или SELECTEL_PASSWORD')\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 ?? 'dist.ngcdn.ru'\n logger.info('Бакет:', bucket)\n\n const packageJson = this.readPackageJson(localDir)\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 } else {\n logger.warn('package.json не найден в текущей директории')\n }\n\n const remoteDirs = []\n\n if (params.remoteDir) {\n remoteDirs.push(params.remoteDir)\n } else if (packageJson) {\n remoteDirs.push(\n this.getRemoteDirByVersion(bucket, packageJson.name, packageJson.version),\n this.getRemoteDirByTarget(bucket, packageJson.name, params.target ?? this.getTarget())\n )\n }\n\n if (!remoteDirs.length) {\n logger.error('Удаленные директории не определены')\n process.exit(1)\n }\n\n logger.info('Удаленные директории:', remoteDirs)\n\n await Promise.allSettled(\n remoteDirs.map(async (remoteDir) => {\n const rclone = `rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer`\n logger.info(`Загружаем версию в ${remoteDir} с командой:\\n\\t`, rclone)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = SELECTEL_USER\n $.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = SELECTEL_PASSWORD\n $.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? 's3.ru-1.storage.selcloud.ru'\n $.env.RCLONE_CONFIG_MYREMOTE_BUCKET_NAME = bucket\n $.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? 'ru-1'\n\n await $`rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer ${params.dry ? '--dry-run' : ''}`\n\n logger.info(`Пакет загружен. Ресурсы доступны по адресу:\\n\\t`, `https://${remoteDir}`)\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\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 .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\n const npmCommand = new Command('npm')\n .description('Деплой пакета в npm')\n .option('--skip-git-checks', 'Отключение git проверок при публикации')\n .action(async (params) => {\n await this.action.handle({ ...params, provider: 'npm', packageManager: program.packageManager })\n })\n\n npmCommand.addOption(targetOption)\n npmCommand.addOption(localDirOption)\n npmCommand.addOption(dryOption)\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 osName from 'os-name'\nimport si 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 console.info(chalk.green('[System Information]'))\n console.info('OS Version :', chalk.blue(osName(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 cpu = await si.cpu()\n const mem = await si.mem()\n console.info('CPU Family:', chalk.blue(`${cpu.vendor} ${cpu.brand}`))\n console.info('CPU Ph Cores:', chalk.blue(cpu.cores))\n console.info('CPU Speed:', chalk.blue(`${cpu.speed}GHz`))\n console.info('Memory:', chalk.blue(`${filesize(mem.total)}`))\n console.info('Memory Free:', chalk.blue(`${filesize(mem.free)}`))\n console.info('Memory Used:', chalk.blue(`${filesize(mem.used)}`))\n console.info('Memory Available:', chalk.blue(`${filesize(mem.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 progress from 'cli-progress'\nimport Table from 'cli-table3'\nimport { filesize } from 'filesize'\nimport { glob } from 'glob'\nimport inquirer from 'inquirer'\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 answers = await inquirer.prompt([\n {\n type: 'list',\n message: 'Продолжить?',\n choices: [\n { name: 'Yes', value: 1 },\n { name: 'No', value: 0 },\n ],\n default: 1,\n name: 'continue',\n },\n ])\n\n if (!answers.continue) return\n\n console.log()\n const bar = new progress.SingleBar({ fps: 25 }, progress.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 __originalPath: resource,\n __optimizedPath: 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 __originalPath: resource,\n __optimizedPath: resource,\n status: false,\n }\n }\n\n try {\n const beforeStat = fs.statSync(resource)\n await runner.run({\n resource,\n output: outputPath,\n extraFlags,\n })\n const afterStat = fs.statSync(outputPath)\n\n return {\n __originalPath: resource,\n __originalStat: beforeStat,\n __optimizedPath: resource,\n __optimizedStat: afterStat,\n status: true,\n }\n } catch (err) {\n return {\n __originalPath: resource,\n __optimizedPath: resource,\n status: false,\n err: err as string,\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 head: ['Обработано', 'Не обработано', 'Изменение размера'],\n chars: {\n left: leftMargin.concat('│'),\n 'top-left': leftMargin.concat('┌'),\n 'bottom-left': leftMargin.concat('└'),\n mid: '',\n 'left-mid': '',\n 'mid-mid': '',\n 'right-mid': '',\n },\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 replace: option.replace,\n prefix: option.prefix,\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","import 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.2.1\",\n \"description\": \"Foxford Cli\",\n \"keywords\": [\n \"foxford\",\n \"cli\",\n \"tool\"\n ],\n \"homepage\": \"https://github.com/foxford/stoege\",\n \"bugs\": \"https://github.com/foxford/stoege/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/foxford/stoege.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 \"exports\": {\n \"./README.mdx\": \"./README.mdx\",\n \".\": {\n \"types\": \"./src/types/index.ts\"\n }\n },\n \"bin\": {\n \"fox-dev\": \"./scripts/dev.js\",\n \"fox\": \"./scripts/prod.js\"\n },\n \"scripts\": {\n \"============================ BUILD =============================\": \"\",\n \"build\": \"tsup\",\n \"prebuild\": \"pnpm -w run build:workspace-deps \\\"$PWD\\\"\",\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 \"@tsconfig/node16\": \"16.1.3\",\n \"@types/cli-progress\": \"3.11.5\",\n \"@types/fluent-ffmpeg\": \"2.1.24\",\n \"chalk\": \"4.1.0\",\n \"cli-progress\": \"3.12.0\",\n \"cli-table3\": \"0.6.5\",\n \"commander\": \"13.1.0\",\n \"dotenv\": \"16.4.5\",\n \"dotenv-expand\": \"11.0.6\",\n \"file-type\": \"19.0.0\",\n \"filesize\": \"10.1.2\",\n \"fluent-ffmpeg\": \"2.1.2\",\n \"fs-extra\": \"11.2.0\",\n \"glob\": \"10.4.2\",\n \"inquirer\": \"12.4.3\",\n \"os-name\": \"4.0.1\",\n \"package-manager-detector\": \"1.3.0\",\n \"read-package-up\": \"11.0.0\",\n \"systeminformation\": \"5.25.11\",\n \"tinify\": \"1.7.1\",\n \"tsx\": \"4.15.7\",\n \"typescript\": \"5.8.3\",\n \"yaml\": \"2.4.5\",\n \"zx\": \"8.5.4\"\n },\n \"devDependencies\": {\n \"@foxford/eslint-config\": \"workspace:*\",\n \"@foxford/typescript-config\": \"workspace:*\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"tsup\": \"8.4.0\",\n \"vitest\": \"3.0.9\"\n }\n}\n","import { createRequire } from 'node:module'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\nimport fs 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\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 fs.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 // eslint-disable-next-line @typescript-eslint/no-require-imports\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 // eslint-disable-next-line @typescript-eslint/no-require-imports\n const module = require(`${plugin.pkgJson.name}`)\n module.default(program)\n continue\n }\n\n let targetPath = path.resolve(dirname)\n\n if (fs.existsSync(path.resolve(targetPath, 'build'))) {\n targetPath = path.resolve(targetPath, 'build')\n }\n\n if (fs.existsSync(path.join(targetPath, 'package.json'))) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\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 fs.readdir(processesPath)\n\n return files\n .filter((file) => {\n const filePath = path.join(processesPath, file, 'index.ts')\n const stat = fs.statSync(filePath)\n return stat.isFile()\n })\n .map((file) => path.parse(file).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","dotenv","import_node_path","init_logger","chalk","label","import_chalk","init_logger","chalk","label","import_chalk","tinify","chalk","import_node_path","import_dotenv","import_fs_extra","path","dotenv","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","osName","si","init_command","init_program","init_action","init_command","import_node_path","import_chalk","import_cli_table3","import_filesize","init_action","init_program","Table","chalk","path","inquirer","progress","fs","import_chalk","init_command","init_program","path","chalk","init_action","init_command","import_chalk","init_program","import_node_path","import_chalk","import_fs_extra","log","chalk","module","fs","path","require","chalk"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foxford/cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Foxford Cli",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"foxford",
|
|
@@ -34,7 +34,6 @@
|
|
|
34
34
|
"cli-progress": "3.12.0",
|
|
35
35
|
"cli-table3": "0.6.5",
|
|
36
36
|
"commander": "13.1.0",
|
|
37
|
-
"detect-package-manager": "3.0.2",
|
|
38
37
|
"dotenv": "16.4.5",
|
|
39
38
|
"dotenv-expand": "11.0.6",
|
|
40
39
|
"file-type": "19.0.0",
|
|
@@ -44,6 +43,7 @@
|
|
|
44
43
|
"glob": "10.4.2",
|
|
45
44
|
"inquirer": "12.4.3",
|
|
46
45
|
"os-name": "4.0.1",
|
|
46
|
+
"package-manager-detector": "1.3.0",
|
|
47
47
|
"read-package-up": "11.0.0",
|
|
48
48
|
"systeminformation": "5.25.11",
|
|
49
49
|
"tinify": "1.7.1",
|
|
@@ -62,6 +62,6 @@
|
|
|
62
62
|
],
|
|
63
63
|
"main": "./fox.js",
|
|
64
64
|
"types": "./fox.d.ts",
|
|
65
|
-
"sha": "
|
|
65
|
+
"sha": "d2df653c",
|
|
66
66
|
"scripts": {}
|
|
67
|
-
}
|
|
67
|
+
}
|