@foxford/cli 1.4.2 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.mdx CHANGED
@@ -54,9 +54,9 @@ Fox-cli может быть расширен плагинами. Плагин -
54
54
  "license": "MIT",
55
55
  "exports": {
56
56
  ".": {
57
- "import": "./dist/index.mjs",
57
+ "import": "./dist/index.js",
58
58
  "types": "./dist/index.d.ts",
59
- "default": "./dist/index.js"
59
+ "default": "./dist/index.cjs"
60
60
  }
61
61
  },
62
62
  "dependencies": {
package/fox.cjs CHANGED
@@ -30,10 +30,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  mod
31
31
  ));
32
32
 
33
- // ../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js
33
+ // ../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.18_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js
34
34
  var getImportMetaUrl, importMetaUrl;
35
35
  var init_cjs_shims = __esm({
36
- "../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js"() {
36
+ "../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.18_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js"() {
37
37
  "use strict";
38
38
  getImportMetaUrl = () => typeof document === "undefined" ? new URL(`file:${__filename}`).href : document.currentScript && document.currentScript.tagName.toUpperCase() === "SCRIPT" ? document.currentScript.src : new URL("main.js", document.baseURI).href;
39
39
  importMetaUrl = /* @__PURE__ */ getImportMetaUrl();
@@ -1887,7 +1887,7 @@ var import_chalk12 = __toESM(require("chalk"), 1);
1887
1887
  // package.json
1888
1888
  var package_default = {
1889
1889
  name: "@foxford/cli",
1890
- version: "1.4.2",
1890
+ version: "1.5.0",
1891
1891
  description: "Foxford Cli",
1892
1892
  keywords: [
1893
1893
  "foxford",
@@ -1912,6 +1912,9 @@ var package_default = {
1912
1912
  main: "./README.mdx",
1913
1913
  types: "./src/types/index.ts",
1914
1914
  type: "module",
1915
+ engines: {
1916
+ node: ">=20"
1917
+ },
1915
1918
  exports: {
1916
1919
  "./README.mdx": "./README.mdx",
1917
1920
  ".": {
@@ -1928,7 +1931,7 @@ var package_default = {
1928
1931
  postbuild: "pnpm run build-dts",
1929
1932
  "build-dts": "dts-bundle-generator -o build/fox.d.ts src/types/index.ts --no-banner --external-inlines=commander loglevel --sort --inline-declare-externals",
1930
1933
  "============================ DEPLOY =============================": "",
1931
- deploy: "fox deploy npm",
1934
+ deploy: "fox deploy npm --skip-git-checks",
1932
1935
  "============================ LINT =============================": "",
1933
1936
  "lint:clean": "rm -f .eslintcache",
1934
1937
  "lint:type-check": "tsc --noEmit --pretty",
@@ -2043,7 +2046,7 @@ var _CommandLoader = class _CommandLoader {
2043
2046
  try {
2044
2047
  log2.debug(`\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u044C: ${import_chalk11.default.cyan(processName)}`);
2045
2048
  const modulePath = import_node_path7.default.join(_CommandLoader.PROCESSES_DIR, processName);
2046
- const module2 = require3(modulePath);
2049
+ const module2 = await import(modulePath);
2047
2050
  module2.default(program);
2048
2051
  } catch (err) {
2049
2052
  log2.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u044F "${processName}":`, err);
@@ -2085,38 +2088,32 @@ var _CommandLoader = class _CommandLoader {
2085
2088
  static async loadPlugins(program) {
2086
2089
  const plugins = await program.getPluginPaths();
2087
2090
  for (const plugin of plugins) {
2088
- log2.debug(`\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u043C\u043E\u0434\u0443\u043B\u044C: ${import_chalk11.default.cyan(plugin.pkgJson.name)}`);
2089
- const dirname = import_node_path7.default.dirname(plugin.path);
2090
- if (false) {
2091
- const module2 = require3(`${plugin.pkgJson.name}`);
2092
- module2.default(program);
2093
- continue;
2094
- }
2095
- let targetPath = import_node_path7.default.resolve(dirname);
2096
- if ((0, import_node_fs2.existsSync)(import_node_path7.default.resolve(targetPath, "build"))) {
2097
- targetPath = import_node_path7.default.resolve(targetPath, "build");
2098
- }
2099
- if ((0, import_node_fs2.existsSync)(import_node_path7.default.join(targetPath, "package.json"))) {
2091
+ log2.debug(`\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043C \u043F\u043B\u0430\u0433\u0438\u043D: ${import_chalk11.default.cyan(plugin.pkgJson.name)}`);
2092
+ try {
2093
+ if (false) {
2094
+ const module3 = await import(plugin.pkgJson.name);
2095
+ const fn = module3.default ?? module3;
2096
+ await fn(program);
2097
+ continue;
2098
+ }
2099
+ const dirname = import_node_path7.default.dirname(plugin.path);
2100
+ let targetPath = import_node_path7.default.resolve(dirname);
2101
+ if ((0, import_node_fs2.existsSync)(import_node_path7.default.resolve(targetPath, "build"))) {
2102
+ targetPath = import_node_path7.default.resolve(targetPath, "build");
2103
+ }
2104
+ if (!(0, import_node_fs2.existsSync)(import_node_path7.default.join(targetPath, "package.json"))) continue;
2100
2105
  const packageJson = require3(import_node_path7.default.join(targetPath, "package.json"));
2101
- try {
2102
- const require4 = (0, import_node_module2.createRequire)(__filename);
2103
- let module2;
2104
- const modulePath = this.getModulePath(packageJson);
2105
- if (packageJson.type === "module") {
2106
- module2 = await import(import_node_path7.default.join(targetPath, modulePath));
2107
- } else {
2108
- module2 = require4(import_node_path7.default.join(targetPath, modulePath));
2109
- }
2110
- if (typeof module2.default === "function") {
2111
- module2.default(program);
2112
- } else if (typeof module2 === "function") {
2113
- module2(program);
2114
- } else {
2115
- log2.warn(`\u041C\u043E\u0434\u0443\u043B\u044C "${plugin.pkgJson.name}" \u043D\u0435 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0444\u0443\u043D\u043A\u0446\u0438\u044E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E`);
2116
- }
2117
- } catch (error) {
2118
- log2.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u044F "${plugin.pkgJson.name}":`, error);
2106
+ const modulePath = this.getModulePath(packageJson);
2107
+ const module2 = await import(import_node_path7.default.join(targetPath, modulePath));
2108
+ if (typeof module2.default === "function") {
2109
+ await module2.default(program);
2110
+ } else if (typeof module2 === "function") {
2111
+ await module2(program);
2112
+ } else {
2113
+ log2.warn(`\u041C\u043E\u0434\u0443\u043B\u044C "${plugin.pkgJson.name}" \u043D\u0435 \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0444\u0443\u043D\u043A\u0446\u0438\u044E \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E`);
2119
2114
  }
2115
+ } catch (error) {
2116
+ log2.error(`\u041E\u0448\u0438\u0431\u043A\u0430 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u044F "${plugin.pkgJson.name}":`, error);
2120
2117
  }
2121
2118
  }
2122
2119
  }
package/fox.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js","../src/logger/index.ts","../src/program/abstract.action.ts","../src/program/abstract.command.ts","../src/lib/runners/runner.ts","../src/lib/runners/ffmpeg.runner.ts","../src/lib/runners/shell.runner.ts","../src/lib/runners/node.runner.ts","../src/lib/runners/npm.runner.ts","../src/lib/runners/pnpm.runner.ts","../src/helpers/env.ts","../src/helpers/logger.ts","../src/lib/runners/script.runner.ts","../src/lib/runners/tinypng.runner.ts","../src/lib/runners/runner.factory.ts","../src/lib/runners/index.ts","../src/program/program.ts","../src/program/index.ts","../src/lib/ui/banner.ts","../src/lib/ui/prefixes.ts","../src/lib/ui/index.ts","../src/processes/codemod/action.ts","../src/lib/collection/collection.ts","../src/lib/collection/abstract.collection.ts","../src/lib/utils/formatting.ts","../src/lib/collection/fox-codemod.collection.ts","../src/lib/collection/collection.factory.ts","../src/lib/collection/index.ts","../src/processes/codemod/command.ts","../src/processes/codemod/index.ts","../src/utils/versioning.ts","../src/processes/deploy/providers/abstract.provider.ts","../src/processes/deploy/utils/resolve-workspace-deps.ts","../src/processes/deploy/providers/npm.ts","../src/processes/deploy/providers/s3.ts","../src/processes/deploy/action.ts","../src/processes/deploy/command.ts","../src/processes/deploy/index.ts","../src/processes/info/action.ts","../src/processes/info/command.ts","../src/processes/info/index.ts","../src/processes/optimize/action.ts","../src/processes/optimize/command.ts","../src/processes/optimize/index.ts","../src/bin/fox.ts","../package.json","../src/program/loader.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { log } from '@foxford/logger'\n\nimport type { HierarchicalLogger } from '@foxford/logger'\n\nconst logger: HierarchicalLogger = log.getLogger('cli')\nlogger.setLevel('info')\n\nexport { logger }\n","import type * as FoxfordTools from '../types'\n\nexport abstract class AbstractAction<Options = FoxfordTools.ProcessInput[]> {\n constructor(protected program: FoxfordTools.Program) {}\n public abstract handle(options?: Options, params?: string[]): Promise<void>\n}\n","import type { AbstractAction } from './abstract.action'\nimport type * as FoxfordTools from '../types'\n\nexport abstract class AbstractCommand<Options = unknown> {\n constructor(protected action: AbstractAction<Options>) {}\n\n public abstract id: string\n\n public abstract load(program: FoxfordTools.Program): Promise<void> | void\n}\n","export enum Runner {\n NPM = 'NPM',\n PNPM = 'PNPM',\n FFMPEG = 'FFMPEG',\n TINYPNG = 'TINYPNG',\n NODE = 'NODE',\n PACKAGE_JSON_SCRIPT = 'PACKAGE_JSON_SCRIPT',\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport ffmpeg from 'fluent-ffmpeg'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class FFMpegRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n public async run(payload: RunnerPayload): Promise<string | null> {\n return new Promise<null | string>((resolve, reject) => {\n ffmpeg(payload.resource)\n .output(payload.output ?? path.basename(payload.resource))\n .outputOptions([\n '-hide_banner',\n '-movflags +faststart',\n '-pix_fmt yuv420p',\n '-c:v libx264',\n '-preset:v veryslow',\n '-profile:v high',\n '-level 3.1',\n '-tune:v ssim',\n '-r 30',\n '-g 180',\n '-keyint_min 180',\n '-sc_threshold 0',\n '-max_muxing_queue_size 1024',\n // '-vf scale=1920:-1',\n '-f mp4',\n ...(payload.extraFlags ?? []),\n ])\n .on('end', function () {\n resolve(payload.resource)\n })\n .on('error', function (err) {\n console.log()\n console.log(chalk.redBright('Cannot process video: ' + err.message))\n reject(err)\n })\n .run()\n })\n }\n}\n","import { spawn, execSync } from 'child_process'\n\nimport chalk from 'chalk'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type { ChildProcess, SpawnOptions, ExecSyncOptionsWithStringEncoding } from 'child_process'\n\nexport class ShellRunner {\n protected binary: string\n protected options: RunnerOptions\n\n constructor(binary: string, options?: RunnerOptions) {\n this.binary = binary\n this.options = options ?? { cwd: process.cwd() }\n }\n\n public async run(\n command: string,\n args: string[] = [],\n options: SpawnOptions = {},\n collect = false\n ): Promise<unknown> {\n const spawnOptions: SpawnOptions = {\n cwd: this.options.cwd,\n shell: true,\n stdio: collect ? 'pipe' : 'inherit',\n ...options,\n }\n return new Promise((resolve, reject) => {\n const child: ChildProcess = spawn(`${this.binary}`, [command, ...args], spawnOptions)\n if (collect && child.stdout) {\n child.stdout.on('data', (data) => resolve(data.toString().replace(/\\r\\n|\\n/, '')))\n }\n child.on('close', (code) => {\n if (code === 0) {\n resolve(child.stdout)\n } else {\n console.error(chalk.red(`\\n Не удалось выполнить команду: ${this.binary} ${command} ${args} `))\n reject(code)\n }\n })\n })\n }\n\n public runSync(command: string): string {\n const spawnOptions: ExecSyncOptionsWithStringEncoding = {\n cwd: this.options.cwd,\n encoding: 'utf-8',\n }\n return execSync(`${this.binary} ${command}`, spawnOptions)\n }\n\n /**\n * @param command\n * @returns The entire command that will be ran when calling `run(command)`.\n */\n public rawFullCommand(command: string): string {\n const commandArgs: string[] = [command]\n return `${this.binary} ${commandArgs.join(' ')}`\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NodeRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('node', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('npm', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class PnpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('pnpm', options)\n }\n}\n","import path from 'node:path'\n\nimport { config as dotenvConfig } from 'dotenv'\nimport { expand as dotenvExpand } from 'dotenv-expand'\nimport fs from 'fs-extra'\n\ntype Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T\n\nfunction truthy<T>(value: T): value is Truthy<T> {\n return !!value\n}\n\nexport function loadEnv(pkgPath: string) {\n const dotenvFiles = [\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}.local`),\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}`),\n Boolean(process.env.NODE_ENV) === false && path.join(pkgPath, `.env.development`),\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n process.env.NODE_ENV !== 'test' && path.join(pkgPath, `.env.local`),\n path.join(pkgPath, '.env'),\n ].filter(truthy)\n\n dotenvFiles.forEach((dotenvFile) => {\n if (fs.existsSync(dotenvFile)) {\n dotenvExpand(\n dotenvConfig({\n path: dotenvFile,\n })\n )\n }\n })\n\n return dotenvFiles\n}\n","import type { Chalk } from 'chalk'\n\nexport const label = (chalk: Chalk, label: string) => chalk.black(` ${label} `)\n","import chalk from 'chalk'\n\nimport { PnpmRunner } from './pnpm.runner'\nimport { loadEnv } from '../../helpers/env'\nimport { label } from '../../helpers/logger'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type * as FoxfordTools from '../../types'\n\nconst getLabel = (pkgName: string) => {\n return label(chalk.bgGreen, pkgName) + chalk.white(' ')\n}\n\nconst getFailLabel = (pkgName: string) => {\n return label(chalk.bgRed, pkgName) + chalk.white(' ')\n}\n\ninterface RunnerPayload {\n pkg: FoxfordTools.Package\n}\n\nexport class ScriptRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n async run(script: string, { pkg }: RunnerPayload) {\n const label = getLabel(pkg.localName.toUpperCase())\n const failLabel = getFailLabel(pkg.localName.toUpperCase())\n console.log(label + chalk.blue(`Start ${chalk.white.underline(script)} process`))\n if (this.options.verbose) {\n console.log(label + chalk.blue(`Print typescript config`))\n console.log()\n }\n console.log(\n label + chalk.blue(`Env ${chalk.magenta('process.env.NODE_ENV')} is ${chalk.yellow(process.env.NODE_ENV)}`)\n )\n console.log(\n label +\n chalk.blue(`Env ${chalk.magenta('process.env.NODE_OPTIONS')} is ${chalk.yellow(process.env.NODE_OPTIONS)}`)\n )\n try {\n console.log(label + chalk.blue(`Load .env files`))\n const envFiles = loadEnv(pkg.path)\n console.log(JSON.stringify(envFiles, null, 2))\n } catch (err) {\n if (err instanceof Error) {\n console.log(failLabel + chalk.red(err.message))\n process.exit(1)\n }\n }\n\n const pnpmRunner = new PnpmRunner()\n\n pnpmRunner.run('run', [`--filter ${pkg.localName}`, script], {\n cwd: pkg.path,\n env: Object.assign(process.env, { FORCE_COLOR: '1' }),\n })\n }\n}\n","import chalk from 'chalk'\nimport tinify from 'tinify'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface TinyPngRunnerOptions extends RunnerOptions {\n token?: string\n}\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class TinyPngRunner {\n options: TinyPngRunnerOptions\n\n constructor(options?: TinyPngRunnerOptions) {\n this.options = options ?? ({} as TinyPngRunnerOptions)\n\n if (!options?.token) throw new Error('You must specify process.env.TINIFY_API_KEY env variable with tinify key')\n }\n\n public async run(payload: RunnerPayload): Promise<null | string> {\n const source = tinify.fromFile(payload.resource)\n tinify.key = this.options?.token ?? ''\n\n try {\n await source.toFile(payload.output ?? payload.resource)\n } catch (err) {\n if (err instanceof Error) console.log(chalk.redBright('Cannot compress resource with tinify: ' + err.message))\n }\n\n return payload.resource\n }\n\n public runSync(): string {\n throw new TypeError('this method not implemented')\n }\n}\n","import { FFMpegRunner } from './ffmpeg.runner'\nimport { NodeRunner } from './node.runner'\nimport { NpmRunner } from './npm.runner'\nimport { PnpmRunner } from './pnpm.runner'\nimport { Runner } from './runner'\nimport { ScriptRunner } from './script.runner'\nimport { TinyPngRunner } from './tinypng.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nconst RunnerMap = {\n [Runner.NPM]: NpmRunner,\n [Runner.PNPM]: PnpmRunner,\n [Runner.NODE]: NodeRunner,\n [Runner.PACKAGE_JSON_SCRIPT]: ScriptRunner,\n [Runner.FFMPEG]: FFMpegRunner,\n [Runner.TINYPNG]: TinyPngRunner,\n}\n\ntype RunnerTypeMap = typeof RunnerMap\n\nexport class RunnerFactory {\n public static create<R extends Runner>(\n runner: R,\n options?: ConstructorParameters<RunnerTypeMap[R]>[0]\n ): InstanceType<RunnerTypeMap[R]> {\n const RunnerClass = RunnerMap[runner]\n\n if (!RunnerClass) {\n throw new Error(`Unknown runner ${runner}`)\n }\n\n return new RunnerClass(options as RunnerOptions) as InstanceType<RunnerTypeMap[R]>\n }\n}\n","export * from './runner'\nexport * from './runner.factory'\nexport type * from './abstract.runner'\n","import { existsSync } from 'fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command } from 'commander'\nimport { config as dotenvConfig } from 'dotenv'\nimport { $, fs } from 'zx'\n\nimport { Runner, RunnerFactory } from '../lib/runners/index'\nimport { logger } from '../logger'\n\nimport type { AbstractCommand } from './abstract.command'\nimport type * as FoxfordTools from '../types'\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class Program extends Command implements FoxfordTools.Program {\n packageManager: string\n rootPath: string\n logger = logger\n private commandList: Array<AbstractCommand> = []\n\n constructor(packageManager: string, rootPath: string) {\n super()\n\n $.verbose = false\n\n const dotenvFiles = [\n path.resolve('./.env.local'),\n path.resolve('./.env'),\n path.resolve(__dirname, '../.env.local'),\n path.resolve(__dirname, '../.env'),\n ]\n\n dotenvFiles.forEach((dotenvFile) => {\n if (existsSync(dotenvFile)) {\n dotenvConfig({\n path: dotenvFile,\n })\n }\n })\n\n this.packageManager = packageManager\n this.rootPath = rootPath\n }\n\n static async init(): Promise<Program> {\n const detector = await import('package-manager-detector')\n\n let packageManager: string = 'npm'\n let rootPath: string = process.cwd()\n\n const detectResult = await detector.detect({\n strategies: ['packageManager-field', 'devEngines-field', 'lockfile', 'install-metadata'],\n })\n\n if (detectResult) {\n packageManager = detectResult.name\n logger.info(`Определен менеджер пакетов: \"${packageManager}\"`)\n } else {\n logger.warn(`Невозможно определить менеджер пакетов. Дефолт: \"${packageManager}\"`)\n }\n\n if (packageManager === 'npm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.NPM).runSync('root'))\n } else if (packageManager === 'pnpm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.PNPM).runSync('root'))\n }\n\n return new Program(packageManager, rootPath)\n }\n\n public async getPluginPaths(): Promise<Array<{ path: string; pkgJson: FoxfordTools.PackageJson }>> {\n const nodeModulesPlugins = []\n const readPkgUp = await import('read-package-up')\n const result = await readPkgUp.readPackageUp({ cwd: this.rootPath })\n\n if (!result) {\n throw new Error('Unable to find package.json')\n }\n const { packageJson } = result\n\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies }\n\n for (const [name] of Object.entries(dependencies)) {\n // Игнорируем пакеты с типами и другие специфические пакеты\n if (this.shouldSkipPackage(name)) continue\n if (name === packageJson.name) continue\n\n let packageDir: string | null = null\n\n // Попытка найти пакет с помощью require.resolve\n try {\n const packagePath = require.resolve(name, { paths: [this.rootPath] })\n packageDir = path.dirname(packagePath)\n } catch {\n // logger.debug(`Error resolving package ${name} with require.resolve:`, error)\n }\n\n // Fallback: если require.resolve не сработал, пробуем найти пакет вручную\n if (!packageDir) {\n try {\n packageDir = path.join(this.rootPath, 'node_modules', name)\n if (!(await fs.pathExists(packageDir))) {\n logger.debug(`Package directory not found for ${name}`)\n continue\n }\n } catch (error) {\n logger.debug(`Error finding package directory for ${name}:`, error)\n continue\n }\n }\n\n // Теперь у нас есть packageDir, пробуем прочитать package.json\n try {\n const result = await readPkgUp.readPackageUp({ cwd: packageDir })\n if (!result) {\n logger.debug(`Unable to find package.json for ${name}`)\n continue\n }\n\n const { packageJson, path: packageJsonPath } = result\n\n if (packageJson.keywords && packageJson.keywords.includes('foxford-cli-plugin')) {\n nodeModulesPlugins.push({\n path: packageJsonPath,\n pkgJson: packageJson as FoxfordTools.PackageJson,\n })\n }\n } catch (error) {\n logger.debug(`Error reading package.json for ${name}:`, error)\n }\n }\n\n return nodeModulesPlugins\n }\n\n private shouldSkipPackage(name: string): boolean {\n return (\n name.startsWith('@types/') ||\n name.startsWith('@foxford/types') ||\n name === '@foxford/cli' ||\n name === 'typescript' ||\n name.includes('eslint') ||\n name.includes('@babel') ||\n name.includes('react')\n )\n }\n\n defineCommand(command: AbstractCommand) {\n this.commandList.push(command)\n }\n\n getCommands() {\n return this.commandList\n }\n}\n","export * from './abstract.action'\nexport * from './abstract.command'\nexport * from './program'\n","export const BANNER = `\n·▄▄▄ ▐▄• ▄ ·▄▄▄ ▄▄▄ ·▄▄▄▄ \n▐▄▄·▪ █▌█▌▪▐▄▄·▪ ▀▄ █·██▪ ██ \n██▪ ▄█▀▄ ·██· ██▪ ▄█▀▄ ▐▀▀▄ ▐█· ▐█▌\n██▌.▐█▌.▐▌▪▐█·█▌██▌.▐█▌.▐▌▐█•█▌██. ██ \n▀▀▀ ▀█▄▀▪•▀▀ ▀▀▀▀▀ ▀█▄▀▪.▀ ▀▀▀▀▀▀• \n`\n","import chalk from 'chalk'\n\nexport const ERROR_PREFIX = chalk.bgRgb(210, 0, 75).bold.rgb(0, 0, 0)(' Error ')\nexport const INFO_PREFIX = chalk.bgRgb(60, 190, 100).bold.rgb(0, 0, 0)(' Info ')\n","export * from './banner'\nexport * from './prefixes'\n","import { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { CodemodOptions } from './types'\n\nexport class CodemodAction extends AbstractAction<CodemodOptions> {\n public async handle(options: CodemodOptions) {\n const flags = []\n\n if (options.dry) flags.push('--dry')\n if (options.verbose) flags.push('--verbose')\n\n console.log('options', options)\n console.log('flags', flags)\n console.log('extra', options.extra)\n\n const runner = RunnerFactory.create(Runner.NODE, {\n verbose: options.verbose,\n })\n\n runner.run('', [], {\n cwd: process.cwd(),\n })\n\n return\n }\n}\n","export enum Collection {\n FOX_CODEMODS = '@foxford/codemods',\n}\n","import type * as FoxfordTools from '../../types'\n\nexport interface CollectionItem {\n name: string\n alias: string\n description: string\n}\n\nexport abstract class AbstractCollection {\n constructor(protected collection: string) {}\n\n public async execute(_name: string, _inputs: FoxfordTools.ProcessInput[], _extraFlags?: string[], _cwd?: string) {\n return\n }\n\n public abstract getItems(): Promise<CollectionItem[]>\n}\n","/**\n *\n * @param str\n * @returns formated string\n * @description normalizes input to supported path and file name format.\n * Changes camelCase strings to kebab-case, replaces spaces with dash and keeps underscores.\n */\nexport function normalizeToKebabOrSnakeCase(str: string) {\n const STRING_DASHERIZE_REGEXP = /\\s/g\n const STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g\n return str.replace(STRING_DECAMELIZE_REGEXP, '$1-$2').toLowerCase().replace(STRING_DASHERIZE_REGEXP, '-')\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport fs from 'fs-extra'\n\nimport { AbstractCollection } from './abstract.collection'\nimport { Collection } from './collection'\nimport { normalizeToKebabOrSnakeCase } from '../utils/formatting'\n\nimport type { CollectionItem } from './abstract.collection'\n\ninterface Codemod extends CollectionItem {\n runner: string\n}\n\nexport class FoxCodemodCollection extends AbstractCollection {\n private codemods: Codemod[] = []\n private loaded = false\n\n constructor() {\n super(Collection.FOX_CODEMODS)\n }\n\n private async load() {\n const pathCollection = require.resolve(Collection.FOX_CODEMODS)\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgJson = require(path.join(path.dirname(pathCollection), 'package.json'))\n\n if (!pkgJson.codemods) {\n console.log(\n chalk.red('May be you must specify \"codemods\" section in your package.json with path to collection.json')\n )\n process.exit(1)\n }\n\n const collectionPath = path.join(path.dirname(pathCollection), pkgJson.codemods ?? '')\n\n if (!fs.existsSync(collectionPath)) {\n console.log(\n chalk.red('Collection path specified in \"codemods\" section in your package.json is not valid: ', collectionPath)\n )\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const collectionJson = require(collectionPath)\n this.codemods = collectionJson.codemods.map((codemod: Codemod) => ({\n ...codemod,\n name: normalizeToKebabOrSnakeCase(codemod.name),\n }))\n } catch {\n console.log(chalk.red('Collection json is not valid'))\n }\n\n this.loaded = true\n }\n\n public async getItems(): Promise<Codemod[]> {\n if (!this.loaded) {\n try {\n await this.load()\n } catch {\n //\n }\n }\n return this.codemods\n }\n}\n","// import { Runner, RunnerFactory } from '../runners'\n// import { SchematicRunner } from '../runners/schematic.runner'\nimport { Collection } from './collection'\nimport { FoxCodemodCollection } from './fox-codemod.collection'\n\nimport type { AbstractCollection } from './abstract.collection'\n\nexport class CollectionFactory {\n public static create(collection: Collection | string): AbstractCollection {\n // const schematicRunner = RunnerFactory.create(Runner.SCHEMATIC) as SchematicRunner\n\n if (collection === Collection.FOX_CODEMODS) {\n return new FoxCodemodCollection()\n }\n\n return new FoxCodemodCollection()\n }\n}\n","export * from './collection.factory'\nexport * from './collection'\nexport * from './abstract.collection'\n","import chalk from 'chalk'\nimport Table from 'cli-table3'\nimport { Option, Command } from 'commander'\n\nimport { Collection, CollectionFactory } from '../../lib/collection'\nimport { AbstractCommand } from '../../program'\n\nimport type { CodemodOptions } from './types'\nimport type { CollectionItem, AbstractCollection } from '../../lib/collection'\nimport type * as FoxfordTools from '../../types'\n\nexport class CodemodCommand extends AbstractCommand<CodemodOptions> {\n id = 'codemod'\n\n private items: CollectionItem[] = []\n\n private buildRunCommand() {\n const verbose = new Option('--verbose', 'Вывод данных')\n const dry = new Option('--dry', 'Прогон без изменений')\n\n const run = new Command('run')\n\n run\n .description('Запусить кодмод с именем <name>')\n .argument('<name>', 'Имя кодмода (codemod --list)')\n .argument('<input...>', 'Glob паттерн файлов для которых будет применим кодмод')\n .addOption(verbose)\n .addOption(dry)\n .allowUnknownOption(true)\n .showHelpAfterError()\n .action(async (name: string, input: string[], options: CodemodOptions, command: FoxfordTools.Program) => {\n // console.log('extra', extra)\n if (!this.items.filter((item) => item.name === name)) {\n console.error('Name not found')\n return\n }\n\n const unknownOptions = command.parseOptions(command.args)?.unknown ?? []\n\n const paths = input.filter((item) => !unknownOptions.includes(item))\n\n if (unknownOptions.length) {\n options.extra = unknownOptions\n }\n\n options.paths = paths\n\n await this.action.handle(options)\n })\n\n return run\n }\n\n private buildListCommand() {\n const run = new Command('list')\n\n run\n .description('Вывести полный список доступных кодмодов')\n .showHelpAfterError()\n .action(async () => {\n const list = await this.getCollectionItems()\n console.log(\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` + this.buildSchematicsListAsTable(list)\n )\n })\n\n return run\n }\n\n private async getCollectionItems() {\n const list = await this.getItems(this.getCollection())\n this.items = list\n return list\n }\n\n public async load(program: FoxfordTools.Program) {\n const codemod = new Command('codemod')\n codemod\n .addHelpText(\n 'before',\n `\\n---------------------------------------\\n${chalk.greenBright(\n '🛠 Codemod manager'\n )}\\n---------------------------------------\\n`\n )\n .usage('<command>')\n .helpOption(false)\n // .allowUnknownOption()\n .description(await this.buildDescription())\n .summary('Управление кодмодами')\n .addCommand(this.buildRunCommand())\n .addCommand(this.buildListCommand())\n .action(async (options) => {\n if (!options || Object.keys(options).length === 0) {\n codemod.outputHelp()\n return\n }\n\n await this.action.handle(options)\n })\n\n program.addCommand(codemod)\n }\n\n private buildSchematicsListAsTable(items: CollectionItem[]): string {\n const leftMargin = ' '\n const tableConfig = {\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['name', 'description'],\n }\n const table: Table.Table = new Table(tableConfig)\n for (const item of items) {\n table.push([chalk.green(item.name), item.description])\n }\n\n return table.toString()\n }\n\n private getCollection(): string {\n return Collection.FOX_CODEMODS\n }\n\n private async getItems(collection: string): Promise<CollectionItem[]> {\n const abstractCollection: AbstractCollection = CollectionFactory.create(collection)\n this.items = await abstractCollection.getItems()\n return this.items\n }\n\n private async buildDescription(): Promise<string> {\n const list = await this.getCollectionItems()\n const shortList = list.slice(0, 20)\n return (\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` +\n this.buildSchematicsListAsTable(shortList) +\n chalk.yellowBright(`\\n\\nЧтобы увидеть полный список кодмодов используйте команду `) +\n chalk.greenBright(`codemod list`)\n )\n }\n}\n","import { CodemodAction } from './action'\nimport { CodemodCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new CodemodCommand(new CodemodAction(program)))\n}\n","/**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * @param version - Базовая версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n *\n * @example\n * getBetaPackageVersion('1.2.3', 'abc123') // '1.2.3-beta-abc123-20260311'\n */\nexport function getBetaPackageVersion(version: string, sha: string): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n const date = `${year}${month}${day}`\n return `${version}-beta-${sha}-${date}`\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { logger } from '../../../logger'\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployOptions } from '../types'\nimport type { HierarchicalLogger } from '@foxford/logger'\n\n/**\n *\n * Методы провайдера не выбрасывают ошибки.\n *\n * Обработка ошибок должна происходить в методах классов, которые наследуются от класса провайдера.\n */\nexport abstract class DeployProvider {\n cwd: string\n logger: HierarchicalLogger\n buildDir: string\n\n constructor(public providerName: string) {\n this.cwd = process.cwd()\n this.logger = logger.getLogger(providerName)\n this.buildDir = './build'\n }\n\n /**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * Делегирует вызов утилитной функции {@link getBetaPackageVersion} для обратной совместимости.\n *\n * @param version - Версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n */\n public getBetaPackageVersion(version: string, sha: string): string {\n return getBetaPackageVersion(version, sha)\n }\n\n /**\n * Читает и парсит файл package.json из текущей рабочей директории.\n *\n * Эта функция пытается найти и прочитать файл package.json в текущей\n * рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.\n *\n * @returns Распарсенное содержимое файла package.json или null.\n */\n public readPackageJson(pkgPath: string): FoxfordTools.PackageJson | null {\n const packageJsonPath = path.resolve(pkgPath, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n return null\n }\n\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(packageJsonContent)\n } catch (error) {\n this.logger.error(`Ошибка при чтении или парсинге package.json: ${(error as Error).message}`)\n return null\n }\n }\n\n public abstract deploy(params: Omit<DeployOptions, 'provider'>): Promise<void>\n}\n","import { getCatalogsFromWorkspaceManifest } from '@pnpm/catalogs.config'\nimport { createExportableManifest } from '@pnpm/exportable-manifest'\nimport { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'\n\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\n\n/** Секции зависимостей, которые участвуют в резолве (devDependencies удаляются ранее) */\ntype DepSection = 'dependencies' | 'peerDependencies' | 'optionalDependencies'\n\n/** Секции, которые проверяются и резолвятся */\nconst DEP_SECTIONS: DepSection[] = ['dependencies', 'peerDependencies', 'optionalDependencies']\n\n/**\n * Опции для функции резолва зависимостей.\n */\nexport interface ResolveWorkspaceDepsOptions {\n /** Цель деплоя: beta или latest */\n target: 'beta' | 'latest'\n /** Короткий SHA коммита (для генерации бета-версии) */\n commitSha: string\n /**\n * Список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей.\n */\n affected?: string[]\n /** Путь к корню воркспейса (директория с pnpm-workspace.yaml) */\n workspaceRoot: string\n /**\n * Директория пакета — содержит node_modules со ссылками на workspace-пакеты.\n * Используется @pnpm/exportable-manifest для резолва workspace: протоколов.\n */\n packageDir: string\n}\n\n/**\n * Проверяет, содержит ли packageJson зависимости с workspace: или catalog: префиксами.\n * Проверяются только dependencies, peerDependencies и optionalDependencies.\n *\n * @param packageJson - Объект package.json пакета\n * @returns true если найдены нерезолвенные workspace: или catalog: зависимости\n */\nexport function hasWorkspaceOrCatalogDeps(packageJson: FoxfordTools.PackageJson): boolean {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n for (const version of Object.values(deps)) {\n if (version.startsWith('workspace:') || version.startsWith('catalog:')) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Резолвит зависимости с workspace: и catalog: префиксами через @pnpm/exportable-manifest.\n * Мутирует переданный packageJson на месте.\n *\n * Поведение:\n * - `catalog:dev` / `catalog:cli` — берёт версию из соответствующей секции pnpm-workspace.yaml\n * - `workspace:*` — резолвит в точную версию `X.Y.Z` (через node_modules пакета)\n * - `workspace:^` — резолвит в `^X.Y.Z`\n * - `workspace:~` — резолвит в `~X.Y.Z`\n * - Если пакет входит в `affected` и `target === 'beta'` — получает бета-версию (post-processing)\n * - devDependencies не трогаются (должны быть удалены до вызова)\n *\n * @param packageJson - Объект package.json (мутируется in-place)\n * @param options - Параметры резолва\n */\nexport async function resolveWorkspaceAndCatalogDeps(\n packageJson: FoxfordTools.PackageJson,\n options: ResolveWorkspaceDepsOptions\n): Promise<void> {\n if (!hasWorkspaceOrCatalogDeps(packageJson)) return\n\n const { target, commitSha, affected = [], workspaceRoot, packageDir } = options\n\n /**\n * Сохраняем исходные workspace: спецификаторы до резолва,\n * чтобы использовать их при post-processing affected/beta зависимостей.\n */\n const workspaceDeps = new Map<string, Map<string, string>>()\n\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const sectionMap = new Map<string, string>()\n for (const [depName, spec] of Object.entries(deps)) {\n if (spec.startsWith('workspace:')) {\n sectionMap.set(depName, spec)\n }\n }\n\n if (sectionMap.size > 0) {\n workspaceDeps.set(section, sectionMap)\n }\n }\n\n /** Читаем pnpm-workspace.yaml и получаем catalogs через @pnpm/* пакеты */\n const workspaceManifest = await readWorkspaceManifest(workspaceRoot)\n\n if (workspaceManifest === null) {\n throw new Error(`pnpm-workspace.yaml не найден в директории: ${workspaceRoot}`)\n }\n\n const catalogs = getCatalogsFromWorkspaceManifest(workspaceManifest)\n\n /**\n * createExportableManifest резолвит workspace:, catalog: и jsr: протоколы,\n * используя node_modules из packageDir для поиска версий workspace-пакетов.\n * Тип второго аргумента берётся из сигнатуры функции, чтобы не импортировать\n * @pnpm/types напрямую (он является транзитивной зависимостью).\n */\n type PnpmProjectManifest = Parameters<typeof createExportableManifest>[1]\n const resolved = await createExportableManifest(packageDir, packageJson as unknown as PnpmProjectManifest, {\n catalogs,\n })\n\n /** Копируем резолвенные секции зависимостей обратно в packageJson */\n for (const section of DEP_SECTIONS) {\n if (resolved[section] != null) {\n packageJson[section] = resolved[section] as Record<string, string>\n }\n }\n\n /**\n * Post-processing: для affected-пакетов при target=beta заменяем\n * резолвенную версию на бета-версию. createExportableManifest не знает\n * о бета-публикациях, поэтому эта логика применяется отдельно.\n */\n if (target === 'beta' && affected.length > 0) {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const originalSpecs = workspaceDeps.get(section)\n if (!originalSpecs) continue\n\n for (const depName of Object.keys(deps)) {\n if (!affected.includes(depName)) continue\n if (!originalSpecs.has(depName)) continue\n\n const resolvedVersion = deps[depName]!\n /** Сохраняем префикс ^ или ~ если он был применён createExportableManifest */\n const prefix = resolvedVersion.startsWith('^') ? '^' : resolvedVersion.startsWith('~') ? '~' : ''\n const baseVersion = resolvedVersion.slice(prefix.length)\n deps[depName] = `${prefix}${getBetaPackageVersion(baseVersion, commitSha)}`\n }\n }\n }\n}\n","/* eslint-disable max-lines */\nimport { fs, $, path, cd } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\nimport { hasWorkspaceOrCatalogDeps, resolveWorkspaceAndCatalogDeps } from '../utils/resolve-workspace-deps'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployNpmOptions } from '../types'\nimport type { ProcessOutput } from 'zx'\n\nfunction sleep(ms: number) {\n if (process.env.NODE_ENV === 'test') {\n return Promise.resolve()\n }\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport class NpmDeploy extends DeployProvider {\n versionLists: string[] = []\n dry: string = ''\n noGitChecks: string = ''\n\n constructor() {\n super('npm')\n }\n\n /**\n * Возвращает сообщение об устаревании с текущим SHA коммита.\n *\n * @returns Промис, который разрешается строкой сообщения об устаревании.\n */\n private async getDeprecationMessage(): Promise<string> {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().trim()\n return `deprecated by ${commitSha}`\n }\n\n /**\n * Создает или обновляет файл .npmrc с токеном аутентификации для реестра npm.\n *\n * Этот метод добавляет конфигурацию аутентификации в файл .npmrc,\n * обеспечивая безопасный доступ к реестру npm для публикации пакетов.\n * Он использует переменную окружения NPM_TOKEN для аутентификации.\n *\n * @returns Промис, который разрешается, когда файл .npmrc успешно обновлен.\n * @throws Выбрасывает ошибку, если операция с файлом не удалась или если NPM_TOKEN не установлен.\n */\n private async touchNpmrc(): Promise<void> {\n const authStr = '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'\n await $`echo ${authStr} >> .npmrc`\n }\n\n /**\n * Фильтрует устаревшие версии из заданного списка версий пакета.\n *\n * Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.\n * Он использует команду `npm view` для получения статуса устаревания каждой версии.\n *\n * @param pkgName - Имя пакета в регистре.\n * @param versions - Массив строк версий для проверки на устаревание.\n * @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.\n */\n private async getNotDeprecatedVersions(pkgName: string, versions: string[]): Promise<string[]> {\n const notDeprecatedVersions = []\n for (const ver of versions) {\n const cmd = ['npm', 'view', `${pkgName}@${ver}`, 'deprecated']\n const result = await $`${cmd}`\n\n if (!result.toString().trim().includes('deprecated by')) {\n notDeprecatedVersions.push(ver)\n }\n }\n return notDeprecatedVersions\n }\n\n /**\n * Получает список всех версий текущего пакета из реестра npm.\n *\n * Этот метод выполняет команду npm для получения всех версий пакета,\n * указанного в файле package.json. Затем он парсит JSON-ответ\n * и сохраняет результат в свойстве `versionLists` класса.\n *\n * Если пакет ещё не опубликован в npm (HTTP 404), метод возвращает пустой\n * массив и логирует информационное сообщение — процесс деплоя продолжается\n * без очистки beta-версий.\n *\n * @param pkgName - Имя пакета в регистре.\n *\n * @returns Промис, который разрешается в массив строк, где каждая строка\n * представляет версию пакета. Если пакет не найден или парсинг\n * не удался, возвращает пустой массив.\n */\n private async getVersionsList(pkgName: string): Promise<string[]> {\n logger.info('Getting versions list...')\n\n let outputProcess: ProcessOutput\n\n try {\n outputProcess = await $`npm view ${pkgName} versions --json`\n } catch (error) {\n const errorText = String(error)\n\n if (errorText.includes('E404')) {\n logger.info(`Пакет ${pkgName} ещё не опубликован в npm, пропускаем очистку beta-версий`)\n } else {\n logger.warn(`Не удалось получить список версий: ${errorText}`)\n }\n\n return []\n }\n\n const versionsListPo = outputProcess.toString()\n logger.info('Versions list recieved', versionsListPo)\n\n try {\n const parsed = JSON.parse(versionsListPo)\n\n if (Array.isArray(parsed)) {\n return parsed\n } else {\n // Если это не массив, но валидный JSON (например, строка), возвращаем её в массиве\n return [parsed]\n }\n } catch {\n logger.error('Error parsing versions list')\n return []\n }\n }\n\n /**\n * Получает список бэта версий на текущую версию из списка всех версий.\n *\n * @param currentVersion - Строка текущей версии для сравнения.\n * @returns Массив строк похожих версий.\n */\n private getBetaVersions(currentVersion: string): string[] {\n return this.versionLists.filter((ver) => {\n if (!ver.includes('beta')) return false\n if (ver === currentVersion) return false\n\n const semverFromVersion = currentVersion.match(/^[0-9]{1,9}.[0-9]{1,9}.[0-9]{1,9}/gi)\n if (!semverFromVersion) return false\n\n const matchedVersion = semverFromVersion[0] ?? null\n if (!matchedVersion) return false\n\n return ver.includes(matchedVersion)\n })\n }\n\n /**\n * Помечает предыдущие похожие версии пакета как устаревшие.\n *\n * Этот метод находит похожие версии на текущую версию, фильтрует уже устаревшие версии,\n * а затем помечает оставшиеся версии как устаревшие, используя команду npm deprecate.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.\n */\n private async deprecatePrevBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Отмечаем предыдущие бэта версии как deprecated')\n\n this.versionLists = await this.getVersionsList(packageJson.name)\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Найдены beta версии:', betaVersions)\n\n const notDeprecatedVersions = await this.getNotDeprecatedVersions(packageJson.name, betaVersions)\n logger.info('Beta версии без deprecated:', notDeprecatedVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of notDeprecatedVersions) {\n await sleep(500)\n try {\n if (!this.dry) {\n const cmd = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', cmd)\n await $`${cmd}`\n }\n } catch (error) {\n logger.error(error)\n continue\n }\n }\n }\n\n /**\n * Удаляет бета-версии пакета, которые похожи на текущую версию.\n *\n * Этот метод получает все версии пакета, находит похожие версии на текущую,\n * и удаляет те, которые являются бета-версиями. Он использует команду npm unpublish с флагом --force.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.\n * @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.\n */\n private async unpublishBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Разпубликовываем beta версии')\n this.versionLists = await this.getVersionsList(packageJson.name)\n logger.info('Список версий: ', this.versionLists)\n\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Список для разпубликации и депрекейта: ', betaVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of betaVersions) {\n if (!ver.includes('beta')) continue\n\n try {\n const deprecate = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', deprecate)\n await $`${deprecate}`\n\n const unpublish = ['npm', 'unpublish', `${packageJson.name}@${ver}`, '--force', this.dry].filter(\n (item) => item !== ''\n )\n logger.info('Разпубликовывем версию:', unpublish)\n await $`${unpublish}`\n } catch (error) {\n logger.error(error)\n continue\n }\n\n await sleep(500)\n }\n }\n\n /**\n * Разворачивает пакет в реестре npm.\n *\n * Этот метод обрабатывает весь процесс развертывания, включая управление версиями,\n * обновление package.json, публикацию npm и пост-публикационные действия, такие как пометка\n * предыдущих версий как устаревших или удаление бета-версий.\n *\n * Если в package.json присутствуют зависимости с префиксами `workspace:` или `catalog:`,\n * они автоматически резолвятся в конкретные версии перед публикацией.\n *\n * @param params - Параметры развертывания.\n * @param params.dry - Если true, выполняет пробный запуск без фактической публикации.\n * @param params.target - Цель развертывания, либо 'beta', либо 'latest'. По умолчанию 'beta'.\n * @param params.affected - Comma-separated список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей при target=beta.\n *\n * @throws Завершает процесс, если директория сборки не найдена.\n * @returns Промис, который разрешается, когда процесс развертывания завершен.\n */\n async deploy(params: DeployNpmOptions) {\n logger.info('Начинаем процесс деплоя в NPM', params)\n const packageDir = process.cwd()\n const localDir = path.join(packageDir, params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const packageJson = this.readPackageJson(localDir)\n\n if (!packageJson) {\n logger.error('package.json не найден в текущей директории')\n process.exit(1)\n }\n\n if (params.dry === true) this.dry = '--dry-run'\n if (params.skipGitChecks) this.noGitChecks = '--no-git-checks'\n\n logger.info('Меняем директорию на', localDir)\n cd(localDir)\n\n logger.info('Получаем sha коммита')\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n const target = params.target ?? 'beta'\n logger.info('Целевая версия:', target)\n\n await this.touchNpmrc()\n logger.info('Создаем .npmrc')\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n\n packageJson.sha = commitSha\n logger.info('Версия пакета:', packageJson.version)\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies\n }\n\n // Предварительная проверка до вызова git-подпроцесса: внутри resolveWorkspaceAndCatalogDeps\n // есть идентичный guard, но здесь он позволяет избежать запуска `git rev-parse --show-toplevel`\n // для пакетов без workspace/catalog зависимостей.\n if (hasWorkspaceOrCatalogDeps(packageJson)) {\n logger.info('Обнаружены workspace/catalog зависимости, запускаем резолв...')\n\n /**\n * Резолв workspace/catalog протоколов поддерживается только в pnpm.\n * Если packageManager не определён или не является 'pnpm' — завершаем процесс с ошибкой.\n */\n if (params.packageManager !== 'pnpm') {\n logger.error(\n `Резолв workspace: и catalog: зависимостей поддерживается только при использовании pnpm. ` +\n `Текущий packageManager: \"${params.packageManager ?? 'не определён'}\". ` +\n `Используйте pnpm для публикации пакетов с workspace/catalog зависимостями.`\n )\n process.exit(1)\n }\n\n const workspaceRoot = (await $`git rev-parse --show-toplevel`).toString().trim()\n\n const affectedPackages = params.affected ? params.affected.split(',').map((s) => s.trim()) : undefined\n\n await resolveWorkspaceAndCatalogDeps(packageJson, {\n affected: affectedPackages,\n commitSha,\n packageDir,\n target,\n workspaceRoot,\n })\n\n logger.info('Workspace/catalog зависимости зарезолвлены', packageJson)\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson('package.json', packageJson, {\n spaces: 2,\n })\n\n const cmd = [\n params.packageManager ?? 'npm',\n 'publish',\n '--access=public',\n `--tag=${target}`,\n this.dry,\n this.noGitChecks,\n ].filter((item) => item !== '')\n logger.info('Публикуем с аргументами:', cmd)\n\n await $`${cmd}`\n\n if (target === 'beta') {\n await this.deprecatePrevBetaVersions(packageJson)\n } else {\n await this.unpublishBetaVersions(packageJson)\n }\n }\n}\n","import { fs, $, path } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\n\nimport type { DeployS3Options } from '../types'\n\nexport class S3Deploy extends DeployProvider {\n constructor() {\n super('s3')\n }\n\n /**\n * Определяет цель развертывания на основе текущей ветки Git.\n *\n * @returns {'latest' | 'beta'} 'latest' для ветки master, 'beta' для всех остальных.\n */\n getTarget(): 'latest' | 'beta' {\n const { GITHUB_REF_NAME } = process.env\n\n if (GITHUB_REF_NAME === 'master') return 'latest'\n\n return 'beta'\n }\n\n /**\n * Формирует путь для ресурсов в хранилище.\n *\n * @param segments - Cегменты пути.\n * @returns Путь для цели развертывания.\n */\n getRemotePath(...segments: (string | undefined)[]): string {\n return segments\n .filter(Boolean)\n .join(path.posix.sep)\n .replace(/[/\\\\]+/g, path.posix.sep)\n .replace(/^\\//, '')\n }\n\n /**\n * Выполняет команду rclone copy.\n *\n * @param localDir - Путь до локальных ресурсов.\n * @param bucket - Имя бакета в хранилище.\n * @param remoteDir - Удаленный путь для загрузки ресурсов.\n * @param flags - Дополнительные аргументы.\n * @returns Результат выполнения команды.\n */\n async exec(localDir: string, bucket: string, remoteDir?: string, flags?: string[]): Promise<void> {\n const cmd = ['rclone', 'copy', localDir]\n\n if (remoteDir) {\n cmd.push(`myremote:${bucket}/${remoteDir}`)\n } else {\n cmd.push(`myremote:${bucket}/`)\n }\n\n if (flags) {\n cmd.push(...flags)\n }\n\n logger.info('Запуск деплоя:', cmd)\n\n await $`${cmd}`\n\n logger.info('Деплой успешно завершен:', cmd)\n }\n\n /**\n * Получает учетные данные для S3 из параметров или переменных окружения\n * @param options - Опции команды\n * @returns Объект с accessKey и secretKey\n * @throws Error если учетные данные не найдены\n */\n getS3Credentials(options: Partial<DeployS3Options>): { accessKey: string; secretKey: string } {\n const accessKey = options.accessKey ?? process.env.ACCESS_KEY ?? process.env.SELECTEL_USER\n const secretKey = options.secretKey ?? process.env.SECRET_KEY ?? process.env.SELECTEL_PASSWORD\n\n if (!accessKey || !secretKey) {\n throw new Error(\n 'Не указаны учетные данные для S3. ' +\n 'Используйте параметры --access-key и --secret-key или установите переменные окружения ACCESS_KEY и SECRET_KEY'\n )\n }\n\n return { accessKey, secretKey }\n }\n\n /**\n * Выполняет процесс развертывания в хранилище по S3.\n *\n * Этот метод копирует файлы из локальной директории в удаленные директории хранилища,\n * используя rclone. Он обрабатывает как версионные, так и целевые пути.\n *\n * @param {DeployS3Options} params - Параметры развертывания.\n * @param {string} [params.localDir] - Локальная директория для копирования (по умолчанию this.buildDir).\n * @param {string} [params.bucket] - Имя бакета хранилища (по умолчанию из env или 'dist.ngcdn.ru').\n * @param {string} [params.packageName] - Имя пакета (по умолчанию из package.json).\n * @param {string} [params.endpoint] - Endpoint хранилища.\n * @param {string} [params.region] - Регион хранилища.\n * @param {string} [params.accessKey] - Токен доступа.\n * @param {string} [params.secretKey] - Секрет.\n * @param {boolean} [params.verbose] - Вывод дебаг информации.\n * @param {'latest' | 'beta'} [params.target] - Цель развертывания (по умолчанию определяется автоматически).\n * @param {boolean} [params.dry] - Если true, выполняет пробный запуск без фактической загрузки.\n *\n * @throws Завершает процесс, если локальная директория не существует.\n */\n async deploy(params: DeployS3Options) {\n logger.info('Начинаем процесс деплоя в хранилище', params)\n const { BUCKET } = process.env\n\n let accessKey, secretKey\n\n try {\n const credentials = this.getS3Credentials(params)\n accessKey = credentials.accessKey\n secretKey = credentials.secretKey\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.toString())\n } else {\n logger.error(error)\n }\n process.exit(1)\n }\n\n const localDir = path.join(process.cwd(), params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const bucket = params.bucket ?? BUCKET\n\n if (!bucket) {\n logger.error('Бакет не определен')\n process.exit(1)\n }\n\n logger.info('Бакет:', bucket)\n\n const packageJson = this.readPackageJson(localDir)\n\n const remoteDirs = []\n\n if (packageJson) {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n if (params.packageName) {\n packageJson.name = params.packageName\n }\n\n const target = params.target ?? this.getTarget()\n logger.info('Целевая версия:', target)\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n logger.info('Версия пакета:', packageJson.version)\n\n packageJson.sha = commitSha\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson(path.resolve(localDir, 'package.json'), packageJson, {\n spaces: 2,\n })\n\n remoteDirs.push(\n this.getRemotePath(params.remoteDir, packageJson.name, packageJson.version),\n this.getRemotePath(params.remoteDir, packageJson.name, target)\n )\n } else {\n logger.warn('package.json не найден в текущей директории')\n\n if (params.remoteDir) {\n remoteDirs.push(params.remoteDir)\n }\n }\n\n logger.info('Удаленные директории:', remoteDirs)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = accessKey\n $.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = secretKey\n $.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? 's3.ru-1.storage.selcloud.ru'\n $.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? 'ru-1'\n\n const execFlags = ['--progress']\n\n if (params.verbose) execFlags.push('-vv')\n\n if (params.dry) {\n execFlags.push('--dry-run')\n }\n\n if (!remoteDirs.length) {\n await this.exec(localDir, bucket, undefined, execFlags)\n process.exit(0)\n }\n\n await Promise.all(\n remoteDirs.map((remoteDir) => {\n return this.exec(localDir, bucket, remoteDir, execFlags)\n })\n )\n }\n}\n","import { AbstractAction } from '../../program'\nimport { NpmDeploy } from './providers/npm'\nimport { S3Deploy } from './providers/s3'\n\nimport type { DeployProvider } from './providers/abstract.provider'\nimport type { DeployOptions } from './types'\n\nexport class DeployAction extends AbstractAction<DeployOptions> {\n public async handle(params: DeployOptions) {\n let provider: DeployProvider\n\n switch (params.provider) {\n case 'npm':\n provider = new NpmDeploy()\n break\n case 's3':\n provider = new S3Deploy()\n break\n default:\n throw new Error(`Unsupported deploy provider: ${params.provider}`)\n }\n\n await provider.deploy(params)\n }\n}\n","import { Command, Option } from 'commander'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { DeployOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class DeployCommand extends AbstractCommand<DeployOptions> {\n id = 'deploy'\n public async load(program: FoxfordTools.Program) {\n const deployCommand = new Command('deploy').description('Задеплоить пакет')\n\n const targetOption = new Option('--target <target>', 'Релиз beta или latest')\n .choices(['beta', 'latest'])\n .default('beta')\n const localDirOption = new Option('--local-dir <path>', 'Из какой локальной директории загрузить содержимое')\n const dryOption = new Option('--dry', 'Запуск без выполнения операции').default(false)\n const verboseOption = new Option('--verbose', 'Вывод дебаг информации').default(false)\n\n const s3Command = new Command('s3')\n .description('Деплой пакета по s3 в хранилище')\n .option('--bucket <name>', 'В какой бакет загрузить пакет')\n .option('--package-name <name>', 'Имя пакета вместо packageJson.name')\n .option('--remote-dir <dir>', 'Целевая директория в хранилище')\n .option('--access-key <key>', 'Токен доступа')\n .option('--secret-key <secret>', 'Секретный токен')\n .option('--region <name>', 'Регион S3')\n .option('--endpoint <url>', 'Endpoint S3')\n .action(async (params) => {\n await this.action.handle({ ...params, provider: 's3' })\n })\n\n s3Command.addOption(targetOption)\n s3Command.addOption(localDirOption)\n s3Command.addOption(dryOption)\n s3Command.addOption(verboseOption)\n\n const skipGitChecksOption = new Option('--skip-git-checks', 'Отключение git проверок при публикации')\n const affectedOption = new Option(\n '--affected <packages>',\n 'Comma-separated список affected-пакетов, публикуемых в текущем цикле (для резолва бета-версий workspace-зависимостей)'\n )\n\n const npmCommand = new Command('npm').description('Деплой пакета в npm').action(async (params) => {\n await this.action.handle({ ...params, packageManager: program.packageManager, provider: 'npm' })\n })\n\n npmCommand.addOption(targetOption)\n npmCommand.addOption(localDirOption)\n npmCommand.addOption(dryOption)\n npmCommand.addOption(verboseOption)\n npmCommand.addOption(skipGitChecksOption)\n npmCommand.addOption(affectedOption)\n\n deployCommand.addCommand(s3Command)\n deployCommand.addCommand(npmCommand)\n\n program.addCommand(deployCommand)\n }\n}\n","import { DeployAction } from './action'\nimport { DeployCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new DeployCommand(new DeployAction(program)))\n}\n","import { platform, release } from 'os'\n\nimport chalk from 'chalk'\nimport { filesize } from 'filesize'\nimport { cpu, mem } from 'systeminformation'\nimport { $ } from 'zx'\n\nimport { BANNER } from '../../lib/ui'\nimport { AbstractAction } from '../../program'\n\nexport class InfoAction extends AbstractAction {\n public async handle() {\n this.displayBanner()\n await this.displaySystemInformation()\n }\n\n private displayBanner() {\n console.info(chalk.red(BANNER))\n }\n\n private async displaySystemInformation(): Promise<void> {\n const osName = await import('os-name')\n console.info(chalk.green('[System Information]'))\n console.info('OS Version :', chalk.blue(osName.default(platform(), release())))\n console.info('NodeJS Version :', chalk.blue(process.version))\n const where = await $`which node`\n console.info('NodeJS path :', where.toString())\n console.info('NODE_OPTIONS :', chalk.blue(process.env.NODE_OPTIONS))\n if (where.toString().includes('nvm')) {\n console.info('NVM_DIR :', chalk.blue(process.env.NVM_DIR))\n }\n console.log()\n const cpuDevice = await cpu()\n const memDevice = await mem()\n console.info('CPU Family:', chalk.blue(`${cpuDevice.vendor} ${cpuDevice.brand}`))\n console.info('CPU Ph Cores:', chalk.blue(cpuDevice.cores))\n console.info('CPU Speed:', chalk.blue(`${cpuDevice.speed}GHz`))\n console.info('Memory:', chalk.blue(`${filesize(memDevice.total)}`))\n console.info('Memory Free:', chalk.blue(`${filesize(memDevice.free)}`))\n console.info('Memory Used:', chalk.blue(`${filesize(memDevice.used)}`))\n console.info('Memory Available:', chalk.blue(`${filesize(memDevice.available)}`))\n }\n\n rightPad(name: string, length: number): string {\n while (name.length < length) {\n // eslint-disable-next-line no-param-reassign\n name = name.concat(' ')\n }\n return name\n }\n}\n","import { AbstractCommand } from '../../program'\n\nimport type { Command } from 'commander'\n\nexport class InfoCommand extends AbstractCommand {\n id = 'info'\n public async load(program: Command) {\n program\n .command('info')\n .alias('i')\n .description('Показать инфо')\n .action(async () => {\n await this.action.handle()\n })\n }\n}\n","import { InfoAction } from './action'\nimport { InfoCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new InfoCommand(new InfoAction(program)))\n}\n","import fs from 'fs'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\nimport { SingleBar, Presets } from 'cli-progress'\nimport Table from 'cli-table3'\nimport { filesize } from 'filesize'\nimport { glob } from 'glob'\n\nimport { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { OptimizeOptions } from './types'\n\ninterface ResourceTask {\n __originalPath: string\n __originalStat?: fs.Stats\n __optimizedStat?: fs.Stats\n __optimizedPath: string\n err?: string | Error\n status: boolean\n diff?: string\n}\n\nexport class OptimizeAction extends AbstractAction<OptimizeOptions> {\n public async handle(options: OptimizeOptions, extraFlags: string[] = []) {\n const resources = await glob(path.join(process.cwd(), options.filePath!), { ignore: 'node_modules/**' })\n\n console.log(chalk.white(`Найдено ${chalk.green(resources.length)} ресурсов для оптимизации`))\n console.log(\n chalk.yellowBright(`Если вы хотите увидеть список ресурсов, воспользуйтесь опцией ${chalk.green('--list')}`)\n )\n\n if (options.list) console.log(resources)\n\n const inquirer = await import('inquirer')\n\n const answers = await inquirer.default.prompt([\n {\n choices: [\n { name: 'Yes', value: 1 },\n { name: 'No', value: 0 },\n ],\n default: 1,\n message: 'Продолжить?',\n name: 'continue',\n type: 'list',\n },\n ])\n\n if (!answers.continue) return\n\n console.log()\n const bar = new SingleBar({ fps: 25 }, Presets.shades_classic)\n bar.start(resources.length, 0)\n\n const ft = await import('file-type')\n\n const promises = resources.map(async (resource) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const fileType = await ft.fileTypeFromFile(resource)\n if (!fileType)\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n\n const { mime } = fileType\n\n let runner\n\n const outputPath = options.replace\n ? resource\n : path.join(path.dirname(resource), `${options.prefix ?? ''}${path.basename(resource)}`)\n\n switch (mime) {\n case 'image/png':\n case 'image/jpeg':\n runner = RunnerFactory.create(Runner.TINYPNG, {\n token: process.env.TINIFY_API_KEY ?? '',\n verbose: true,\n })\n break\n case 'video/mp4':\n runner = RunnerFactory.create(Runner.FFMPEG, {\n verbose: true,\n })\n break\n default:\n console.log(chalk.yellowBright(`Unsupported mime type for ${chalk.white(resource)}`))\n }\n\n if (!runner) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n }\n\n try {\n const beforeStat = fs.statSync(resource)\n await runner.run({\n extraFlags,\n output: outputPath,\n resource,\n })\n const afterStat = fs.statSync(outputPath)\n\n return {\n __optimizedPath: resource,\n __optimizedStat: afterStat,\n __originalPath: resource,\n __originalStat: beforeStat,\n status: true,\n }\n } catch (err) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n err: err as string,\n status: false,\n }\n } finally {\n bar.increment()\n }\n })\n\n try {\n const result = await Promise.all(promises)\n bar.stop()\n console.log()\n this.printResult(result)\n } catch (err) {\n bar.stop()\n console.log()\n console.log(chalk.redBright('Ошибка при оптимизации:', err))\n }\n }\n\n private printResult(result: ResourceTask[]) {\n const statusTable = this.buildStatusTable(result)\n console.log(statusTable)\n this.showUncompletedFiles(result)\n }\n\n private showUncompletedFiles(results: ResourceTask[]) {\n const failed = results.filter((item) => item.status === false)\n if (failed.length > 0) {\n console.log(chalk.redBright('Список необработанных файлов'))\n console.log(failed.map((item) => item.__originalPath))\n }\n }\n\n private buildStatusTable = (results: ResourceTask[]) => {\n const success = results.filter((item) => item.status === true)\n const failed = results.filter((item) => item.status === false)\n const leftMargin = ''\n const table = new Table({\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['Обработано', 'Не обработано', 'Изменение размера'],\n })\n\n const sumFilesize = results.reduce((acc, task) => {\n if (task.__originalStat && task.__optimizedStat) {\n // eslint-disable-next-line no-param-reassign\n acc += task.__originalStat.size - task.__optimizedStat.size\n }\n return acc\n }, 0)\n\n const sumPrefix = sumFilesize >= 0 ? '-' : '+'\n\n table.push([\n chalk.greenBright(success.length),\n chalk.redBright(failed.length),\n sumFilesize >= 0\n ? chalk.greenBright(`${sumPrefix}${filesize(sumFilesize)}`)\n : chalk.redBright(`${sumPrefix}${filesize(Math.abs(sumFilesize))}`),\n ])\n\n return table.toString()\n }\n}\n","import chalk from 'chalk'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { OptimizeOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class OptimizeCommand extends AbstractCommand<OptimizeOptions> {\n id = 'optimize'\n\n public async load(program: FoxfordTools.Program) {\n program\n .command('optimize [path] [extraFlags...]')\n .alias('opt')\n .option('-l, --list', 'Вывести список файлов для оптимизации', false)\n .option('-r, --replace', 'Заменить исходный файл', false)\n .option('-p, --prefix', 'Префикс в имени оптимайзнутого файла', '__')\n .description('Оптимизировать ресурс(jpg,png,mp4)')\n .action(async (path: string, extraFlags: string[], option) => {\n if (!path) {\n console.log(chalk.yellow('Укажите путь до ресурса(поддерживается glob)'))\n process.exit(1)\n }\n\n await this.action.handle(\n {\n filePath: path,\n list: option.list,\n prefix: option.prefix,\n replace: option.replace,\n },\n extraFlags\n )\n })\n }\n}\n","import { OptimizeAction } from './action'\nimport { OptimizeCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new OptimizeCommand(new OptimizeAction(program)))\n}\n","#!/usr/bin/env node\nimport chalk from 'chalk'\n\nimport pkg from '../../package.json'\nimport { logger } from '../logger'\nimport { Program } from '../program'\nimport { CommandLoader } from '../program/loader'\n\nconst PROGRAM_NAME = 'fox'\n\nconst welcomeText = `${chalk.green(`Привет✌️ , Foxford разработчик🤓`)}\n${chalk.magenta(`Эта штука призвана помочь тебе в кодогенерации и в чем-нибудь ещё🍿`)}\n${chalk.yellowBright('Чай наливай себе сам 🍮🍪')}\n`\n\nconst bootstrap = async () => {\n logger.debug('Start program')\n const program = await Program.init()\n\n program\n .version(pkg.version, '-v, --version', 'Показать текущую версию тулзы')\n .name(PROGRAM_NAME)\n .description(welcomeText)\n .usage('<command> [options]')\n .helpOption(false)\n .addHelpCommand(false)\n\n logger.debug('Load processes')\n await CommandLoader.load(program)\n logger.debug('Loading complete')\n\n logger.debug('Parse process.argv', process.argv)\n await program.parseAsync(process.argv)\n\n if (!process.argv.slice(2).length) {\n program.outputHelp()\n }\n}\n\nbootstrap()\n","{\n \"name\": \"@foxford/cli\",\n \"version\": \"1.4.2\",\n \"description\": \"Foxford Cli\",\n \"keywords\": [\n \"foxford\",\n \"cli\",\n \"tool\"\n ],\n \"homepage\": \"https://github.com/foxford/frontend-platform\",\n \"bugs\": \"https://github.com/foxford/frontend-platform/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/foxford/frontend-platform.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Foxford Co\",\n \"maintainers\": [\n {\n \"name\": \"Roman Olin\",\n \"email\": \"r.v.olin@foxford.ru\",\n \"team\": \"core-frontend\"\n }\n ],\n \"main\": \"./README.mdx\",\n \"types\": \"./src/types/index.ts\",\n \"type\": \"module\",\n \"exports\": {\n \"./README.mdx\": \"./README.mdx\",\n \".\": {\n \"types\": \"./src/types/index.ts\"\n }\n },\n \"bin\": {\n \"fox-dev\": \"./scripts/dev.cjs\",\n \"fox\": \"./scripts/prod.cjs\"\n },\n \"scripts\": {\n \"============================ BUILD =============================\": \"\",\n \"build\": \"tsup\",\n \"postbuild\": \"pnpm run build-dts\",\n \"build-dts\": \"dts-bundle-generator -o build/fox.d.ts src/types/index.ts --no-banner --external-inlines=commander loglevel --sort --inline-declare-externals\",\n \"============================ DEPLOY =============================\": \"\",\n \"deploy\": \"fox deploy npm\",\n \"============================ LINT =============================\": \"\",\n \"lint:clean\": \"rm -f .eslintcache\",\n \"lint:type-check\": \"tsc --noEmit --pretty\",\n \"lint:eslint\": \"eslint --cache --cache-strategy content --max-warnings=0 ./\",\n \"============================ TEST =============================\": \"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@foxford/logger\": \"workspace:*\",\n \"@pnpm/catalogs.config\": \"1000.0.5\",\n \"@pnpm/exportable-manifest\": \"1000.4.1\",\n \"@pnpm/workspace.read-manifest\": \"1000.3.0\",\n \"@tsconfig/node16\": \"16.1.3\",\n \"chalk\": \"4.1.0\",\n \"cli-progress\": \"catalog:cli\",\n \"cli-table3\": \"catalog:cli\",\n \"commander\": \"catalog:cli\",\n \"dotenv\": \"16.4.5\",\n \"dotenv-expand\": \"11.0.6\",\n \"file-type\": \"21.3.2\",\n \"filesize\": \"10.1.2\",\n \"fluent-ffmpeg\": \"2.1.2\",\n \"fs-extra\": \"catalog:dev\",\n \"glob\": \"catalog:dev\",\n \"inquirer\": \"12.4.3\",\n \"os-name\": \"7.0.0\",\n \"package-manager-detector\": \"1.3.0\",\n \"read-package-up\": \"11.0.0\",\n \"systeminformation\": \"5.31.1\",\n \"tinify\": \"1.7.1\",\n \"tsx\": \"4.21.0\",\n \"typescript\": \"catalog:dev\",\n \"yaml\": \"2.4.5\",\n \"zx\": \"catalog:dev\"\n },\n \"devDependencies\": {\n \"@foxford/eslint-config\": \"workspace:*\",\n \"@foxford/prettier-config\": \"workspace:*\",\n \"@foxford/typescript-config\": \"workspace:*\",\n \"@foxford/vitest-config\": \"workspace:*\",\n \"@types/cli-progress\": \"catalog:cli\",\n \"@types/fluent-ffmpeg\": \"2.1.24\",\n \"@types/fs-extra\": \"11.0.4\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"tsup\": \"catalog:dev\",\n \"vitest\": \"catalog:dev\"\n }\n}","import { existsSync, statSync } from 'node:fs'\nimport { readdir } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport chalk from 'chalk'\nimport { pathExists } from 'fs-extra'\n\nimport { ERROR_PREFIX } from '../lib/ui'\nimport { logger } from '../logger'\n\nimport type * as FoxfordTools from '../types'\nimport type { NormalizedPackageJson } from 'read-package-up'\n\nconst log = logger.getLogger('command-loader')\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class CommandLoader {\n static PROCESSES_DIR = path.resolve(__dirname, '..', 'processes')\n\n public static async load(program: FoxfordTools.Program): Promise<void> {\n if (process.env.NODE_ENV === 'production') {\n await this.loadProductionProcesses(program)\n } else {\n await this.loadDevelopmentProcesses(program)\n }\n\n await Promise.all(program.getCommands().map(async (command) => await command.load(program)))\n this.handleInvalidCommand(program)\n }\n\n static async loadProductionProcesses(program: FoxfordTools.Program) {\n try {\n for (const [processName, moduleLoader] of Object.entries({\n codemod: () => import('../processes/codemod'),\n deploy: () => import('../processes/deploy'),\n info: () => import('../processes/info'),\n optimize: () => import('../processes/optimize')\n })) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const module = await moduleLoader()\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при загрузке процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n static async loadDevelopmentProcesses(program: FoxfordTools.Program) {\n if (!(await pathExists(CommandLoader.PROCESSES_DIR))) {\n log.error(`Директория процессов не найдена: ${CommandLoader.PROCESSES_DIR}`)\n return\n }\n\n try {\n const processes = await this.getProcesses(CommandLoader.PROCESSES_DIR)\n for (const processName of processes) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const modulePath = path.join(CommandLoader.PROCESSES_DIR, processName)\n\n const module = require(modulePath)\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при чтении процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n private static getModulePath(packageJson: NormalizedPackageJson): string {\n let modulePath: string = ''\n\n if (packageJson.exports) {\n // Используем exports для определения точки входа\n if (typeof packageJson.exports === 'string') {\n modulePath = packageJson.exports\n } else if ((packageJson.exports as Record<string, unknown>)['.']) {\n // Если есть экспорт по умолчанию\n const defaultExport = (packageJson.exports as Record<string, string>)['.'] as string | Record<string, string>\n if (typeof defaultExport === 'string') {\n modulePath = defaultExport\n } else {\n if (packageJson.type === 'module') {\n modulePath = defaultExport.import as string\n } else {\n modulePath = defaultExport.require as string\n }\n }\n }\n } else if (packageJson.main) {\n // Fallback на main, если exports не определен\n modulePath = packageJson.main as string\n } else {\n // Если ни exports, ни main не определены, используем index.js\n modulePath = 'index.js'\n }\n\n return modulePath\n }\n\n private static async loadPlugins(program: FoxfordTools.Program) {\n const plugins = await program.getPluginPaths()\n\n for (const plugin of plugins) {\n log.debug(`Загружаем модуль: ${chalk.cyan(plugin.pkgJson.name)}`)\n const dirname = path.dirname(plugin.path)\n\n if (process.env.NODE_ENV === 'development') {\n const module = require(`${plugin.pkgJson.name}`)\n module.default(program)\n continue\n }\n\n let targetPath = path.resolve(dirname)\n\n if (existsSync(path.resolve(targetPath, 'build'))) {\n targetPath = path.resolve(targetPath, 'build')\n }\n\n if (existsSync(path.join(targetPath, 'package.json'))) {\n const packageJson = require(path.join(targetPath, 'package.json'))\n\n try {\n const require = createRequire(__filename)\n let module\n\n const modulePath = this.getModulePath(packageJson)\n\n if (packageJson.type === 'module') {\n // Если это ES модуль\n module = await import(path.join(targetPath, modulePath))\n } else {\n // Если это CommonJS модуль\n module = require(path.join(targetPath, modulePath))\n }\n\n if (typeof module.default === 'function') {\n module.default(program)\n } else if (typeof module === 'function') {\n module(program)\n } else {\n log.warn(`Модуль \"${plugin.pkgJson.name}\" не экспортирует функцию по умолчанию`)\n }\n } catch (error) {\n log.error(`Ошибка при загрузке модуля \"${plugin.pkgJson.name}\":`, error)\n }\n }\n }\n }\n\n private static async getProcesses(processesPath: string): Promise<string[]> {\n const files = await readdir(processesPath)\n\n return files\n .filter((file) => {\n const filePath = path.join(processesPath, file as string, 'index.ts')\n const stat = statSync(filePath)\n return stat.isFile()\n })\n .map((file) => path.parse(file as string).name)\n }\n\n private static handleInvalidCommand(program: FoxfordTools.Program) {\n program.on('command:*', () => {\n console.error(`\\n${ERROR_PREFIX} Неверная команда: ${chalk.red('%s')}`, program.args.join(' '))\n console.log(`Смотри ${chalk.red('--help')} для вывода доступного списка команд.\\n`)\n process.exit(1)\n })\n }\n}\n"],"mappings":"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","names":["ffmpeg","path","chalk","import_chalk","chalk","path","fs","dotenvExpand","dotenvConfig","import_node_path","init_logger","chalk","label","import_chalk","init_logger","chalk","label","import_chalk","tinify","chalk","import_node_path","import_dotenv","require","path","dotenvConfig","result","packageJson","init_program","import_chalk","chalk","init_program","import_node_path","import_chalk","import_fs_extra","path","chalk","fs","init_collection","import_chalk","import_commander","init_collection","init_program","chalk","Table","import_node_path","path","fs","import_zx","import_zx","init_action","init_program","import_commander","init_command","init_program","init_action","init_command","import_chalk","import_zx","init_action","init_program","chalk","init_command","init_program","init_action","init_command","import_fs","import_node_path","import_chalk","import_cli_table3","import_filesize","init_action","init_program","Table","chalk","path","fs","import_chalk","init_command","init_program","path","chalk","init_action","init_command","import_chalk","init_program","import_node_fs","import_node_module","import_node_path","import_node_url","import_chalk","import_fs_extra","log","require","__dirname","path","chalk","module","chalk"]}
1
+ {"version":3,"sources":["../../../node_modules/.pnpm/tsup@8.5.1_@swc+core@1.15.18_jiti@1.21.7_postcss@8.5.6_tsx@4.21.0_typescript@5.9.3_yaml@2.4.5/node_modules/tsup/assets/cjs_shims.js","../src/logger/index.ts","../src/program/abstract.action.ts","../src/program/abstract.command.ts","../src/lib/runners/runner.ts","../src/lib/runners/ffmpeg.runner.ts","../src/lib/runners/shell.runner.ts","../src/lib/runners/node.runner.ts","../src/lib/runners/npm.runner.ts","../src/lib/runners/pnpm.runner.ts","../src/helpers/env.ts","../src/helpers/logger.ts","../src/lib/runners/script.runner.ts","../src/lib/runners/tinypng.runner.ts","../src/lib/runners/runner.factory.ts","../src/lib/runners/index.ts","../src/program/program.ts","../src/program/index.ts","../src/lib/ui/banner.ts","../src/lib/ui/prefixes.ts","../src/lib/ui/index.ts","../src/processes/codemod/action.ts","../src/lib/collection/collection.ts","../src/lib/collection/abstract.collection.ts","../src/lib/utils/formatting.ts","../src/lib/collection/fox-codemod.collection.ts","../src/lib/collection/collection.factory.ts","../src/lib/collection/index.ts","../src/processes/codemod/command.ts","../src/processes/codemod/index.ts","../src/utils/versioning.ts","../src/processes/deploy/providers/abstract.provider.ts","../src/processes/deploy/utils/resolve-workspace-deps.ts","../src/processes/deploy/providers/npm.ts","../src/processes/deploy/providers/s3.ts","../src/processes/deploy/action.ts","../src/processes/deploy/command.ts","../src/processes/deploy/index.ts","../src/processes/info/action.ts","../src/processes/info/command.ts","../src/processes/info/index.ts","../src/processes/optimize/action.ts","../src/processes/optimize/command.ts","../src/processes/optimize/index.ts","../src/bin/fox.ts","../package.json","../src/program/loader.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () => \n typeof document === \"undefined\" \n ? new URL(`file:${__filename}`).href \n : (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT') \n ? document.currentScript.src \n : new URL(\"main.js\", document.baseURI).href;\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","import { log } from '@foxford/logger'\n\nimport type { HierarchicalLogger } from '@foxford/logger'\n\nconst logger: HierarchicalLogger = log.getLogger('cli')\nlogger.setLevel('info')\n\nexport { logger }\n","import type * as FoxfordTools from '../types'\n\nexport abstract class AbstractAction<Options = FoxfordTools.ProcessInput[]> {\n constructor(protected program: FoxfordTools.Program) {}\n public abstract handle(options?: Options, params?: string[]): Promise<void>\n}\n","import type { AbstractAction } from './abstract.action'\nimport type * as FoxfordTools from '../types'\n\nexport abstract class AbstractCommand<Options = unknown> {\n constructor(protected action: AbstractAction<Options>) {}\n\n public abstract id: string\n\n public abstract load(program: FoxfordTools.Program): Promise<void> | void\n}\n","export enum Runner {\n NPM = 'NPM',\n PNPM = 'PNPM',\n FFMPEG = 'FFMPEG',\n TINYPNG = 'TINYPNG',\n NODE = 'NODE',\n PACKAGE_JSON_SCRIPT = 'PACKAGE_JSON_SCRIPT',\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport ffmpeg from 'fluent-ffmpeg'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class FFMpegRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n public async run(payload: RunnerPayload): Promise<string | null> {\n return new Promise<null | string>((resolve, reject) => {\n ffmpeg(payload.resource)\n .output(payload.output ?? path.basename(payload.resource))\n .outputOptions([\n '-hide_banner',\n '-movflags +faststart',\n '-pix_fmt yuv420p',\n '-c:v libx264',\n '-preset:v veryslow',\n '-profile:v high',\n '-level 3.1',\n '-tune:v ssim',\n '-r 30',\n '-g 180',\n '-keyint_min 180',\n '-sc_threshold 0',\n '-max_muxing_queue_size 1024',\n // '-vf scale=1920:-1',\n '-f mp4',\n ...(payload.extraFlags ?? []),\n ])\n .on('end', function () {\n resolve(payload.resource)\n })\n .on('error', function (err) {\n console.log()\n console.log(chalk.redBright('Cannot process video: ' + err.message))\n reject(err)\n })\n .run()\n })\n }\n}\n","import { spawn, execSync } from 'child_process'\n\nimport chalk from 'chalk'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type { ChildProcess, SpawnOptions, ExecSyncOptionsWithStringEncoding } from 'child_process'\n\nexport class ShellRunner {\n protected binary: string\n protected options: RunnerOptions\n\n constructor(binary: string, options?: RunnerOptions) {\n this.binary = binary\n this.options = options ?? { cwd: process.cwd() }\n }\n\n public async run(\n command: string,\n args: string[] = [],\n options: SpawnOptions = {},\n collect = false\n ): Promise<unknown> {\n const spawnOptions: SpawnOptions = {\n cwd: this.options.cwd,\n shell: true,\n stdio: collect ? 'pipe' : 'inherit',\n ...options,\n }\n return new Promise((resolve, reject) => {\n const child: ChildProcess = spawn(`${this.binary}`, [command, ...args], spawnOptions)\n if (collect && child.stdout) {\n child.stdout.on('data', (data) => resolve(data.toString().replace(/\\r\\n|\\n/, '')))\n }\n child.on('close', (code) => {\n if (code === 0) {\n resolve(child.stdout)\n } else {\n console.error(chalk.red(`\\n Не удалось выполнить команду: ${this.binary} ${command} ${args} `))\n reject(code)\n }\n })\n })\n }\n\n public runSync(command: string): string {\n const spawnOptions: ExecSyncOptionsWithStringEncoding = {\n cwd: this.options.cwd,\n encoding: 'utf-8',\n }\n return execSync(`${this.binary} ${command}`, spawnOptions)\n }\n\n /**\n * @param command\n * @returns The entire command that will be ran when calling `run(command)`.\n */\n public rawFullCommand(command: string): string {\n const commandArgs: string[] = [command]\n return `${this.binary} ${commandArgs.join(' ')}`\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NodeRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('node', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class NpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('npm', options)\n }\n}\n","import { ShellRunner } from './shell.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nexport class PnpmRunner extends ShellRunner {\n constructor(options?: RunnerOptions) {\n super('pnpm', options)\n }\n}\n","import path from 'node:path'\n\nimport { config as dotenvConfig } from 'dotenv'\nimport { expand as dotenvExpand } from 'dotenv-expand'\nimport fs from 'fs-extra'\n\ntype Truthy<T> = T extends false | '' | 0 | null | undefined ? never : T\n\nfunction truthy<T>(value: T): value is Truthy<T> {\n return !!value\n}\n\nexport function loadEnv(pkgPath: string) {\n const dotenvFiles = [\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}.local`),\n Boolean(process.env.NODE_ENV) && path.join(pkgPath, `.env.${process.env.NODE_ENV}`),\n Boolean(process.env.NODE_ENV) === false && path.join(pkgPath, `.env.development`),\n // Don't include `.env.local` for `test` environment\n // since normally you expect tests to produce the same\n // results for everyone\n process.env.NODE_ENV !== 'test' && path.join(pkgPath, `.env.local`),\n path.join(pkgPath, '.env'),\n ].filter(truthy)\n\n dotenvFiles.forEach((dotenvFile) => {\n if (fs.existsSync(dotenvFile)) {\n dotenvExpand(\n dotenvConfig({\n path: dotenvFile,\n })\n )\n }\n })\n\n return dotenvFiles\n}\n","import type { Chalk } from 'chalk'\n\nexport const label = (chalk: Chalk, label: string) => chalk.black(` ${label} `)\n","import chalk from 'chalk'\n\nimport { PnpmRunner } from './pnpm.runner'\nimport { loadEnv } from '../../helpers/env'\nimport { label } from '../../helpers/logger'\n\nimport type { RunnerOptions } from './abstract.runner'\nimport type * as FoxfordTools from '../../types'\n\nconst getLabel = (pkgName: string) => {\n return label(chalk.bgGreen, pkgName) + chalk.white(' ')\n}\n\nconst getFailLabel = (pkgName: string) => {\n return label(chalk.bgRed, pkgName) + chalk.white(' ')\n}\n\ninterface RunnerPayload {\n pkg: FoxfordTools.Package\n}\n\nexport class ScriptRunner {\n options: RunnerOptions\n\n constructor(options?: RunnerOptions) {\n this.options = options ?? ({} as RunnerOptions)\n }\n\n async run(script: string, { pkg }: RunnerPayload) {\n const label = getLabel(pkg.localName.toUpperCase())\n const failLabel = getFailLabel(pkg.localName.toUpperCase())\n console.log(label + chalk.blue(`Start ${chalk.white.underline(script)} process`))\n if (this.options.verbose) {\n console.log(label + chalk.blue(`Print typescript config`))\n console.log()\n }\n console.log(\n label + chalk.blue(`Env ${chalk.magenta('process.env.NODE_ENV')} is ${chalk.yellow(process.env.NODE_ENV)}`)\n )\n console.log(\n label +\n chalk.blue(`Env ${chalk.magenta('process.env.NODE_OPTIONS')} is ${chalk.yellow(process.env.NODE_OPTIONS)}`)\n )\n try {\n console.log(label + chalk.blue(`Load .env files`))\n const envFiles = loadEnv(pkg.path)\n console.log(JSON.stringify(envFiles, null, 2))\n } catch (err) {\n if (err instanceof Error) {\n console.log(failLabel + chalk.red(err.message))\n process.exit(1)\n }\n }\n\n const pnpmRunner = new PnpmRunner()\n\n pnpmRunner.run('run', [`--filter ${pkg.localName}`, script], {\n cwd: pkg.path,\n env: Object.assign(process.env, { FORCE_COLOR: '1' }),\n })\n }\n}\n","import chalk from 'chalk'\nimport tinify from 'tinify'\n\nimport type { RunnerOptions } from './abstract.runner'\n\ninterface TinyPngRunnerOptions extends RunnerOptions {\n token?: string\n}\n\ninterface RunnerPayload {\n resource: string\n output?: string\n extraFlags?: string[]\n}\n\nexport class TinyPngRunner {\n options: TinyPngRunnerOptions\n\n constructor(options?: TinyPngRunnerOptions) {\n this.options = options ?? ({} as TinyPngRunnerOptions)\n\n if (!options?.token) throw new Error('You must specify process.env.TINIFY_API_KEY env variable with tinify key')\n }\n\n public async run(payload: RunnerPayload): Promise<null | string> {\n const source = tinify.fromFile(payload.resource)\n tinify.key = this.options?.token ?? ''\n\n try {\n await source.toFile(payload.output ?? payload.resource)\n } catch (err) {\n if (err instanceof Error) console.log(chalk.redBright('Cannot compress resource with tinify: ' + err.message))\n }\n\n return payload.resource\n }\n\n public runSync(): string {\n throw new TypeError('this method not implemented')\n }\n}\n","import { FFMpegRunner } from './ffmpeg.runner'\nimport { NodeRunner } from './node.runner'\nimport { NpmRunner } from './npm.runner'\nimport { PnpmRunner } from './pnpm.runner'\nimport { Runner } from './runner'\nimport { ScriptRunner } from './script.runner'\nimport { TinyPngRunner } from './tinypng.runner'\n\nimport type { RunnerOptions } from './abstract.runner'\n\nconst RunnerMap = {\n [Runner.NPM]: NpmRunner,\n [Runner.PNPM]: PnpmRunner,\n [Runner.NODE]: NodeRunner,\n [Runner.PACKAGE_JSON_SCRIPT]: ScriptRunner,\n [Runner.FFMPEG]: FFMpegRunner,\n [Runner.TINYPNG]: TinyPngRunner,\n}\n\ntype RunnerTypeMap = typeof RunnerMap\n\nexport class RunnerFactory {\n public static create<R extends Runner>(\n runner: R,\n options?: ConstructorParameters<RunnerTypeMap[R]>[0]\n ): InstanceType<RunnerTypeMap[R]> {\n const RunnerClass = RunnerMap[runner]\n\n if (!RunnerClass) {\n throw new Error(`Unknown runner ${runner}`)\n }\n\n return new RunnerClass(options as RunnerOptions) as InstanceType<RunnerTypeMap[R]>\n }\n}\n","export * from './runner'\nexport * from './runner.factory'\nexport type * from './abstract.runner'\n","import { existsSync } from 'fs'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport { Command } from 'commander'\nimport { config as dotenvConfig } from 'dotenv'\nimport { $, fs } from 'zx'\n\nimport { Runner, RunnerFactory } from '../lib/runners/index'\nimport { logger } from '../logger'\n\nimport type { AbstractCommand } from './abstract.command'\nimport type * as FoxfordTools from '../types'\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class Program extends Command implements FoxfordTools.Program {\n packageManager: string\n rootPath: string\n logger = logger\n private commandList: Array<AbstractCommand> = []\n\n constructor(packageManager: string, rootPath: string) {\n super()\n\n $.verbose = false\n\n const dotenvFiles = [\n path.resolve('./.env.local'),\n path.resolve('./.env'),\n path.resolve(__dirname, '../.env.local'),\n path.resolve(__dirname, '../.env'),\n ]\n\n dotenvFiles.forEach((dotenvFile) => {\n if (existsSync(dotenvFile)) {\n dotenvConfig({\n path: dotenvFile,\n })\n }\n })\n\n this.packageManager = packageManager\n this.rootPath = rootPath\n }\n\n static async init(): Promise<Program> {\n const detector = await import('package-manager-detector')\n\n let packageManager: string = 'npm'\n let rootPath: string = process.cwd()\n\n const detectResult = await detector.detect({\n strategies: ['packageManager-field', 'devEngines-field', 'lockfile', 'install-metadata'],\n })\n\n if (detectResult) {\n packageManager = detectResult.name\n logger.info(`Определен менеджер пакетов: \"${packageManager}\"`)\n } else {\n logger.warn(`Невозможно определить менеджер пакетов. Дефолт: \"${packageManager}\"`)\n }\n\n if (packageManager === 'npm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.NPM).runSync('root'))\n } else if (packageManager === 'pnpm') {\n rootPath = path.dirname(RunnerFactory.create(Runner.PNPM).runSync('root'))\n }\n\n return new Program(packageManager, rootPath)\n }\n\n public async getPluginPaths(): Promise<Array<{ path: string; pkgJson: FoxfordTools.PackageJson }>> {\n const nodeModulesPlugins = []\n const readPkgUp = await import('read-package-up')\n const result = await readPkgUp.readPackageUp({ cwd: this.rootPath })\n\n if (!result) {\n throw new Error('Unable to find package.json')\n }\n const { packageJson } = result\n\n const dependencies = { ...packageJson.dependencies, ...packageJson.devDependencies }\n\n for (const [name] of Object.entries(dependencies)) {\n // Игнорируем пакеты с типами и другие специфические пакеты\n if (this.shouldSkipPackage(name)) continue\n if (name === packageJson.name) continue\n\n let packageDir: string | null = null\n\n // Попытка найти пакет с помощью require.resolve\n try {\n const packagePath = require.resolve(name, { paths: [this.rootPath] })\n packageDir = path.dirname(packagePath)\n } catch {\n // logger.debug(`Error resolving package ${name} with require.resolve:`, error)\n }\n\n // Fallback: если require.resolve не сработал, пробуем найти пакет вручную\n if (!packageDir) {\n try {\n packageDir = path.join(this.rootPath, 'node_modules', name)\n if (!(await fs.pathExists(packageDir))) {\n logger.debug(`Package directory not found for ${name}`)\n continue\n }\n } catch (error) {\n logger.debug(`Error finding package directory for ${name}:`, error)\n continue\n }\n }\n\n // Теперь у нас есть packageDir, пробуем прочитать package.json\n try {\n const result = await readPkgUp.readPackageUp({ cwd: packageDir })\n if (!result) {\n logger.debug(`Unable to find package.json for ${name}`)\n continue\n }\n\n const { packageJson, path: packageJsonPath } = result\n\n if (packageJson.keywords && packageJson.keywords.includes('foxford-cli-plugin')) {\n nodeModulesPlugins.push({\n path: packageJsonPath,\n pkgJson: packageJson as FoxfordTools.PackageJson,\n })\n }\n } catch (error) {\n logger.debug(`Error reading package.json for ${name}:`, error)\n }\n }\n\n return nodeModulesPlugins\n }\n\n private shouldSkipPackage(name: string): boolean {\n return (\n name.startsWith('@types/') ||\n name.startsWith('@foxford/types') ||\n name === '@foxford/cli' ||\n name === 'typescript' ||\n name.includes('eslint') ||\n name.includes('@babel') ||\n name.includes('react')\n )\n }\n\n defineCommand(command: AbstractCommand) {\n this.commandList.push(command)\n }\n\n getCommands() {\n return this.commandList\n }\n}\n","export * from './abstract.action'\nexport * from './abstract.command'\nexport * from './program'\n","export const BANNER = `\n·▄▄▄ ▐▄• ▄ ·▄▄▄ ▄▄▄ ·▄▄▄▄ \n▐▄▄·▪ █▌█▌▪▐▄▄·▪ ▀▄ █·██▪ ██ \n██▪ ▄█▀▄ ·██· ██▪ ▄█▀▄ ▐▀▀▄ ▐█· ▐█▌\n██▌.▐█▌.▐▌▪▐█·█▌██▌.▐█▌.▐▌▐█•█▌██. ██ \n▀▀▀ ▀█▄▀▪•▀▀ ▀▀▀▀▀ ▀█▄▀▪.▀ ▀▀▀▀▀▀• \n`\n","import chalk from 'chalk'\n\nexport const ERROR_PREFIX = chalk.bgRgb(210, 0, 75).bold.rgb(0, 0, 0)(' Error ')\nexport const INFO_PREFIX = chalk.bgRgb(60, 190, 100).bold.rgb(0, 0, 0)(' Info ')\n","export * from './banner'\nexport * from './prefixes'\n","import { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { CodemodOptions } from './types'\n\nexport class CodemodAction extends AbstractAction<CodemodOptions> {\n public async handle(options: CodemodOptions) {\n const flags = []\n\n if (options.dry) flags.push('--dry')\n if (options.verbose) flags.push('--verbose')\n\n console.log('options', options)\n console.log('flags', flags)\n console.log('extra', options.extra)\n\n const runner = RunnerFactory.create(Runner.NODE, {\n verbose: options.verbose,\n })\n\n runner.run('', [], {\n cwd: process.cwd(),\n })\n\n return\n }\n}\n","export enum Collection {\n FOX_CODEMODS = '@foxford/codemods',\n}\n","import type * as FoxfordTools from '../../types'\n\nexport interface CollectionItem {\n name: string\n alias: string\n description: string\n}\n\nexport abstract class AbstractCollection {\n constructor(protected collection: string) {}\n\n public async execute(_name: string, _inputs: FoxfordTools.ProcessInput[], _extraFlags?: string[], _cwd?: string) {\n return\n }\n\n public abstract getItems(): Promise<CollectionItem[]>\n}\n","/**\n *\n * @param str\n * @returns formated string\n * @description normalizes input to supported path and file name format.\n * Changes camelCase strings to kebab-case, replaces spaces with dash and keeps underscores.\n */\nexport function normalizeToKebabOrSnakeCase(str: string) {\n const STRING_DASHERIZE_REGEXP = /\\s/g\n const STRING_DECAMELIZE_REGEXP = /([a-z\\d])([A-Z])/g\n return str.replace(STRING_DECAMELIZE_REGEXP, '$1-$2').toLowerCase().replace(STRING_DASHERIZE_REGEXP, '-')\n}\n","import path from 'node:path'\n\nimport chalk from 'chalk'\nimport fs from 'fs-extra'\n\nimport { AbstractCollection } from './abstract.collection'\nimport { Collection } from './collection'\nimport { normalizeToKebabOrSnakeCase } from '../utils/formatting'\n\nimport type { CollectionItem } from './abstract.collection'\n\ninterface Codemod extends CollectionItem {\n runner: string\n}\n\nexport class FoxCodemodCollection extends AbstractCollection {\n private codemods: Codemod[] = []\n private loaded = false\n\n constructor() {\n super(Collection.FOX_CODEMODS)\n }\n\n private async load() {\n const pathCollection = require.resolve(Collection.FOX_CODEMODS)\n\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const pkgJson = require(path.join(path.dirname(pathCollection), 'package.json'))\n\n if (!pkgJson.codemods) {\n console.log(\n chalk.red('May be you must specify \"codemods\" section in your package.json with path to collection.json')\n )\n process.exit(1)\n }\n\n const collectionPath = path.join(path.dirname(pathCollection), pkgJson.codemods ?? '')\n\n if (!fs.existsSync(collectionPath)) {\n console.log(\n chalk.red('Collection path specified in \"codemods\" section in your package.json is not valid: ', collectionPath)\n )\n }\n\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const collectionJson = require(collectionPath)\n this.codemods = collectionJson.codemods.map((codemod: Codemod) => ({\n ...codemod,\n name: normalizeToKebabOrSnakeCase(codemod.name),\n }))\n } catch {\n console.log(chalk.red('Collection json is not valid'))\n }\n\n this.loaded = true\n }\n\n public async getItems(): Promise<Codemod[]> {\n if (!this.loaded) {\n try {\n await this.load()\n } catch {\n //\n }\n }\n return this.codemods\n }\n}\n","// import { Runner, RunnerFactory } from '../runners'\n// import { SchematicRunner } from '../runners/schematic.runner'\nimport { Collection } from './collection'\nimport { FoxCodemodCollection } from './fox-codemod.collection'\n\nimport type { AbstractCollection } from './abstract.collection'\n\nexport class CollectionFactory {\n public static create(collection: Collection | string): AbstractCollection {\n // const schematicRunner = RunnerFactory.create(Runner.SCHEMATIC) as SchematicRunner\n\n if (collection === Collection.FOX_CODEMODS) {\n return new FoxCodemodCollection()\n }\n\n return new FoxCodemodCollection()\n }\n}\n","export * from './collection.factory'\nexport * from './collection'\nexport * from './abstract.collection'\n","import chalk from 'chalk'\nimport Table from 'cli-table3'\nimport { Option, Command } from 'commander'\n\nimport { Collection, CollectionFactory } from '../../lib/collection'\nimport { AbstractCommand } from '../../program'\n\nimport type { CodemodOptions } from './types'\nimport type { CollectionItem, AbstractCollection } from '../../lib/collection'\nimport type * as FoxfordTools from '../../types'\n\nexport class CodemodCommand extends AbstractCommand<CodemodOptions> {\n id = 'codemod'\n\n private items: CollectionItem[] = []\n\n private buildRunCommand() {\n const verbose = new Option('--verbose', 'Вывод данных')\n const dry = new Option('--dry', 'Прогон без изменений')\n\n const run = new Command('run')\n\n run\n .description('Запусить кодмод с именем <name>')\n .argument('<name>', 'Имя кодмода (codemod --list)')\n .argument('<input...>', 'Glob паттерн файлов для которых будет применим кодмод')\n .addOption(verbose)\n .addOption(dry)\n .allowUnknownOption(true)\n .showHelpAfterError()\n .action(async (name: string, input: string[], options: CodemodOptions, command: FoxfordTools.Program) => {\n // console.log('extra', extra)\n if (!this.items.filter((item) => item.name === name)) {\n console.error('Name not found')\n return\n }\n\n const unknownOptions = command.parseOptions(command.args)?.unknown ?? []\n\n const paths = input.filter((item) => !unknownOptions.includes(item))\n\n if (unknownOptions.length) {\n options.extra = unknownOptions\n }\n\n options.paths = paths\n\n await this.action.handle(options)\n })\n\n return run\n }\n\n private buildListCommand() {\n const run = new Command('list')\n\n run\n .description('Вывести полный список доступных кодмодов')\n .showHelpAfterError()\n .action(async () => {\n const list = await this.getCollectionItems()\n console.log(\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` + this.buildSchematicsListAsTable(list)\n )\n })\n\n return run\n }\n\n private async getCollectionItems() {\n const list = await this.getItems(this.getCollection())\n this.items = list\n return list\n }\n\n public async load(program: FoxfordTools.Program) {\n const codemod = new Command('codemod')\n codemod\n .addHelpText(\n 'before',\n `\\n---------------------------------------\\n${chalk.greenBright(\n '🛠 Codemod manager'\n )}\\n---------------------------------------\\n`\n )\n .usage('<command>')\n .helpOption(false)\n // .allowUnknownOption()\n .description(await this.buildDescription())\n .summary('Управление кодмодами')\n .addCommand(this.buildRunCommand())\n .addCommand(this.buildListCommand())\n .action(async (options) => {\n if (!options || Object.keys(options).length === 0) {\n codemod.outputHelp()\n return\n }\n\n await this.action.handle(options)\n })\n\n program.addCommand(codemod)\n }\n\n private buildSchematicsListAsTable(items: CollectionItem[]): string {\n const leftMargin = ' '\n const tableConfig = {\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['name', 'description'],\n }\n const table: Table.Table = new Table(tableConfig)\n for (const item of items) {\n table.push([chalk.green(item.name), item.description])\n }\n\n return table.toString()\n }\n\n private getCollection(): string {\n return Collection.FOX_CODEMODS\n }\n\n private async getItems(collection: string): Promise<CollectionItem[]> {\n const abstractCollection: AbstractCollection = CollectionFactory.create(collection)\n this.items = await abstractCollection.getItems()\n return this.items\n }\n\n private async buildDescription(): Promise<string> {\n const list = await this.getCollectionItems()\n const shortList = list.slice(0, 20)\n return (\n `Доступные кодмоды из ${chalk.bold(this.getCollection())}:\\n` +\n this.buildSchematicsListAsTable(shortList) +\n chalk.yellowBright(`\\n\\nЧтобы увидеть полный список кодмодов используйте команду `) +\n chalk.greenBright(`codemod list`)\n )\n }\n}\n","import { CodemodAction } from './action'\nimport { CodemodCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new CodemodCommand(new CodemodAction(program)))\n}\n","/**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * @param version - Базовая версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n *\n * @example\n * getBetaPackageVersion('1.2.3', 'abc123') // '1.2.3-beta-abc123-20260311'\n */\nexport function getBetaPackageVersion(version: string, sha: string): string {\n const now = new Date()\n const year = now.getFullYear()\n const month = String(now.getMonth() + 1).padStart(2, '0')\n const day = String(now.getDate()).padStart(2, '0')\n const date = `${year}${month}${day}`\n return `${version}-beta-${sha}-${date}`\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport { logger } from '../../../logger'\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployOptions } from '../types'\nimport type { HierarchicalLogger } from '@foxford/logger'\n\n/**\n *\n * Методы провайдера не выбрасывают ошибки.\n *\n * Обработка ошибок должна происходить в методах классов, которые наследуются от класса провайдера.\n */\nexport abstract class DeployProvider {\n cwd: string\n logger: HierarchicalLogger\n buildDir: string\n\n constructor(public providerName: string) {\n this.cwd = process.cwd()\n this.logger = logger.getLogger(providerName)\n this.buildDir = './build'\n }\n\n /**\n * Генерирует строку бета-версии пакета на основе SHA коммита и текущей даты.\n *\n * Делегирует вызов утилитной функции {@link getBetaPackageVersion} для обратной совместимости.\n *\n * @param version - Версия пакета из package.json\n * @param sha - Короткий SHA коммита, используемый в строке бета-версии\n * @returns Строка версии в формате `<version>-beta-<sha>-<YYYYMMDD>`\n */\n public getBetaPackageVersion(version: string, sha: string): string {\n return getBetaPackageVersion(version, sha)\n }\n\n /**\n * Читает и парсит файл package.json из текущей рабочей директории.\n *\n * Эта функция пытается найти и прочитать файл package.json в текущей\n * рабочей директории. Если файл найден, он читается синхронно и парсится как JSON.\n *\n * @returns Распарсенное содержимое файла package.json или null.\n */\n public readPackageJson(pkgPath: string): FoxfordTools.PackageJson | null {\n const packageJsonPath = path.resolve(pkgPath, 'package.json')\n\n if (!fs.existsSync(packageJsonPath)) {\n return null\n }\n\n try {\n const packageJsonContent = fs.readFileSync(packageJsonPath, 'utf-8')\n return JSON.parse(packageJsonContent)\n } catch (error) {\n this.logger.error(`Ошибка при чтении или парсинге package.json: ${(error as Error).message}`)\n return null\n }\n }\n\n public abstract deploy(params: Omit<DeployOptions, 'provider'>): Promise<void>\n}\n","import { getCatalogsFromWorkspaceManifest } from '@pnpm/catalogs.config'\nimport { createExportableManifest } from '@pnpm/exportable-manifest'\nimport { readWorkspaceManifest } from '@pnpm/workspace.read-manifest'\n\nimport { getBetaPackageVersion } from '../../../utils/versioning'\n\nimport type * as FoxfordTools from '../../../types'\n\n/** Секции зависимостей, которые участвуют в резолве (devDependencies удаляются ранее) */\ntype DepSection = 'dependencies' | 'peerDependencies' | 'optionalDependencies'\n\n/** Секции, которые проверяются и резолвятся */\nconst DEP_SECTIONS: DepSection[] = ['dependencies', 'peerDependencies', 'optionalDependencies']\n\n/**\n * Опции для функции резолва зависимостей.\n */\nexport interface ResolveWorkspaceDepsOptions {\n /** Цель деплоя: beta или latest */\n target: 'beta' | 'latest'\n /** Короткий SHA коммита (для генерации бета-версии) */\n commitSha: string\n /**\n * Список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей.\n */\n affected?: string[]\n /** Путь к корню воркспейса (директория с pnpm-workspace.yaml) */\n workspaceRoot: string\n /**\n * Директория пакета — содержит node_modules со ссылками на workspace-пакеты.\n * Используется @pnpm/exportable-manifest для резолва workspace: протоколов.\n */\n packageDir: string\n}\n\n/**\n * Проверяет, содержит ли packageJson зависимости с workspace: или catalog: префиксами.\n * Проверяются только dependencies, peerDependencies и optionalDependencies.\n *\n * @param packageJson - Объект package.json пакета\n * @returns true если найдены нерезолвенные workspace: или catalog: зависимости\n */\nexport function hasWorkspaceOrCatalogDeps(packageJson: FoxfordTools.PackageJson): boolean {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n for (const version of Object.values(deps)) {\n if (version.startsWith('workspace:') || version.startsWith('catalog:')) {\n return true\n }\n }\n }\n\n return false\n}\n\n/**\n * Резолвит зависимости с workspace: и catalog: префиксами через @pnpm/exportable-manifest.\n * Мутирует переданный packageJson на месте.\n *\n * Поведение:\n * - `catalog:dev` / `catalog:cli` — берёт версию из соответствующей секции pnpm-workspace.yaml\n * - `workspace:*` — резолвит в точную версию `X.Y.Z` (через node_modules пакета)\n * - `workspace:^` — резолвит в `^X.Y.Z`\n * - `workspace:~` — резолвит в `~X.Y.Z`\n * - Если пакет входит в `affected` и `target === 'beta'` — получает бета-версию (post-processing)\n * - devDependencies не трогаются (должны быть удалены до вызова)\n *\n * @param packageJson - Объект package.json (мутируется in-place)\n * @param options - Параметры резолва\n */\nexport async function resolveWorkspaceAndCatalogDeps(\n packageJson: FoxfordTools.PackageJson,\n options: ResolveWorkspaceDepsOptions\n): Promise<void> {\n if (!hasWorkspaceOrCatalogDeps(packageJson)) return\n\n const { target, commitSha, affected = [], workspaceRoot, packageDir } = options\n\n /**\n * Сохраняем исходные workspace: спецификаторы до резолва,\n * чтобы использовать их при post-processing affected/beta зависимостей.\n */\n const workspaceDeps = new Map<string, Map<string, string>>()\n\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const sectionMap = new Map<string, string>()\n for (const [depName, spec] of Object.entries(deps)) {\n if (spec.startsWith('workspace:')) {\n sectionMap.set(depName, spec)\n }\n }\n\n if (sectionMap.size > 0) {\n workspaceDeps.set(section, sectionMap)\n }\n }\n\n /** Читаем pnpm-workspace.yaml и получаем catalogs через @pnpm/* пакеты */\n const workspaceManifest = await readWorkspaceManifest(workspaceRoot)\n\n if (workspaceManifest === null) {\n throw new Error(`pnpm-workspace.yaml не найден в директории: ${workspaceRoot}`)\n }\n\n const catalogs = getCatalogsFromWorkspaceManifest(workspaceManifest)\n\n /**\n * createExportableManifest резолвит workspace:, catalog: и jsr: протоколы,\n * используя node_modules из packageDir для поиска версий workspace-пакетов.\n * Тип второго аргумента берётся из сигнатуры функции, чтобы не импортировать\n * @pnpm/types напрямую (он является транзитивной зависимостью).\n */\n type PnpmProjectManifest = Parameters<typeof createExportableManifest>[1]\n const resolved = await createExportableManifest(packageDir, packageJson as unknown as PnpmProjectManifest, {\n catalogs,\n })\n\n /** Копируем резолвенные секции зависимостей обратно в packageJson */\n for (const section of DEP_SECTIONS) {\n if (resolved[section] != null) {\n packageJson[section] = resolved[section] as Record<string, string>\n }\n }\n\n /**\n * Post-processing: для affected-пакетов при target=beta заменяем\n * резолвенную версию на бета-версию. createExportableManifest не знает\n * о бета-публикациях, поэтому эта логика применяется отдельно.\n */\n if (target === 'beta' && affected.length > 0) {\n for (const section of DEP_SECTIONS) {\n const deps = packageJson[section]\n if (!deps) continue\n\n const originalSpecs = workspaceDeps.get(section)\n if (!originalSpecs) continue\n\n for (const depName of Object.keys(deps)) {\n if (!affected.includes(depName)) continue\n if (!originalSpecs.has(depName)) continue\n\n const resolvedVersion = deps[depName]!\n /** Сохраняем префикс ^ или ~ если он был применён createExportableManifest */\n const prefix = resolvedVersion.startsWith('^') ? '^' : resolvedVersion.startsWith('~') ? '~' : ''\n const baseVersion = resolvedVersion.slice(prefix.length)\n deps[depName] = `${prefix}${getBetaPackageVersion(baseVersion, commitSha)}`\n }\n }\n }\n}\n","/* eslint-disable max-lines */\nimport { fs, $, path, cd } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\nimport { hasWorkspaceOrCatalogDeps, resolveWorkspaceAndCatalogDeps } from '../utils/resolve-workspace-deps'\n\nimport type * as FoxfordTools from '../../../types'\nimport type { DeployNpmOptions } from '../types'\nimport type { ProcessOutput } from 'zx'\n\nfunction sleep(ms: number) {\n if (process.env.NODE_ENV === 'test') {\n return Promise.resolve()\n }\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nexport class NpmDeploy extends DeployProvider {\n versionLists: string[] = []\n dry: string = ''\n noGitChecks: string = ''\n\n constructor() {\n super('npm')\n }\n\n /**\n * Возвращает сообщение об устаревании с текущим SHA коммита.\n *\n * @returns Промис, который разрешается строкой сообщения об устаревании.\n */\n private async getDeprecationMessage(): Promise<string> {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().trim()\n return `deprecated by ${commitSha}`\n }\n\n /**\n * Создает или обновляет файл .npmrc с токеном аутентификации для реестра npm.\n *\n * Этот метод добавляет конфигурацию аутентификации в файл .npmrc,\n * обеспечивая безопасный доступ к реестру npm для публикации пакетов.\n * Он использует переменную окружения NPM_TOKEN для аутентификации.\n *\n * @returns Промис, который разрешается, когда файл .npmrc успешно обновлен.\n * @throws Выбрасывает ошибку, если операция с файлом не удалась или если NPM_TOKEN не установлен.\n */\n private async touchNpmrc(): Promise<void> {\n const authStr = '//registry.npmjs.org/:_authToken=${NPM_TOKEN}'\n await $`echo ${authStr} >> .npmrc`\n }\n\n /**\n * Фильтрует устаревшие версии из заданного списка версий пакета.\n *\n * Этот метод проверяет каждую версию в реестре npm, чтобы определить, является ли она устаревшей.\n * Он использует команду `npm view` для получения статуса устаревания каждой версии.\n *\n * @param pkgName - Имя пакета в регистре.\n * @param versions - Массив строк версий для проверки на устаревание.\n * @returns Промис, который разрешается в массив строк версий, которые не являются устаревшими.\n */\n private async getNotDeprecatedVersions(pkgName: string, versions: string[]): Promise<string[]> {\n const notDeprecatedVersions = []\n for (const ver of versions) {\n const cmd = ['npm', 'view', `${pkgName}@${ver}`, 'deprecated']\n const result = await $`${cmd}`\n\n if (!result.toString().trim().includes('deprecated by')) {\n notDeprecatedVersions.push(ver)\n }\n }\n return notDeprecatedVersions\n }\n\n /**\n * Получает список всех версий текущего пакета из реестра npm.\n *\n * Этот метод выполняет команду npm для получения всех версий пакета,\n * указанного в файле package.json. Затем он парсит JSON-ответ\n * и сохраняет результат в свойстве `versionLists` класса.\n *\n * Если пакет ещё не опубликован в npm (HTTP 404), метод возвращает пустой\n * массив и логирует информационное сообщение — процесс деплоя продолжается\n * без очистки beta-версий.\n *\n * @param pkgName - Имя пакета в регистре.\n *\n * @returns Промис, который разрешается в массив строк, где каждая строка\n * представляет версию пакета. Если пакет не найден или парсинг\n * не удался, возвращает пустой массив.\n */\n private async getVersionsList(pkgName: string): Promise<string[]> {\n logger.info('Getting versions list...')\n\n let outputProcess: ProcessOutput\n\n try {\n outputProcess = await $`npm view ${pkgName} versions --json`\n } catch (error) {\n const errorText = String(error)\n\n if (errorText.includes('E404')) {\n logger.info(`Пакет ${pkgName} ещё не опубликован в npm, пропускаем очистку beta-версий`)\n } else {\n logger.warn(`Не удалось получить список версий: ${errorText}`)\n }\n\n return []\n }\n\n const versionsListPo = outputProcess.toString()\n logger.info('Versions list recieved', versionsListPo)\n\n try {\n const parsed = JSON.parse(versionsListPo)\n\n if (Array.isArray(parsed)) {\n return parsed\n } else {\n // Если это не массив, но валидный JSON (например, строка), возвращаем её в массиве\n return [parsed]\n }\n } catch {\n logger.error('Error parsing versions list')\n return []\n }\n }\n\n /**\n * Получает список бэта версий на текущую версию из списка всех версий.\n *\n * @param currentVersion - Строка текущей версии для сравнения.\n * @returns Массив строк похожих версий.\n */\n private getBetaVersions(currentVersion: string): string[] {\n return this.versionLists.filter((ver) => {\n if (!ver.includes('beta')) return false\n if (ver === currentVersion) return false\n\n const semverFromVersion = currentVersion.match(/^[0-9]{1,9}.[0-9]{1,9}.[0-9]{1,9}/gi)\n if (!semverFromVersion) return false\n\n const matchedVersion = semverFromVersion[0] ?? null\n if (!matchedVersion) return false\n\n return ver.includes(matchedVersion)\n })\n }\n\n /**\n * Помечает предыдущие похожие версии пакета как устаревшие.\n *\n * Этот метод находит похожие версии на текущую версию, фильтрует уже устаревшие версии,\n * а затем помечает оставшиеся версии как устаревшие, используя команду npm deprecate.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все похожие, не устаревшие версии были помечены как устаревшие или была попытка их пометить.\n */\n private async deprecatePrevBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Отмечаем предыдущие бэта версии как deprecated')\n\n this.versionLists = await this.getVersionsList(packageJson.name)\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Найдены beta версии:', betaVersions)\n\n const notDeprecatedVersions = await this.getNotDeprecatedVersions(packageJson.name, betaVersions)\n logger.info('Beta версии без deprecated:', notDeprecatedVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of notDeprecatedVersions) {\n await sleep(500)\n try {\n if (!this.dry) {\n const cmd = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', cmd)\n await $`${cmd}`\n }\n } catch (error) {\n logger.error(error)\n continue\n }\n }\n }\n\n /**\n * Удаляет бета-версии пакета, которые похожи на текущую версию.\n *\n * Этот метод получает все версии пакета, находит похожие версии на текущую,\n * и удаляет те, которые являются бета-версиями. Он использует команду npm unpublish с флагом --force.\n *\n * @param packageJson - package.json пакета.\n * @returns Промис, который разрешается, когда все бета-версии были удалены или была попытка их удалить.\n * @throws Записывает ошибки в консоль, если удаление не удалось для какой-либо версии, но продолжает со следующей версией.\n */\n private async unpublishBetaVersions(packageJson: FoxfordTools.PackageJson): Promise<void> {\n logger.info('Разпубликовываем beta версии')\n this.versionLists = await this.getVersionsList(packageJson.name)\n logger.info('Список версий: ', this.versionLists)\n\n const betaVersions = this.getBetaVersions(packageJson.version)\n logger.info('Список для разпубликации и депрекейта: ', betaVersions)\n\n const deprecationMessage = await this.getDeprecationMessage()\n\n for (const ver of betaVersions) {\n if (!ver.includes('beta')) continue\n\n try {\n const deprecate = ['npm', 'deprecate', `${packageJson.name}@${ver}`, deprecationMessage].filter(\n (item) => item !== ''\n )\n logger.info('Помечаем версию как deprecated:', deprecate)\n await $`${deprecate}`\n\n const unpublish = ['npm', 'unpublish', `${packageJson.name}@${ver}`, '--force', this.dry].filter(\n (item) => item !== ''\n )\n logger.info('Разпубликовывем версию:', unpublish)\n await $`${unpublish}`\n } catch (error) {\n logger.error(error)\n continue\n }\n\n await sleep(500)\n }\n }\n\n /**\n * Разворачивает пакет в реестре npm.\n *\n * Этот метод обрабатывает весь процесс развертывания, включая управление версиями,\n * обновление package.json, публикацию npm и пост-публикационные действия, такие как пометка\n * предыдущих версий как устаревших или удаление бета-версий.\n *\n * Если в package.json присутствуют зависимости с префиксами `workspace:` или `catalog:`,\n * они автоматически резолвятся в конкретные версии перед публикацией.\n *\n * @param params - Параметры развертывания.\n * @param params.dry - Если true, выполняет пробный запуск без фактической публикации.\n * @param params.target - Цель развертывания, либо 'beta', либо 'latest'. По умолчанию 'beta'.\n * @param params.affected - Comma-separated список пакетов, публикуемых в текущем цикле.\n * Используется для резолва бета-версий workspace-зависимостей при target=beta.\n *\n * @throws Завершает процесс, если директория сборки не найдена.\n * @returns Промис, который разрешается, когда процесс развертывания завершен.\n */\n async deploy(params: DeployNpmOptions) {\n logger.info('Начинаем процесс деплоя в NPM', params)\n const packageDir = process.cwd()\n const localDir = path.join(packageDir, params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const packageJson = this.readPackageJson(localDir)\n\n if (!packageJson) {\n logger.error('package.json не найден в текущей директории')\n process.exit(1)\n }\n\n if (params.dry === true) this.dry = '--dry-run'\n if (params.skipGitChecks) this.noGitChecks = '--no-git-checks'\n\n logger.info('Меняем директорию на', localDir)\n cd(localDir)\n\n logger.info('Получаем sha коммита')\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n const target = params.target ?? 'beta'\n logger.info('Целевая версия:', target)\n\n await this.touchNpmrc()\n logger.info('Создаем .npmrc')\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n\n packageJson.sha = commitSha\n logger.info('Версия пакета:', packageJson.version)\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n if (packageJson.devDependencies) {\n delete packageJson.devDependencies\n }\n\n // Предварительная проверка до вызова git-подпроцесса: внутри resolveWorkspaceAndCatalogDeps\n // есть идентичный guard, но здесь он позволяет избежать запуска `git rev-parse --show-toplevel`\n // для пакетов без workspace/catalog зависимостей.\n if (hasWorkspaceOrCatalogDeps(packageJson)) {\n logger.info('Обнаружены workspace/catalog зависимости, запускаем резолв...')\n\n /**\n * Резолв workspace/catalog протоколов поддерживается только в pnpm.\n * Если packageManager не определён или не является 'pnpm' — завершаем процесс с ошибкой.\n */\n if (params.packageManager !== 'pnpm') {\n logger.error(\n `Резолв workspace: и catalog: зависимостей поддерживается только при использовании pnpm. ` +\n `Текущий packageManager: \"${params.packageManager ?? 'не определён'}\". ` +\n `Используйте pnpm для публикации пакетов с workspace/catalog зависимостями.`\n )\n process.exit(1)\n }\n\n const workspaceRoot = (await $`git rev-parse --show-toplevel`).toString().trim()\n\n const affectedPackages = params.affected ? params.affected.split(',').map((s) => s.trim()) : undefined\n\n await resolveWorkspaceAndCatalogDeps(packageJson, {\n affected: affectedPackages,\n commitSha,\n packageDir,\n target,\n workspaceRoot,\n })\n\n logger.info('Workspace/catalog зависимости зарезолвлены', packageJson)\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson('package.json', packageJson, {\n spaces: 2,\n })\n\n const cmd = [\n params.packageManager ?? 'npm',\n 'publish',\n '--access=public',\n `--tag=${target}`,\n this.dry,\n this.noGitChecks,\n ].filter((item) => item !== '')\n logger.info('Публикуем с аргументами:', cmd)\n\n await $`${cmd}`\n\n if (target === 'beta') {\n await this.deprecatePrevBetaVersions(packageJson)\n } else {\n await this.unpublishBetaVersions(packageJson)\n }\n }\n}\n","import { fs, $, path } from 'zx'\n\nimport { DeployProvider } from './abstract.provider'\nimport { logger } from '../../../logger'\n\nimport type { DeployS3Options } from '../types'\n\nexport class S3Deploy extends DeployProvider {\n constructor() {\n super('s3')\n }\n\n /**\n * Определяет цель развертывания на основе текущей ветки Git.\n *\n * @returns {'latest' | 'beta'} 'latest' для ветки master, 'beta' для всех остальных.\n */\n getTarget(): 'latest' | 'beta' {\n const { GITHUB_REF_NAME } = process.env\n\n if (GITHUB_REF_NAME === 'master') return 'latest'\n\n return 'beta'\n }\n\n /**\n * Формирует путь для ресурсов в хранилище.\n *\n * @param segments - Cегменты пути.\n * @returns Путь для цели развертывания.\n */\n getRemotePath(...segments: (string | undefined)[]): string {\n return segments\n .filter(Boolean)\n .join(path.posix.sep)\n .replace(/[/\\\\]+/g, path.posix.sep)\n .replace(/^\\//, '')\n }\n\n /**\n * Выполняет команду rclone copy.\n *\n * @param localDir - Путь до локальных ресурсов.\n * @param bucket - Имя бакета в хранилище.\n * @param remoteDir - Удаленный путь для загрузки ресурсов.\n * @param flags - Дополнительные аргументы.\n * @returns Результат выполнения команды.\n */\n async exec(localDir: string, bucket: string, remoteDir?: string, flags?: string[]): Promise<void> {\n const cmd = ['rclone', 'copy', localDir]\n\n if (remoteDir) {\n cmd.push(`myremote:${bucket}/${remoteDir}`)\n } else {\n cmd.push(`myremote:${bucket}/`)\n }\n\n if (flags) {\n cmd.push(...flags)\n }\n\n logger.info('Запуск деплоя:', cmd)\n\n await $`${cmd}`\n\n logger.info('Деплой успешно завершен:', cmd)\n }\n\n /**\n * Получает учетные данные для S3 из параметров или переменных окружения\n * @param options - Опции команды\n * @returns Объект с accessKey и secretKey\n * @throws Error если учетные данные не найдены\n */\n getS3Credentials(options: Partial<DeployS3Options>): { accessKey: string; secretKey: string } {\n const accessKey = options.accessKey ?? process.env.ACCESS_KEY ?? process.env.SELECTEL_USER\n const secretKey = options.secretKey ?? process.env.SECRET_KEY ?? process.env.SELECTEL_PASSWORD\n\n if (!accessKey || !secretKey) {\n throw new Error(\n 'Не указаны учетные данные для S3. ' +\n 'Используйте параметры --access-key и --secret-key или установите переменные окружения ACCESS_KEY и SECRET_KEY'\n )\n }\n\n return { accessKey, secretKey }\n }\n\n /**\n * Выполняет процесс развертывания в хранилище по S3.\n *\n * Этот метод копирует файлы из локальной директории в удаленные директории хранилища,\n * используя rclone. Он обрабатывает как версионные, так и целевые пути.\n *\n * @param {DeployS3Options} params - Параметры развертывания.\n * @param {string} [params.localDir] - Локальная директория для копирования (по умолчанию this.buildDir).\n * @param {string} [params.bucket] - Имя бакета хранилища (по умолчанию из env или 'dist.ngcdn.ru').\n * @param {string} [params.packageName] - Имя пакета (по умолчанию из package.json).\n * @param {string} [params.endpoint] - Endpoint хранилища.\n * @param {string} [params.region] - Регион хранилища.\n * @param {string} [params.accessKey] - Токен доступа.\n * @param {string} [params.secretKey] - Секрет.\n * @param {boolean} [params.verbose] - Вывод дебаг информации.\n * @param {'latest' | 'beta'} [params.target] - Цель развертывания (по умолчанию определяется автоматически).\n * @param {boolean} [params.dry] - Если true, выполняет пробный запуск без фактической загрузки.\n *\n * @throws Завершает процесс, если локальная директория не существует.\n */\n async deploy(params: DeployS3Options) {\n logger.info('Начинаем процесс деплоя в хранилище', params)\n const { BUCKET } = process.env\n\n let accessKey, secretKey\n\n try {\n const credentials = this.getS3Credentials(params)\n accessKey = credentials.accessKey\n secretKey = credentials.secretKey\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.toString())\n } else {\n logger.error(error)\n }\n process.exit(1)\n }\n\n const localDir = path.join(process.cwd(), params.localDir ?? this.buildDir)\n\n if (!fs.existsSync(localDir)) {\n logger.error(`Директория \"${localDir}\" не существует`)\n process.exit(1)\n }\n\n const bucket = params.bucket ?? BUCKET\n\n if (!bucket) {\n logger.error('Бакет не определен')\n process.exit(1)\n }\n\n logger.info('Бакет:', bucket)\n\n const packageJson = this.readPackageJson(localDir)\n\n const remoteDirs = []\n\n if (packageJson) {\n const commitSha = (await $`git rev-parse --short HEAD`).toString().replace('\\n', '')\n logger.info('Коммит:', commitSha)\n\n if (params.packageName) {\n packageJson.name = params.packageName\n }\n\n const target = params.target ?? this.getTarget()\n logger.info('Целевая версия:', target)\n\n if (target === 'beta') {\n packageJson.version = packageJson.version.includes('beta')\n ? packageJson.version\n : this.getBetaPackageVersion(packageJson.version, commitSha)\n }\n logger.info('Версия пакета:', packageJson.version)\n\n packageJson.sha = commitSha\n\n if (packageJson.scripts && packageJson.scripts.postinstall) {\n packageJson.scripts = {\n postinstall: packageJson.scripts.postinstall,\n }\n } else {\n packageJson.scripts = {}\n }\n\n logger.info('Публикуемый package.json', packageJson)\n\n await fs.writeJson(path.resolve(localDir, 'package.json'), packageJson, {\n spaces: 2,\n })\n\n remoteDirs.push(\n this.getRemotePath(params.remoteDir, packageJson.name, packageJson.version),\n this.getRemotePath(params.remoteDir, packageJson.name, target)\n )\n } else {\n logger.warn('package.json не найден в текущей директории')\n\n if (params.remoteDir) {\n remoteDirs.push(params.remoteDir)\n }\n }\n\n logger.info('Удаленные директории:', remoteDirs)\n\n $.env.RCLONE_CONFIG_MYREMOTE_TYPE = 's3'\n $.env.RCLONE_CONFIG_MYREMOTE_PROVIDER = 'Other'\n $.env.RCLONE_CONFIG_MYREMOTE_ACCESS_KEY_ID = accessKey\n $.env.RCLONE_CONFIG_MYREMOTE_SECRET_ACCESS_KEY = secretKey\n $.env.RCLONE_CONFIG_MYREMOTE_ENDPOINT = params.endpoint ?? 's3.ru-1.storage.selcloud.ru'\n $.env.RCLONE_CONFIG_MYREMOTE_REGION = params.region ?? 'ru-1'\n\n const execFlags = ['--progress']\n\n if (params.verbose) execFlags.push('-vv')\n\n if (params.dry) {\n execFlags.push('--dry-run')\n }\n\n if (!remoteDirs.length) {\n await this.exec(localDir, bucket, undefined, execFlags)\n process.exit(0)\n }\n\n await Promise.all(\n remoteDirs.map((remoteDir) => {\n return this.exec(localDir, bucket, remoteDir, execFlags)\n })\n )\n }\n}\n","import { AbstractAction } from '../../program'\nimport { NpmDeploy } from './providers/npm'\nimport { S3Deploy } from './providers/s3'\n\nimport type { DeployProvider } from './providers/abstract.provider'\nimport type { DeployOptions } from './types'\n\nexport class DeployAction extends AbstractAction<DeployOptions> {\n public async handle(params: DeployOptions) {\n let provider: DeployProvider\n\n switch (params.provider) {\n case 'npm':\n provider = new NpmDeploy()\n break\n case 's3':\n provider = new S3Deploy()\n break\n default:\n throw new Error(`Unsupported deploy provider: ${params.provider}`)\n }\n\n await provider.deploy(params)\n }\n}\n","import { Command, Option } from 'commander'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { DeployOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class DeployCommand extends AbstractCommand<DeployOptions> {\n id = 'deploy'\n public async load(program: FoxfordTools.Program) {\n const deployCommand = new Command('deploy').description('Задеплоить пакет')\n\n const targetOption = new Option('--target <target>', 'Релиз beta или latest')\n .choices(['beta', 'latest'])\n .default('beta')\n const localDirOption = new Option('--local-dir <path>', 'Из какой локальной директории загрузить содержимое')\n const dryOption = new Option('--dry', 'Запуск без выполнения операции').default(false)\n const verboseOption = new Option('--verbose', 'Вывод дебаг информации').default(false)\n\n const s3Command = new Command('s3')\n .description('Деплой пакета по s3 в хранилище')\n .option('--bucket <name>', 'В какой бакет загрузить пакет')\n .option('--package-name <name>', 'Имя пакета вместо packageJson.name')\n .option('--remote-dir <dir>', 'Целевая директория в хранилище')\n .option('--access-key <key>', 'Токен доступа')\n .option('--secret-key <secret>', 'Секретный токен')\n .option('--region <name>', 'Регион S3')\n .option('--endpoint <url>', 'Endpoint S3')\n .action(async (params) => {\n await this.action.handle({ ...params, provider: 's3' })\n })\n\n s3Command.addOption(targetOption)\n s3Command.addOption(localDirOption)\n s3Command.addOption(dryOption)\n s3Command.addOption(verboseOption)\n\n const skipGitChecksOption = new Option('--skip-git-checks', 'Отключение git проверок при публикации')\n const affectedOption = new Option(\n '--affected <packages>',\n 'Comma-separated список affected-пакетов, публикуемых в текущем цикле (для резолва бета-версий workspace-зависимостей)'\n )\n\n const npmCommand = new Command('npm').description('Деплой пакета в npm').action(async (params) => {\n await this.action.handle({ ...params, packageManager: program.packageManager, provider: 'npm' })\n })\n\n npmCommand.addOption(targetOption)\n npmCommand.addOption(localDirOption)\n npmCommand.addOption(dryOption)\n npmCommand.addOption(verboseOption)\n npmCommand.addOption(skipGitChecksOption)\n npmCommand.addOption(affectedOption)\n\n deployCommand.addCommand(s3Command)\n deployCommand.addCommand(npmCommand)\n\n program.addCommand(deployCommand)\n }\n}\n","import { DeployAction } from './action'\nimport { DeployCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new DeployCommand(new DeployAction(program)))\n}\n","import { platform, release } from 'os'\n\nimport chalk from 'chalk'\nimport { filesize } from 'filesize'\nimport { cpu, mem } from 'systeminformation'\nimport { $ } from 'zx'\n\nimport { BANNER } from '../../lib/ui'\nimport { AbstractAction } from '../../program'\n\nexport class InfoAction extends AbstractAction {\n public async handle() {\n this.displayBanner()\n await this.displaySystemInformation()\n }\n\n private displayBanner() {\n console.info(chalk.red(BANNER))\n }\n\n private async displaySystemInformation(): Promise<void> {\n const osName = await import('os-name')\n console.info(chalk.green('[System Information]'))\n console.info('OS Version :', chalk.blue(osName.default(platform(), release())))\n console.info('NodeJS Version :', chalk.blue(process.version))\n const where = await $`which node`\n console.info('NodeJS path :', where.toString())\n console.info('NODE_OPTIONS :', chalk.blue(process.env.NODE_OPTIONS))\n if (where.toString().includes('nvm')) {\n console.info('NVM_DIR :', chalk.blue(process.env.NVM_DIR))\n }\n console.log()\n const cpuDevice = await cpu()\n const memDevice = await mem()\n console.info('CPU Family:', chalk.blue(`${cpuDevice.vendor} ${cpuDevice.brand}`))\n console.info('CPU Ph Cores:', chalk.blue(cpuDevice.cores))\n console.info('CPU Speed:', chalk.blue(`${cpuDevice.speed}GHz`))\n console.info('Memory:', chalk.blue(`${filesize(memDevice.total)}`))\n console.info('Memory Free:', chalk.blue(`${filesize(memDevice.free)}`))\n console.info('Memory Used:', chalk.blue(`${filesize(memDevice.used)}`))\n console.info('Memory Available:', chalk.blue(`${filesize(memDevice.available)}`))\n }\n\n rightPad(name: string, length: number): string {\n while (name.length < length) {\n // eslint-disable-next-line no-param-reassign\n name = name.concat(' ')\n }\n return name\n }\n}\n","import { AbstractCommand } from '../../program'\n\nimport type { Command } from 'commander'\n\nexport class InfoCommand extends AbstractCommand {\n id = 'info'\n public async load(program: Command) {\n program\n .command('info')\n .alias('i')\n .description('Показать инфо')\n .action(async () => {\n await this.action.handle()\n })\n }\n}\n","import { InfoAction } from './action'\nimport { InfoCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new InfoCommand(new InfoAction(program)))\n}\n","import fs from 'fs'\nimport path from 'node:path'\n\nimport chalk from 'chalk'\nimport { SingleBar, Presets } from 'cli-progress'\nimport Table from 'cli-table3'\nimport { filesize } from 'filesize'\nimport { glob } from 'glob'\n\nimport { Runner, RunnerFactory } from '../../lib/runners'\nimport { AbstractAction } from '../../program'\n\nimport type { OptimizeOptions } from './types'\n\ninterface ResourceTask {\n __originalPath: string\n __originalStat?: fs.Stats\n __optimizedStat?: fs.Stats\n __optimizedPath: string\n err?: string | Error\n status: boolean\n diff?: string\n}\n\nexport class OptimizeAction extends AbstractAction<OptimizeOptions> {\n public async handle(options: OptimizeOptions, extraFlags: string[] = []) {\n const resources = await glob(path.join(process.cwd(), options.filePath!), { ignore: 'node_modules/**' })\n\n console.log(chalk.white(`Найдено ${chalk.green(resources.length)} ресурсов для оптимизации`))\n console.log(\n chalk.yellowBright(`Если вы хотите увидеть список ресурсов, воспользуйтесь опцией ${chalk.green('--list')}`)\n )\n\n if (options.list) console.log(resources)\n\n const inquirer = await import('inquirer')\n\n const answers = await inquirer.default.prompt([\n {\n choices: [\n { name: 'Yes', value: 1 },\n { name: 'No', value: 0 },\n ],\n default: 1,\n message: 'Продолжить?',\n name: 'continue',\n type: 'list',\n },\n ])\n\n if (!answers.continue) return\n\n console.log()\n const bar = new SingleBar({ fps: 25 }, Presets.shades_classic)\n bar.start(resources.length, 0)\n\n const ft = await import('file-type')\n\n const promises = resources.map(async (resource) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const fileType = await ft.fileTypeFromFile(resource)\n if (!fileType)\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n\n const { mime } = fileType\n\n let runner\n\n const outputPath = options.replace\n ? resource\n : path.join(path.dirname(resource), `${options.prefix ?? ''}${path.basename(resource)}`)\n\n switch (mime) {\n case 'image/png':\n case 'image/jpeg':\n runner = RunnerFactory.create(Runner.TINYPNG, {\n token: process.env.TINIFY_API_KEY ?? '',\n verbose: true,\n })\n break\n case 'video/mp4':\n runner = RunnerFactory.create(Runner.FFMPEG, {\n verbose: true,\n })\n break\n default:\n console.log(chalk.yellowBright(`Unsupported mime type for ${chalk.white(resource)}`))\n }\n\n if (!runner) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n status: false,\n }\n }\n\n try {\n const beforeStat = fs.statSync(resource)\n await runner.run({\n extraFlags,\n output: outputPath,\n resource,\n })\n const afterStat = fs.statSync(outputPath)\n\n return {\n __optimizedPath: resource,\n __optimizedStat: afterStat,\n __originalPath: resource,\n __originalStat: beforeStat,\n status: true,\n }\n } catch (err) {\n return {\n __optimizedPath: resource,\n __originalPath: resource,\n err: err as string,\n status: false,\n }\n } finally {\n bar.increment()\n }\n })\n\n try {\n const result = await Promise.all(promises)\n bar.stop()\n console.log()\n this.printResult(result)\n } catch (err) {\n bar.stop()\n console.log()\n console.log(chalk.redBright('Ошибка при оптимизации:', err))\n }\n }\n\n private printResult(result: ResourceTask[]) {\n const statusTable = this.buildStatusTable(result)\n console.log(statusTable)\n this.showUncompletedFiles(result)\n }\n\n private showUncompletedFiles(results: ResourceTask[]) {\n const failed = results.filter((item) => item.status === false)\n if (failed.length > 0) {\n console.log(chalk.redBright('Список необработанных файлов'))\n console.log(failed.map((item) => item.__originalPath))\n }\n }\n\n private buildStatusTable = (results: ResourceTask[]) => {\n const success = results.filter((item) => item.status === true)\n const failed = results.filter((item) => item.status === false)\n const leftMargin = ''\n const table = new Table({\n chars: {\n 'bottom-left': leftMargin.concat('└'),\n left: leftMargin.concat('│'),\n 'left-mid': '',\n mid: '',\n 'mid-mid': '',\n 'right-mid': '',\n 'top-left': leftMargin.concat('┌'),\n },\n head: ['Обработано', 'Не обработано', 'Изменение размера'],\n })\n\n const sumFilesize = results.reduce((acc, task) => {\n if (task.__originalStat && task.__optimizedStat) {\n // eslint-disable-next-line no-param-reassign\n acc += task.__originalStat.size - task.__optimizedStat.size\n }\n return acc\n }, 0)\n\n const sumPrefix = sumFilesize >= 0 ? '-' : '+'\n\n table.push([\n chalk.greenBright(success.length),\n chalk.redBright(failed.length),\n sumFilesize >= 0\n ? chalk.greenBright(`${sumPrefix}${filesize(sumFilesize)}`)\n : chalk.redBright(`${sumPrefix}${filesize(Math.abs(sumFilesize))}`),\n ])\n\n return table.toString()\n }\n}\n","import chalk from 'chalk'\n\nimport { AbstractCommand } from '../../program'\n\nimport type { OptimizeOptions } from './types'\nimport type * as FoxfordTools from '../../types'\n\nexport class OptimizeCommand extends AbstractCommand<OptimizeOptions> {\n id = 'optimize'\n\n public async load(program: FoxfordTools.Program) {\n program\n .command('optimize [path] [extraFlags...]')\n .alias('opt')\n .option('-l, --list', 'Вывести список файлов для оптимизации', false)\n .option('-r, --replace', 'Заменить исходный файл', false)\n .option('-p, --prefix', 'Префикс в имени оптимайзнутого файла', '__')\n .description('Оптимизировать ресурс(jpg,png,mp4)')\n .action(async (path: string, extraFlags: string[], option) => {\n if (!path) {\n console.log(chalk.yellow('Укажите путь до ресурса(поддерживается glob)'))\n process.exit(1)\n }\n\n await this.action.handle(\n {\n filePath: path,\n list: option.list,\n prefix: option.prefix,\n replace: option.replace,\n },\n extraFlags\n )\n })\n }\n}\n","import { OptimizeAction } from './action'\nimport { OptimizeCommand } from './command'\n\nimport type * as FoxfordTools from '../../types'\n\nexport default (program: FoxfordTools.Program) => {\n program.defineCommand(new OptimizeCommand(new OptimizeAction(program)))\n}\n","#!/usr/bin/env node\nimport chalk from 'chalk'\n\nimport pkg from '../../package.json'\nimport { logger } from '../logger'\nimport { Program } from '../program'\nimport { CommandLoader } from '../program/loader'\n\nconst PROGRAM_NAME = 'fox'\n\nconst welcomeText = `${chalk.green(`Привет✌️ , Foxford разработчик🤓`)}\n${chalk.magenta(`Эта штука призвана помочь тебе в кодогенерации и в чем-нибудь ещё🍿`)}\n${chalk.yellowBright('Чай наливай себе сам 🍮🍪')}\n`\n\nconst bootstrap = async () => {\n logger.debug('Start program')\n const program = await Program.init()\n\n program\n .version(pkg.version, '-v, --version', 'Показать текущую версию тулзы')\n .name(PROGRAM_NAME)\n .description(welcomeText)\n .usage('<command> [options]')\n .helpOption(false)\n .addHelpCommand(false)\n\n logger.debug('Load processes')\n await CommandLoader.load(program)\n logger.debug('Loading complete')\n\n logger.debug('Parse process.argv', process.argv)\n await program.parseAsync(process.argv)\n\n if (!process.argv.slice(2).length) {\n program.outputHelp()\n }\n}\n\nbootstrap()\n","{\n \"name\": \"@foxford/cli\",\n \"version\": \"1.5.0\",\n \"description\": \"Foxford Cli\",\n \"keywords\": [\n \"foxford\",\n \"cli\",\n \"tool\"\n ],\n \"homepage\": \"https://github.com/foxford/frontend-platform\",\n \"bugs\": \"https://github.com/foxford/frontend-platform/issues\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/foxford/frontend-platform.git\"\n },\n \"license\": \"MIT\",\n \"author\": \"Foxford Co\",\n \"maintainers\": [\n {\n \"name\": \"Roman Olin\",\n \"email\": \"r.v.olin@foxford.ru\",\n \"team\": \"core-frontend\"\n }\n ],\n \"main\": \"./README.mdx\",\n \"types\": \"./src/types/index.ts\",\n \"type\": \"module\",\n \"engines\": {\n \"node\": \">=20\"\n },\n \"exports\": {\n \"./README.mdx\": \"./README.mdx\",\n \".\": {\n \"types\": \"./src/types/index.ts\"\n }\n },\n \"bin\": {\n \"fox-dev\": \"./scripts/dev.cjs\",\n \"fox\": \"./scripts/prod.cjs\"\n },\n \"scripts\": {\n \"============================ BUILD =============================\": \"\",\n \"build\": \"tsup\",\n \"postbuild\": \"pnpm run build-dts\",\n \"build-dts\": \"dts-bundle-generator -o build/fox.d.ts src/types/index.ts --no-banner --external-inlines=commander loglevel --sort --inline-declare-externals\",\n \"============================ DEPLOY =============================\": \"\",\n \"deploy\": \"fox deploy npm --skip-git-checks\",\n \"============================ LINT =============================\": \"\",\n \"lint:clean\": \"rm -f .eslintcache\",\n \"lint:type-check\": \"tsc --noEmit --pretty\",\n \"lint:eslint\": \"eslint --cache --cache-strategy content --max-warnings=0 ./\",\n \"============================ TEST =============================\": \"\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\"\n },\n \"dependencies\": {\n \"@foxford/logger\": \"workspace:*\",\n \"@pnpm/catalogs.config\": \"1000.0.5\",\n \"@pnpm/exportable-manifest\": \"1000.4.1\",\n \"@pnpm/workspace.read-manifest\": \"1000.3.0\",\n \"@tsconfig/node16\": \"16.1.3\",\n \"chalk\": \"4.1.0\",\n \"cli-progress\": \"catalog:cli\",\n \"cli-table3\": \"catalog:cli\",\n \"commander\": \"catalog:cli\",\n \"dotenv\": \"16.4.5\",\n \"dotenv-expand\": \"11.0.6\",\n \"file-type\": \"21.3.2\",\n \"filesize\": \"10.1.2\",\n \"fluent-ffmpeg\": \"2.1.2\",\n \"fs-extra\": \"catalog:dev\",\n \"glob\": \"catalog:dev\",\n \"inquirer\": \"12.4.3\",\n \"os-name\": \"7.0.0\",\n \"package-manager-detector\": \"1.3.0\",\n \"read-package-up\": \"11.0.0\",\n \"systeminformation\": \"5.31.1\",\n \"tinify\": \"1.7.1\",\n \"tsx\": \"4.21.0\",\n \"typescript\": \"catalog:dev\",\n \"yaml\": \"2.4.5\",\n \"zx\": \"catalog:dev\"\n },\n \"devDependencies\": {\n \"@foxford/eslint-config\": \"workspace:*\",\n \"@foxford/prettier-config\": \"workspace:*\",\n \"@foxford/typescript-config\": \"workspace:*\",\n \"@foxford/vitest-config\": \"workspace:*\",\n \"@types/cli-progress\": \"catalog:cli\",\n \"@types/fluent-ffmpeg\": \"2.1.24\",\n \"@types/fs-extra\": \"11.0.4\",\n \"dts-bundle-generator\": \"9.5.1\",\n \"tsup\": \"catalog:dev\",\n \"vitest\": \"catalog:dev\"\n }\n}","import { existsSync, statSync } from 'node:fs'\nimport { readdir } from 'node:fs/promises'\nimport { createRequire } from 'node:module'\nimport path from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport chalk from 'chalk'\nimport { pathExists } from 'fs-extra'\n\nimport { ERROR_PREFIX } from '../lib/ui'\nimport { logger } from '../logger'\n\nimport type * as FoxfordTools from '../types'\nimport type { NormalizedPackageJson } from 'read-package-up'\n\nconst log = logger.getLogger('command-loader')\n\nconst require = createRequire(import.meta.url)\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\nexport class CommandLoader {\n static PROCESSES_DIR = path.resolve(__dirname, '..', 'processes')\n\n public static async load(program: FoxfordTools.Program): Promise<void> {\n if (process.env.NODE_ENV === 'production') {\n await this.loadProductionProcesses(program)\n } else {\n await this.loadDevelopmentProcesses(program)\n }\n\n await Promise.all(program.getCommands().map(async (command) => await command.load(program)))\n this.handleInvalidCommand(program)\n }\n\n static async loadProductionProcesses(program: FoxfordTools.Program) {\n try {\n for (const [processName, moduleLoader] of Object.entries({\n codemod: () => import('../processes/codemod'),\n deploy: () => import('../processes/deploy'),\n info: () => import('../processes/info'),\n optimize: () => import('../processes/optimize')\n })) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const module = await moduleLoader()\n module.default(program)\n } catch (err) {\n log.error(`Ошибка при загрузке модуля \"${processName}\":`, err)\n }\n }\n } catch (err) {\n log.error('Ошибка при загрузке процессов:', err)\n }\n\n try {\n await this.loadPlugins(program)\n } catch (err) {\n log.error('Ошибка при чтении плагина:', err)\n }\n }\n\n static async loadDevelopmentProcesses(program: FoxfordTools.Program) {\n if (!(await pathExists(CommandLoader.PROCESSES_DIR))) {\n log.error(`Директория процессов не найдена: ${CommandLoader.PROCESSES_DIR}`)\n return\n }\n\n try {\n const processes = await this.getProcesses(CommandLoader.PROCESSES_DIR)\n for (const processName of processes) {\n try {\n log.debug(`Загружаем модуль: ${chalk.cyan(processName)}`)\n const modulePath = path.join(CommandLoader.PROCESSES_DIR, processName)\n\n const module = await import(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\n try {\n if (process.env.NODE_ENV === 'development') {\n const module = await import(plugin.pkgJson.name)\n const fn = module.default ?? module\n await fn(program)\n continue\n }\n\n const dirname = path.dirname(plugin.path)\n let targetPath = path.resolve(dirname)\n\n if (existsSync(path.resolve(targetPath, 'build'))) {\n targetPath = path.resolve(targetPath, 'build')\n }\n\n if (!existsSync(path.join(targetPath, 'package.json'))) continue\n\n const packageJson = require(path.join(targetPath, 'package.json'))\n const modulePath = this.getModulePath(packageJson)\n const module = await import(path.join(targetPath, modulePath))\n\n if (typeof module.default === 'function') {\n await module.default(program)\n } else if (typeof module === 'function') {\n await module(program)\n } else {\n log.warn(`Модуль \"${plugin.pkgJson.name}\" не экспортирует функцию по умолчанию`)\n }\n } catch (error) {\n log.error(`Ошибка при загрузке модуля \"${plugin.pkgJson.name}\":`, error)\n }\n }\n }\n\n private static async getProcesses(processesPath: string): Promise<string[]> {\n const files = await readdir(processesPath)\n\n return files\n .filter((file) => {\n const filePath = path.join(processesPath, file as string, 'index.ts')\n const stat = statSync(filePath)\n return stat.isFile()\n })\n .map((file) => path.parse(file as string).name)\n }\n\n private static handleInvalidCommand(program: FoxfordTools.Program) {\n program.on('command:*', () => {\n console.error(`\\n${ERROR_PREFIX} Неверная команда: ${chalk.red('%s')}`, program.args.join(' '))\n console.log(`Смотри ${chalk.red('--help')} для вывода доступного списка команд.\\n`)\n process.exit(1)\n })\n }\n}\n"],"mappings":"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","names":["ffmpeg","path","chalk","import_chalk","chalk","path","fs","dotenvExpand","dotenvConfig","import_node_path","init_logger","chalk","label","import_chalk","init_logger","chalk","label","import_chalk","tinify","chalk","import_node_path","import_dotenv","require","path","dotenvConfig","result","packageJson","init_program","import_chalk","chalk","init_program","import_node_path","import_chalk","import_fs_extra","path","chalk","fs","init_collection","import_chalk","import_commander","init_collection","init_program","chalk","Table","import_node_path","path","fs","import_zx","import_zx","init_action","init_program","import_commander","init_command","init_program","init_action","init_command","import_chalk","import_zx","init_action","init_program","chalk","init_command","init_program","init_action","init_command","import_fs","import_node_path","import_chalk","import_cli_table3","import_filesize","init_action","init_program","Table","chalk","path","fs","import_chalk","init_command","init_program","path","chalk","init_action","init_command","import_chalk","init_program","import_node_fs","import_node_module","import_node_path","import_node_url","import_chalk","import_fs_extra","log","require","__dirname","path","chalk","module","chalk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@foxford/cli",
3
- "version": "1.4.2",
3
+ "version": "1.5.0",
4
4
  "description": "Foxford Cli",
5
5
  "keywords": [
6
6
  "foxford",
@@ -23,6 +23,9 @@
23
23
  }
24
24
  ],
25
25
  "type": "module",
26
+ "engines": {
27
+ "node": ">=20"
28
+ },
26
29
  "bin": {
27
30
  "fox": "./fox.cjs"
28
31
  },
@@ -63,6 +66,6 @@
63
66
  ],
64
67
  "main": "./fox.cjs",
65
68
  "types": "./fox.d.ts",
66
- "sha": "937bc57",
69
+ "sha": "2702991",
67
70
  "scripts": {}
68
71
  }