onreza-release 1.0.1 → 2.1.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,71 @@
1
+ import type { GitPlatform, ProviderRepoInfo } from "./types";
2
+ /**
3
+ * Определяет Git платформу по URL репозитория
4
+ *
5
+ * @param remoteUrl - URL репозитория (HTTPS, SSH, SCP-like)
6
+ * @returns Платформа или null если не удалось определить
7
+ *
8
+ * @example
9
+ * detectPlatform("https://github.com/owner/repo.git") // "github"
10
+ * detectPlatform("git@gitverse.ru:owner/repo.git") // "gitverse"
11
+ * detectPlatform("https://gitlab.company.com/owner/repo") // "gitlab"
12
+ */
13
+ export declare function detectPlatform(remoteUrl: string): GitPlatform | null;
14
+ /**
15
+ * Парсит URL репозитория и извлекает owner, repo, host
16
+ *
17
+ * @param url - URL репозитория
18
+ * @returns Информация о репозитории или null если не удалось распарсить
19
+ *
20
+ * @example
21
+ * parseRepoUrl("https://github.com/owner/repo.git")
22
+ * // { owner: "owner", repo: "repo", host: "github.com" }
23
+ *
24
+ * parseRepoUrl("git@gitverse.ru:owner/repo.git")
25
+ * // { owner: "owner", repo: "repo", host: "gitverse.ru" }
26
+ */
27
+ export declare function parseRepoUrl(url: string): ProviderRepoInfo | null;
28
+ /**
29
+ * Проверяет, запущен ли скрипт в CI окружении определённой платформы
30
+ */
31
+ export interface CiEnvironment {
32
+ /** Платформа CI */
33
+ platform: GitPlatform;
34
+ /** Owner/repo из переменных окружения */
35
+ repository?: string;
36
+ /** Текущая ветка */
37
+ branch?: string;
38
+ }
39
+ /**
40
+ * Определяет CI окружение по переменным окружения
41
+ *
42
+ * @returns Информация о CI окружении или null
43
+ */
44
+ export declare function detectCiEnvironment(): CiEnvironment | null;
45
+ /**
46
+ * Определяет платформу автоматически
47
+ *
48
+ * Приоритет:
49
+ * 1. CI переменные окружения
50
+ * 2. Git remote URL
51
+ *
52
+ * @param remoteUrl - URL репозитория (опционально)
53
+ * @returns Платформа или null
54
+ */
55
+ export declare function detectPlatformAuto(remoteUrl?: string): GitPlatform | null;
56
+ /**
57
+ * Возвращает базовый URL для платформы
58
+ *
59
+ * @param platform - Платформа
60
+ * @param host - Хост (опционально, для self-hosted)
61
+ * @returns Базовый URL
62
+ */
63
+ export declare function getPlatformBaseUrl(platform: GitPlatform, host?: string): string;
64
+ /**
65
+ * Возвращает API URL для платформы
66
+ *
67
+ * @param platform - Платформа
68
+ * @param host - Хост (опционально, для self-hosted)
69
+ * @returns API URL
70
+ */
71
+ export declare function getPlatformApiUrl(platform: GitPlatform, host?: string): string;
@@ -0,0 +1,53 @@
1
+ import type { AssetLimits, CreateReleaseOptions, CreateReleaseResult, GitPlatform, ProviderRepoInfo, ReleaseProvider, RetryFunction, TokenValidationResult, UploadAssetResult } from "./types";
2
+ /**
3
+ * GitHub Release Provider
4
+ *
5
+ * Реализует ReleaseProvider для GitHub платформы.
6
+ * Использует GitHub REST API напрямую через fetch.
7
+ */
8
+ export declare class GitHubReleaseProvider implements ReleaseProvider {
9
+ private repoInfo;
10
+ private retryFn?;
11
+ private token;
12
+ private apiBaseUrl;
13
+ readonly platform: GitPlatform;
14
+ readonly assetLimits: AssetLimits;
15
+ constructor(token: string, repoInfo: ProviderRepoInfo, retryFn?: RetryFunction);
16
+ /**
17
+ * Выполняет API запрос к GitHub
18
+ */
19
+ private apiRequest;
20
+ /**
21
+ * Проверяет валидность токена через API
22
+ */
23
+ validateToken(): Promise<TokenValidationResult>;
24
+ /**
25
+ * Создает релиз на GitHub
26
+ */
27
+ createRelease(tag: string, name: string, body: string, options?: CreateReleaseOptions): Promise<CreateReleaseResult>;
28
+ /**
29
+ * Проверяет существование релиза по тегу
30
+ *
31
+ * @throws Error если произошла ошибка отличная от 404 (сетевая, авторизация и т.д.)
32
+ */
33
+ releaseExists(tag: string): Promise<boolean>;
34
+ /**
35
+ * Получает информацию о релизе по тегу
36
+ *
37
+ * @returns null если релиз не найден (404)
38
+ * @throws Error если произошла ошибка отличная от 404
39
+ */
40
+ getRelease(tag: string): Promise<CreateReleaseResult | null>;
41
+ /**
42
+ * Загружает файл как asset к релизу
43
+ */
44
+ uploadAsset(releaseId: number | string, filePath: string, assetName: string): Promise<UploadAssetResult>;
45
+ /**
46
+ * Определяет Content-Type по имени файла
47
+ */
48
+ private getContentType;
49
+ /**
50
+ * Возвращает информацию о репозитории
51
+ */
52
+ get repositoryInfo(): ProviderRepoInfo;
53
+ }
@@ -0,0 +1,48 @@
1
+ import type { AssetLimits, CreateReleaseOptions, CreateReleaseResult, GitPlatform, ProviderRepoInfo, ReleaseProvider, RetryFunction, TokenValidationResult, UploadAssetResult } from "./types";
2
+ /**
3
+ * GitVerse Release Provider
4
+ *
5
+ * Реализует ReleaseProvider для GitVerse платформы.
6
+ */
7
+ export declare class GitVerseReleaseProvider implements ReleaseProvider {
8
+ private client;
9
+ private repoInfo;
10
+ private retryFn?;
11
+ private token;
12
+ readonly platform: GitPlatform;
13
+ readonly assetLimits: AssetLimits;
14
+ constructor(token: string, repoInfo: ProviderRepoInfo, retryFn?: RetryFunction);
15
+ /**
16
+ * Проверяет валидность токена через API
17
+ */
18
+ validateToken(): Promise<TokenValidationResult>;
19
+ /**
20
+ * Создает релиз на GitVerse
21
+ */
22
+ createRelease(tag: string, name: string, body: string, options?: CreateReleaseOptions): Promise<CreateReleaseResult>;
23
+ /**
24
+ * Проверяет существование релиза по тегу
25
+ *
26
+ * @throws Error если произошла ошибка отличная от 404 (сетевая, авторизация и т.д.)
27
+ */
28
+ releaseExists(tag: string): Promise<boolean>;
29
+ /**
30
+ * Получает информацию о релизе по тегу
31
+ *
32
+ * @returns null если релиз не найден (404)
33
+ * @throws Error если произошла ошибка отличная от 404
34
+ */
35
+ getRelease(tag: string): Promise<CreateReleaseResult | null>;
36
+ /**
37
+ * Загружает файл как asset к релизу
38
+ */
39
+ uploadAsset(releaseId: number | string, filePath: string, assetName: string): Promise<UploadAssetResult>;
40
+ /**
41
+ * Формирует URL релиза
42
+ */
43
+ private getReleaseUrl;
44
+ /**
45
+ * Возвращает информацию о репозитории
46
+ */
47
+ get repositoryInfo(): ProviderRepoInfo;
48
+ }
@@ -0,0 +1,67 @@
1
+ import type { GitPlatform, ProviderRepoInfo, ReleaseProvider, RetryFunction } from "./types";
2
+ /**
3
+ * Опции для создания провайдера релизов
4
+ */
5
+ export interface CreateReleaseProviderOptions {
6
+ /** Информация о репозитории */
7
+ repoInfo: ProviderRepoInfo;
8
+ /** Платформа (если не указана, будет определена автоматически) */
9
+ platform?: GitPlatform | "auto";
10
+ /** Токен авторизации (если не указан, будет получен из env) */
11
+ token?: string;
12
+ /** Retry функция (опционально) */
13
+ retryFn?: RetryFunction;
14
+ }
15
+ /**
16
+ * Результат создания провайдера
17
+ */
18
+ export interface CreateReleaseProviderResult {
19
+ /** Провайдер релизов */
20
+ provider: ReleaseProvider;
21
+ /** Источник токена */
22
+ tokenSource: string;
23
+ /** Определённая платформа */
24
+ platform: GitPlatform;
25
+ }
26
+ /**
27
+ * Создаёт провайдер релизов для указанной платформы
28
+ *
29
+ * Автоматически определяет платформу по URL репозитория или CI окружению,
30
+ * получает токен из переменных окружения и создаёт соответствующий провайдер.
31
+ *
32
+ * @example
33
+ * ```ts
34
+ * const { provider } = createReleaseProvider({
35
+ * repoInfo: { owner: "user", repo: "project", host: "github.com" },
36
+ * });
37
+ *
38
+ * const release = await provider.createRelease("v1.0.0", "Release 1.0.0", "Changelog");
39
+ * ```
40
+ */
41
+ export declare function createReleaseProvider(options: CreateReleaseProviderOptions): CreateReleaseProviderResult;
42
+ /**
43
+ * Проверяет доступность токена для платформы
44
+ *
45
+ * @param platform - Git платформа
46
+ * @returns true если токен найден
47
+ */
48
+ export declare function hasToken(platform: GitPlatform): boolean;
49
+ /**
50
+ * Валидирует токен для платформы
51
+ *
52
+ * @param platform - Git платформа
53
+ * @param repoInfo - Информация о репозитории
54
+ * @returns Результат валидации
55
+ */
56
+ export declare function validateToken(platform: GitPlatform, repoInfo: ProviderRepoInfo): Promise<{
57
+ valid: boolean;
58
+ username?: string;
59
+ error?: string;
60
+ }>;
61
+ export { detectCiEnvironment, detectPlatform, detectPlatformAuto } from "./detector";
62
+ export { GitHubReleaseProvider } from "./github";
63
+ export { GitVerseReleaseProvider } from "./gitverse";
64
+ export { formatFileSize, getAssetLimits, PLATFORM_ASSET_LIMITS, validateAsset, validateAssetBatch } from "./limits";
65
+ export { getSupportedEnvVars, getToken, getTokenNotFoundError, isCI } from "./tokens";
66
+ export type { AssetLimits, CreateReleaseOptions, CreateReleaseResult, GitPlatform, ProviderRepoInfo, ReleaseProvider, RetryFunction, TokenValidationResult, UploadAssetResult, } from "./types";
67
+ export { createProviderRepoInfo } from "./types";
@@ -0,0 +1,75 @@
1
+ import type { AssetLimits, GitPlatform } from "./types";
2
+ /**
3
+ * Лимиты assets по платформам
4
+ *
5
+ * Источники:
6
+ * - GitVerse: Эмпирически определённые лимиты
7
+ * - GitHub: https://docs.github.com/en/repositories/releasing-projects-on-github/about-releases
8
+ * - GitLab: https://docs.gitlab.com/ee/user/project/releases/
9
+ */
10
+ export declare const PLATFORM_ASSET_LIMITS: Record<GitPlatform, AssetLimits>;
11
+ /**
12
+ * Получает лимиты для указанной платформы
13
+ *
14
+ * @param platform - Git платформа
15
+ */
16
+ export declare function getAssetLimits(platform: GitPlatform): AssetLimits;
17
+ /**
18
+ * Форматирует размер файла в человекочитаемый формат
19
+ *
20
+ * @param bytes - Размер в байтах
21
+ */
22
+ export declare function formatFileSize(bytes: number): string;
23
+ /**
24
+ * Получает расширение файла с поддержкой составных расширений
25
+ *
26
+ * @param filePath - Путь к файлу
27
+ */
28
+ export declare function getFileExtension(filePath: string): string;
29
+ /**
30
+ * Проверяет допустимость расширения для платформы
31
+ *
32
+ * @param platform - Git платформа
33
+ * @param extension - Расширение файла (с точкой)
34
+ */
35
+ export declare function isExtensionAllowed(platform: GitPlatform, extension: string): boolean;
36
+ /**
37
+ * Проверяет размер файла для платформы
38
+ *
39
+ * @param platform - Git платформа
40
+ * @param sizeBytes - Размер в байтах
41
+ */
42
+ export declare function isFileSizeAllowed(platform: GitPlatform, sizeBytes: number): boolean;
43
+ /**
44
+ * Результат валидации asset
45
+ */
46
+ export interface AssetValidationResult {
47
+ /** Валиден ли файл */
48
+ valid: boolean;
49
+ /** Сообщение об ошибке */
50
+ error?: string;
51
+ /** Размер файла */
52
+ sizeBytes?: number;
53
+ }
54
+ /**
55
+ * Валидирует файл для загрузки на указанную платформу
56
+ *
57
+ * @param platform - Git платформа
58
+ * @param filePath - Путь к файлу
59
+ * @param sizeBytes - Размер файла в байтах
60
+ */
61
+ export declare function validateAsset(platform: GitPlatform, filePath: string, sizeBytes: number): AssetValidationResult;
62
+ /**
63
+ * Валидирует пакет файлов для загрузки
64
+ *
65
+ * @param platform - Git платформа
66
+ * @param files - Массив { path, sizeBytes }
67
+ */
68
+ export declare function validateAssetBatch(platform: GitPlatform, files: Array<{
69
+ path: string;
70
+ sizeBytes: number;
71
+ }>): {
72
+ valid: boolean;
73
+ errors: string[];
74
+ totalSize: number;
75
+ };
@@ -0,0 +1,42 @@
1
+ import type { GitPlatform } from "./types";
2
+ /**
3
+ * Результат получения токена
4
+ */
5
+ export interface TokenResult {
6
+ /** Токен */
7
+ token: string;
8
+ /** Имя переменной окружения, из которой получен токен */
9
+ source: string;
10
+ }
11
+ /**
12
+ * Получает токен для указанной платформы
13
+ *
14
+ * @param platform - Git платформа
15
+ * @returns Результат с токеном или null если токен не найден
16
+ *
17
+ * @example
18
+ * const result = getToken("github");
19
+ * if (result) {
20
+ * console.log(`Token from ${result.source}`);
21
+ * }
22
+ */
23
+ export declare function getToken(platform: GitPlatform): TokenResult | null;
24
+ /**
25
+ * Проверяет, запущен ли скрипт в CI окружении платформы
26
+ *
27
+ * @param platform - Git платформа
28
+ */
29
+ export declare function isCI(platform: GitPlatform): boolean;
30
+ /**
31
+ * Генерирует сообщение об ошибке отсутствия токена
32
+ *
33
+ * @param platform - Git платформа
34
+ * @returns Сообщение с инструкциями
35
+ */
36
+ export declare function getTokenNotFoundError(platform: GitPlatform): string;
37
+ /**
38
+ * Возвращает список всех поддерживаемых переменных окружения для платформы
39
+ *
40
+ * @param platform - Git платформа
41
+ */
42
+ export declare function getSupportedEnvVars(platform: GitPlatform): string[];
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Поддерживаемые Git платформы
3
+ */
4
+ export type GitPlatform = "gitverse" | "github" | "gitlab";
5
+ /**
6
+ * Лимиты для assets релиза (immutable)
7
+ */
8
+ export interface AssetLimits {
9
+ /** Максимальный размер одного файла в байтах */
10
+ readonly maxFileSizeBytes: number;
11
+ /** Максимальный суммарный размер за один upload (null = без лимита) */
12
+ readonly maxTotalSizeBytes: number | null;
13
+ /** Допустимые расширения файлов (null = любые) */
14
+ readonly allowedExtensions: readonly string[] | null;
15
+ /** Максимальное количество файлов за раз */
16
+ readonly maxFilesPerUpload: number;
17
+ }
18
+ /**
19
+ * Результат валидации токена (discriminated union)
20
+ *
21
+ * Гарантирует, что valid=true всегда имеет username,
22
+ * а valid=false всегда имеет error.
23
+ */
24
+ export type TokenValidationResult = {
25
+ readonly valid: true;
26
+ readonly username: string;
27
+ } | {
28
+ readonly valid: false;
29
+ readonly error: string;
30
+ };
31
+ /**
32
+ * Опции для создания релиза
33
+ */
34
+ export interface CreateReleaseOptions {
35
+ /** Черновик (не публиковать сразу) */
36
+ draft?: boolean;
37
+ /** Prerelease версия */
38
+ prerelease?: boolean;
39
+ /** Целевая ветка/коммит для тега (если тег ещё не создан) */
40
+ targetCommitish?: string;
41
+ }
42
+ /**
43
+ * Результат создания релиза
44
+ */
45
+ export interface CreateReleaseResult {
46
+ /** ID релиза (number для GitHub/GitVerse, string для GitLab) */
47
+ id: number | string;
48
+ /** URL релиза */
49
+ url: string;
50
+ /** URL для загрузки assets (для GitHub) */
51
+ uploadUrl?: string;
52
+ /** Тег релиза */
53
+ tag: string;
54
+ }
55
+ /**
56
+ * Результат загрузки asset
57
+ */
58
+ export interface UploadAssetResult {
59
+ /** ID asset */
60
+ id: number | string;
61
+ /** Имя asset */
62
+ name: string;
63
+ /** URL для скачивания */
64
+ downloadUrl: string;
65
+ /** Размер в байтах */
66
+ size: number;
67
+ }
68
+ /**
69
+ * Информация о репозитории для провайдера (immutable)
70
+ */
71
+ export interface ProviderRepoInfo {
72
+ /** Владелец репозитория */
73
+ readonly owner: string;
74
+ /** Название репозитория */
75
+ readonly repo: string;
76
+ /** Хост платформы (например: github.com, gitverse.ru) */
77
+ readonly host: string;
78
+ }
79
+ /**
80
+ * Создаёт валидированный объект ProviderRepoInfo
81
+ *
82
+ * @throws Error если owner, repo или host пустые или невалидные
83
+ */
84
+ export declare function createProviderRepoInfo(owner: string, repo: string, host: string): ProviderRepoInfo;
85
+ /**
86
+ * Retry функция type
87
+ */
88
+ export type RetryFunction = <T>(fn: () => Promise<T>, operationName?: string) => Promise<T>;
89
+ /**
90
+ * Опции для создания провайдера
91
+ */
92
+ export interface CreateProviderOptions {
93
+ /** Информация о репозитории */
94
+ repoInfo: ProviderRepoInfo;
95
+ /** Платформа (если не указана, будет определена автоматически) */
96
+ platform?: GitPlatform;
97
+ /** Токен авторизации */
98
+ token: string;
99
+ /** Retry функция (опционально) */
100
+ retryFn?: RetryFunction;
101
+ }
102
+ /**
103
+ * Универсальный интерфейс провайдера релизов
104
+ *
105
+ * Реализуется для каждой Git платформы (GitVerse, GitHub, GitLab).
106
+ * Предоставляет единый API для работы с релизами.
107
+ */
108
+ export interface ReleaseProvider {
109
+ /**
110
+ * Название платформы
111
+ */
112
+ readonly platform: GitPlatform;
113
+ /**
114
+ * Лимиты для assets
115
+ */
116
+ readonly assetLimits: AssetLimits;
117
+ /**
118
+ * Проверяет валидность токена
119
+ */
120
+ validateToken(): Promise<TokenValidationResult>;
121
+ /**
122
+ * Создаёт релиз
123
+ *
124
+ * @param tag - Тег для релиза
125
+ * @param name - Название релиза
126
+ * @param body - Описание релиза (release notes)
127
+ * @param options - Дополнительные опции
128
+ */
129
+ createRelease(tag: string, name: string, body: string, options?: CreateReleaseOptions): Promise<CreateReleaseResult>;
130
+ /**
131
+ * Проверяет существование релиза по тегу
132
+ *
133
+ * @param tag - Тег для проверки
134
+ */
135
+ releaseExists(tag: string): Promise<boolean>;
136
+ /**
137
+ * Получает информацию о релизе по тегу
138
+ *
139
+ * @param tag - Тег релиза
140
+ * @returns Информация о релизе или null если не найден
141
+ */
142
+ getRelease(tag: string): Promise<CreateReleaseResult | null>;
143
+ /**
144
+ * Загружает файл как asset к релизу
145
+ *
146
+ * @param releaseId - ID релиза
147
+ * @param filePath - Путь к файлу
148
+ * @param assetName - Имя asset в релизе
149
+ */
150
+ uploadAsset(releaseId: number | string, filePath: string, assetName: string): Promise<UploadAssetResult>;
151
+ }