gitverse-release 2.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.
- package/README.md +352 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +118 -0
- package/dist/cli.js.map +10 -0
- package/dist/config.d.ts +13 -0
- package/dist/gitverse.d.ts +28 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.js +1299 -0
- package/dist/index.js.map +36 -0
- package/dist/types.d.ts +328 -0
- package/dist/utils/changelog.d.ts +14 -0
- package/dist/utils/git.d.ts +45 -0
- package/dist/utils/parser.d.ts +29 -0
- package/dist/utils/version.d.ts +18 -0
- package/package.json +60 -0
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.ts", "../src/config.ts", "../../sdk/dist/api/organizations.js", "../../sdk/dist/api/commits.js", "../../sdk/dist/api/actions.js", "../../sdk/dist/errors.js", "../../sdk/dist/api/stars.js", "../../sdk/dist/api/issues.js", "../../sdk/dist/api/branches.js", "../../sdk/dist/utils.js", "../../sdk/dist/api/repositories.js", "../../sdk/dist/api/collaborators.js", "../../sdk/dist/api/contents.js", "../../sdk/dist/api/teams.js", "../../sdk/dist/api/git.js", "../../sdk/dist/api/releases.js", "../../sdk/dist/api/pulls.js", "../../sdk/dist/api/forks.js", "../../sdk/dist/client.js", "../../sdk/dist/api/users.js", "../../sdk/dist/api/emails.js", "../../sdk/dist/index.js", "../src/gitverse.ts", "../src/utils/changelog.ts", "../src/utils/parser.ts", "../src/utils/git.ts", "../src/utils/version.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { resolve } from \"node:path\";\nimport { loadConfig, validateConfig } from \"./config\";\nimport { createGitVerseClient } from \"./gitverse\";\nimport type {\n CliOptions,\n ConventionalCommit,\n GitRepoInfo,\n PackageConfig,\n ReleaseConfig,\n ReleaseResult,\n VersionBump,\n} from \"./types\";\nimport { generateChangelog, generateReleaseNotes, updateChangelogFile } from \"./utils/changelog\";\nimport {\n createCommit,\n createTag,\n getCommitsSinceTag,\n getCurrentVersion,\n getRepoInfo,\n isWorkingTreeClean,\n pushChanges,\n tagExists,\n updatePackageVersion,\n} from \"./utils/git\";\nimport { parseCommits } from \"./utils/parser\";\nimport { calculateVersionBump } from \"./utils/version\";\n\n/**\n * Печатает информацию о dry run\n */\nfunction printDryRunInfo(\n pkg: PackageConfig,\n currentVersion: string,\n versionBump: VersionBump,\n tag: string,\n commits: ConventionalCommit[],\n changelogEntry: string,\n): void {\n console.log(\"\\n🔍 DRY RUN MODE - No changes will be made\\n\");\n console.log(`📦 Package: ${pkg.packageName}`);\n console.log(`📈 Version: ${currentVersion} → ${versionBump.newVersion}`);\n console.log(`🏷️ Tag: ${tag}`);\n console.log(`💬 Commits: ${commits.length}`);\n console.log(\"\\n📝 CHANGELOG:\\n\");\n console.log(changelogEntry);\n}\n\n/**\n * Печатает информацию об успешном релизе\n */\nfunction printSuccessInfo(\n pkg: PackageConfig,\n currentVersion: string,\n newVersion: string,\n tag: string,\n releaseUrl?: string,\n): void {\n console.log(\"\\n✅ Release created successfully!\\n\");\n console.log(`📦 Package: ${pkg.packageName}`);\n console.log(`📈 Version: ${currentVersion} → ${newVersion}`);\n console.log(`🏷️ Tag: ${tag}`);\n if (releaseUrl) {\n console.log(`🌐 Release: ${releaseUrl}`);\n }\n console.log(\"\");\n}\n\n/**\n * Обновляет файлы пакета\n */\nasync function updatePackageFiles(pkg: PackageConfig, newVersion: string, changelogEntry: string): Promise<string> {\n await updatePackageVersion(pkg.path, newVersion);\n const changelogPath = resolve(pkg.path, pkg.changelog);\n await updateChangelogFile(changelogPath, changelogEntry);\n return changelogPath;\n}\n\n/**\n * Собирает и валидирует коммиты\n */\nasync function collectCommits(\n pkg: PackageConfig,\n options: CliOptions,\n warnings: string[],\n): Promise<ConventionalCommit[]> {\n const rawCommits = await getCommitsSinceTag(pkg.tagPrefix, pkg.path);\n\n if (rawCommits.length === 0 && !options.version) {\n throw new Error(`No commits found since last release for ${pkg.packageName}`);\n }\n\n const commits = parseCommits(rawCommits);\n\n if (commits.length === 0 && !options.version) {\n warnings.push(\"No conventional commits found, but will proceed with patch bump\");\n }\n\n return commits;\n}\n\n/**\n * Вычисляет prerelease тег\n */\nfunction resolvePrereleaseTag(options: CliOptions, config: Required<ReleaseConfig>): string | undefined {\n if (typeof options.prerelease === \"string\") {\n return options.prerelease;\n }\n if (options.prerelease) {\n return config.versioning.prereleasePrefix;\n }\n return;\n}\n\n/**\n * Создает релиз на GitVerse\n */\nasync function createGitVerseRelease(\n options: CliOptions,\n repoInfo: GitRepoInfo,\n commits: ConventionalCommit[],\n config: Required<ReleaseConfig>,\n pkg: PackageConfig,\n versionBump: VersionBump,\n tag: string,\n warnings: string[],\n): Promise<string | undefined> {\n if (options.noRelease) {\n return;\n }\n\n try {\n const gitverseClient = createGitVerseClient(repoInfo);\n const releaseNotes = generateReleaseNotes(commits, config.changelog);\n\n return await gitverseClient.createRelease(tag, `${pkg.packageName} v${versionBump.newVersion}`, releaseNotes, {\n prerelease: !!options.prerelease,\n });\n } catch (error) {\n warnings.push(`Failed to create GitVerse release: ${error instanceof Error ? error.message : String(error)}`);\n return;\n }\n}\n\n/**\n * Выполняет git операции\n */\nasync function performGitOperations(\n config: Required<ReleaseConfig>,\n options: CliOptions,\n pkg: PackageConfig,\n newVersion: string,\n tag: string,\n changelogPath: string,\n): Promise<void> {\n if (config.git.commitChanges && !options.noCommit) {\n const commitMessage = config.git.commitMessage.replace(\"{{package}}\", pkg.name).replace(\"{{version}}\", newVersion);\n\n await createCommit(commitMessage, [resolve(pkg.path, \"package.json\"), changelogPath]);\n }\n\n if (!options.noTag) {\n const tagMessage = config.git.tagMessage.replace(\"{{package}}\", pkg.name).replace(\"{{version}}\", newVersion);\n\n await createTag(tag, tagMessage);\n }\n\n if (config.git.push && !options.noPush) {\n await pushChanges(options.noTag ? undefined : tag);\n }\n}\n\n/**\n * Основная функция для создания релиза\n */\nexport async function release(packageName?: string, options: CliOptions = {}): Promise<ReleaseResult> {\n const result: ReleaseResult = {\n errors: [],\n newVersion: \"\",\n oldVersion: \"\",\n packageName: packageName || \"unknown\",\n success: false,\n warnings: [],\n };\n\n try {\n // Загружаем конфигурацию\n const config = await loadConfig(options.config);\n validateConfig(config);\n\n // Получаем информацию о репозитории\n const repoInfo = await getRepoInfo();\n\n // Определяем какой пакет релизить\n const pkg = resolvePackage(config, packageName);\n\n result.packageName = pkg.packageName;\n\n // Проверяем чистоту рабочей директории\n if (!(options.dryRun || (await isWorkingTreeClean()))) {\n throw new Error(\"Working tree is not clean. Please commit or stash your changes.\");\n }\n\n // Получаем текущую версию\n const currentVersion = await getCurrentVersion(pkg.path);\n result.oldVersion = currentVersion;\n\n // Собираем коммиты\n const commits = await collectCommits(pkg, options, result.warnings);\n\n // Вычисляем новую версию\n const prereleaseTag = resolvePrereleaseTag(options, config);\n const versionBump = calculateVersionBump(currentVersion, commits, options.version, prereleaseTag);\n\n result.newVersion = versionBump.newVersion;\n\n // Проверяем что тег не существует\n const tag = `${pkg.tagPrefix}${versionBump.newVersion}`;\n result.tag = tag;\n\n if (await tagExists(tag)) {\n throw new Error(`Tag ${tag} already exists`);\n }\n\n // Генерируем CHANGELOG\n const changelogEntry = generateChangelog(\n {\n commits,\n date: new Date(),\n repoUrl: repoInfo.url,\n version: versionBump.newVersion,\n },\n config.changelog,\n );\n\n if (options.dryRun) {\n printDryRunInfo(pkg, currentVersion, versionBump, tag, commits, changelogEntry);\n result.success = true;\n return result;\n }\n\n // Обновляем файлы пакета\n const changelogPath = await updatePackageFiles(pkg, versionBump.newVersion, changelogEntry);\n\n // Выполняем git операции\n await performGitOperations(config, options, pkg, versionBump.newVersion, tag, changelogPath);\n\n // Создаем GitVerse Release\n result.releaseUrl = await createGitVerseRelease(\n options,\n repoInfo,\n commits,\n config,\n pkg,\n versionBump,\n tag,\n result.warnings,\n );\n\n result.success = true;\n\n // Выводим итоги\n printSuccessInfo(pkg, currentVersion, versionBump.newVersion, tag, result.releaseUrl);\n\n return result;\n } catch (error) {\n result.success = false;\n result.errors.push(error instanceof Error ? error.message : String(error));\n\n console.error(\"\\n❌ Release failed:\\n\");\n console.error(error);\n console.error(\"\");\n\n return result;\n }\n}\n\n/**\n * Определяет какой пакет релизить\n */\nfunction resolvePackage(config: Required<ReleaseConfig>, packageName?: string): PackageConfig {\n if (!config.monorepo.enabled) {\n // Single package mode\n return {\n changelog: \"CHANGELOG.md\",\n name: \"main\",\n packageName: packageName || \"unknown\",\n path: \".\",\n tagPrefix: \"v\",\n };\n }\n\n // Monorepo mode\n if (!packageName) {\n throw new Error(\"Package name is required in monorepo mode. Use --package <name>\");\n }\n\n const pkg = config.monorepo.packages.find((p) => p.name === packageName);\n\n if (!pkg) {\n throw new Error(\n `Package \"${packageName}\" not found in config. Available packages: ${config.monorepo.packages.map((p) => p.name).join(\", \")}`,\n );\n }\n\n return pkg;\n}\n\nexport { loadConfig, validateConfig } from \"./config\";\nexport { createGitVerseClient } from \"./gitverse\";\n// Экспорты\nexport * from \"./types\";\n",
|
|
6
|
+
"import { readFile } from \"node:fs/promises\";\nimport { resolve } from \"node:path\";\nimport type { ReleaseConfig } from \"./types\";\n\n/**\n * Дефолтная конфигурация\n */\nexport const DEFAULT_CONFIG: Required<ReleaseConfig> = {\n changelog: {\n showAuthor: true,\n showHash: true,\n types: {\n build: \"🏗️ Build System\",\n chore: \"🔧 Chores\",\n ci: \"👷 CI/CD\",\n docs: \"📝 Documentation\",\n feat: \"✨ Features\",\n fix: \"🐛 Bug Fixes\",\n perf: \"⚡ Performance\",\n refactor: \"♻️ Refactoring\",\n revert: \"⏪ Reverts\",\n style: \"💄 Styling\",\n test: \"✅ Tests\",\n },\n },\n git: {\n commitChanges: true,\n commitMessage: \"chore(release): {{package}} v{{version}} [skip ci]\",\n push: true,\n tagMessage: \"Release {{package}} v{{version}}\",\n },\n monorepo: {\n enabled: false,\n packages: [],\n },\n versioning: {\n allowPrerelease: false,\n prereleasePrefix: \"beta\",\n },\n};\n\n/**\n * Загружает конфигурацию из файла\n */\nexport async function loadConfig(configPath?: string): Promise<Required<ReleaseConfig>> {\n const path = configPath || \".gitverereleaserc.json\";\n const fullPath = resolve(process.cwd(), path);\n\n try {\n const content = await readFile(fullPath, \"utf-8\");\n const userConfig = JSON.parse(content) as Partial<ReleaseConfig>;\n\n // Мерджим с дефолтной конфигурацией\n return mergeConfig(DEFAULT_CONFIG, userConfig);\n } catch (error) {\n // Если файл не найден, используем дефолтную конфигурацию\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n return DEFAULT_CONFIG;\n }\n\n throw new Error(\n `Failed to load config from ${fullPath}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n}\n\n/**\n * Мерджит пользовательскую конфигурацию с дефолтной\n */\nfunction mergeConfig(defaults: Required<ReleaseConfig>, user: Partial<ReleaseConfig>): Required<ReleaseConfig> {\n return {\n changelog: {\n ...defaults.changelog,\n ...user.changelog,\n types: {\n ...defaults.changelog.types,\n ...user.changelog?.types,\n },\n },\n git: {\n ...defaults.git,\n ...user.git,\n },\n monorepo: {\n ...defaults.monorepo,\n ...user.monorepo,\n },\n versioning: {\n ...defaults.versioning,\n ...user.versioning,\n },\n };\n}\n\n/**\n * Валидирует конфигурацию\n */\nexport function validateConfig(config: Required<ReleaseConfig>): void {\n if (config.monorepo.enabled && config.monorepo.packages.length === 0) {\n throw new Error(\"Monorepo mode is enabled but no packages are configured\");\n }\n\n for (const pkg of config.monorepo.packages) {\n if (!(pkg.name && pkg.path && pkg.packageName && pkg.tagPrefix)) {\n throw new Error(`Invalid package configuration for ${pkg.name || \"unknown\"}`);\n }\n }\n}\n",
|
|
7
|
+
"class j{client;constructor(b){this.client=b}async checkMembership(b,h){try{return await this.client.get(`/orgs/${b}/members/${h}`),!0}catch(d){if(d instanceof Error&&d.message.includes(\"404\"))return!1;throw d}}}export{j as OrganizationsApi};\nexport{j as a};\n\n//# debugId=C13270CF8AD6E2A964756E2164756E21\n",
|
|
8
|
+
"class g{client;constructor(b){this.client=b}list(b,d){return this.client.get(`/repos/${b}/${d}/commits`)}get(b,d,f){return this.client.get(`/repos/${b}/${d}/commits/${f}`)}create(b,d,f){return this.client.post(`/repos/${b}/${d}/git/commits`,f)}}export{g as CommitsApi};\nexport{g as b};\n\n//# debugId=61215F457F0A502764756E2164756E21\n",
|
|
9
|
+
"class v{client;constructor(b){this.client=b}listOrgRunners(b){return this.client.get(`/orgs/${b}/actions/runners`)}createOrgRegistrationToken(b){return this.client.post(`/orgs/${b}/actions/runners/registration-token`,{})}getOrgRunner(b,h){return this.client.get(`/orgs/${b}/actions/runners/${h}`)}deleteOrgRunner(b,h){return this.client.delete(`/orgs/${b}/actions/runners/${h}`)}listRepoRunners(b,h){return this.client.get(`/repos/${b}/${h}/actions/runners`)}createRepoRegistrationToken(b,h){return this.client.post(`/repos/${b}/${h}/actions/runners/registration-token`,{})}getRepoRunner(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/runners/${j}`)}deleteRepoRunner(b,h,j){return this.client.delete(`/repos/${b}/${h}/actions/runners/${j}`)}listOrgSecrets(b){return this.client.get(`/orgs/${b}/actions/secrets`)}getOrgSecret(b,h){return this.client.get(`/orgs/${b}/actions/secrets/${h}`)}createOrUpdateOrgSecret(b,h,j){return this.client.put(`/orgs/${b}/actions/secrets/${h}`,j)}deleteOrgSecret(b,h){return this.client.delete(`/orgs/${b}/actions/secrets/${h}`)}listRepoSecrets(b,h){return this.client.get(`/repos/${b}/${h}/actions/secrets`)}getRepoSecret(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/secrets/${j}`)}createOrUpdateRepoSecret(b,h,j,q){return this.client.put(`/repos/${b}/${h}/actions/secrets/${j}`,q)}deleteRepoSecret(b,h,j){return this.client.delete(`/repos/${b}/${h}/actions/secrets/${j}`)}listOrgVariables(b){return this.client.get(`/orgs/${b}/actions/variables`)}createOrgVariable(b,h){return this.client.post(`/orgs/${b}/actions/variables`,h)}getOrgVariable(b,h){return this.client.get(`/orgs/${b}/actions/variables/${h}`)}deleteOrgVariable(b,h){return this.client.delete(`/orgs/${b}/actions/variables/${h}`)}updateOrgVariable(b,h,j){return this.client.patch(`/orgs/${b}/actions/variables/${h}`,j)}listRepoVariables(b,h){return this.client.get(`/repos/${b}/${h}/actions/variables`)}createRepoVariable(b,h,j){return this.client.post(`/repos/${b}/${h}/actions/variables`,j)}getRepoVariable(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/variables/${j}`)}deleteRepoVariable(b,h,j){return this.client.delete(`/repos/${b}/${h}/actions/variables/${j}`)}updateRepoVariable(b,h,j,q){return this.client.patch(`/repos/${b}/${h}/actions/variables/${j}`,q)}listArtifacts(b,h){return this.client.get(`/repos/${b}/${h}/actions/artifacts`)}getArtifact(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/artifacts/${j}`)}deleteArtifact(b,h,j){return this.client.delete(`/repos/${b}/${h}/actions/artifacts/${j}`)}downloadArtifact(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/artifacts/${j}/zip`)}downloadArtifactRaw(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/artifacts/${j}/zip/raw`)}getWorkflowDispatchInputs(b,h,j){return this.client.get(`/repos/${b}/${h}/actions/workflows/${j}/dispatches`)}dispatchWorkflow(b,h,j,q){return this.client.post(`/repos/${b}/${h}/actions/workflows/${j}/dispatches`,q)}}export{v as ActionsApi};\nexport{v as c};\n\n//# debugId=C94CD5CE732DF06864756E2164756E21\n",
|
|
10
|
+
"class j extends Error{status;metadata;constructor(b,f,h){super(f);this.name=\"GitVerseApiError\",this.status=b,this.metadata=h,Object.setPrototypeOf(this,j.prototype)}}class k extends j{rateLimit;constructor(b,f,h){super(429,b,h);this.name=\"RateLimitError\",this.rateLimit=f,Object.setPrototypeOf(this,k.prototype)}getRetryAfterSeconds(){return this.rateLimit.retryAfter}getResetDate(){return new Date(this.rateLimit.reset*1000)}}class q{currentVersion;latestVersion;decommissioning;constructor(b,f,h){this.currentVersion=b,this.latestVersion=f,this.decommissioning=h}getMessage(){let b=`Используется устаревшая версия API: ${this.currentVersion}. Последняя версия: ${this.latestVersion}.`;if(this.decommissioning)b+=` Версия будет выведена из эксплуатации: ${this.decommissioning}.`;return b}}export{k as RateLimitError,j as GitVerseApiError,q as ApiVersionWarning};\nexport{j as v,k as w,q as x};\n\n//# debugId=244FAF075E55BD6464756E2164756E21\n",
|
|
11
|
+
"import{v as h}from\"../errors.js\";class j{client;constructor(b){this.client=b}list(){return this.client.get(\"/user/starred\")}async add(b,c){await this.client.put(`/user/starred/${b}/${c}`)}async check(b,c){try{return await this.client.get(`/user/starred/${b}/${c}`),!0}catch(f){if(f instanceof h&&f.status===404)return!1;throw f}}async remove(b,c){await this.client.delete(`/user/starred/${b}/${c}`)}}export{j as StarsApi};\nexport{j as d};\n\n//# debugId=EA86658A9ECD454B64756E2164756E21\n",
|
|
12
|
+
"class A{client;constructor(c){this.client=c}list(c,h,f){let j=new URLSearchParams;if(f)j.append(\"state\",f);let k=j.toString(),z=`/repos/${c}/${h}/issues${k?`?${k}`:\"\"}`;return this.client.get(z)}get(c,h,f){return this.client.get(`/repos/${c}/${h}/issues/${f}`)}getComment(c,h,f){return this.client.get(`/repos/${c}/${h}/issues/comments/${f}`)}getComments(c,h,f){return this.client.get(`/repos/${c}/${h}/issues/${f}/comments`)}getLabels(c,h,f){return this.client.get(`/repos/${c}/${h}/issues/${f}/labels`)}getTimeline(c,h,f){return this.client.get(`/repos/${c}/${h}/issues/${f}/timeline`)}}export{A as IssuesApi};\nexport{A as e};\n\n//# debugId=289B1FCE01AEA6F664756E2164756E21\n",
|
|
13
|
+
"class f{client;constructor(b){this.client=b}list(b,d){return this.client.get(`/repos/${b}/${d}/branches`)}}export{f as BranchesApi};\nexport{f};\n\n//# debugId=FD830EC0D6616EE464756E2164756E21\n",
|
|
14
|
+
"var y=/^[A-Za-z0-9+/=]+$/,z=/^([a-z][a-z0-9+.-]*:\\/\\/[^/]+)\\/([a-z][a-z0-9+.-]*:\\/\\/.+)$/i;function w(j){return Buffer.from(j).toString(\"base64\")}function A(j){return Buffer.from(j,\"base64\").toString(\"utf-8\")}function G(j,k,q){return{branch:q,content:w(j),message:k}}function H(j,k,q,v){return{branch:v,content:w(j),message:q,sha:k}}function I(j){if(!j.content)return\"\";if(j.encoding===\"base64\"){let k=j.content;if(!y.test(k))return k;try{return A(k)}catch{return k}}return j.content}function E(j){if(!j)return j;let k=j.match(z);if(k?.[1]&&k?.[2]){let q=k[1],v=k[2];if(v.startsWith(q))return v}return j}function J(j){let k=[\"clone_url\",\"html_url\",\"url\",\"git_url\",\"mirror_url\"],q={...j};for(let v of k)if(typeof q[v]===\"string\")q[v]=E(q[v]);return q}export{H as updateFileParams,I as parseFileContent,J as fixRepositoryUrls,E as fixDuplicatedUrl,w as encodeBase64,A as decodeBase64,G as createFileParams};\nexport{J as u};\n\n//# debugId=F1BB6E2CA5D979A564756E2164756E21\n",
|
|
15
|
+
"import{u as q}from\"../utils.js\";class z{client;constructor(g){this.client=g}async get(g,j){let k=await this.client.get(`/repos/${g}/${j}`);return q(k)}delete(g,j){return this.client.delete(`/repos/${g}/${j}`)}async update(g,j,k){let v=await this.client.patch(`/repos/${g}/${j}`,k);return q(v)}compare(g,j,k){return this.client.get(`/repos/${g}/${j}/compare/${k}`)}getLanguages(g,j){return this.client.get(`/repos/${g}/${j}/languages`)}async listForAuthenticatedUser(){return(await this.client.get(\"/user/repos\")).map((j)=>q(j))}async create(g){let j=await this.client.post(\"/user/repos\",g);return q(j)}}export{z as RepositoriesApi};\nexport{z as g};\n\n//# debugId=0CF25CF34B70341F64756E2164756E21\n",
|
|
16
|
+
"class h{client;constructor(d){this.client=d}list(d,f){return this.client.get(`/repos/${d}/${f}/collaborators`)}add(d,f,g){return this.client.put(`/repos/${d}/${f}/collaborators/${g}`,{})}}export{h as CollaboratorsApi};\nexport{h};\n\n//# debugId=38159AA44FAD0CBE64756E2164756E21\n",
|
|
17
|
+
"class j{client;constructor(b){this.client=b}get(b,d,f){return this.client.get(`/repos/${b}/${d}/contents/${f}`)}createFile(b,d,f,g){return this.client.put(`/repos/${b}/${d}/contents/${f}`,g)}updateFile(b,d,f,g){return this.client.put(`/repos/${b}/${d}/contents/${f}`,g)}deleteFile(b,d,f,g){return this.client.delete(`/repos/${b}/${d}/contents/${f}`,g)}}export{j as ContentsApi};\nexport{j as i};\n\n//# debugId=01D3BAD20A257EBF64756E2164756E21\n",
|
|
18
|
+
"class j{client;constructor(b){this.client=b}list(b){return this.client.get(`/orgs/${b}/teams`)}getInvitations(b,d){return this.client.get(`/orgs/${b}/teams/${d}/invitations`)}getMembers(b,d){return this.client.get(`/orgs/${b}/teams/${d}/members`)}addRepository(b,d,f,h){return this.client.put(`/orgs/${b}/teams/${d}/repos/${f}/${h}`,{})}}export{j as TeamsApi};\nexport{j};\n\n//# debugId=3ECAF54B3CA1F91764756E2164756E21\n",
|
|
19
|
+
"class g{client;constructor(b){this.client=b}createRef(b,d,f){return this.client.post(`/repos/${b}/${d}/git/refs`,f)}createTree(b,d,f){return this.client.post(`/repos/${b}/${d}/git/trees`,f)}getTree(b,d,f){return this.client.get(`/repos/${b}/${d}/git/trees/${f}`)}}export{g as GitApi};\nexport{g as k};\n\n//# debugId=D2B0CB1C080336A564756E2164756E21\n",
|
|
20
|
+
"class k{client;constructor(b){this.client=b}list(b,f){return this.client.get(`/repos/${b}/${f}/releases`)}create(b,f,h){return this.client.post(`/repos/${b}/${f}/releases`,h)}getByTag(b,f,h){return this.client.get(`/repos/${b}/${f}/releases/tags/${h}`)}deleteByTag(b,f,h){return this.client.delete(`/repos/${b}/${f}/releases/tags/${h}`)}get(b,f,h){return this.client.get(`/repos/${b}/${f}/releases/${h}`)}delete(b,f,h){return this.client.delete(`/repos/${b}/${f}/releases/${h}`)}update(b,f,h,j){return this.client.patch(`/repos/${b}/${f}/releases/${h}`,j)}getAssets(b,f,h){return this.client.get(`/repos/${b}/${f}/releases/${h}/assets`)}uploadAsset(b,f,h,j){return this.client.post(`/repos/${b}/${f}/releases/${h}/assets`,j)}deleteAsset(b,f,h,j){return this.client.delete(`/repos/${b}/${f}/releases/${h}/assets/${j}`)}}export{k as ReleasesApi};\nexport{k as l};\n\n//# debugId=7CD31A4CC1DE9F7664756E2164756E21\n",
|
|
21
|
+
"class v{client;constructor(d){this.client=d}create(d,g,f){return this.client.post(`/repos/${d}/${g}/pulls`,f)}get(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}`)}list(d,g,f){let k=new URL(`/repos/${d}/${g}/pulls`,\"http://localhost\");if(f)k.searchParams.set(\"state\",f);return this.client.get(k.href.replace(\"http://localhost\",\"\"))}update(d,g,f,j){return this.client.patch(`/repos/${d}/${g}/pulls/${f}`,j)}getFiles(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}/files`)}updateBranch(d,g,f){return this.client.put(`/repos/${d}/${g}/pulls/${f}/update-branch`,{})}getCommits(d,g,f){return this.client.get(`/repos/${d}/${g}/pulls/${f}/commits`)}}export{v as PullsApi};\nexport{v as m};\n\n//# debugId=35A0A924DAC8BD1664756E2164756E21\n",
|
|
22
|
+
"import{u as d}from\"../utils.js\";class k{client;constructor(b){this.client=b}async create(b,g,h){let j=await this.client.post(`/repos/${b}/${g}/forks`,h);return d(j)}}export{k as ForksApi};\nexport{k as n};\n\n//# debugId=2E98DE40FBCEC5CA64756E2164756E21\n",
|
|
23
|
+
"import{v as Q,w as S,x as U}from\"./errors.js\";var F={DELETE:\"DELETE\",GET:\"GET\",PATCH:\"PATCH\",POST:\"POST\",PUT:\"PUT\"};class Y{baseUrl;token;apiVersion;onApiVersionWarning;constructor(j={}){this.baseUrl=j.baseUrl||\"https://api.gitverse.ru\",this.token=j.token,this.apiVersion=j.apiVersion||\"1\"}setToken(j){this.token=j}extractRateLimitInfo(j){let q=j.get(\"GitVerse-RateLimit-Limit\"),x=j.get(\"GitVerse-RateLimit-Remaining\"),z=j.get(\"GitVerse-RateLimit-Retry-After\"),B=j.get(\"Gitverse-Ratelimit-Reset\");if(!(q&&x&&z&&B))return;return{limit:Number.parseInt(q,10),remaining:Number.parseInt(x,10),reset:Number.parseInt(B,10),retryAfter:Number.parseInt(z,10)}}extractApiVersionInfo(j){let q=j.get(\"Gitverse-Api-Version\"),x=j.get(\"Gitverse-Api-Latest-Version\"),z=j.get(\"Gitverse-Api-Deprecation\")===\"true\",B=j.get(\"Gitverse-Api-Decommissioning\");if(!(q&&x))return;return{decommissioning:B||void 0,deprecated:z,latestVersion:x,version:q}}extractMetadata(j){let q=this.extractRateLimitInfo(j),x=this.extractApiVersionInfo(j);if(x?.deprecated&&this.onApiVersionWarning){let z=new U(x.version,x.latestVersion,x.decommissioning);this.onApiVersionWarning(z)}return{apiVersion:x,rateLimit:q}}async request(j,q,x){let z=j.startsWith(\"/\")?j.slice(1):j,B=`${this.baseUrl}/${z}`,J=new Headers;if(J.set(\"Content-Type\",\"application/json\"),J.set(\"Accept\",`application/vnd.gitverse.object+json; version=${this.apiVersion}`),this.token)J.set(\"Authorization\",`Bearer ${this.token}`);let X={body:x?JSON.stringify(x):void 0,headers:J,method:q},D=await fetch(B,X),K=this.extractMetadata(D.headers),N;try{N=await D.json()}catch{N=void 0}if(!D.ok){let O=N?.message||D.statusText;if(D.status===429&&K.rateLimit)throw new S(O||\"Превышен лимит запросов. Попробуйте позже.\",K.rateLimit,K);throw new Q(D.status,O,K)}return N}get(j){return this.request(j,F.GET)}post(j,q){return this.request(j,F.POST,q)}put(j,q){return this.request(j,F.PUT,q)}delete(j,q){return this.request(j,F.DELETE,q)}patch(j,q){return this.request(j,F.PATCH,q)}}export{F as HTTPMethods,Y as GitVerseClient};\nexport{Y as o};\n\n//# debugId=3C1435E422FBD05064756E2164756E21\n",
|
|
24
|
+
"class d{client;constructor(b){this.client=b}getCurrent(){return this.client.get(\"/user\")}getByUsername(b){return this.client.get(`/users/${b}`)}}export{d as UsersApi};\nexport{d as y};\n\n//# debugId=E77D801B99FD164A64756E2164756E21\n",
|
|
25
|
+
"class c{client;constructor(b){this.client=b}list(){return this.client.get(\"/user/emails\")}add(b){return this.client.post(\"/user/emails\",b)}remove(b){return this.client.delete(\"/user/emails\",b)}}export{c as EmailsApi};\nexport{c as z};\n\n//# debugId=1FE313BCACDA9D3264756E2164756E21\n",
|
|
26
|
+
"import{a as L}from\"./api/organizations.js\";import{b as x}from\"./api/commits.js\";import{c as q}from\"./api/actions.js\";import{d as W}from\"./api/stars.js\";import{e as K}from\"./api/issues.js\";import{f as v}from\"./api/branches.js\";import{g as Q}from\"./api/repositories.js\";import{h as w}from\"./api/collaborators.js\";import{i as y}from\"./api/contents.js\";import{j as X}from\"./api/teams.js\";import{k as J}from\"./api/git.js\";import{l as N}from\"./api/releases.js\";import{m as M}from\"./api/pulls.js\";import{n as H}from\"./api/forks.js\";import{o as j}from\"./client.js\";import{p as B,q as E,r as F,s as I,t as O}from\"./enums.js\";import\"./utils.js\";import{v as Z,w as _,x as $}from\"./errors.js\";import{y as Y}from\"./api/users.js\";import{z as D}from\"./api/emails.js\";class P{client;users;repos;contents;pulls;forks;emails;issues;stars;branches;commits;collaborators;organizations;teams;releases;git;actions;constructor(d={}){this.client=new j(d),this.users=new Y(this.client),this.repos=new Q(this.client),this.contents=new y(this.client),this.pulls=new M(this.client),this.forks=new H(this.client),this.emails=new D(this.client),this.issues=new K(this.client),this.stars=new W(this.client),this.branches=new v(this.client),this.commits=new x(this.client),this.collaborators=new w(this.client),this.organizations=new L(this.client),this.teams=new X(this.client),this.releases=new N(this.client),this.git=new J(this.client),this.actions=new q(this.client)}setToken(d){return this.client.setToken(d),this}}export{E as VisibilityType,B as UserType,_ as RateLimitError,I as PullRequestState,O as IssueState,Z as GitVerseApiError,P as GitVerse,F as ContentType,$ as ApiVersionWarning};\n\n//# debugId=1FDA74B2231FF3F964756E2164756E21\n",
|
|
27
|
+
"import { GitVerse } from \"gitverse-api-sdk\";\nimport type { GitRepoInfo } from \"./types\";\n\n/**\n * GitVerse API клиент для создания релизов\n */\nexport class GitVerseReleaseClient {\n private client: GitVerse;\n private repoInfo: GitRepoInfo;\n\n constructor(token: string, repoInfo: GitRepoInfo) {\n this.client = new GitVerse({ token });\n this.repoInfo = repoInfo;\n }\n\n /**\n * Создает релиз на GitVerse\n */\n async createRelease(\n tag: string,\n name: string,\n body: string,\n options: {\n draft?: boolean;\n prerelease?: boolean;\n } = {},\n ): Promise<string> {\n const { owner, repo } = this.repoInfo;\n\n try {\n await this.client.releases.create(owner, repo, {\n body,\n draft: options.draft,\n name,\n prerelease: options.prerelease,\n tag_name: tag,\n });\n\n // Возвращаем URL релиза\n return `${this.repoInfo.url}/releases/tag/${tag}`;\n } catch (error) {\n throw new Error(`Failed to create GitVerse release: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Проверяет существование релиза по тегу\n */\n async releaseExists(tag: string): Promise<boolean> {\n const { owner, repo } = this.repoInfo;\n\n try {\n await this.client.releases.getByTag(owner, repo, tag);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Получает информацию о релизе по тегу\n */\n async getRelease(tag: string) {\n const { owner, repo } = this.repoInfo;\n return await this.client.releases.getByTag(owner, repo, tag);\n }\n}\n\n/**\n * Создает клиент для работы с GitVerse API\n */\nexport function createGitVerseClient(repoInfo: GitRepoInfo): GitVerseReleaseClient {\n const token = process.env.GITVERSE_TOKEN;\n\n if (!token) {\n throw new Error(\"GITVERSE_TOKEN environment variable is required for creating releases\");\n }\n\n return new GitVerseReleaseClient(token, repoInfo);\n}\n",
|
|
28
|
+
"import { readFile, writeFile } from \"node:fs/promises\";\nimport type { ChangelogConfig, ChangelogGenerateOptions, ConventionalCommit } from \"../types\";\nimport { groupCommitsByType } from \"./parser\";\n\n/**\n * Генерирует CHANGELOG для версии\n */\nexport function generateChangelog(options: ChangelogGenerateOptions, config: ChangelogConfig): string {\n const { version, commits, date = new Date(), repoUrl } = options;\n\n const sections: string[] = [];\n\n // Заголовок версии\n const dateStr = date.toISOString().split(\"T\")[0];\n sections.push(`## [${version}] - ${dateStr}`);\n sections.push(\"\");\n\n // Группируем коммиты по типам\n const grouped = groupCommitsByType(commits);\n\n // Сортируем типы по важности\n const typeOrder = [\"feat\", \"fix\", \"perf\", \"refactor\", \"docs\", \"test\", \"build\", \"ci\", \"chore\", \"style\", \"revert\"];\n\n // Сначала breaking changes\n const breakingCommits = commits.filter((c) => c.breaking);\n if (breakingCommits.length > 0) {\n sections.push(\"### ⚠️ BREAKING CHANGES\");\n sections.push(\"\");\n for (const commit of breakingCommits) {\n sections.push(formatCommit(commit, config, repoUrl));\n }\n sections.push(\"\");\n }\n\n // Затем остальные типы\n for (const type of typeOrder) {\n const typeCommits = grouped[type]?.filter((c) => !c.breaking);\n if (!typeCommits || typeCommits.length === 0) {\n continue;\n }\n\n const title = config.types[type] || type.toUpperCase();\n sections.push(`### ${title}`);\n sections.push(\"\");\n\n for (const commit of typeCommits) {\n sections.push(formatCommit(commit, config, repoUrl));\n }\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\");\n}\n\n/**\n * Форматирует коммит для CHANGELOG\n */\nfunction formatCommit(commit: ConventionalCommit, config: ChangelogConfig, repoUrl?: string): string {\n const parts: string[] = [];\n\n // Основное сообщение\n let message = commit.subject;\n\n // Добавляем scope если есть\n if (commit.scope) {\n message = `**${commit.scope}:** ${message}`;\n }\n\n parts.push(`- ${message}`);\n\n // Добавляем hash если включено\n if (config.showHash && repoUrl) {\n parts.push(`([${commit.shortHash}](${repoUrl}/commit/${commit.hash}))`);\n } else if (config.showHash) {\n parts.push(`(${commit.shortHash})`);\n }\n\n // Добавляем автора если включено\n if (config.showAuthor) {\n parts.push(`by @${commit.author}`);\n }\n\n return parts.join(\" \");\n}\n\n/**\n * Обновляет CHANGELOG файл, добавляя новую версию в начало\n */\nexport async function updateChangelogFile(changelogPath: string, newEntry: string): Promise<void> {\n let existingContent = \"\";\n\n try {\n existingContent = await readFile(changelogPath, \"utf-8\");\n } catch (error) {\n // Файл не существует, создаем новый\n if (error instanceof Error && \"code\" in error && error.code === \"ENOENT\") {\n existingContent = \"# Changelog\\n\\nAll notable changes to this project will be documented in this file.\\n\\n\";\n } else {\n throw error;\n }\n }\n\n // Находим место для вставки (после заголовка и описания)\n const lines = existingContent.split(\"\\n\");\n let insertIndex = 0;\n\n // Пропускаем заголовок и пустые строки в начале\n for (let i = 0; i < lines.length; i++) {\n const currentLine = lines[i];\n const prevLine = lines[i - 1];\n\n if (currentLine?.startsWith(\"## \")) {\n // Нашли первую версию\n insertIndex = i;\n break;\n }\n if (i > 0 && currentLine?.trim() === \"\" && prevLine?.trim() !== \"\") {\n // Нашли первую пустую строку после текста\n insertIndex = i + 1;\n }\n }\n\n // Если не нашли место, добавляем в конец\n if (insertIndex === 0) {\n insertIndex = lines.length;\n }\n\n // Вставляем новую запись\n lines.splice(insertIndex, 0, newEntry);\n\n // Записываем обратно\n await writeFile(changelogPath, lines.join(\"\\n\"));\n}\n\n/**\n * Генерирует CHANGELOG текст для GitVerse Release\n * (более компактный формат без markdown заголовков)\n */\nexport function generateReleaseNotes(commits: ConventionalCommit[], config: ChangelogConfig): string {\n const sections: string[] = [];\n\n // Breaking changes\n const breakingCommits = commits.filter((c) => c.breaking);\n if (breakingCommits.length > 0) {\n sections.push(\"⚠️ BREAKING CHANGES:\");\n for (const commit of breakingCommits) {\n sections.push(`- ${commit.subject}`);\n }\n sections.push(\"\");\n }\n\n // Группируем остальные\n const grouped = groupCommitsByType(commits.filter((c) => !c.breaking));\n\n const typeOrder = [\"feat\", \"fix\", \"perf\", \"refactor\"];\n\n for (const type of typeOrder) {\n const typeCommits = grouped[type];\n if (!typeCommits || typeCommits.length === 0) {\n continue;\n }\n\n const title = config.types[type] || type.toUpperCase();\n sections.push(`${title}:`);\n for (const commit of typeCommits) {\n let message = commit.subject;\n if (commit.scope) {\n message = `**${commit.scope}:** ${message}`;\n }\n sections.push(`- ${message}`);\n }\n sections.push(\"\");\n }\n\n return sections.join(\"\\n\").trim();\n}\n",
|
|
29
|
+
"import type { ConventionalCommit } from \"../types\";\n\n/**\n * Регулярное выражение для парсинга Conventional Commit\n * Формат: type(scope): subject\n * type(scope)!: subject (breaking)\n * type!: subject (breaking без scope)\n */\nconst COMMIT_REGEX = /^(?<type>\\w+)(?:\\((?<scope>[^)]+)\\))?(?<breaking>!)?: (?<subject>.+)$/;\n\n/**\n * Парсит сырой коммит из git log в структуру ConventionalCommit\n */\nexport function parseCommit(rawCommit: string): ConventionalCommit | null {\n const lines = rawCommit.split(\"\\n\");\n\n if (lines.length < 5) {\n return null; // Недостаточно данных\n }\n\n // Формат git log --format=\"%H%n%h%n%an%n%ae%n%ai%n%B\"\n const [hash, shortHash, author, email, dateStr, ...messageLines] = lines;\n\n if (!(hash && shortHash && author && email && dateStr)) {\n return null; // Неполные данные\n }\n\n const message = messageLines.join(\"\\n\").trim();\n const messageParts = message.split(\"\\n\");\n const firstLine = messageParts[0];\n const bodyLines = messageParts.slice(1);\n\n if (!firstLine) {\n return null; // Пустое сообщение\n }\n\n // Парсим первую строку\n const match = firstLine.match(COMMIT_REGEX);\n\n if (!match?.groups) {\n // Не соответствует формату Conventional Commits - пропускаем\n return null;\n }\n\n const { type, scope, breaking, subject } = match.groups;\n\n if (!(type && subject)) {\n return null; // Неполное соответствие\n }\n\n // Ищем breaking change в теле или футере\n const body = bodyLines.join(\"\\n\").trim();\n const hasBreakingInBody = body.includes(\"BREAKING CHANGE:\") || body.includes(\"BREAKING-CHANGE:\");\n\n return {\n author,\n body: body || undefined,\n breaking: !!breaking || hasBreakingInBody,\n date: new Date(dateStr),\n email,\n footer: undefined, // TODO: парсинг футера если нужно\n hash,\n raw: message,\n scope: scope || undefined,\n shortHash,\n subject,\n type,\n };\n}\n\n/**\n * Парсит массив сырых коммитов\n */\nexport function parseCommits(rawCommits: string[]): ConventionalCommit[] {\n return rawCommits.map((raw) => parseCommit(raw)).filter((commit): commit is ConventionalCommit => commit !== null);\n}\n\n/**\n * Группирует коммиты по типам\n */\nexport function groupCommitsByType(commits: ConventionalCommit[]): Record<string, ConventionalCommit[]> {\n const groups: Record<string, ConventionalCommit[]> = {};\n\n for (const commit of commits) {\n if (!groups[commit.type]) {\n groups[commit.type] = [];\n }\n groups[commit.type]?.push(commit);\n }\n\n return groups;\n}\n\n/**\n * Фильтрует коммиты по scope\n */\nexport function filterCommitsByScope(commits: ConventionalCommit[], scope: string): ConventionalCommit[] {\n return commits.filter((commit) => commit.scope === scope);\n}\n\n/**\n * Проверяет, есть ли breaking changes\n */\nexport function hasBreakingChanges(commits: ConventionalCommit[]): boolean {\n return commits.some((commit) => commit.breaking);\n}\n\n/**\n * Проверяет, есть ли новые features\n */\nexport function hasFeatures(commits: ConventionalCommit[]): boolean {\n return commits.some((commit) => commit.type === \"feat\");\n}\n\n/**\n * Проверяет, есть ли bug fixes\n */\nexport function hasFixes(commits: ConventionalCommit[]): boolean {\n return commits.some((commit) => commit.type === \"fix\");\n}\n",
|
|
30
|
+
"import { exec } from \"node:child_process\";\nimport { promisify } from \"node:util\";\nimport type { GitRepoInfo } from \"../types\";\n\nconst execAsync = promisify(exec);\n\n// Regex для парсинга GitVerse URL\nconst GITVERSE_URL_REGEX_1 = /gitverse\\.ru[:/]([^/]+)\\/([^/.]+)(\\.git)?$/;\nconst GITVERSE_URL_REGEX_2 = /gitverse\\.ru\\/([^/]+)\\/([^/.]+)(\\.git)?$/;\n\n/**\n * Выполняет git команду\n */\nasync function git(command: string): Promise<string> {\n const { stdout } = await execAsync(`git ${command}`);\n return stdout.trim();\n}\n\n/**\n * Получает информацию о Git репозитории\n *\n * Приоритет источников данных:\n * 1. Переменные окружения GitVerse Actions (для CI/CD)\n * 2. Git remote URL (для локального использования)\n */\nexport async function getRepoInfo(): Promise<GitRepoInfo> {\n // Сначала пробуем получить из GitVerse Actions переменных окружения\n // Это более надежно в CI/CD окружении и не требует git операций\n if (process.env.GITVERSE_ACTIONS === \"true\" && process.env.GITHUB_REPOSITORY) {\n const fullName = process.env.GITHUB_REPOSITORY;\n const parts = fullName.split(\"/\");\n\n if (parts.length === 2 && parts[0] && parts[1]) {\n const owner = parts[0];\n const repo = parts[1];\n const branch = process.env.GITHUB_REF_NAME || \"main\";\n\n return {\n branch,\n fullName,\n owner,\n repo,\n url: `https://gitverse.ru/${owner}/${repo}`,\n };\n }\n }\n\n // Fallback на парсинг git remote (для локального использования)\n const url = await git(\"remote get-url origin\");\n\n // Парсим owner/repo из URL\n // Поддерживаемые форматы:\n // - https://gitverse.ru/owner/repo.git\n // - https://gitverse.ru/owner/repo\n // - git@gitverse.ru:owner/repo.git\n const match = url.match(GITVERSE_URL_REGEX_1) || url.match(GITVERSE_URL_REGEX_2);\n\n if (!(match?.[1] && match[2])) {\n throw new Error(`Unable to parse GitVerse repository from URL: ${url}`);\n }\n\n const owner = match[1];\n const repo = match[2];\n\n // Получаем текущую ветку\n const branch = await git(\"branch --show-current\");\n\n return {\n branch,\n fullName: `${owner}/${repo}`,\n owner,\n repo,\n url: `https://gitverse.ru/${owner}/${repo}`,\n };\n}\n\n/**\n * Получает последний тег с указанным префиксом\n */\nexport async function getLatestTag(prefix: string): Promise<string | null> {\n try {\n const tags = await git(`tag --sort=-v:refname --list \"${prefix}*\"`);\n const tagList = tags.split(\"\\n\").filter((tag) => tag.length > 0);\n\n return tagList.length > 0 ? (tagList[0] ?? null) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Получает список коммитов с момента последнего тега\n */\nexport async function getCommitsSinceTag(tagPrefix: string, path?: string): Promise<string[]> {\n const latestTag = await getLatestTag(tagPrefix);\n\n let range: string;\n if (latestTag) {\n range = `${latestTag}..HEAD`;\n } else {\n // Если тега нет, берем все коммиты\n range = \"HEAD\";\n }\n\n const format = \"%H%n%h%n%an%n%ae%n%ai%n%B%n==END==\";\n const pathFilter = path ? `-- ${path}` : \"\";\n\n const log = await git(`log ${range} --format=\"${format}\" ${pathFilter}`);\n\n // Парсим вывод git log\n // Используем split по \\n==END== чтобы корректно обработать последний коммит после trim()\n const commits = log\n .split(\"\\n==END==\")\n .map((commit) => commit.trim())\n .filter((commit) => commit.length > 0 && commit !== \"==END==\");\n\n return commits;\n}\n\n/**\n * Получает текущую версию из package.json\n */\nexport async function getCurrentVersion(packagePath: string): Promise<string> {\n const { readFile } = await import(\"node:fs/promises\");\n const { resolve } = await import(\"node:path\");\n\n const pkgJsonPath = resolve(packagePath, \"package.json\");\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkgJson = JSON.parse(content);\n\n if (!pkgJson.version) {\n throw new Error(`No version found in ${pkgJsonPath}`);\n }\n\n return pkgJson.version;\n}\n\n/**\n * Обновляет версию в package.json\n */\nexport async function updatePackageVersion(packagePath: string, newVersion: string): Promise<void> {\n const { readFile, writeFile } = await import(\"node:fs/promises\");\n const { resolve } = await import(\"node:path\");\n\n const pkgJsonPath = resolve(packagePath, \"package.json\");\n const content = await readFile(pkgJsonPath, \"utf-8\");\n const pkgJson = JSON.parse(content);\n\n pkgJson.version = newVersion;\n\n await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\\n`);\n}\n\n/**\n * Создает git коммит\n */\nexport async function createCommit(message: string, files: string[]): Promise<void> {\n // Добавляем файлы\n for (const file of files) {\n await git(`add \"${file}\"`);\n }\n\n // Создаем коммит\n await git(`commit -m \"${message}\"`);\n}\n\n/**\n * Создает git тег\n */\nexport async function createTag(tag: string, message: string): Promise<void> {\n await git(`tag -a \"${tag}\" -m \"${message}\"`);\n}\n\n/**\n * Пушит изменения и теги в remote\n */\nexport async function pushChanges(tag?: string): Promise<void> {\n // Пушим коммиты\n await git(\"push\");\n\n // Пушим тег, если указан\n if (tag) {\n await git(`push origin \"${tag}\"`);\n }\n}\n\n/**\n * Проверяет, что рабочая директория чистая\n */\nexport async function isWorkingTreeClean(): Promise<boolean> {\n try {\n const status = await git(\"status --porcelain\");\n return status.length === 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Проверяет, что тег существует\n */\nexport async function tagExists(tag: string): Promise<boolean> {\n try {\n await git(`rev-parse \"${tag}\"`);\n return true;\n } catch {\n return false;\n }\n}\n",
|
|
31
|
+
"import type { BumpType, ConventionalCommit, VersionBump } from \"../types\";\nimport { hasBreakingChanges, hasFeatures, hasFixes } from \"./parser\";\n\n/**\n * Парсит версию в компоненты\n */\ninterface SemanticVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease?: string;\n}\n\n// Regex для парсинга версий\nconst VERSION_REGEX = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-(.+))?$/;\nconst PRERELEASE_INCREMENT_REGEX = /^(.+)\\.(\\d+)$/;\n\n/**\n * Парсит строку версии\n */\nfunction parseVersion(version: string): SemanticVersion {\n // Удаляем префикс 'v' если есть\n const v = version.startsWith(\"v\") ? version.slice(1) : version;\n\n const match = v.match(VERSION_REGEX);\n if (!(match?.[1] && match[2] && match[3])) {\n throw new Error(`Invalid version format: ${version}`);\n }\n\n return {\n major: Number.parseInt(match[1], 10),\n minor: Number.parseInt(match[2], 10),\n patch: Number.parseInt(match[3], 10),\n prerelease: match[4],\n };\n}\n\n/**\n * Форматирует версию в строку\n */\nfunction formatVersion(ver: SemanticVersion): string {\n let result = `${ver.major}.${ver.minor}.${ver.patch}`;\n if (ver.prerelease) {\n result += `-${ver.prerelease}`;\n }\n return result;\n}\n\n/**\n * Определяет тип изменения версии на основе коммитов\n */\nexport function determineBumpType(commits: ConventionalCommit[]): BumpType | null {\n if (commits.length === 0) {\n return null;\n }\n\n if (hasBreakingChanges(commits)) {\n return \"major\";\n }\n\n if (hasFeatures(commits)) {\n return \"minor\";\n }\n\n if (hasFixes(commits)) {\n return \"patch\";\n }\n\n // Если есть другие типы коммитов (chore, docs, etc), делаем patch\n return \"patch\";\n}\n\n/**\n * Увеличивает версию согласно типу изменения\n */\nexport function bumpVersion(currentVersion: string, bumpType: BumpType, prereleasePrefix?: string): string {\n const ver = parseVersion(currentVersion);\n\n switch (bumpType) {\n case \"major\":\n ver.major += 1;\n ver.minor = 0;\n ver.patch = 0;\n ver.prerelease = undefined;\n break;\n case \"minor\":\n ver.minor += 1;\n ver.patch = 0;\n ver.prerelease = undefined;\n break;\n case \"patch\":\n ver.patch += 1;\n ver.prerelease = undefined;\n break;\n case \"prerelease\":\n if (ver.prerelease) {\n // Инкрементируем номер prerelease\n const match = ver.prerelease.match(PRERELEASE_INCREMENT_REGEX);\n if (match?.[1] && match[2]) {\n const prefix = match[1];\n const num = Number.parseInt(match[2], 10);\n ver.prerelease = `${prefix}.${num + 1}`;\n } else {\n ver.prerelease = `${ver.prerelease}.1`;\n }\n } else {\n // Создаем первый prerelease\n ver.patch += 1;\n ver.prerelease = `${prereleasePrefix || \"beta\"}.0`;\n }\n break;\n }\n\n return formatVersion(ver);\n}\n\n/**\n * Вычисляет bump версии на основе коммитов\n */\nexport function calculateVersionBump(\n currentVersion: string,\n commits: ConventionalCommit[],\n forceVersion?: string,\n prerelease?: string,\n): VersionBump {\n const bumpType = prerelease ? \"prerelease\" : determineBumpType(commits) || \"patch\";\n\n const newVersion = forceVersion || bumpVersion(currentVersion, bumpType, prerelease);\n\n return {\n bumpType,\n commits,\n currentVersion,\n hasBreaking: hasBreakingChanges(commits),\n hasFeatures: hasFeatures(commits),\n hasFixes: hasFixes(commits),\n newVersion,\n };\n}\n\n/**\n * Сравнивает две версии\n * Возвращает: -1 если a < b, 0 если a === b, 1 если a > b\n */\nexport function compareVersions(a: string, b: string): number {\n const verA = parseVersion(a);\n const verB = parseVersion(b);\n\n if (verA.major !== verB.major) {\n return verA.major > verB.major ? 1 : -1;\n }\n if (verA.minor !== verB.minor) {\n return verA.minor > verB.minor ? 1 : -1;\n }\n if (verA.patch !== verB.patch) {\n return verA.patch > verB.patch ? 1 : -1;\n }\n\n // Сравнение prerelease\n if (verA.prerelease && !verB.prerelease) {\n return -1; // prerelease всегда меньше релиза\n }\n if (!verA.prerelease && verB.prerelease) {\n return 1;\n }\n if (verA.prerelease && verB.prerelease) {\n return verA.prerelease.localeCompare(verB.prerelease);\n }\n\n return 0;\n}\n"
|
|
32
|
+
],
|
|
33
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA,oBAAS;;;ACAT;AACA;AAMO,IAAM,iBAA0C;AAAA,EACrD,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IACV,OAAO;AAAA,MACL,OAAO;AAAA,MACP,OAAO;AAAA,MACP,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,eAAe;AAAA,IACf,eAAe;AAAA,IACf,MAAM;AAAA,IACN,YAAY;AAAA,EACd;AAAA,EACA,UAAU;AAAA,IACR,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AAAA,EACA,YAAY;AAAA,IACV,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,EACpB;AACF;AAKA,eAAsB,UAAU,CAAC,YAAuD;AAAA,EACtF,MAAM,OAAO,cAAc;AAAA,EAC3B,MAAM,WAAW,QAAQ,QAAQ,IAAI,GAAG,IAAI;AAAA,EAE5C,IAAI;AAAA,IACF,MAAM,UAAU,MAAM,SAAS,UAAU,OAAO;AAAA,IAChD,MAAM,aAAa,KAAK,MAAM,OAAO;AAAA,IAGrC,OAAO,YAAY,gBAAgB,UAAU;AAAA,IAC7C,OAAO,OAAO;AAAA,IAEd,IAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU;AAAA,MACxE,OAAO;AAAA,IACT;AAAA,IAEA,MAAM,IAAI,MACR,8BAA8B,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAClG;AAAA;AAAA;AAOJ,SAAS,WAAW,CAAC,UAAmC,MAAuD;AAAA,EAC7G,OAAO;AAAA,IACL,WAAW;AAAA,SACN,SAAS;AAAA,SACT,KAAK;AAAA,MACR,OAAO;AAAA,WACF,SAAS,UAAU;AAAA,WACnB,KAAK,WAAW;AAAA,MACrB;AAAA,IACF;AAAA,IACA,KAAK;AAAA,SACA,SAAS;AAAA,SACT,KAAK;AAAA,IACV;AAAA,IACA,UAAU;AAAA,SACL,SAAS;AAAA,SACT,KAAK;AAAA,IACV;AAAA,IACA,YAAY;AAAA,SACP,SAAS;AAAA,SACT,KAAK;AAAA,IACV;AAAA,EACF;AAAA;AAMK,SAAS,cAAc,CAAC,QAAuC;AAAA,EACpE,IAAI,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,WAAW,GAAG;AAAA,IACpE,MAAM,IAAI,MAAM,yDAAyD;AAAA,EAC3E;AAAA,EAEA,WAAW,OAAO,OAAO,SAAS,UAAU;AAAA,IAC1C,IAAI,EAAE,IAAI,QAAQ,IAAI,QAAQ,IAAI,eAAe,IAAI,YAAY;AAAA,MAC/D,MAAM,IAAI,MAAM,qCAAqC,IAAI,QAAQ,WAAW;AAAA,IAC9E;AAAA,EACF;AAAA;;;AC1GF,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,OAAQ,gBAAe,CAAC,GAAE,GAAE;AAAA,IAAC,IAAG;AAAA,MAAC,OAAO,MAAM,KAAK,OAAO,IAAI,SAAS,aAAa,GAAG,GAAE;AAAA,MAAG,OAAM,GAAE;AAAA,MAAC,IAAG,aAAa,SAAO,EAAE,QAAQ,SAAS,KAAK;AAAA,QAAE,OAAM;AAAA,MAAG,MAAM;AAAA;AAAA;AAAG;;;ACAlN,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,WAAW;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,aAAa,GAAG;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,iBAAgB,CAAC;AAAA;AAAE;;;ACApP,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,cAAc,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,mBAAmB;AAAA;AAAA,EAAE,0BAA0B,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,SAAS,wCAAuC,CAAC,CAAC;AAAA;AAAA,EAAE,YAAY,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,qBAAqB,GAAG;AAAA;AAAA,EAAE,eAAe,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,SAAS,qBAAqB,GAAG;AAAA;AAAA,EAAE,eAAe,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,mBAAmB;AAAA;AAAA,EAAE,2BAA2B,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,wCAAuC,CAAC,CAAC;AAAA;AAAA,EAAE,aAAa,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,qBAAqB,IAAG;AAAA;AAAA,EAAE,gBAAgB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,qBAAqB,IAAG;AAAA;AAAA,EAAE,cAAc,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,mBAAmB;AAAA;AAAA,EAAE,YAAY,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,qBAAqB,GAAG;AAAA;AAAA,EAAE,uBAAuB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,qBAAqB,KAAI,EAAC;AAAA;AAAA,EAAE,eAAe,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,SAAS,qBAAqB,GAAG;AAAA;AAAA,EAAE,eAAe,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,mBAAmB;AAAA;AAAA,EAAE,aAAa,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,qBAAqB,IAAG;AAAA;AAAA,EAAE,wBAAwB,CAAC,GAAE,GAAE,IAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,qBAAqB,MAAI,CAAC;AAAA;AAAA,EAAE,gBAAgB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,qBAAqB,IAAG;AAAA;AAAA,EAAE,gBAAgB,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,qBAAqB;AAAA;AAAA,EAAE,iBAAiB,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,SAAS,uBAAsB,CAAC;AAAA;AAAA,EAAE,cAAc,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,uBAAuB,GAAG;AAAA;AAAA,EAAE,iBAAiB,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,SAAS,uBAAuB,GAAG;AAAA;AAAA,EAAE,iBAAiB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,MAAM,SAAS,uBAAuB,KAAI,EAAC;AAAA;AAAA,EAAE,iBAAiB,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,qBAAqB;AAAA;AAAA,EAAE,kBAAkB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,uBAAsB,EAAC;AAAA;AAAA,EAAE,eAAe,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,uBAAuB,IAAG;AAAA;AAAA,EAAE,kBAAkB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,uBAAuB,IAAG;AAAA;AAAA,EAAE,kBAAkB,CAAC,GAAE,GAAE,IAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,MAAM,UAAU,KAAK,uBAAuB,MAAI,CAAC;AAAA;AAAA,EAAE,aAAa,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,qBAAqB;AAAA;AAAA,EAAE,WAAW,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,uBAAuB,IAAG;AAAA;AAAA,EAAE,cAAc,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,uBAAuB,IAAG;AAAA;AAAA,EAAE,gBAAgB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,uBAAuB,QAAO;AAAA;AAAA,EAAE,mBAAmB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,uBAAuB,YAAW;AAAA;AAAA,EAAE,yBAAyB,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,uBAAuB,eAAc;AAAA;AAAA,EAAE,gBAAgB,CAAC,GAAE,GAAE,IAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,uBAAuB,iBAAe,CAAC;AAAA;AAAE;;;ACAh5F,MAAM,WAAU,MAAK;AAAA,EAAC;AAAA,EAAO;AAAA,EAAS,WAAW,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,MAAM,CAAC;AAAA,IAAE,KAAK,OAAK,oBAAmB,KAAK,SAAO,GAAE,KAAK,WAAS,GAAE,OAAO,eAAe,MAAK,GAAE,SAAS;AAAA;AAAE;AAAA;AAAC,MAAM,UAAU,GAAC;AAAA,EAAC;AAAA,EAAU,WAAW,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,MAAM,KAAI,GAAE,CAAC;AAAA,IAAE,KAAK,OAAK,kBAAiB,KAAK,YAAU,GAAE,OAAO,eAAe,MAAK,EAAE,SAAS;AAAA;AAAA,EAAE,oBAAoB,GAAE;AAAA,IAAC,OAAO,KAAK,UAAU;AAAA;AAAA,EAAW,YAAY,GAAE;AAAA,IAAC,OAAO,IAAI,KAAK,KAAK,UAAU,QAAM,IAAI;AAAA;AAAE;AAAA;AAAC,MAAM,EAAC;AAAA,EAAC;AAAA,EAAe;AAAA,EAAc;AAAA,EAAgB,WAAW,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,KAAK,iBAAe,GAAE,KAAK,gBAAc,GAAE,KAAK,kBAAgB;AAAA;AAAA,EAAE,UAAU,GAAE;AAAA,IAAC,IAAI,IAAE,uCAAsC,KAAK,qCAAqC,KAAK;AAAA,IAAiB,IAAG,KAAK;AAAA,MAAgB,KAAG,2CAA2C,KAAK;AAAA,IAAmB,OAAO;AAAA;AAAE;;;ACApvB,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,eAAe;AAAA;AAAA,OAAQ,IAAG,CAAC,GAAE,GAAE;AAAA,IAAC,MAAM,KAAK,OAAO,IAAI,iBAAiB,KAAK,GAAG;AAAA;AAAA,OAAQ,MAAK,CAAC,GAAE,GAAE;AAAA,IAAC,IAAG;AAAA,MAAC,OAAO,MAAM,KAAK,OAAO,IAAI,iBAAiB,KAAK,GAAG,GAAE;AAAA,MAAG,OAAM,GAAE;AAAA,MAAC,IAAG,aAAa,MAAG,EAAE,WAAS;AAAA,QAAI,OAAM;AAAA,MAAG,MAAM;AAAA;AAAA;AAAA,OAAS,OAAM,CAAC,GAAE,GAAE;AAAA,IAAC,MAAM,KAAK,OAAO,OAAO,iBAAiB,KAAK,GAAG;AAAA;AAAE;;;ACA/Y,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,IAAI,KAAE,IAAI;AAAA,IAAgB,IAAG;AAAA,MAAE,GAAE,OAAO,SAAQ,CAAC;AAAA,IAAE,IAAI,KAAE,GAAE,SAAS,GAAE,IAAE,UAAU,KAAK,WAAW,KAAE,IAAI,OAAI;AAAA,IAAK,OAAO,KAAK,OAAO,IAAI,CAAC;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAY,GAAG;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,qBAAqB,GAAG;AAAA;AAAA,EAAE,WAAW,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAY,YAAY;AAAA;AAAA,EAAE,SAAS,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAY,UAAU;AAAA;AAAA,EAAE,WAAW,CAAC,GAAE,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAY,YAAY;AAAA;AAAE;;;ACA5kB,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAY;AAAA;AAAE;;;ACA1G,IAA0B,IAAE;AAAwc,SAAS,CAAC,CAAC,IAAE;AAAA,EAAC,IAAG,CAAC;AAAA,IAAE,OAAO;AAAA,EAAE,IAAI,KAAE,GAAE,MAAM,CAAC;AAAA,EAAE,IAAG,KAAI,MAAI,KAAI,IAAG;AAAA,IAAC,IAAI,KAAE,GAAE,IAAG,KAAE,GAAE;AAAA,IAAG,IAAG,GAAE,WAAW,EAAC;AAAA,MAAE,OAAO;AAAA,EAAC;AAAA,EAAC,OAAO;AAAA;AAAE,SAAS,CAAC,CAAC,IAAE;AAAA,EAAC,IAAI,KAAE,CAAC,aAAY,YAAW,OAAM,WAAU,YAAY,GAAE,KAAE,KAAI,GAAC;AAAA,EAAE,SAAQ,MAAK;AAAA,IAAE,IAAG,OAAO,GAAE,QAAK;AAAA,MAAS,GAAE,MAAG,EAAE,GAAE,GAAE;AAAA,EAAE,OAAO;AAAA;;;ACA5sB,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,IAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,OAAQ,IAAG,CAAC,IAAE,IAAE;AAAA,IAAC,IAAI,KAAE,MAAM,KAAK,OAAO,IAAI,UAAU,MAAK,IAAG;AAAA,IAAE,OAAO,EAAE,EAAC;AAAA;AAAA,EAAE,MAAM,CAAC,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,MAAK,IAAG;AAAA;AAAA,OAAQ,OAAM,CAAC,IAAE,IAAE,IAAE;AAAA,IAAC,IAAI,KAAE,MAAM,KAAK,OAAO,MAAM,UAAU,MAAK,MAAI,EAAC;AAAA,IAAE,OAAO,EAAE,EAAC;AAAA;AAAA,EAAE,OAAO,CAAC,IAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,MAAK,cAAa,IAAG;AAAA;AAAA,EAAE,YAAY,CAAC,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,MAAK,cAAa;AAAA;AAAA,OAAQ,yBAAwB,GAAE;AAAA,IAAC,QAAO,MAAM,KAAK,OAAO,IAAI,aAAa,GAAG,IAAI,CAAC,OAAI,EAAE,EAAC,CAAC;AAAA;AAAA,OAAQ,OAAM,CAAC,IAAE;AAAA,IAAC,IAAI,KAAE,MAAM,KAAK,OAAO,KAAK,eAAc,EAAC;AAAA,IAAE,OAAO,EAAE,EAAC;AAAA;AAAE;;;ACA1lB,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,kBAAiB;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,oBAAmB,MAAI,CAAC,CAAC;AAAA;AAAE;;;ACA3L,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,cAAc,IAAG;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,cAAc,MAAI,EAAC;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,cAAc,MAAI,EAAC;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,cAAc,MAAI,EAAC;AAAA;AAAE;;;ACAhW,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,SAAS;AAAA;AAAA,EAAE,cAAc,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,WAAW,eAAe;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,WAAW,WAAW;AAAA;AAAA,EAAE,aAAa,CAAC,GAAE,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,SAAS,WAAW,WAAW,MAAK,MAAI,CAAC,CAAC;AAAA;AAAE;;;ACAjV,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,SAAS,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,cAAa,EAAC;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,eAAc,EAAC;AAAA;AAAA,EAAE,OAAO,CAAC,GAAE,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,eAAe,IAAG;AAAA;AAAE;;;ACAvQ,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,aAAY;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,eAAa,EAAC;AAAA;AAAA,EAAE,QAAQ,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,oBAAmB,IAAG;AAAA;AAAA,EAAE,WAAW,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,oBAAmB,IAAG;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,eAAc,IAAG;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,eAAc,IAAG;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE,IAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,MAAM,UAAU,KAAK,eAAc,MAAI,EAAC;AAAA;AAAA,EAAE,SAAS,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,eAAc,WAAU;AAAA;AAAA,EAAE,WAAW,CAAC,GAAE,IAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,eAAc,aAAW,EAAC;AAAA;AAAA,EAAE,WAAW,CAAC,GAAE,IAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,UAAU,KAAK,eAAc,aAAY,IAAG;AAAA;AAAE;;;ACAlzB,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,UAAU,KAAK,YAAU,EAAC;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAW,IAAG;AAAA;AAAA,EAAE,IAAI,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,IAAI,KAAE,IAAI,IAAI,UAAU,KAAK,YAAU,kBAAkB;AAAA,IAAE,IAAG;AAAA,MAAE,GAAE,aAAa,IAAI,SAAQ,EAAC;AAAA,IAAE,OAAO,KAAK,OAAO,IAAI,GAAE,KAAK,QAAQ,oBAAmB,EAAE,CAAC;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE,IAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,MAAM,UAAU,KAAK,YAAW,MAAI,EAAC;AAAA;AAAA,EAAE,QAAQ,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAW,UAAS;AAAA;AAAA,EAAE,YAAY,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAW,oBAAkB,CAAC,CAAC;AAAA;AAAA,EAAE,UAAU,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,KAAK,YAAW,YAAW;AAAA;AAAE;;;ACAxnB,MAAM,GAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,OAAQ,OAAM,CAAC,GAAE,IAAE,IAAE;AAAA,IAAC,IAAI,KAAE,MAAM,KAAK,OAAO,KAAK,UAAU,KAAK,YAAU,EAAC;AAAA,IAAE,OAAO,EAAE,EAAC;AAAA;AAAE;;;ACAvH,IAAI,IAAE,EAAC,QAAO,UAAS,KAAI,OAAM,OAAM,SAAQ,MAAK,QAAO,KAAI,MAAK;AAAA;AAAE,MAAM,EAAC;AAAA,EAAC;AAAA,EAAQ;AAAA,EAAM;AAAA,EAAW;AAAA,EAAoB,WAAW,CAAC,KAAE,CAAC,GAAE;AAAA,IAAC,KAAK,UAAQ,GAAE,WAAS,2BAA0B,KAAK,QAAM,GAAE,OAAM,KAAK,aAAW,GAAE,cAAY;AAAA;AAAA,EAAI,QAAQ,CAAC,IAAE;AAAA,IAAC,KAAK,QAAM;AAAA;AAAA,EAAE,oBAAoB,CAAC,IAAE;AAAA,IAAC,IAAI,KAAE,GAAE,IAAI,0BAA0B,GAAE,IAAE,GAAE,IAAI,8BAA8B,GAAE,KAAE,GAAE,IAAI,gCAAgC,GAAE,IAAE,GAAE,IAAI,0BAA0B;AAAA,IAAE,IAAG,EAAE,MAAG,KAAG,MAAG;AAAA,MAAG;AAAA,IAAO,OAAM,EAAC,OAAM,OAAO,SAAS,IAAE,EAAE,GAAE,WAAU,OAAO,SAAS,GAAE,EAAE,GAAE,OAAM,OAAO,SAAS,GAAE,EAAE,GAAE,YAAW,OAAO,SAAS,IAAE,EAAE,EAAC;AAAA;AAAA,EAAE,qBAAqB,CAAC,IAAE;AAAA,IAAC,IAAI,KAAE,GAAE,IAAI,sBAAsB,GAAE,IAAE,GAAE,IAAI,6BAA6B,GAAE,KAAE,GAAE,IAAI,0BAA0B,MAAI,QAAO,IAAE,GAAE,IAAI,8BAA8B;AAAA,IAAE,IAAG,EAAE,MAAG;AAAA,MAAG;AAAA,IAAO,OAAM,EAAC,iBAAgB,KAAQ,WAAE,YAAW,IAAE,eAAc,GAAE,SAAQ,GAAC;AAAA;AAAA,EAAE,eAAe,CAAC,IAAE;AAAA,IAAC,IAAI,KAAE,KAAK,qBAAqB,EAAC,GAAE,IAAE,KAAK,sBAAsB,EAAC;AAAA,IAAE,IAAG,GAAG,cAAY,KAAK,qBAAoB;AAAA,MAAC,IAAI,KAAE,IAAI,EAAE,EAAE,SAAQ,EAAE,eAAc,EAAE,eAAe;AAAA,MAAE,KAAK,oBAAoB,EAAC;AAAA,IAAC;AAAA,IAAC,OAAM,EAAC,YAAW,GAAE,WAAU,GAAC;AAAA;AAAA,OAAQ,QAAO,CAAC,IAAE,IAAE,GAAE;AAAA,IAAC,IAAI,KAAE,GAAE,WAAW,GAAG,IAAE,GAAE,MAAM,CAAC,IAAE,IAAE,IAAE,GAAG,KAAK,WAAW,MAAI,KAAE,IAAI;AAAA,IAAQ,IAAG,GAAE,IAAI,gBAAe,kBAAkB,GAAE,GAAE,IAAI,UAAS,iDAAiD,KAAK,YAAY,GAAE,KAAK;AAAA,MAAM,GAAE,IAAI,iBAAgB,UAAU,KAAK,OAAO;AAAA,IAAE,IAAI,IAAE,EAAC,MAAK,IAAE,KAAK,UAAU,CAAC,IAAO,WAAE,SAAQ,IAAE,QAAO,GAAC,GAAE,IAAE,MAAM,MAAM,GAAE,CAAC,GAAE,IAAE,KAAK,gBAAgB,EAAE,OAAO,GAAE;AAAA,IAAE,IAAG;AAAA,MAAC,IAAE,MAAM,EAAE,KAAK;AAAA,MAAE,MAAK;AAAA,MAAC,IAAO;AAAA;AAAA,IAAE,IAAG,CAAC,EAAE,IAAG;AAAA,MAAC,IAAI,IAAE,GAAG,WAAS,EAAE;AAAA,MAAW,IAAG,EAAE,WAAS,OAAK,EAAE;AAAA,QAAU,MAAM,IAAI,EAAE,KAAG,8CAA4C,EAAE,WAAU,CAAC;AAAA,MAAE,MAAM,IAAI,GAAE,EAAE,QAAO,GAAE,CAAC;AAAA,IAAC;AAAA,IAAC,OAAO;AAAA;AAAA,EAAE,GAAG,CAAC,IAAE;AAAA,IAAC,OAAO,KAAK,QAAQ,IAAE,EAAE,GAAG;AAAA;AAAA,EAAE,IAAI,CAAC,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,QAAQ,IAAE,EAAE,MAAK,EAAC;AAAA;AAAA,EAAE,GAAG,CAAC,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,QAAQ,IAAE,EAAE,KAAI,EAAC;AAAA;AAAA,EAAE,MAAM,CAAC,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,QAAQ,IAAE,EAAE,QAAO,EAAC;AAAA;AAAA,EAAE,KAAK,CAAC,IAAE,IAAE;AAAA,IAAC,OAAO,KAAK,QAAQ,IAAE,EAAE,OAAM,EAAC;AAAA;AAAE;;;ACA18D,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,UAAU,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,OAAO;AAAA;AAAA,EAAE,aAAa,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,UAAU,GAAG;AAAA;AAAE;;;ACAhJ,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO,WAAW,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO;AAAA;AAAA,EAAE,IAAI,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,IAAI,cAAc;AAAA;AAAA,EAAE,GAAG,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,KAAK,gBAAe,CAAC;AAAA;AAAA,EAAE,MAAM,CAAC,GAAE;AAAA,IAAC,OAAO,KAAK,OAAO,OAAO,gBAAe,CAAC;AAAA;AAAE;;;ACA+iB,MAAM,EAAC;AAAA,EAAC;AAAA,EAAO;AAAA,EAAM;AAAA,EAAM;AAAA,EAAS;AAAA,EAAM;AAAA,EAAM;AAAA,EAAO;AAAA,EAAO;AAAA,EAAM;AAAA,EAAS;AAAA,EAAQ;AAAA,EAAc;AAAA,EAAc;AAAA,EAAM;AAAA,EAAS;AAAA,EAAI;AAAA,EAAQ,WAAW,CAAC,KAAE,CAAC,GAAE;AAAA,IAAC,KAAK,SAAO,IAAI,EAAE,EAAC,GAAE,KAAK,QAAM,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,QAAM,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,WAAS,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,QAAM,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,QAAM,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,SAAO,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,SAAO,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,QAAM,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,WAAS,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,UAAQ,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,gBAAc,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,gBAAc,IAAI,EAAE,KAAK,MAAM,GAAE,KAAK,QAAM,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,WAAS,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,MAAI,IAAI,GAAE,KAAK,MAAM,GAAE,KAAK,UAAQ,IAAI,EAAE,KAAK,MAAM;AAAA;AAAA,EAAE,QAAQ,CAAC,IAAE;AAAA,IAAC,OAAO,KAAK,OAAO,SAAS,EAAC,GAAE;AAAA;AAAK;;;ACMz8C,MAAM,sBAAsB;AAAA,EACzB;AAAA,EACA;AAAA,EAER,WAAW,CAAC,OAAe,UAAuB;AAAA,IAChD,KAAK,SAAS,IAAI,EAAS,EAAE,MAAM,CAAC;AAAA,IACpC,KAAK,WAAW;AAAA;AAAA,OAMZ,cAAa,CACjB,KACA,MACA,MACA,UAGI,CAAC,GACY;AAAA,IACjB,QAAQ,OAAO,SAAS,KAAK;AAAA,IAE7B,IAAI;AAAA,MACF,MAAM,KAAK,OAAO,SAAS,OAAO,OAAO,MAAM;AAAA,QAC7C;AAAA,QACA,OAAO,QAAQ;AAAA,QACf;AAAA,QACA,YAAY,QAAQ;AAAA,QACpB,UAAU;AAAA,MACZ,CAAC;AAAA,MAGD,OAAO,GAAG,KAAK,SAAS,oBAAoB;AAAA,MAC5C,OAAO,OAAO;AAAA,MACd,MAAM,IAAI,MAAM,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;AAAA;AAAA;AAAA,OAO5G,cAAa,CAAC,KAA+B;AAAA,IACjD,QAAQ,OAAO,SAAS,KAAK;AAAA,IAE7B,IAAI;AAAA,MACF,MAAM,KAAK,OAAO,SAAS,SAAS,OAAO,MAAM,GAAG;AAAA,MACpD,OAAO;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA;AAAA;AAAA,OAOL,WAAU,CAAC,KAAa;AAAA,IAC5B,QAAQ,OAAO,SAAS,KAAK;AAAA,IAC7B,OAAO,MAAM,KAAK,OAAO,SAAS,SAAS,OAAO,MAAM,GAAG;AAAA;AAE/D;AAKO,SAAS,oBAAoB,CAAC,UAA8C;AAAA,EACjF,MAAM,QAAQ,QAAQ,IAAI;AAAA,EAE1B,IAAI,CAAC,OAAO;AAAA,IACV,MAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AAAA,EAEA,OAAO,IAAI,sBAAsB,OAAO,QAAQ;AAAA;;;AC9ElD,qBAAS;;;ACQT,IAAM,eAAe;AAKd,SAAS,WAAW,CAAC,WAA8C;AAAA,EACxE,MAAM,QAAQ,UAAU,MAAM;AAAA,CAAI;AAAA,EAElC,IAAI,MAAM,SAAS,GAAG;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAGA,OAAO,MAAM,WAAW,QAAQ,OAAO,YAAY,gBAAgB;AAAA,EAEnE,IAAI,EAAE,QAAQ,aAAa,UAAU,SAAS,UAAU;AAAA,IACtD,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,aAAa,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,EAC7C,MAAM,eAAe,QAAQ,MAAM;AAAA,CAAI;AAAA,EACvC,MAAM,YAAY,aAAa;AAAA,EAC/B,MAAM,YAAY,aAAa,MAAM,CAAC;AAAA,EAEtC,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,QAAQ,UAAU,MAAM,YAAY;AAAA,EAE1C,IAAI,CAAC,OAAO,QAAQ;AAAA,IAElB,OAAO;AAAA,EACT;AAAA,EAEA,QAAQ,MAAM,OAAO,UAAU,YAAY,MAAM;AAAA,EAEjD,IAAI,EAAE,QAAQ,UAAU;AAAA,IACtB,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,OAAO,UAAU,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,EACvC,MAAM,oBAAoB,KAAK,SAAS,kBAAkB,KAAK,KAAK,SAAS,kBAAkB;AAAA,EAE/F,OAAO;AAAA,IACL;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,CAAC,CAAC,YAAY;AAAA,IACxB,MAAM,IAAI,KAAK,OAAO;AAAA,IACtB;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,KAAK;AAAA,IACL,OAAO,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAMK,SAAS,YAAY,CAAC,YAA4C;AAAA,EACvE,OAAO,WAAW,IAAI,CAAC,QAAQ,YAAY,GAAG,CAAC,EAAE,OAAO,CAAC,WAAyC,WAAW,IAAI;AAAA;AAM5G,SAAS,kBAAkB,CAAC,SAAqE;AAAA,EACtG,MAAM,SAA+C,CAAC;AAAA,EAEtD,WAAW,UAAU,SAAS;AAAA,IAC5B,IAAI,CAAC,OAAO,OAAO,OAAO;AAAA,MACxB,OAAO,OAAO,QAAQ,CAAC;AAAA,IACzB;AAAA,IACA,OAAO,OAAO,OAAO,KAAK,MAAM;AAAA,EAClC;AAAA,EAEA,OAAO;AAAA;AAaF,SAAS,kBAAkB,CAAC,SAAwC;AAAA,EACzE,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,QAAQ;AAAA;AAM1C,SAAS,WAAW,CAAC,SAAwC;AAAA,EAClE,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,MAAM;AAAA;AAMjD,SAAS,QAAQ,CAAC,SAAwC;AAAA,EAC/D,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,KAAK;AAAA;;;AD/GhD,SAAS,iBAAiB,CAAC,SAAmC,QAAiC;AAAA,EACpG,QAAQ,SAAS,SAAS,OAAO,IAAI,MAAQ,YAAY;AAAA,EAEzD,MAAM,WAAqB,CAAC;AAAA,EAG5B,MAAM,UAAU,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EAC9C,SAAS,KAAK,OAAO,cAAc,SAAS;AAAA,EAC5C,SAAS,KAAK,EAAE;AAAA,EAGhB,MAAM,UAAU,mBAAmB,OAAO;AAAA,EAG1C,MAAM,YAAY,CAAC,QAAQ,OAAO,QAAQ,YAAY,QAAQ,QAAQ,SAAS,MAAM,SAAS,SAAS,QAAQ;AAAA,EAG/G,MAAM,kBAAkB,QAAQ,OAAO,CAAC,OAAM,GAAE,QAAQ;AAAA,EACxD,IAAI,gBAAgB,SAAS,GAAG;AAAA,IAC9B,SAAS,KAAK,yBAAwB;AAAA,IACtC,SAAS,KAAK,EAAE;AAAA,IAChB,WAAW,UAAU,iBAAiB;AAAA,MACpC,SAAS,KAAK,aAAa,QAAQ,QAAQ,OAAO,CAAC;AAAA,IACrD;AAAA,IACA,SAAS,KAAK,EAAE;AAAA,EAClB;AAAA,EAGA,WAAW,QAAQ,WAAW;AAAA,IAC5B,MAAM,cAAc,QAAQ,OAAO,OAAO,CAAC,OAAM,CAAC,GAAE,QAAQ;AAAA,IAC5D,IAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAAA,MAC5C;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,OAAO,MAAM,SAAS,KAAK,YAAY;AAAA,IACrD,SAAS,KAAK,OAAO,OAAO;AAAA,IAC5B,SAAS,KAAK,EAAE;AAAA,IAEhB,WAAW,UAAU,aAAa;AAAA,MAChC,SAAS,KAAK,aAAa,QAAQ,QAAQ,OAAO,CAAC;AAAA,IACrD;AAAA,IACA,SAAS,KAAK,EAAE;AAAA,EAClB;AAAA,EAEA,OAAO,SAAS,KAAK;AAAA,CAAI;AAAA;AAM3B,SAAS,YAAY,CAAC,QAA4B,QAAyB,SAA0B;AAAA,EACnG,MAAM,QAAkB,CAAC;AAAA,EAGzB,IAAI,UAAU,OAAO;AAAA,EAGrB,IAAI,OAAO,OAAO;AAAA,IAChB,UAAU,KAAK,OAAO,YAAY;AAAA,EACpC;AAAA,EAEA,MAAM,KAAK,KAAK,SAAS;AAAA,EAGzB,IAAI,OAAO,YAAY,SAAS;AAAA,IAC9B,MAAM,KAAK,KAAK,OAAO,cAAc,kBAAkB,OAAO,QAAQ;AAAA,EACxE,EAAO,SAAI,OAAO,UAAU;AAAA,IAC1B,MAAM,KAAK,IAAI,OAAO,YAAY;AAAA,EACpC;AAAA,EAGA,IAAI,OAAO,YAAY;AAAA,IACrB,MAAM,KAAK,OAAO,OAAO,QAAQ;AAAA,EACnC;AAAA,EAEA,OAAO,MAAM,KAAK,GAAG;AAAA;AAMvB,eAAsB,mBAAmB,CAAC,eAAuB,UAAiC;AAAA,EAChG,IAAI,kBAAkB;AAAA,EAEtB,IAAI;AAAA,IACF,kBAAkB,MAAM,UAAS,eAAe,OAAO;AAAA,IACvD,OAAO,OAAO;AAAA,IAEd,IAAI,iBAAiB,SAAS,UAAU,SAAS,MAAM,SAAS,UAAU;AAAA,MACxE,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,IACpB,EAAO;AAAA,MACL,MAAM;AAAA;AAAA;AAAA,EAKV,MAAM,QAAQ,gBAAgB,MAAM;AAAA,CAAI;AAAA,EACxC,IAAI,cAAc;AAAA,EAGlB,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,MAAM,cAAc,MAAM;AAAA,IAC1B,MAAM,WAAW,MAAM,IAAI;AAAA,IAE3B,IAAI,aAAa,WAAW,KAAK,GAAG;AAAA,MAElC,cAAc;AAAA,MACd;AAAA,IACF;AAAA,IACA,IAAI,IAAI,KAAK,aAAa,KAAK,MAAM,MAAM,UAAU,KAAK,MAAM,IAAI;AAAA,MAElE,cAAc,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAGA,IAAI,gBAAgB,GAAG;AAAA,IACrB,cAAc,MAAM;AAAA,EACtB;AAAA,EAGA,MAAM,OAAO,aAAa,GAAG,QAAQ;AAAA,EAGrC,MAAM,UAAU,eAAe,MAAM,KAAK;AAAA,CAAI,CAAC;AAAA;AAO1C,SAAS,oBAAoB,CAAC,SAA+B,QAAiC;AAAA,EACnG,MAAM,WAAqB,CAAC;AAAA,EAG5B,MAAM,kBAAkB,QAAQ,OAAO,CAAC,OAAM,GAAE,QAAQ;AAAA,EACxD,IAAI,gBAAgB,SAAS,GAAG;AAAA,IAC9B,SAAS,KAAK,sBAAqB;AAAA,IACnC,WAAW,UAAU,iBAAiB;AAAA,MACpC,SAAS,KAAK,KAAK,OAAO,SAAS;AAAA,IACrC;AAAA,IACA,SAAS,KAAK,EAAE;AAAA,EAClB;AAAA,EAGA,MAAM,UAAU,mBAAmB,QAAQ,OAAO,CAAC,OAAM,CAAC,GAAE,QAAQ,CAAC;AAAA,EAErE,MAAM,YAAY,CAAC,QAAQ,OAAO,QAAQ,UAAU;AAAA,EAEpD,WAAW,QAAQ,WAAW;AAAA,IAC5B,MAAM,cAAc,QAAQ;AAAA,IAC5B,IAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAAA,MAC5C;AAAA,IACF;AAAA,IAEA,MAAM,QAAQ,OAAO,MAAM,SAAS,KAAK,YAAY;AAAA,IACrD,SAAS,KAAK,GAAG,QAAQ;AAAA,IACzB,WAAW,UAAU,aAAa;AAAA,MAChC,IAAI,UAAU,OAAO;AAAA,MACrB,IAAI,OAAO,OAAO;AAAA,QAChB,UAAU,KAAK,OAAO,YAAY;AAAA,MACpC;AAAA,MACA,SAAS,KAAK,KAAK,SAAS;AAAA,IAC9B;AAAA,IACA,SAAS,KAAK,EAAE;AAAA,EAClB;AAAA,EAEA,OAAO,SAAS,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA;;;AE9KlC;AACA;AAGA,IAAM,YAAY,UAAU,IAAI;AAGhC,IAAM,uBAAuB;AAC7B,IAAM,uBAAuB;AAK7B,eAAe,GAAG,CAAC,SAAkC;AAAA,EACnD,QAAQ,WAAW,MAAM,UAAU,OAAO,SAAS;AAAA,EACnD,OAAO,OAAO,KAAK;AAAA;AAUrB,eAAsB,WAAW,GAAyB;AAAA,EAGxD,IAAI,QAAQ,IAAI,qBAAqB,UAAU,QAAQ,IAAI,mBAAmB;AAAA,IAC5E,MAAM,WAAW,QAAQ,IAAI;AAAA,IAC7B,MAAM,QAAQ,SAAS,MAAM,GAAG;AAAA,IAEhC,IAAI,MAAM,WAAW,KAAK,MAAM,MAAM,MAAM,IAAI;AAAA,MAC9C,MAAM,SAAQ,MAAM;AAAA,MACpB,MAAM,QAAO,MAAM;AAAA,MACnB,MAAM,UAAS,QAAQ,IAAI,mBAAmB;AAAA,MAE9C,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,KAAK,uBAAuB,UAAS;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAGA,MAAM,MAAM,MAAM,IAAI,uBAAuB;AAAA,EAO7C,MAAM,QAAQ,IAAI,MAAM,oBAAoB,KAAK,IAAI,MAAM,oBAAoB;AAAA,EAE/E,IAAI,EAAE,QAAQ,MAAM,MAAM,KAAK;AAAA,IAC7B,MAAM,IAAI,MAAM,iDAAiD,KAAK;AAAA,EACxE;AAAA,EAEA,MAAM,QAAQ,MAAM;AAAA,EACpB,MAAM,OAAO,MAAM;AAAA,EAGnB,MAAM,SAAS,MAAM,IAAI,uBAAuB;AAAA,EAEhD,OAAO;AAAA,IACL;AAAA,IACA,UAAU,GAAG,SAAS;AAAA,IACtB;AAAA,IACA;AAAA,IACA,KAAK,uBAAuB,SAAS;AAAA,EACvC;AAAA;AAMF,eAAsB,YAAY,CAAC,QAAwC;AAAA,EACzE,IAAI;AAAA,IACF,MAAM,OAAO,MAAM,IAAI,iCAAiC,UAAU;AAAA,IAClE,MAAM,UAAU,KAAK,MAAM;AAAA,CAAI,EAAE,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;AAAA,IAE/D,OAAO,QAAQ,SAAS,IAAK,QAAQ,MAAM,OAAQ;AAAA,IACnD,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOX,eAAsB,kBAAkB,CAAC,WAAmB,MAAkC;AAAA,EAC5F,MAAM,YAAY,MAAM,aAAa,SAAS;AAAA,EAE9C,IAAI;AAAA,EACJ,IAAI,WAAW;AAAA,IACb,QAAQ,GAAG;AAAA,EACb,EAAO;AAAA,IAEL,QAAQ;AAAA;AAAA,EAGV,MAAM,SAAS;AAAA,EACf,MAAM,aAAa,OAAO,MAAM,SAAS;AAAA,EAEzC,MAAM,MAAM,MAAM,IAAI,OAAO,mBAAmB,WAAW,YAAY;AAAA,EAIvE,MAAM,UAAU,IACb,MAAM;AAAA,QAAW,EACjB,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC,EAC7B,OAAO,CAAC,WAAW,OAAO,SAAS,KAAK,WAAW,SAAS;AAAA,EAE/D,OAAO;AAAA;AAMT,eAAsB,iBAAiB,CAAC,aAAsC;AAAA,EAC5E,QAAQ,wBAAa,MAAa;AAAA,EAClC,QAAQ,sBAAY,MAAa;AAAA,EAEjC,MAAM,cAAc,SAAQ,aAAa,cAAc;AAAA,EACvD,MAAM,UAAU,MAAM,UAAS,aAAa,OAAO;AAAA,EACnD,MAAM,UAAU,KAAK,MAAM,OAAO;AAAA,EAElC,IAAI,CAAC,QAAQ,SAAS;AAAA,IACpB,MAAM,IAAI,MAAM,uBAAuB,aAAa;AAAA,EACtD;AAAA,EAEA,OAAO,QAAQ;AAAA;AAMjB,eAAsB,oBAAoB,CAAC,aAAqB,YAAmC;AAAA,EACjG,QAAQ,qBAAU,0BAAc,MAAa;AAAA,EAC7C,QAAQ,sBAAY,MAAa;AAAA,EAEjC,MAAM,cAAc,SAAQ,aAAa,cAAc;AAAA,EACvD,MAAM,UAAU,MAAM,UAAS,aAAa,OAAO;AAAA,EACnD,MAAM,UAAU,KAAK,MAAM,OAAO;AAAA,EAElC,QAAQ,UAAU;AAAA,EAElB,MAAM,WAAU,aAAa,GAAG,KAAK,UAAU,SAAS,MAAM,CAAC;AAAA,CAAK;AAAA;AAMtE,eAAsB,YAAY,CAAC,SAAiB,OAAgC;AAAA,EAElF,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,IAAI,QAAQ,OAAO;AAAA,EAC3B;AAAA,EAGA,MAAM,IAAI,cAAc,UAAU;AAAA;AAMpC,eAAsB,SAAS,CAAC,KAAa,SAAgC;AAAA,EAC3E,MAAM,IAAI,WAAW,YAAY,UAAU;AAAA;AAM7C,eAAsB,WAAW,CAAC,KAA6B;AAAA,EAE7D,MAAM,IAAI,MAAM;AAAA,EAGhB,IAAI,KAAK;AAAA,IACP,MAAM,IAAI,gBAAgB,MAAM;AAAA,EAClC;AAAA;AAMF,eAAsB,kBAAkB,GAAqB;AAAA,EAC3D,IAAI;AAAA,IACF,MAAM,SAAS,MAAM,IAAI,oBAAoB;AAAA,IAC7C,OAAO,OAAO,WAAW;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOX,eAAsB,SAAS,CAAC,KAA+B;AAAA,EAC7D,IAAI;AAAA,IACF,MAAM,IAAI,cAAc,MAAM;AAAA,IAC9B,OAAO;AAAA,IACP,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;;;AChMX,IAAM,gBAAgB;AACtB,IAAM,6BAA6B;AAKnC,SAAS,YAAY,CAAC,SAAkC;AAAA,EAEtD,MAAM,KAAI,QAAQ,WAAW,GAAG,IAAI,QAAQ,MAAM,CAAC,IAAI;AAAA,EAEvD,MAAM,QAAQ,GAAE,MAAM,aAAa;AAAA,EACnC,IAAI,EAAE,QAAQ,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,IACzC,MAAM,IAAI,MAAM,2BAA2B,SAAS;AAAA,EACtD;AAAA,EAEA,OAAO;AAAA,IACL,OAAO,OAAO,SAAS,MAAM,IAAI,EAAE;AAAA,IACnC,OAAO,OAAO,SAAS,MAAM,IAAI,EAAE;AAAA,IACnC,OAAO,OAAO,SAAS,MAAM,IAAI,EAAE;AAAA,IACnC,YAAY,MAAM;AAAA,EACpB;AAAA;AAMF,SAAS,aAAa,CAAC,KAA8B;AAAA,EACnD,IAAI,SAAS,GAAG,IAAI,SAAS,IAAI,SAAS,IAAI;AAAA,EAC9C,IAAI,IAAI,YAAY;AAAA,IAClB,UAAU,IAAI,IAAI;AAAA,EACpB;AAAA,EACA,OAAO;AAAA;AAMF,SAAS,iBAAiB,CAAC,SAAgD;AAAA,EAChF,IAAI,QAAQ,WAAW,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,mBAAmB,OAAO,GAAG;AAAA,IAC/B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,YAAY,OAAO,GAAG;AAAA,IACxB,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,SAAS,OAAO,GAAG;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EAGA,OAAO;AAAA;AAMF,SAAS,WAAW,CAAC,gBAAwB,UAAoB,kBAAmC;AAAA,EACzG,MAAM,MAAM,aAAa,cAAc;AAAA,EAEvC,QAAQ;AAAA,SACD;AAAA,MACH,IAAI,SAAS;AAAA,MACb,IAAI,QAAQ;AAAA,MACZ,IAAI,QAAQ;AAAA,MACZ,IAAI,aAAa;AAAA,MACjB;AAAA,SACG;AAAA,MACH,IAAI,SAAS;AAAA,MACb,IAAI,QAAQ;AAAA,MACZ,IAAI,aAAa;AAAA,MACjB;AAAA,SACG;AAAA,MACH,IAAI,SAAS;AAAA,MACb,IAAI,aAAa;AAAA,MACjB;AAAA,SACG;AAAA,MACH,IAAI,IAAI,YAAY;AAAA,QAElB,MAAM,QAAQ,IAAI,WAAW,MAAM,0BAA0B;AAAA,QAC7D,IAAI,QAAQ,MAAM,MAAM,IAAI;AAAA,UAC1B,MAAM,SAAS,MAAM;AAAA,UACrB,MAAM,MAAM,OAAO,SAAS,MAAM,IAAI,EAAE;AAAA,UACxC,IAAI,aAAa,GAAG,UAAU,MAAM;AAAA,QACtC,EAAO;AAAA,UACL,IAAI,aAAa,GAAG,IAAI;AAAA;AAAA,MAE5B,EAAO;AAAA,QAEL,IAAI,SAAS;AAAA,QACb,IAAI,aAAa,GAAG,oBAAoB;AAAA;AAAA,MAE1C;AAAA;AAAA,EAGJ,OAAO,cAAc,GAAG;AAAA;AAMnB,SAAS,oBAAoB,CAClC,gBACA,SACA,cACA,YACa;AAAA,EACb,MAAM,WAAW,aAAa,eAAe,kBAAkB,OAAO,KAAK;AAAA,EAE3E,MAAM,aAAa,gBAAgB,YAAY,gBAAgB,UAAU,UAAU;AAAA,EAEnF,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,mBAAmB,OAAO;AAAA,IACvC,aAAa,YAAY,OAAO;AAAA,IAChC,UAAU,SAAS,OAAO;AAAA,IAC1B;AAAA,EACF;AAAA;;;A1B3GF,SAAS,eAAe,CACtB,KACA,gBACA,aACA,KACA,SACA,gBACM;AAAA,EACN,QAAQ,IAAI;AAAA;AAAA,CAA8C;AAAA,EAC1D,QAAQ,IAAI,yBAAc,IAAI,aAAa;AAAA,EAC3C,QAAQ,IAAI,yBAAc,oBAAoB,YAAY,YAAY;AAAA,EACtE,QAAQ,IAAI,uBAAY,KAAK;AAAA,EAC7B,QAAQ,IAAI,yBAAc,QAAQ,QAAQ;AAAA,EAC1C,QAAQ,IAAI;AAAA;AAAA,CAAkB;AAAA,EAC9B,QAAQ,IAAI,cAAc;AAAA;AAM5B,SAAS,gBAAgB,CACvB,KACA,gBACA,YACA,KACA,YACM;AAAA,EACN,QAAQ,IAAI;AAAA;AAAA,CAAoC;AAAA,EAChD,QAAQ,IAAI,yBAAc,IAAI,aAAa;AAAA,EAC3C,QAAQ,IAAI,yBAAc,oBAAoB,YAAY;AAAA,EAC1D,QAAQ,IAAI,uBAAY,KAAK;AAAA,EAC7B,IAAI,YAAY;AAAA,IACd,QAAQ,IAAI,yBAAc,YAAY;AAAA,EACxC;AAAA,EACA,QAAQ,IAAI,EAAE;AAAA;AAMhB,eAAe,kBAAkB,CAAC,KAAoB,YAAoB,gBAAyC;AAAA,EACjH,MAAM,qBAAqB,IAAI,MAAM,UAAU;AAAA,EAC/C,MAAM,gBAAgB,SAAQ,IAAI,MAAM,IAAI,SAAS;AAAA,EACrD,MAAM,oBAAoB,eAAe,cAAc;AAAA,EACvD,OAAO;AAAA;AAMT,eAAe,cAAc,CAC3B,KACA,SACA,UAC+B;AAAA,EAC/B,MAAM,aAAa,MAAM,mBAAmB,IAAI,WAAW,IAAI,IAAI;AAAA,EAEnE,IAAI,WAAW,WAAW,KAAK,CAAC,QAAQ,SAAS;AAAA,IAC/C,MAAM,IAAI,MAAM,2CAA2C,IAAI,aAAa;AAAA,EAC9E;AAAA,EAEA,MAAM,UAAU,aAAa,UAAU;AAAA,EAEvC,IAAI,QAAQ,WAAW,KAAK,CAAC,QAAQ,SAAS;AAAA,IAC5C,SAAS,KAAK,iEAAiE;AAAA,EACjF;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,oBAAoB,CAAC,SAAqB,QAAqD;AAAA,EACtG,IAAI,OAAO,QAAQ,eAAe,UAAU;AAAA,IAC1C,OAAO,QAAQ;AAAA,EACjB;AAAA,EACA,IAAI,QAAQ,YAAY;AAAA,IACtB,OAAO,OAAO,WAAW;AAAA,EAC3B;AAAA,EACA;AAAA;AAMF,eAAe,qBAAqB,CAClC,SACA,UACA,SACA,QACA,KACA,aACA,KACA,UAC6B;AAAA,EAC7B,IAAI,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,iBAAiB,qBAAqB,QAAQ;AAAA,IACpD,MAAM,eAAe,qBAAqB,SAAS,OAAO,SAAS;AAAA,IAEnE,OAAO,MAAM,eAAe,cAAc,KAAK,GAAG,IAAI,gBAAgB,YAAY,cAAc,cAAc;AAAA,MAC5G,YAAY,CAAC,CAAC,QAAQ;AAAA,IACxB,CAAC;AAAA,IACD,OAAO,OAAO;AAAA,IACd,SAAS,KAAK,sCAAsC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG;AAAA,IAC5G;AAAA;AAAA;AAOJ,eAAe,oBAAoB,CACjC,QACA,SACA,KACA,YACA,KACA,eACe;AAAA,EACf,IAAI,OAAO,IAAI,iBAAiB,CAAC,QAAQ,UAAU;AAAA,IACjD,MAAM,gBAAgB,OAAO,IAAI,cAAc,QAAQ,eAAe,IAAI,IAAI,EAAE,QAAQ,eAAe,UAAU;AAAA,IAEjH,MAAM,aAAa,eAAe,CAAC,SAAQ,IAAI,MAAM,cAAc,GAAG,aAAa,CAAC;AAAA,EACtF;AAAA,EAEA,IAAI,CAAC,QAAQ,OAAO;AAAA,IAClB,MAAM,aAAa,OAAO,IAAI,WAAW,QAAQ,eAAe,IAAI,IAAI,EAAE,QAAQ,eAAe,UAAU;AAAA,IAE3G,MAAM,UAAU,KAAK,UAAU;AAAA,EACjC;AAAA,EAEA,IAAI,OAAO,IAAI,QAAQ,CAAC,QAAQ,QAAQ;AAAA,IACtC,MAAM,YAAY,QAAQ,QAAQ,YAAY,GAAG;AAAA,EACnD;AAAA;AAMF,eAAsB,OAAO,CAAC,aAAsB,UAAsB,CAAC,GAA2B;AAAA,EACpG,MAAM,SAAwB;AAAA,IAC5B,QAAQ,CAAC;AAAA,IACT,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,aAAa,eAAe;AAAA,IAC5B,SAAS;AAAA,IACT,UAAU,CAAC;AAAA,EACb;AAAA,EAEA,IAAI;AAAA,IAEF,MAAM,SAAS,MAAM,WAAW,QAAQ,MAAM;AAAA,IAC9C,eAAe,MAAM;AAAA,IAGrB,MAAM,WAAW,MAAM,YAAY;AAAA,IAGnC,MAAM,MAAM,eAAe,QAAQ,WAAW;AAAA,IAE9C,OAAO,cAAc,IAAI;AAAA,IAGzB,IAAI,EAAE,QAAQ,UAAW,MAAM,mBAAmB,IAAK;AAAA,MACrD,MAAM,IAAI,MAAM,iEAAiE;AAAA,IACnF;AAAA,IAGA,MAAM,iBAAiB,MAAM,kBAAkB,IAAI,IAAI;AAAA,IACvD,OAAO,aAAa;AAAA,IAGpB,MAAM,UAAU,MAAM,eAAe,KAAK,SAAS,OAAO,QAAQ;AAAA,IAGlE,MAAM,gBAAgB,qBAAqB,SAAS,MAAM;AAAA,IAC1D,MAAM,cAAc,qBAAqB,gBAAgB,SAAS,QAAQ,SAAS,aAAa;AAAA,IAEhG,OAAO,aAAa,YAAY;AAAA,IAGhC,MAAM,MAAM,GAAG,IAAI,YAAY,YAAY;AAAA,IAC3C,OAAO,MAAM;AAAA,IAEb,IAAI,MAAM,UAAU,GAAG,GAAG;AAAA,MACxB,MAAM,IAAI,MAAM,OAAO,oBAAoB;AAAA,IAC7C;AAAA,IAGA,MAAM,iBAAiB,kBACrB;AAAA,MACE;AAAA,MACA,MAAM,IAAI;AAAA,MACV,SAAS,SAAS;AAAA,MAClB,SAAS,YAAY;AAAA,IACvB,GACA,OAAO,SACT;AAAA,IAEA,IAAI,QAAQ,QAAQ;AAAA,MAClB,gBAAgB,KAAK,gBAAgB,aAAa,KAAK,SAAS,cAAc;AAAA,MAC9E,OAAO,UAAU;AAAA,MACjB,OAAO;AAAA,IACT;AAAA,IAGA,MAAM,gBAAgB,MAAM,mBAAmB,KAAK,YAAY,YAAY,cAAc;AAAA,IAG1F,MAAM,qBAAqB,QAAQ,SAAS,KAAK,YAAY,YAAY,KAAK,aAAa;AAAA,IAG3F,OAAO,aAAa,MAAM,sBACxB,SACA,UACA,SACA,QACA,KACA,aACA,KACA,OAAO,QACT;AAAA,IAEA,OAAO,UAAU;AAAA,IAGjB,iBAAiB,KAAK,gBAAgB,YAAY,YAAY,KAAK,OAAO,UAAU;AAAA,IAEpF,OAAO;AAAA,IACP,OAAO,OAAO;AAAA,IACd,OAAO,UAAU;AAAA,IACjB,OAAO,OAAO,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAEzE,QAAQ,MAAM;AAAA;AAAA,CAAsB;AAAA,IACpC,QAAQ,MAAM,KAAK;AAAA,IACnB,QAAQ,MAAM,EAAE;AAAA,IAEhB,OAAO;AAAA;AAAA;AAOX,SAAS,cAAc,CAAC,QAAiC,aAAqC;AAAA,EAC5F,IAAI,CAAC,OAAO,SAAS,SAAS;AAAA,IAE5B,OAAO;AAAA,MACL,WAAW;AAAA,MACX,MAAM;AAAA,MACN,aAAa,eAAe;AAAA,MAC5B,MAAM;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AAAA,EAGA,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,IAAI,MAAM,iEAAiE;AAAA,EACnF;AAAA,EAEA,MAAM,MAAM,OAAO,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AAAA,EAEvE,IAAI,CAAC,KAAK;AAAA,IACR,MAAM,IAAI,MACR,YAAY,yDAAyD,OAAO,SAAS,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,GAC5H;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;",
|
|
34
|
+
"debugId": "9FC7FA9EE9A38A2464756E2164756E21",
|
|
35
|
+
"names": []
|
|
36
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Конфигурация для gitverse-release
|
|
3
|
+
*/
|
|
4
|
+
export interface ReleaseConfig {
|
|
5
|
+
/**
|
|
6
|
+
* Настройки для monorepo
|
|
7
|
+
*/
|
|
8
|
+
monorepo?: MonorepoConfig;
|
|
9
|
+
/**
|
|
10
|
+
* Настройки генерации CHANGELOG
|
|
11
|
+
*/
|
|
12
|
+
changelog?: ChangelogConfig;
|
|
13
|
+
/**
|
|
14
|
+
* Настройки Git операций
|
|
15
|
+
*/
|
|
16
|
+
git?: GitConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Настройки версионирования
|
|
19
|
+
*/
|
|
20
|
+
versioning?: VersioningConfig;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Конфигурация monorepo
|
|
24
|
+
*/
|
|
25
|
+
export interface MonorepoConfig {
|
|
26
|
+
/**
|
|
27
|
+
* Включен ли режим monorepo
|
|
28
|
+
*/
|
|
29
|
+
enabled: boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Список пакетов в monorepo
|
|
32
|
+
*/
|
|
33
|
+
packages: PackageConfig[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Конфигурация отдельного пакета в monorepo
|
|
37
|
+
*/
|
|
38
|
+
export interface PackageConfig {
|
|
39
|
+
/**
|
|
40
|
+
* Короткое имя пакета (для CLI)
|
|
41
|
+
*/
|
|
42
|
+
name: string;
|
|
43
|
+
/**
|
|
44
|
+
* Путь к директории пакета
|
|
45
|
+
*/
|
|
46
|
+
path: string;
|
|
47
|
+
/**
|
|
48
|
+
* Название пакета в package.json
|
|
49
|
+
*/
|
|
50
|
+
packageName: string;
|
|
51
|
+
/**
|
|
52
|
+
* Префикс для git тега (например: "sdk-v")
|
|
53
|
+
*/
|
|
54
|
+
tagPrefix: string;
|
|
55
|
+
/**
|
|
56
|
+
* Путь к CHANGELOG файлу
|
|
57
|
+
*/
|
|
58
|
+
changelog: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Конфигурация CHANGELOG
|
|
62
|
+
*/
|
|
63
|
+
export interface ChangelogConfig {
|
|
64
|
+
/**
|
|
65
|
+
* Mapping типов коммитов на заголовки секций
|
|
66
|
+
*/
|
|
67
|
+
types: Record<string, string>;
|
|
68
|
+
/**
|
|
69
|
+
* Показывать ли автора коммита
|
|
70
|
+
*/
|
|
71
|
+
showAuthor: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Показывать ли хеш коммита
|
|
74
|
+
*/
|
|
75
|
+
showHash: boolean;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Конфигурация Git операций
|
|
79
|
+
*/
|
|
80
|
+
export interface GitConfig {
|
|
81
|
+
/**
|
|
82
|
+
* Создавать ли коммит с изменениями
|
|
83
|
+
*/
|
|
84
|
+
commitChanges: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* Шаблон сообщения коммита (поддерживает {{package}} и {{version}})
|
|
87
|
+
*/
|
|
88
|
+
commitMessage: string;
|
|
89
|
+
/**
|
|
90
|
+
* Шаблон сообщения для тега (поддерживает {{package}} и {{version}})
|
|
91
|
+
*/
|
|
92
|
+
tagMessage: string;
|
|
93
|
+
/**
|
|
94
|
+
* Пушить ли изменения в remote
|
|
95
|
+
*/
|
|
96
|
+
push: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Конфигурация версионирования
|
|
100
|
+
*/
|
|
101
|
+
export interface VersioningConfig {
|
|
102
|
+
/**
|
|
103
|
+
* Разрешены ли prerelease версии
|
|
104
|
+
*/
|
|
105
|
+
allowPrerelease: boolean;
|
|
106
|
+
/**
|
|
107
|
+
* Префикс для prerelease версий (beta, alpha, rc)
|
|
108
|
+
*/
|
|
109
|
+
prereleasePrefix: string;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* CLI опции
|
|
113
|
+
*/
|
|
114
|
+
export interface CliOptions {
|
|
115
|
+
/**
|
|
116
|
+
* Тестовый прогон (не создавать коммиты/теги/релизы)
|
|
117
|
+
*/
|
|
118
|
+
dryRun?: boolean;
|
|
119
|
+
/**
|
|
120
|
+
* Путь к конфиг файлу
|
|
121
|
+
*/
|
|
122
|
+
config?: string;
|
|
123
|
+
/**
|
|
124
|
+
* Имя пакета для релиза (для monorepo)
|
|
125
|
+
*/
|
|
126
|
+
package?: string;
|
|
127
|
+
/**
|
|
128
|
+
* Принудительная версия
|
|
129
|
+
*/
|
|
130
|
+
version?: string;
|
|
131
|
+
/**
|
|
132
|
+
* Создать prerelease версию
|
|
133
|
+
*/
|
|
134
|
+
prerelease?: string | boolean;
|
|
135
|
+
/**
|
|
136
|
+
* Не создавать коммит
|
|
137
|
+
*/
|
|
138
|
+
noCommit?: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Не создавать тег
|
|
141
|
+
*/
|
|
142
|
+
noTag?: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Не пушить в remote
|
|
145
|
+
*/
|
|
146
|
+
noPush?: boolean;
|
|
147
|
+
/**
|
|
148
|
+
* Не создавать GitVerse Release
|
|
149
|
+
*/
|
|
150
|
+
noRelease?: boolean;
|
|
151
|
+
/**
|
|
152
|
+
* Подробный вывод
|
|
153
|
+
*/
|
|
154
|
+
verbose?: boolean;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Информация о Git репозитории
|
|
158
|
+
*/
|
|
159
|
+
export interface GitRepoInfo {
|
|
160
|
+
/**
|
|
161
|
+
* Owner/repo (например: "rainypixel/gitverse-sdk")
|
|
162
|
+
*/
|
|
163
|
+
fullName: string;
|
|
164
|
+
/**
|
|
165
|
+
* Владелец репозитория
|
|
166
|
+
*/
|
|
167
|
+
owner: string;
|
|
168
|
+
/**
|
|
169
|
+
* Название репозитория
|
|
170
|
+
*/
|
|
171
|
+
repo: string;
|
|
172
|
+
/**
|
|
173
|
+
* URL репозитория
|
|
174
|
+
*/
|
|
175
|
+
url: string;
|
|
176
|
+
/**
|
|
177
|
+
* Текущая ветка
|
|
178
|
+
*/
|
|
179
|
+
branch: string;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Conventional Commit
|
|
183
|
+
*/
|
|
184
|
+
export interface ConventionalCommit {
|
|
185
|
+
/**
|
|
186
|
+
* Тип коммита (feat, fix, etc)
|
|
187
|
+
*/
|
|
188
|
+
type: string;
|
|
189
|
+
/**
|
|
190
|
+
* Scope (опционально)
|
|
191
|
+
*/
|
|
192
|
+
scope?: string;
|
|
193
|
+
/**
|
|
194
|
+
* Описание коммита
|
|
195
|
+
*/
|
|
196
|
+
subject: string;
|
|
197
|
+
/**
|
|
198
|
+
* Тело коммита (опционально)
|
|
199
|
+
*/
|
|
200
|
+
body?: string;
|
|
201
|
+
/**
|
|
202
|
+
* Footer (опционально)
|
|
203
|
+
*/
|
|
204
|
+
footer?: string;
|
|
205
|
+
/**
|
|
206
|
+
* Breaking change
|
|
207
|
+
*/
|
|
208
|
+
breaking: boolean;
|
|
209
|
+
/**
|
|
210
|
+
* Hash коммита
|
|
211
|
+
*/
|
|
212
|
+
hash: string;
|
|
213
|
+
/**
|
|
214
|
+
* Короткий hash
|
|
215
|
+
*/
|
|
216
|
+
shortHash: string;
|
|
217
|
+
/**
|
|
218
|
+
* Автор коммита
|
|
219
|
+
*/
|
|
220
|
+
author: string;
|
|
221
|
+
/**
|
|
222
|
+
* Email автора
|
|
223
|
+
*/
|
|
224
|
+
email: string;
|
|
225
|
+
/**
|
|
226
|
+
* Дата коммита
|
|
227
|
+
*/
|
|
228
|
+
date: Date;
|
|
229
|
+
/**
|
|
230
|
+
* Исходное сообщение коммита
|
|
231
|
+
*/
|
|
232
|
+
raw: string;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Тип изменения версии
|
|
236
|
+
*/
|
|
237
|
+
export type BumpType = "major" | "minor" | "patch" | "prerelease";
|
|
238
|
+
/**
|
|
239
|
+
* Результат анализа версии
|
|
240
|
+
*/
|
|
241
|
+
export interface VersionBump {
|
|
242
|
+
/**
|
|
243
|
+
* Текущая версия
|
|
244
|
+
*/
|
|
245
|
+
currentVersion: string;
|
|
246
|
+
/**
|
|
247
|
+
* Новая версия
|
|
248
|
+
*/
|
|
249
|
+
newVersion: string;
|
|
250
|
+
/**
|
|
251
|
+
* Тип изменения
|
|
252
|
+
*/
|
|
253
|
+
bumpType: BumpType;
|
|
254
|
+
/**
|
|
255
|
+
* Коммиты для релиза
|
|
256
|
+
*/
|
|
257
|
+
commits: ConventionalCommit[];
|
|
258
|
+
/**
|
|
259
|
+
* Есть ли breaking changes
|
|
260
|
+
*/
|
|
261
|
+
hasBreaking: boolean;
|
|
262
|
+
/**
|
|
263
|
+
* Есть ли новые features
|
|
264
|
+
*/
|
|
265
|
+
hasFeatures: boolean;
|
|
266
|
+
/**
|
|
267
|
+
* Есть ли bug fixes
|
|
268
|
+
*/
|
|
269
|
+
hasFixes: boolean;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Опции для генерации CHANGELOG
|
|
273
|
+
*/
|
|
274
|
+
export interface ChangelogGenerateOptions {
|
|
275
|
+
/**
|
|
276
|
+
* Версия релиза
|
|
277
|
+
*/
|
|
278
|
+
version: string;
|
|
279
|
+
/**
|
|
280
|
+
* Коммиты для включения
|
|
281
|
+
*/
|
|
282
|
+
commits: ConventionalCommit[];
|
|
283
|
+
/**
|
|
284
|
+
* Дата релиза
|
|
285
|
+
*/
|
|
286
|
+
date?: Date;
|
|
287
|
+
/**
|
|
288
|
+
* URL репозитория для ссылок
|
|
289
|
+
*/
|
|
290
|
+
repoUrl?: string;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Результат создания релиза
|
|
294
|
+
*/
|
|
295
|
+
export interface ReleaseResult {
|
|
296
|
+
/**
|
|
297
|
+
* Успешно ли выполнен релиз
|
|
298
|
+
*/
|
|
299
|
+
success: boolean;
|
|
300
|
+
/**
|
|
301
|
+
* Название пакета
|
|
302
|
+
*/
|
|
303
|
+
packageName: string;
|
|
304
|
+
/**
|
|
305
|
+
* Старая версия
|
|
306
|
+
*/
|
|
307
|
+
oldVersion: string;
|
|
308
|
+
/**
|
|
309
|
+
* Новая версия
|
|
310
|
+
*/
|
|
311
|
+
newVersion: string;
|
|
312
|
+
/**
|
|
313
|
+
* Созданный тег
|
|
314
|
+
*/
|
|
315
|
+
tag?: string;
|
|
316
|
+
/**
|
|
317
|
+
* URL релиза на GitVerse
|
|
318
|
+
*/
|
|
319
|
+
releaseUrl?: string;
|
|
320
|
+
/**
|
|
321
|
+
* Сообщения об ошибках
|
|
322
|
+
*/
|
|
323
|
+
errors: string[];
|
|
324
|
+
/**
|
|
325
|
+
* Предупреждения
|
|
326
|
+
*/
|
|
327
|
+
warnings: string[];
|
|
328
|
+
}
|
|
@@ -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): 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): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { GitRepoInfo } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Получает информацию о Git репозитории
|
|
4
|
+
*
|
|
5
|
+
* Приоритет источников данных:
|
|
6
|
+
* 1. Переменные окружения GitVerse Actions (для CI/CD)
|
|
7
|
+
* 2. Git remote URL (для локального использования)
|
|
8
|
+
*/
|
|
9
|
+
export declare function getRepoInfo(): Promise<GitRepoInfo>;
|
|
10
|
+
/**
|
|
11
|
+
* Получает последний тег с указанным префиксом
|
|
12
|
+
*/
|
|
13
|
+
export declare function getLatestTag(prefix: string): Promise<string | null>;
|
|
14
|
+
/**
|
|
15
|
+
* Получает список коммитов с момента последнего тега
|
|
16
|
+
*/
|
|
17
|
+
export declare function getCommitsSinceTag(tagPrefix: string, path?: string): Promise<string[]>;
|
|
18
|
+
/**
|
|
19
|
+
* Получает текущую версию из package.json
|
|
20
|
+
*/
|
|
21
|
+
export declare function getCurrentVersion(packagePath: string): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Обновляет версию в package.json
|
|
24
|
+
*/
|
|
25
|
+
export declare function updatePackageVersion(packagePath: string, newVersion: string): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Создает git коммит
|
|
28
|
+
*/
|
|
29
|
+
export declare function createCommit(message: string, files: string[]): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
* Создает git тег
|
|
32
|
+
*/
|
|
33
|
+
export declare function createTag(tag: string, message: string): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Пушит изменения и теги в remote
|
|
36
|
+
*/
|
|
37
|
+
export declare function pushChanges(tag?: string): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* Проверяет, что рабочая директория чистая
|
|
40
|
+
*/
|
|
41
|
+
export declare function isWorkingTreeClean(): Promise<boolean>;
|
|
42
|
+
/**
|
|
43
|
+
* Проверяет, что тег существует
|
|
44
|
+
*/
|
|
45
|
+
export declare function tagExists(tag: string): Promise<boolean>;
|
|
@@ -0,0 +1,29 @@
|
|
|
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
|
+
* Проверяет, есть ли breaking changes
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasBreakingChanges(commits: ConventionalCommit[]): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Проверяет, есть ли новые features
|
|
24
|
+
*/
|
|
25
|
+
export declare function hasFeatures(commits: ConventionalCommit[]): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Проверяет, есть ли bug fixes
|
|
28
|
+
*/
|
|
29
|
+
export declare function hasFixes(commits: ConventionalCommit[]): boolean;
|