@foxford/cli 1.1.2 → 1.2.2

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.
Files changed (4) hide show
  1. package/fox.d.ts +1 -0
  2. package/fox.js +172 -127
  3. package/fox.js.map +1 -1
  4. package/package.json +4 -4
package/fox.d.ts CHANGED
@@ -985,6 +985,7 @@ export interface ProcessInput {
985
985
  value: boolean | string;
986
986
  }
987
987
  export interface Program extends Command {
988
+ packageManager: string;
988
989
  rootPath: string;
989
990
  logger: typeof logger;
990
991
  defineCommand(command: AbstractCommand): void;
package/fox.js CHANGED
@@ -380,22 +380,20 @@ var init_runners = __esm({
380
380
  });
381
381
 
382
382
  // src/program/program.ts
383
- var import_node_path3, import_commander, import_detect_package_manager, import_dotenv2, import_fs_extra2, import_zx, Program;
383
+ var import_node_path3, import_commander, import_dotenv2, import_fs_extra2, import_zx, Program;
384
384
  var init_program = __esm({
385
385
  "src/program/program.ts"() {
386
386
  "use strict";
387
387
  import_node_path3 = __toESM(require("path"));
388
388
  import_commander = require("commander");
389
- import_detect_package_manager = require("detect-package-manager");
390
389
  import_dotenv2 = __toESM(require("dotenv"));
391
390
  import_fs_extra2 = require("fs-extra");
392
391
  import_zx = require("zx");
393
392
  init_runners();
394
393
  init_logger();
395
- Program = class extends import_commander.Command {
396
- constructor() {
394
+ Program = class _Program extends import_commander.Command {
395
+ constructor(packageManager, rootPath) {
397
396
  super();
398
- this.rootPath = process.cwd();
399
397
  this.logger = logger;
400
398
  this.commandList = [];
401
399
  import_zx.$.verbose = false;
@@ -412,7 +410,28 @@ var init_program = __esm({
412
410
  });
413
411
  }
414
412
  });
415
- this.determineRootPath().then((path10) => this.rootPath = path10);
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);
416
435
  }
417
436
  async getPluginPaths() {
418
437
  const nodeModulesPlugins = [];
@@ -466,17 +485,6 @@ var init_program = __esm({
466
485
  shouldSkipPackage(name) {
467
486
  return name.startsWith("@types/") || name.startsWith("@foxford/types") || name === "@foxford/cli" || name === "typescript" || name.includes("eslint") || name.includes("@babel") || name.includes("react");
468
487
  }
469
- async determineRootPath() {
470
- const packageManager = await (0, import_detect_package_manager.detect)();
471
- switch (packageManager) {
472
- case "npm":
473
- return import_node_path3.default.dirname(RunnerFactory.create("NPM" /* NPM */).runSync("root"));
474
- case "pnpm":
475
- return import_node_path3.default.dirname(RunnerFactory.create("PNPM" /* PNPM */).runSync("root"));
476
- default:
477
- return process.cwd();
478
- }
479
- }
480
488
  defineCommand(command) {
481
489
  this.commandList.push(command);
482
490
  }
@@ -819,26 +827,24 @@ var init_abstract_provider = __esm({
819
827
  this.cwd = process.cwd();
820
828
  this.logger = logger.getLogger(providerName);
821
829
  this.buildDir = "./build";
822
- this.packageJson = this.readPackageJson();
823
830
  }
824
831
  /**
825
832
  * Генерирует строку версии пакета на основе цели и SHA коммита.
826
833
  *
827
- * @param target - Цель развертывания. Может быть 'beta' или 'latest'.
828
- * Определяет, возвращать ли бета-версию или текущую версию пакета.
834
+ * @param version - Версия пакета из package.json
829
835
  * @param sha - Короткий SHA коммита, используемый в строке бета-версии.
830
836
  * @returns Строка, представляющая версию пакета.
831
837
  * Для цели 'latest' возвращает текущую версию пакета.
832
838
  * Для цели 'beta' возвращает строку версии в формате:
833
839
  * "<текущая_версия>-beta-<sha>-<текущая_дата>"
834
840
  */
835
- getBetaPackageVersion(sha) {
841
+ getBetaPackageVersion(version, sha) {
836
842
  const now = /* @__PURE__ */ new Date();
837
843
  const year = now.getFullYear();
838
844
  const month = String(now.getMonth() + 1).padStart(2, "0");
839
845
  const day = String(now.getDate()).padStart(2, "0");
840
846
  const date = `${year}${month}${day}`;
841
- return `${this.packageJson.version}-beta-${sha}-${date}`;
847
+ return `${version}-beta-${sha}-${date}`;
842
848
  }
843
849
  /**
844
850
  * Читает и парсит файл package.json из текущей рабочей директории.
@@ -846,20 +852,19 @@ var init_abstract_provider = __esm({
846
852
  * Эта функция пытается найти и прочитать файл package.json в текущей
847
853
  * рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.
848
854
  *
849
- * @throws {Error} Выбрасывает ошибку, если файл package.json не найден в текущей директории
850
- * или если возникла ошибка при чтении/парсинге файла.
851
- * @returns {FoxfordTools.PackageJson} Распарсенное содержимое файла package.json.
855
+ * @returns Распарсенное содержимое файла package.json или null.
852
856
  */
853
- readPackageJson(rootPath = this.cwd) {
854
- const packageJsonPath = import_zx2.path.resolve(rootPath, "package.json");
857
+ readPackageJson(pkgPath) {
858
+ const packageJsonPath = import_zx2.path.resolve(pkgPath, "package.json");
855
859
  if (!import_zx2.fs.existsSync(packageJsonPath)) {
856
- throw new 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");
860
+ return null;
857
861
  }
858
862
  try {
859
863
  const packageJsonContent = import_zx2.fs.readFileSync(packageJsonPath, "utf-8");
860
864
  return JSON.parse(packageJsonContent);
861
865
  } catch (error) {
862
- throw new 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}`);
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;
863
868
  }
864
869
  }
865
870
  };
@@ -885,6 +890,7 @@ var init_npm = __esm({
885
890
  super("npm");
886
891
  this.versionLists = [];
887
892
  this.dry = "";
893
+ this.noGitChecks = "";
888
894
  }
889
895
  /**
890
896
  * Возвращает сообщение об устаревании с текущим SHA коммита.
@@ -906,7 +912,8 @@ var init_npm = __esm({
906
912
  * @throws Выбрасывает ошибку, если операция с файлом не удалась или если NPM_TOKEN не установлен.
907
913
  */
908
914
  async touchNpmrc() {
909
- await import_zx3.$`echo "//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}" >> .npmrc`;
915
+ const authStr = "//registry.npmjs.org/:_authToken=${NPM_TOKEN}";
916
+ await import_zx3.$`echo ${authStr} >> .npmrc`;
910
917
  }
911
918
  /**
912
919
  * Фильтрует устаревшие версии из заданного списка версий пакета.
@@ -914,13 +921,14 @@ var init_npm = __esm({
914
921
  * Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.
915
922
  * Он использует команду `npm view` для получения статуса устаревания каждой версии.
916
923
  *
924
+ * @param pkgName - Имя пакета в регистре.
917
925
  * @param versions - Массив строк версий для проверки на устаревание.
918
926
  * @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.
919
927
  */
920
- async getNotDeprecatedVersions(versions) {
928
+ async getNotDeprecatedVersions(pkgName, versions) {
921
929
  const notDeprecatedVersions = [];
922
930
  for (const ver of versions) {
923
- const cmd = ["npm", "view", `${this.packageJson.name}@${ver}`, "deprecated"];
931
+ const cmd = ["npm", "view", `${pkgName}@${ver}`, "deprecated"];
924
932
  const result = await import_zx3.$`${cmd}`;
925
933
  if (!result.toString().trim().includes("deprecated by")) {
926
934
  notDeprecatedVersions.push(ver);
@@ -935,6 +943,8 @@ var init_npm = __esm({
935
943
  * указанного в файле package.json. Затем он парсит JSON-ответ
936
944
  * и сохраняет результат в свойстве `versionLists` класса.
937
945
  *
946
+ * @param pkgName - Имя пакета в регистре.
947
+ *
938
948
  * @returns Промис, который разрешается в массив строк, где каждая строка
939
949
  * представляет версию пакета. Если парсинг не удался, возвращает
940
950
  * пустой массив.
@@ -942,9 +952,9 @@ var init_npm = __esm({
942
952
  * @throws Записывает ошибку в консоль, если парсинг JSON не удался, но не
943
953
  * выбрасывает исключение.
944
954
  */
945
- async getVersionsList() {
955
+ async getVersionsList(pkgName) {
946
956
  logger.info("Getting versions list...");
947
- const outputProcess = await import_zx3.$`npm view ${this.packageJson.name} versions --json`;
957
+ const outputProcess = await import_zx3.$`npm view ${pkgName} versions --json`;
948
958
  const versionsListPo = outputProcess.toString();
949
959
  logger.info("Versions list recieved", versionsListPo);
950
960
  try {
@@ -982,22 +992,22 @@ var init_npm = __esm({
982
992
  * Этот метод находит похожие версии на текущую версию, фильтрует уже устаревшие версии,
983
993
  * а затем помечает оставшиеся версии как устаревшие, используя команду npm deprecate.
984
994
  *
985
- * @param currentVersion - Текущая версия пакета для сравнения при поиске похожих версий.
995
+ * @param packageJson - package.json пакета.
986
996
  * @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.
987
997
  */
988
- async deprecatePrevBetaVersions(currentVersion) {
998
+ async deprecatePrevBetaVersions(packageJson) {
989
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");
990
- this.versionLists = await this.getVersionsList();
991
- const betaVersions = this.getBetaVersions(currentVersion);
1000
+ this.versionLists = await this.getVersionsList(packageJson.name);
1001
+ const betaVersions = this.getBetaVersions(packageJson.version);
992
1002
  logger.info("\u041D\u0430\u0439\u0434\u0435\u043D\u044B beta \u0432\u0435\u0440\u0441\u0438\u0438:", betaVersions);
993
- const notDeprecatedVersions = await this.getNotDeprecatedVersions(betaVersions);
1003
+ const notDeprecatedVersions = await this.getNotDeprecatedVersions(packageJson.name, betaVersions);
994
1004
  logger.info("Beta \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0435\u0437 deprecated:", notDeprecatedVersions);
995
1005
  const deprecationMessage = await this.getDeprecationMessage();
996
1006
  for (const ver of notDeprecatedVersions) {
997
1007
  await sleep(500);
998
1008
  try {
999
1009
  if (!this.dry) {
1000
- const cmd = ["npm", "deprecate", `${this.packageJson.name}@${ver}`, deprecationMessage].filter(
1010
+ const cmd = ["npm", "deprecate", `${packageJson.name}@${ver}`, deprecationMessage].filter(
1001
1011
  (item) => item !== ""
1002
1012
  );
1003
1013
  logger.info("\u041F\u043E\u043C\u0435\u0447\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u043A\u0430\u043A deprecated:", cmd);
@@ -1015,26 +1025,26 @@ var init_npm = __esm({
1015
1025
  * Этот метод получает все версии пакета, находит похожие версии на текущую,
1016
1026
  * и удаляет те, которые являются бета-версиями. Он использует команду npm unpublish с флагом --force.
1017
1027
  *
1018
- * @param currentVersion - Текущая версия пакета для сравнения при поиске похожих версий.
1028
+ * @param packageJson - package.json пакета.
1019
1029
  * @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.
1020
1030
  * @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.
1021
1031
  */
1022
- async unpublishBetaVersions(currentVersion) {
1032
+ async unpublishBetaVersions(packageJson) {
1023
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");
1024
- this.versionLists = await this.getVersionsList();
1034
+ this.versionLists = await this.getVersionsList(packageJson.name);
1025
1035
  logger.info("\u0421\u043F\u0438\u0441\u043E\u043A \u0432\u0435\u0440\u0441\u0438\u0439: ", this.versionLists);
1026
- const betaVersions = this.getBetaVersions(currentVersion);
1036
+ const betaVersions = this.getBetaVersions(packageJson.version);
1027
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);
1028
1038
  const deprecationMessage = await this.getDeprecationMessage();
1029
1039
  for (const ver of betaVersions) {
1030
1040
  if (!ver.includes("beta")) continue;
1031
1041
  try {
1032
- const deprecate = ["npm", "deprecate", `${this.packageJson.name}@${ver}`, deprecationMessage].filter(
1042
+ const deprecate = ["npm", "deprecate", `${packageJson.name}@${ver}`, deprecationMessage].filter(
1033
1043
  (item) => item !== ""
1034
1044
  );
1035
1045
  logger.info("\u041F\u043E\u043C\u0435\u0447\u0430\u0435\u043C \u0432\u0435\u0440\u0441\u0438\u044E \u043A\u0430\u043A deprecated:", deprecate);
1036
1046
  await import_zx3.$`${deprecate}`;
1037
- const unpublish = ["npm", "unpublish", `${this.packageJson.name}@${ver}`, "--force", this.dry].filter(
1047
+ const unpublish = ["npm", "unpublish", `${packageJson.name}@${ver}`, "--force", this.dry].filter(
1038
1048
  (item) => item !== ""
1039
1049
  );
1040
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);
@@ -1067,8 +1077,13 @@ var init_npm = __esm({
1067
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`);
1068
1078
  process.exit(1);
1069
1079
  }
1070
- this.packageJson = this.readPackageJson(localDir);
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
+ }
1071
1085
  if (params.dry === true) this.dry = "--dry-run";
1086
+ if (params.skipGitChecks) this.noGitChecks = "--no-git-checks";
1072
1087
  logger.info("\u041C\u0435\u043D\u044F\u0435\u043C \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u044E \u043D\u0430", localDir);
1073
1088
  (0, import_zx3.cd)(localDir);
1074
1089
  logger.info("\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u043C sha \u043A\u043E\u043C\u043C\u0438\u0442\u0430");
@@ -1079,31 +1094,38 @@ var init_npm = __esm({
1079
1094
  await this.touchNpmrc();
1080
1095
  logger.info("\u0421\u043E\u0437\u0434\u0430\u0435\u043C .npmrc");
1081
1096
  if (target === "beta") {
1082
- this.packageJson.version = this.packageJson.version.includes("beta") ? this.packageJson.version : this.getBetaPackageVersion(commitSha);
1097
+ packageJson.version = packageJson.version.includes("beta") ? packageJson.version : this.getBetaPackageVersion(packageJson.version, commitSha);
1083
1098
  }
1084
- this.packageJson.sha = commitSha;
1085
- logger.info("\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0430\u043A\u0435\u0442\u0430:", this.packageJson.version);
1086
- if (this.packageJson.scripts && this.packageJson.scripts.postinstall) {
1087
- this.packageJson.scripts = {
1088
- postinstall: this.packageJson.scripts.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
1089
1104
  };
1090
1105
  } else {
1091
- this.packageJson.scripts = {};
1106
+ packageJson.scripts = {};
1092
1107
  }
1093
- if (this.packageJson.devDependencies) {
1094
- delete this.packageJson.devDependencies;
1108
+ if (packageJson.devDependencies) {
1109
+ delete packageJson.devDependencies;
1095
1110
  }
1096
- logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", this.packageJson);
1097
- await import_zx3.fs.writeJson("package.json", this.packageJson, {
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, {
1098
1113
  spaces: 2
1099
1114
  });
1100
- const cmd = ["npm", "publish", "--access=public", `--tag=${target}`, this.dry].filter((item) => item !== "");
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 !== "");
1101
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);
1102
1124
  await import_zx3.$`${cmd}`;
1103
1125
  if (target === "beta") {
1104
- await this.deprecatePrevBetaVersions(this.packageJson.version);
1126
+ await this.deprecatePrevBetaVersions(packageJson);
1105
1127
  } else {
1106
- await this.unpublishBetaVersions(this.packageJson.version);
1128
+ await this.unpublishBetaVersions(packageJson);
1107
1129
  }
1108
1130
  }
1109
1131
  };
@@ -1133,25 +1155,36 @@ var init_s3 = __esm({
1133
1155
  return "beta";
1134
1156
  }
1135
1157
  /**
1136
- * Формирует удаленный путь для версии пакета.
1158
+ * Формирует путь для ресурсов в хранилище.
1137
1159
  *
1138
- * @param {string} bucket - Имя бакета.
1139
- * @param {string} packageName - Имя пакета.
1140
- * @returns {string} Полный путь для версии пакета.
1160
+ * @param segments - Cегменты пути.
1161
+ * @returns Путь для цели развертывания.
1141
1162
  */
1142
- getRemoteDirByVersion(bucket, packageName) {
1143
- return `${bucket}/libs/${packageName}/${this.packageJson.version}/`;
1163
+ getRemotePath(...segments) {
1164
+ return segments.filter(Boolean).join(import_zx4.path.posix.sep).replace(/[/\\]+/g, import_zx4.path.posix.sep).replace(/^\//, "");
1144
1165
  }
1145
1166
  /**
1146
- * Формирует удаленный путь для цели развертывания.
1167
+ * Выполняет команду rclone copy.
1147
1168
  *
1148
- * @param {string} bucket - Имя бакета.
1149
- * @param {string} packageName - Имя пакета.
1150
- * @param {string} target - Цель развертывания ('latest' или 'beta').
1151
- * @returns {string} Полный путь для цели развертывания.
1169
+ * @param localDir - Путь до локальных ресурсов.
1170
+ * @param bucket - Имя бакета в хранилище.
1171
+ * @param remoteDir - Удаленный путь для загрузки ресурсов.
1172
+ * @param flags - Дополнительные аргументы.
1173
+ * @returns Результат выполнения команды.
1152
1174
  */
1153
- getRemoteDirByTarget(bucket, packageName, target) {
1154
- return `${bucket}/libs/${packageName}/${target}/`;
1175
+ async exec(localDir, bucket, remoteDir, flags) {
1176
+ const cmd = ["rclone", "copy", localDir];
1177
+ if (remoteDir) {
1178
+ cmd.push(`myremote:${bucket}/${remoteDir}`);
1179
+ } else {
1180
+ cmd.push(`myremote:${bucket}/`);
1181
+ }
1182
+ if (flags) {
1183
+ cmd.push(...flags);
1184
+ }
1185
+ logger.info("\u0417\u0430\u043F\u0443\u0441\u043A \u0434\u0435\u043F\u043B\u043E\u044F:", cmd);
1186
+ await import_zx4.$`${cmd}`;
1187
+ logger.info("\u0414\u0435\u043F\u043B\u043E\u0439 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D:", cmd);
1155
1188
  }
1156
1189
  /**
1157
1190
  * Выполняет процесс развертывания в хранилище по S3.
@@ -1173,8 +1206,8 @@ var init_s3 = __esm({
1173
1206
  async deploy(params) {
1174
1207
  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);
1175
1208
  const { SELECTEL_USER, SELECTEL_PASSWORD, BUCKET } = process.env;
1176
- if (!SELECTEL_USER || !SELECTEL_PASSWORD || !BUCKET) {
1177
- 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 \u0438\u043B\u0438 BUCKET");
1209
+ if (!SELECTEL_USER || !SELECTEL_PASSWORD) {
1210
+ 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");
1178
1211
  process.exit(1);
1179
1212
  }
1180
1213
  const localDir = import_zx4.path.join(process.cwd(), params.localDir ?? this.buildDir);
@@ -1182,54 +1215,66 @@ var init_s3 = __esm({
1182
1215
  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`);
1183
1216
  process.exit(1);
1184
1217
  }
1185
- this.packageJson = this.readPackageJson(localDir);
1186
- const bucket = params.bucket ?? BUCKET ?? "dist.ngcdn.ru";
1187
- const remoteDirs = [];
1188
- const packageName = params.packageName ?? this.packageJson.name;
1189
- logger.info("\u041F\u043E\u043B\u0443\u0447\u0430\u0435\u043C sha \u043A\u043E\u043C\u043C\u0438\u0442\u0430");
1190
- const commitSha = (await import_zx4.$`git rev-parse --short HEAD`).toString().replace("\n", "");
1191
- logger.info("\u041A\u043E\u043C\u043C\u0438\u0442:", commitSha);
1192
- const target = params.target ?? this.getTarget();
1193
- logger.info("\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F:", target);
1194
- logger.info("\u0411\u0430\u043A\u0435\u0442:", bucket);
1195
- if (target === "beta") {
1196
- this.packageJson.version = this.packageJson.version.includes("beta") ? this.packageJson.version : this.getBetaPackageVersion(commitSha);
1218
+ const bucket = params.bucket ?? BUCKET;
1219
+ if (!bucket) {
1220
+ logger.error("\u0411\u0430\u043A\u0435\u0442 \u043D\u0435 \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D");
1221
+ process.exit(1);
1197
1222
  }
1198
- this.packageJson.sha = commitSha;
1199
- logger.info("\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0430\u043A\u0435\u0442\u0430:", this.packageJson.version);
1200
- if (this.packageJson.scripts && this.packageJson.scripts.postinstall) {
1201
- this.packageJson.scripts = {
1202
- postinstall: this.packageJson.scripts.postinstall
1203
- };
1223
+ logger.info("\u0411\u0430\u043A\u0435\u0442:", bucket);
1224
+ const packageJson = this.readPackageJson(localDir);
1225
+ const remoteDirs = [];
1226
+ if (packageJson) {
1227
+ const commitSha = (await import_zx4.$`git rev-parse --short HEAD`).toString().replace("\n", "");
1228
+ logger.info("\u041A\u043E\u043C\u043C\u0438\u0442:", commitSha);
1229
+ if (params.packageName) {
1230
+ packageJson.name = params.packageName;
1231
+ }
1232
+ const target = params.target ?? this.getTarget();
1233
+ logger.info("\u0426\u0435\u043B\u0435\u0432\u0430\u044F \u0432\u0435\u0440\u0441\u0438\u044F:", target);
1234
+ if (target === "beta") {
1235
+ packageJson.version = packageJson.version.includes("beta") ? packageJson.version : this.getBetaPackageVersion(packageJson.version, commitSha);
1236
+ }
1237
+ logger.info("\u0412\u0435\u0440\u0441\u0438\u044F \u043F\u0430\u043A\u0435\u0442\u0430:", packageJson.version);
1238
+ packageJson.sha = commitSha;
1239
+ if (packageJson.scripts && packageJson.scripts.postinstall) {
1240
+ packageJson.scripts = {
1241
+ postinstall: packageJson.scripts.postinstall
1242
+ };
1243
+ } else {
1244
+ packageJson.scripts = {};
1245
+ }
1246
+ logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", packageJson);
1247
+ await import_zx4.fs.writeJson(import_zx4.path.resolve(localDir, "package.json"), packageJson, {
1248
+ spaces: 2
1249
+ });
1250
+ remoteDirs.push(
1251
+ this.getRemotePath(params.remoteDir, packageJson.name, packageJson.version),
1252
+ this.getRemotePath(params.remoteDir, packageJson.name, target)
1253
+ );
1204
1254
  } else {
1205
- this.packageJson.scripts = {};
1255
+ 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");
1256
+ if (params.remoteDir) {
1257
+ remoteDirs.push(params.remoteDir);
1258
+ }
1206
1259
  }
1207
- logger.info("\u041F\u0443\u0431\u043B\u0438\u043A\u0443\u0435\u043C\u044B\u0439 package.json", this.packageJson);
1208
- await import_zx4.fs.writeJson(import_zx4.path.resolve(localDir, "package.json"), this.packageJson, {
1209
- spaces: 2
1210
- });
1211
- remoteDirs.push(this.getRemoteDirByVersion(bucket, packageName));
1212
- remoteDirs.push(this.getRemoteDirByTarget(bucket, packageName, target));
1213
1260
  logger.info("\u0423\u0434\u0430\u043B\u0435\u043D\u043D\u044B\u0435 \u0434\u0438\u0440\u0435\u043A\u0442\u043E\u0440\u0438\u0438:", remoteDirs);
1214
- await Promise.allSettled(
1215
- remoteDirs.map(async (remoteDir) => {
1216
- const href = `https://${remoteDir}`;
1217
- const files = this.packageJson.files ?? [];
1218
- const fileList = files.map((file) => href + file).join("\n ");
1219
- const rclone = `rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer`;
1220
- 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:
1221
- `, rclone);
1222
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_TYPE = "s3";
1223
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = "Other";
1224
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = SELECTEL_USER;
1225
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = SELECTEL_PASSWORD;
1226
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? "s3.ru-1.storage.selcloud.ru";
1227
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_BUCKET_NAME = BUCKET;
1228
- import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? "ru-1";
1229
- await import_zx4.$`rclone copy ${localDir} myremote:${remoteDir} --progress --error-on-no-transfer ${params.dry ? "--dry-run" : ""}`;
1230
- 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:
1231
- `, href);
1232
- logger.info(fileList);
1261
+ import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_TYPE = "s3";
1262
+ import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = "Other";
1263
+ import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = SELECTEL_USER;
1264
+ import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = SELECTEL_PASSWORD;
1265
+ import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? "s3.ru-1.storage.selcloud.ru";
1266
+ import_zx4.$.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? "ru-1";
1267
+ const execFlags = ["--progress"];
1268
+ if (params.dry) {
1269
+ execFlags.push("--dry-run");
1270
+ }
1271
+ if (!remoteDirs.length) {
1272
+ await this.exec(localDir, bucket, void 0, execFlags);
1273
+ process.exit(0);
1274
+ }
1275
+ await Promise.all(
1276
+ remoteDirs.map((remoteDir) => {
1277
+ return this.exec(localDir, bucket, remoteDir, execFlags);
1233
1278
  })
1234
1279
  );
1235
1280
  }
@@ -1279,16 +1324,16 @@ var init_command2 = __esm({
1279
1324
  async load(program) {
1280
1325
  const deployCommand = new import_commander3.Command("deploy").description("\u0417\u0430\u0434\u0435\u043F\u043B\u043E\u0438\u0442\u044C \u043F\u0430\u043A\u0435\u0442");
1281
1326
  const targetOption = new import_commander3.Option("--target <target>", "\u0420\u0435\u043B\u0438\u0437 beta \u0438\u043B\u0438 latest").choices(["beta", "latest"]).default("beta");
1282
- const localDirOption = new import_commander3.Option("--localDir <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");
1327
+ 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");
1283
1328
  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);
1284
- 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("--packageName <name>", "\u0418\u043C\u044F \u043F\u0430\u043A\u0435\u0442\u0430 \u0432\u043C\u0435\u0441\u0442\u043E packageJson.name").action(async (params) => {
1329
+ 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) => {
1285
1330
  await this.action.handle({ ...params, provider: "s3" });
1286
1331
  });
1287
1332
  s3Command.addOption(targetOption);
1288
1333
  s3Command.addOption(localDirOption);
1289
1334
  s3Command.addOption(dryOption);
1290
- 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) => {
1291
- await this.action.handle({ ...params, provider: "npm" });
1335
+ 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) => {
1336
+ await this.action.handle({ ...params, provider: "npm", packageManager: program.packageManager });
1292
1337
  });
1293
1338
  npmCommand.addOption(targetOption);
1294
1339
  npmCommand.addOption(localDirOption);
@@ -1623,7 +1668,7 @@ var import_chalk12 = __toESM(require("chalk"));
1623
1668
  // package.json
1624
1669
  var package_default = {
1625
1670
  name: "@foxford/cli",
1626
- version: "1.1.2",
1671
+ version: "1.2.2",
1627
1672
  description: "Foxford Cli",
1628
1673
  keywords: [
1629
1674
  "foxford",
@@ -1682,7 +1727,6 @@ var package_default = {
1682
1727
  "cli-progress": "3.12.0",
1683
1728
  "cli-table3": "0.6.5",
1684
1729
  commander: "13.1.0",
1685
- "detect-package-manager": "3.0.2",
1686
1730
  dotenv: "16.4.5",
1687
1731
  "dotenv-expand": "11.0.6",
1688
1732
  "file-type": "19.0.0",
@@ -1692,6 +1736,7 @@ var package_default = {
1692
1736
  glob: "10.4.2",
1693
1737
  inquirer: "12.4.3",
1694
1738
  "os-name": "4.0.1",
1739
+ "package-manager-detector": "1.3.0",
1695
1740
  "read-package-up": "11.0.0",
1696
1741
  systeminformation: "5.25.11",
1697
1742
  tinify: "1.7.1",
@@ -1873,7 +1918,7 @@ ${import_chalk12.default.yellowBright("\u0427\u0430\u0439 \u043D\u0430\u043B\u04
1873
1918
  `;
1874
1919
  var bootstrap = async () => {
1875
1920
  logger.debug("Start program");
1876
- const program = new Program();
1921
+ const program = await Program.init();
1877
1922
  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);
1878
1923
  logger.debug("Load processes");
1879
1924
  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","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 = 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.2\",\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 segments - Cегменты пути.\n * @returns Путь для цели развертывания.\n */\n getRemotePath(...segments: (string | undefined)[]): string {\n return segments\n .filter(Boolean)\n .join(path.posix.sep)\n .replace(/[/\\\\]+/g, path.posix.sep)\n .replace(/^\\//, '')\n }\n\n /**\n * Выполняет команду rclone copy.\n *\n * @param localDir - Путь до локальных ресурсов.\n * @param bucket - Имя бакета в хранилище.\n * @param remoteDir - Удаленный путь для загрузки ресурсов.\n * @param flags - Дополнительные аргументы.\n * @returns Результат выполнения команды.\n */\n async exec(localDir: string, bucket: string, remoteDir?: string, flags?: string[]): Promise<void> {\n const cmd = ['rclone', 'copy', localDir]\n\n if (remoteDir) {\n cmd.push(`myremote:${bucket}/${remoteDir}`)\n } else {\n cmd.push(`myremote:${bucket}/`)\n }\n\n if (flags) {\n cmd.push(...flags)\n }\n\n logger.info('Запуск деплоя:', cmd)\n\n await $`${cmd}`\n\n logger.info('Деплой успешно завершен:', cmd)\n }\n\n /**\n * Выполняет процесс развертывания в хранилище по S3.\n *\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 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\n\n if (!bucket) {\n logger.error('Бакет не определен')\n process.exit(1)\n }\n\n logger.info('Бакет:', bucket)\n\n const packageJson = this.readPackageJson(localDir)\n\n const remoteDirs = []\n\n if (packageJson) {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n if (params.packageName) {\n packageJson.name = params.packageName\n }\n\n const target = params.target ?? this.getTarget()\n logger.info('Целевая версия:', target)\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n logger.info('Версия пакета:', packageJson.version)\n\n packageJson.sha = commitSha\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson(path.resolve(localDir, 'package.json'), packageJson, {\n spaces: 2,\n })\n\n remoteDirs.push(\n this.getRemotePath(params.remoteDir, packageJson.name, packageJson.version),\n this.getRemotePath(params.remoteDir, packageJson.name, target)\n )\n } else {\n logger.warn('package.json не найден в текущей директории')\n\n if (params.remoteDir) {\n remoteDirs.push(params.remoteDir)\n }\n }\n\n logger.info('Удаленные директории:', remoteDirs)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = 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_REGION = params.region ?? 'ru-1'\n\n const execFlags = ['--progress']\n\n if (params.dry) {\n execFlags.push('--dry-run')\n }\n\n if (!remoteDirs.length) {\n await this.exec(localDir, bucket, undefined, execFlags)\n process.exit(0)\n }\n\n await Promise.all(\n remoteDirs.map((remoteDir) => {\n return this.exec(localDir, bucket, remoteDir, execFlags)\n })\n )\n }\n}\n","import { AbstractAction } from '../../program'\nimport { NpmDeploy } from './providers/npm'\nimport { S3Deploy } from './providers/s3'\n\nimport type { DeployProvider } from './providers/abstract.provider'\nimport type { DeployOptions } from './types'\n\nexport class DeployAction extends AbstractAction<DeployOptions> {\n public async handle(params: DeployOptions) {\n let provider: DeployProvider\n\n switch (params.provider) {\n case 'npm':\n provider = new NpmDeploy()\n break\n case 's3':\n provider = new S3Deploy()\n break\n default:\n throw new Error(`Unsupported deploy provider: ${params.provider}`)\n }\n\n await provider.deploy(params)\n }\n}\n","import { Command, Option } from 'commander'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { DeployOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class DeployCommand extends AbstractCommand<DeployOptions> {\n id = 'deploy'\n public async load(program: FoxfordTools.Program) {\n const deployCommand = new Command('deploy').description('Задеплоить пакет')\n\n const targetOption = new Option('--target <target>', 'Релиз beta или latest')\n .choices(['beta', 'latest'])\n .default('beta')\n const localDirOption = new Option('--local-dir <path>', 'Из какой локальной директории загрузить содержимое')\n const dryOption = new Option('--dry', 'Запуск без выполнения операции').default(false)\n\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.2\",\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.1.2",
3
+ "version": "1.2.2",
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": "fc6fa074",
65
+ "sha": "969ec9fe",
66
66
  "scripts": {}
67
- }
67
+ }