onreza-release 1.0.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.
@@ -0,0 +1,19 @@
1
+ import type { BinariesConfig, BinaryExtractionResult, BinaryPlatform } from "../types";
2
+ /**
3
+ * Возвращает имя бинарника внутри архива с учётом sourceBinName.
4
+ * Если sourceBinName не задан, возвращает config.name.
5
+ */
6
+ export declare function getSourceBinaryName(config: BinariesConfig, platform: BinaryPlatform): string;
7
+ /**
8
+ * Извлекает бинарник из tar.gz архива во временную директорию.
9
+ *
10
+ * @param config - Конфигурация бинарной дистрибуции
11
+ * @param platform - Целевая платформа
12
+ * @param tempBaseDir - Базовая директория для временных файлов
13
+ * @returns Результат извлечения с путём к бинарнику и временной директории
14
+ */
15
+ export declare function extractBinaryFromArchive(config: BinariesConfig, platform: BinaryPlatform, tempBaseDir: string): Promise<BinaryExtractionResult>;
16
+ /**
17
+ * Удаляет временную директорию.
18
+ */
19
+ export declare function cleanupTempDir(tempDir: string): Promise<void>;
@@ -0,0 +1,24 @@
1
+ import type { BinariesConfig, BinaryPackageResult, BinaryPlatform } from "../types";
2
+ /**
3
+ * Генерирует package.json для платформенного пакета
4
+ */
5
+ export declare function generatePlatformPackageJson(config: BinariesConfig, platform: BinaryPlatform, version: string): string;
6
+ /**
7
+ * Генерирует README.md для платформенного пакета
8
+ */
9
+ export declare function generatePlatformReadme(config: BinariesConfig, platform: BinaryPlatform, version: string): string;
10
+ /**
11
+ * Генерирует платформенный пакет.
12
+ * Поддерживает два формата входных данных:
13
+ * - "directory": бинарники в директориях (dist/name-platform/name)
14
+ * - "tar.gz": бинарники в tar.gz архивах (dist/name-platform.tar.gz)
15
+ */
16
+ export declare function generatePlatformPackage(config: BinariesConfig, platform: BinaryPlatform, version: string, dryRun?: boolean): Promise<BinaryPackageResult>;
17
+ /**
18
+ * Генерирует все платформенные пакеты
19
+ */
20
+ export declare function generateAllPlatformPackages(config: BinariesConfig, version: string, platforms?: BinaryPlatform[], dryRun?: boolean): Promise<BinaryPackageResult[]>;
21
+ /**
22
+ * Печатает информацию о генерации в dry-run режиме
23
+ */
24
+ export declare function printGenerationDryRun(config: BinariesConfig, version: string, platforms: BinaryPlatform[]): void;
@@ -0,0 +1,113 @@
1
+ import type { BinariesConfig, BinaryPlatform, PlatformMapping } from "../types";
2
+ /**
3
+ * Маппинг платформ на os/cpu значения для package.json
4
+ */
5
+ export declare const PLATFORM_MAPPINGS: Record<BinaryPlatform, PlatformMapping>;
6
+ /**
7
+ * Все поддерживаемые платформы
8
+ */
9
+ export declare const ALL_PLATFORMS: BinaryPlatform[];
10
+ /**
11
+ * Проверяет, что строка является валидной платформой
12
+ */
13
+ export declare function isValidPlatform(value: string): value is BinaryPlatform;
14
+ /**
15
+ * Парсит список платформ из строки (comma-separated)
16
+ */
17
+ export declare function parsePlatforms(value: string): BinaryPlatform[];
18
+ /**
19
+ * Возвращает путь к бинарнику для указанной платформы
20
+ */
21
+ export declare function getBinaryPath(distDir: string, name: string, platform: BinaryPlatform): string;
22
+ /**
23
+ * Возвращает путь к директории платформы
24
+ */
25
+ export declare function getPlatformDir(distDir: string, name: string, platform: BinaryPlatform): string;
26
+ /**
27
+ * Проверяет существование бинарника для платформы.
28
+ *
29
+ * @returns true если файл существует, false если файл не найден (ENOENT)
30
+ * @throws Error при других ошибках доступа (EACCES, ELOOP, EIO и т.д.)
31
+ */
32
+ export declare function validateBinaryExists(distDir: string, name: string, platform: BinaryPlatform): Promise<boolean>;
33
+ /**
34
+ * Валидирует наличие бинарников для всех указанных платформ
35
+ * @returns Массив отсутствующих платформ
36
+ */
37
+ export declare function validateAllBinaries(distDir: string, name: string, platforms: BinaryPlatform[]): Promise<BinaryPlatform[]>;
38
+ /**
39
+ * Возвращает дефолтный шаблон имени пакета
40
+ */
41
+ export declare function getDefaultPackageNameTemplate(scope?: string): string;
42
+ /**
43
+ * Генерирует полное имя пакета для платформы.
44
+ * Поддерживает кастомный шаблон через packageNameTemplate.
45
+ */
46
+ export declare function getPackageName(config: BinariesConfig, platform: BinaryPlatform): string;
47
+ /**
48
+ * Генерирует путь к пакету в output директории.
49
+ * Создаёт структуру директорий на основе имени пакета.
50
+ */
51
+ export declare function getPackageOutputPath(config: BinariesConfig, platform: BinaryPlatform): string;
52
+ /**
53
+ * Раскрывает плейсхолдеры в строке
54
+ */
55
+ export declare function expandPlaceholders(template: string, values: {
56
+ packageDir?: string;
57
+ version?: string;
58
+ platform?: string;
59
+ scope?: string;
60
+ name?: string;
61
+ }): string;
62
+ /**
63
+ * Конвертирует платформу в Node.js process.platform и process.arch
64
+ */
65
+ export declare function platformToNodeValues(platform: BinaryPlatform): {
66
+ platform: string;
67
+ arch: string;
68
+ };
69
+ /**
70
+ * Возвращает ключ источника для платформы с учётом platformMap.
71
+ * Если platformMap не задан или платформа не найдена, возвращает платформу как есть.
72
+ */
73
+ export declare function getSourceKey(config: BinariesConfig, platform: BinaryPlatform): string;
74
+ /**
75
+ * Дефолтный шаблон имени архива
76
+ */
77
+ export declare const DEFAULT_ARCHIVE_NAME_TEMPLATE = "{{name}}-{{platform}}.tar.gz";
78
+ /**
79
+ * Возвращает имя архива для платформы с учётом шаблона.
80
+ */
81
+ export declare function getArchiveName(config: BinariesConfig, platform: BinaryPlatform): string;
82
+ /**
83
+ * Возвращает путь к tar.gz архиву для указанной платформы.
84
+ */
85
+ export declare function getArchivePath(config: BinariesConfig, platform: BinaryPlatform): string;
86
+ /**
87
+ * Проверяет существование tar.gz архива для платформы.
88
+ *
89
+ * @returns true если архив существует, false если не найден (ENOENT)
90
+ * @throws Error при других ошибках доступа
91
+ */
92
+ export declare function validateArchiveExists(config: BinariesConfig, platform: BinaryPlatform): Promise<boolean>;
93
+ /**
94
+ * Универсальная проверка существования источника бинарника.
95
+ * Поддерживает как директории, так и tar.gz архивы.
96
+ *
97
+ * @returns true если источник существует, false если не найден
98
+ * @throws Error при других ошибках доступа
99
+ */
100
+ export declare function validateBinarySourceExists(config: BinariesConfig, platform: BinaryPlatform): Promise<boolean>;
101
+ /**
102
+ * Универсальная валидация наличия источников бинарников для всех платформ.
103
+ * Поддерживает как директории, так и tar.gz архивы.
104
+ *
105
+ * @returns Массив отсутствующих платформ
106
+ */
107
+ export declare function validateAllBinarySources(config: BinariesConfig): Promise<BinaryPlatform[]>;
108
+ /**
109
+ * Возвращает путь к источнику бинарника с учётом формата входных данных.
110
+ * Для directory возвращает путь к директории платформы.
111
+ * Для tar.gz возвращает путь к архиву.
112
+ */
113
+ export declare function getBinarySourcePath(config: BinariesConfig, platform: BinaryPlatform): string;
@@ -0,0 +1,53 @@
1
+ import type { BinariesConfig, BinaryPackageResult, BinaryPlatform, BinaryPublishResult } from "../types";
2
+ /**
3
+ * Вычисляет задержку с экспоненциальным backoff.
4
+ *
5
+ * Формула: delay = initialDelay * 2^attempt, ограничено maxDelay.
6
+ *
7
+ * Примеры (с дефолтными параметрами):
8
+ * - attempt 0: 2000ms
9
+ * - attempt 1: 4000ms
10
+ * - attempt 2: 8000ms
11
+ * - attempt 3: 16000ms
12
+ * - attempt 4+: 30000ms (max)
13
+ *
14
+ * @param attempt - Номер попытки (начиная с 0)
15
+ * @param initialDelay - Начальная задержка в мс (default: 2000)
16
+ * @param maxDelay - Максимальная задержка в мс (default: 30000)
17
+ * @returns Задержка в миллисекундах
18
+ */
19
+ export declare function calculateDelay(attempt: number, initialDelay?: number, maxDelay?: number): number;
20
+ /**
21
+ * Проверяет, можно ли повторить операцию после ошибки.
22
+ *
23
+ * Retriable ошибки (временные, имеет смысл повторить):
24
+ * - Сетевые ошибки: network timeout, ECONNRESET, ETIMEDOUT
25
+ * - Ограничения rate limit: HTTP 429, HTTP 503
26
+ * - Временные ошибки npm registry: registry unavailable, ETARGET
27
+ *
28
+ * Не-retriable ошибки (постоянные, повторять бессмысленно):
29
+ * - Ошибки авторизации (401, 403)
30
+ * - Невалидные данные (400)
31
+ * - Пакет уже существует (409)
32
+ * - Ошибки файловой системы
33
+ *
34
+ * @param error - Любое значение ошибки
35
+ * @returns true если ошибка носит временный характер и retry может помочь
36
+ */
37
+ export declare function isRetriableError(error: unknown): boolean;
38
+ /**
39
+ * Публикует один платформенный пакет
40
+ */
41
+ export declare function publishPlatformPackage(config: BinariesConfig, platform: BinaryPlatform, version: string, dryRun?: boolean): Promise<BinaryPublishResult>;
42
+ /**
43
+ * Публикует все платформенные пакеты
44
+ */
45
+ export declare function publishAllPlatformPackages(config: BinariesConfig, version: string, generatedPackages: BinaryPackageResult[], dryRun?: boolean, verbose?: boolean): Promise<BinaryPublishResult[]>;
46
+ /**
47
+ * Печатает информацию о публикации в dry-run режиме
48
+ */
49
+ export declare function printPublishDryRun(config: BinariesConfig, generatedPackages: BinaryPackageResult[]): void;
50
+ /**
51
+ * Печатает итоговую статистику публикации
52
+ */
53
+ export declare function printPublishSummary(results: BinaryPublishResult[], _config: BinariesConfig): void;
@@ -0,0 +1,34 @@
1
+ import type { BinariesConfig, BinaryPlatform } from "../types";
2
+ /**
3
+ * Генерирует JS wrapper скрипт для bin/
4
+ */
5
+ export declare function generateBinaryWrapper(config: BinariesConfig): string;
6
+ /**
7
+ * Интерфейс для optionalDependencies
8
+ */
9
+ export interface OptionalDependencies {
10
+ [key: string]: string;
11
+ }
12
+ /**
13
+ * Генерирует объект optionalDependencies для основного package.json
14
+ */
15
+ export declare function generateOptionalDependencies(config: BinariesConfig, version: string, platforms?: BinaryPlatform[]): OptionalDependencies;
16
+ /**
17
+ * Обновления для основного package.json
18
+ */
19
+ export interface MainPackageUpdates {
20
+ optionalDependencies: OptionalDependencies;
21
+ bin?: Record<string, string>;
22
+ }
23
+ /**
24
+ * Генерирует обновления для основного package.json
25
+ */
26
+ export declare function generateMainPackageUpdates(config: BinariesConfig, version: string, platforms?: BinaryPlatform[]): MainPackageUpdates;
27
+ /**
28
+ * Обновляет основной package.json с optionalDependencies
29
+ */
30
+ export declare function updateMainPackageJson(packagePath: string, config: BinariesConfig, version: string, platforms?: BinaryPlatform[], dryRun?: boolean): Promise<void>;
31
+ /**
32
+ * Печатает информацию об обновлениях main package в dry-run режиме
33
+ */
34
+ export declare function printMainPackageUpdatesDryRun(config: BinariesConfig, version: string, platforms?: BinaryPlatform[]): void;
@@ -0,0 +1,14 @@
1
+ import type { ChangelogConfig, ChangelogGenerateOptions, ConventionalCommit } from "../types";
2
+ /**
3
+ * Генерирует CHANGELOG для версии
4
+ */
5
+ export declare function generateChangelog(options: ChangelogGenerateOptions, config: ChangelogConfig, packageName?: string): string;
6
+ /**
7
+ * Обновляет CHANGELOG файл, добавляя новую версию в начало
8
+ */
9
+ export declare function updateChangelogFile(changelogPath: string, newEntry: string): Promise<void>;
10
+ /**
11
+ * Генерирует CHANGELOG текст для GitVerse Release
12
+ * (компактный формат без markdown заголовков, но с полной информацией)
13
+ */
14
+ export declare function generateReleaseNotes(commits: ConventionalCommit[], config: ChangelogConfig, repoUrl?: string, packageName?: string): string;
@@ -0,0 +1,5 @@
1
+ import type { GenerateCommitlintOptions, ReleaseConfig } from "../types";
2
+ /**
3
+ * Генерирует commitlint конфиг из release конфига
4
+ */
5
+ export declare function generateCommitlint(config: Required<ReleaseConfig>, options?: GenerateCommitlintOptions): Promise<void>;
@@ -0,0 +1,101 @@
1
+ import type { GitRepoInfo } from "../types";
2
+ /**
3
+ * Выполняет команду shell
4
+ */
5
+ export declare function executeCommand(command: string): Promise<string>;
6
+ /**
7
+ * Выполняет beforeCommit hook
8
+ * Возвращает true если хук выполнился успешно
9
+ * Возвращает false если хук упал с ошибкой
10
+ */
11
+ export declare function runBeforeCommitHook(command: string): Promise<boolean>;
12
+ /**
13
+ * Выполняет git команду
14
+ * Экспортируется для тестирования (позволяет мокать через spyOn)
15
+ */
16
+ export declare function gitCommand(command: string): Promise<string>;
17
+ /**
18
+ * Получает информацию о Git репозитории
19
+ *
20
+ * Приоритет источников данных:
21
+ * 1. Переменные окружения GitVerse Actions (для CI/CD)
22
+ * 2. Git remote URL (для локального использования)
23
+ */
24
+ export declare function getRepoInfo(): Promise<GitRepoInfo>;
25
+ /**
26
+ * Получает последний тег с указанным префиксом
27
+ */
28
+ export declare function getLatestTag(prefix: string): Promise<string | null>;
29
+ /**
30
+ * Получает список коммитов с момента последнего тега
31
+ */
32
+ export declare function getCommitsSinceTag(tagPrefix: string, path?: string): Promise<string[]>;
33
+ /**
34
+ * Получает текущую версию из package.json
35
+ */
36
+ export declare function getCurrentVersion(packagePath: string): Promise<string>;
37
+ /**
38
+ * Получает информацию из package.json (name и version)
39
+ */
40
+ export declare function getPackageInfo(packagePath: string): Promise<{
41
+ name: string;
42
+ version: string;
43
+ }>;
44
+ /**
45
+ * Обновляет версию в package.json
46
+ */
47
+ export declare function updatePackageVersion(packagePath: string, newVersion: string): Promise<void>;
48
+ /**
49
+ * Создает git коммит
50
+ */
51
+ export declare function createCommit(message: string, files: string[]): Promise<void>;
52
+ /**
53
+ * Создает git тег
54
+ */
55
+ export declare function createTag(tag: string, message: string): Promise<void>;
56
+ /**
57
+ * Опции для push операции
58
+ */
59
+ export interface PushOptions {
60
+ /** Тег для пуша (опционально) */
61
+ tag?: string;
62
+ /** Использовать токен для push через HTTPS */
63
+ useToken?: boolean;
64
+ /** Токен для авторизации */
65
+ token?: string;
66
+ /** Информация о репозитории */
67
+ repoInfo?: GitRepoInfo;
68
+ }
69
+ /**
70
+ * Выполняет git команду с очисткой токенов из ошибок
71
+ * Используется для команд с токенами в URL
72
+ * Экспортируется для тестирования
73
+ */
74
+ export declare function gitCommandSilent(command: string): Promise<void>;
75
+ /**
76
+ * Пушит изменения и теги в remote
77
+ */
78
+ export declare function pushChanges(options?: PushOptions): Promise<void>;
79
+ /**
80
+ * Проверяет, что рабочая директория чистая
81
+ *
82
+ * Формат git status --porcelain: "XY PATH"
83
+ * X = status in staging area (index)
84
+ * Y = status in working tree
85
+ *
86
+ * Staged изменения (X != ' ') допустимы - они войдут в коммит релиза
87
+ * Unstaged изменения (Y != ' ') запрещены - нужно закоммитить или stash
88
+ */
89
+ export declare function isWorkingTreeClean(): Promise<boolean>;
90
+ /**
91
+ * Добавляет все измененные файлы в staging area
92
+ * Используется после успешного выполнения beforeCommit хука
93
+ */
94
+ export declare function addChangedFiles(): Promise<void>;
95
+ /**
96
+ * Проверяет, что тег существует.
97
+ *
98
+ * @returns true если тег существует, false если тег не найден
99
+ * @throws Error при критических ошибках git (повреждённый репозиторий, git не найден)
100
+ */
101
+ export declare function tagExists(tag: string): Promise<boolean>;
@@ -0,0 +1,36 @@
1
+ import type { ConventionalCommit } from "../types";
2
+ /**
3
+ * Парсит сырой коммит из git log в структуру ConventionalCommit
4
+ */
5
+ export declare function parseCommit(rawCommit: string): ConventionalCommit | null;
6
+ /**
7
+ * Парсит массив сырых коммитов
8
+ */
9
+ export declare function parseCommits(rawCommits: string[]): ConventionalCommit[];
10
+ /**
11
+ * Группирует коммиты по типам
12
+ */
13
+ export declare function groupCommitsByType(commits: ConventionalCommit[]): Record<string, ConventionalCommit[]>;
14
+ /**
15
+ * Фильтрует коммиты по scope
16
+ */
17
+ export declare function filterCommitsByScope(commits: ConventionalCommit[], scope: string): ConventionalCommit[];
18
+ /**
19
+ * Фильтрует коммиты для пакета с учётом режима monorepo
20
+ *
21
+ * В monorepo режиме: включает коммиты со scope пакета + коммиты без scope (общие)
22
+ * В single-package режиме: включает все коммиты (scope используется для категоризации, не для выбора пакета)
23
+ */
24
+ export declare function filterCommitsForPackage(commits: ConventionalCommit[], packageName: string, isMonorepo: boolean): ConventionalCommit[];
25
+ /**
26
+ * Проверяет, есть ли breaking changes
27
+ */
28
+ export declare function hasBreakingChanges(commits: ConventionalCommit[]): boolean;
29
+ /**
30
+ * Проверяет, есть ли новые features
31
+ */
32
+ export declare function hasFeatures(commits: ConventionalCommit[]): boolean;
33
+ /**
34
+ * Проверяет, есть ли bug fixes
35
+ */
36
+ export declare function hasFixes(commits: ConventionalCommit[]): boolean;
@@ -0,0 +1,39 @@
1
+ import type { RetryConfig } from "../types";
2
+ /**
3
+ * Опции для retry функции
4
+ */
5
+ export interface RetryOptions {
6
+ /**
7
+ * Максимальное количество попыток
8
+ */
9
+ maxAttempts: number;
10
+ /**
11
+ * Начальная задержка (мс)
12
+ */
13
+ initialDelay: number;
14
+ /**
15
+ * Максимальная задержка (мс)
16
+ */
17
+ maxDelay: number;
18
+ /**
19
+ * Название операции для логирования
20
+ */
21
+ operationName?: string;
22
+ }
23
+ /**
24
+ * Проверяет, является ли ошибка временной (можно retry)
25
+ */
26
+ export declare function isRetriableError(error: unknown): boolean;
27
+ /**
28
+ * Выполняет функцию с retry механизмом и экспоненциальным backoff
29
+ *
30
+ * @param fn - Асинхронная функция для выполнения
31
+ * @param options - Опции retry
32
+ * @returns Результат выполнения функции
33
+ * @throws Последняя ошибка после всех попыток
34
+ */
35
+ export declare function retry<T>(fn: () => Promise<T>, options: RetryOptions): Promise<T>;
36
+ /**
37
+ * Создаёт функцию retry с предустановленными настройками из конфига
38
+ */
39
+ export declare function createRetryFunction(config: RetryConfig): <T>(fn: () => Promise<T>, operationName?: string) => Promise<T>;
@@ -0,0 +1,18 @@
1
+ import type { BumpType, ConventionalCommit, VersionBump } from "../types";
2
+ /**
3
+ * Определяет тип изменения версии на основе коммитов
4
+ */
5
+ export declare function determineBumpType(commits: ConventionalCommit[], currentVersion?: string, preMajorMode?: string): BumpType | null;
6
+ /**
7
+ * Увеличивает версию согласно типу изменения
8
+ */
9
+ export declare function bumpVersion(currentVersion: string, bumpType: BumpType, prereleasePrefix?: string): string;
10
+ /**
11
+ * Вычисляет bump версии на основе коммитов
12
+ */
13
+ export declare function calculateVersionBump(currentVersion: string, commits: ConventionalCommit[], forceVersion?: string, prerelease?: string, preMajorMode?: string): VersionBump;
14
+ /**
15
+ * Сравнивает две версии
16
+ * Возвращает: -1 если a < b, 0 если a === b, 1 если a > b
17
+ */
18
+ export declare function compareVersions(a: string, b: string): number;
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "onreza-release",
3
+ "version": "1.0.0",
4
+ "description": "Conventional Commits release automation tool with GitVerse and GitHub support",
5
+ "keywords": [
6
+ "release",
7
+ "conventional-commits",
8
+ "changelog",
9
+ "versioning",
10
+ "semantic-release",
11
+ "monorepo",
12
+ "gitverse",
13
+ "github",
14
+ "bun",
15
+ "onreza"
16
+ ],
17
+ "homepage": "https://gitverse.ru/onreza/release-tool#readme",
18
+ "bugs": {
19
+ "url": "https://gitverse.ru/onreza/release-tool/tasktracker"
20
+ },
21
+ "repository": {
22
+ "type": "git",
23
+ "url": "https://gitverse.ru/onreza/release-tool.git"
24
+ },
25
+ "license": "MIT",
26
+ "author": "ONREZA <support@onreza.ru>",
27
+ "type": "module",
28
+ "exports": {
29
+ ".": {
30
+ "import": "./dist/index.js",
31
+ "types": "./dist/index.d.ts"
32
+ },
33
+ "./cli": {
34
+ "import": "./dist/cli.js",
35
+ "types": "./dist/cli.d.ts"
36
+ }
37
+ },
38
+ "main": "dist/index.js",
39
+ "types": "dist/index.d.ts",
40
+ "bin": {
41
+ "onreza-release": "./dist/cli.js"
42
+ },
43
+ "files": ["dist", "schema.json", "README.md"],
44
+ "scripts": {
45
+ "build": "bun build.ts",
46
+ "dev": "bun build.ts --watch",
47
+ "lint": "biome check",
48
+ "lint:fix": "biome check --write",
49
+ "test": "bun test",
50
+ "test:coverage": "bun test --coverage",
51
+ "typecheck": "tsc --noEmit"
52
+ },
53
+ "dependencies": {
54
+ "@onreza/gitverse-sdk": ">=0.0.0",
55
+ "jsonc-parser": "^3.3.1",
56
+ "tar": "^7.5.3"
57
+ },
58
+ "devDependencies": {
59
+ "@biomejs/biome": "^2.3.11",
60
+ "@types/bun": "1.3.6",
61
+ "typescript": "^5.9.3"
62
+ },
63
+ "publishConfig": {
64
+ "access": "public"
65
+ }
66
+ }