bun-push 0.1.9
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/LICENSE +21 -0
- package/README.md +320 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1459 -0
- package/dist/cli.js.map +22 -0
- package/dist/i18n/index.d.ts +21 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +126 -0
- package/dist/i18n/locales/en.d.ts +119 -0
- package/dist/i18n/locales/en.d.ts.map +1 -0
- package/dist/i18n/locales/en.js +125 -0
- package/dist/i18n/locales/ja.d.ts +119 -0
- package/dist/i18n/locales/ja.d.ts.map +1 -0
- package/dist/i18n/locales/ja.js +125 -0
- package/dist/i18n/locales/ko.d.ts +119 -0
- package/dist/i18n/locales/ko.d.ts.map +1 -0
- package/dist/i18n/locales/ko.js +125 -0
- package/dist/i18n/locales/zh.d.ts +119 -0
- package/dist/i18n/locales/zh.d.ts.map +1 -0
- package/dist/i18n/locales/zh.js +125 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1114 -0
- package/dist/index.js.map +20 -0
- package/dist/index.test.d.ts +2 -0
- package/dist/index.test.d.ts.map +1 -0
- package/dist/index.test.js +90 -0
- package/dist/logo.d.ts +9 -0
- package/dist/logo.d.ts.map +1 -0
- package/dist/logo.js +58 -0
- package/dist/prompts.d.ts +42 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +312 -0
- package/dist/publisher.d.ts +7 -0
- package/dist/publisher.d.ts.map +1 -0
- package/dist/publisher.js +110 -0
- package/dist/publisher.test.d.ts +2 -0
- package/dist/publisher.test.d.ts.map +1 -0
- package/dist/publisher.test.js +92 -0
- package/dist/types.d.ts +78 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/utils/changelog.d.ts +32 -0
- package/dist/utils/changelog.d.ts.map +1 -0
- package/dist/utils/changelog.js +210 -0
- package/dist/utils/changelog.test.d.ts +2 -0
- package/dist/utils/changelog.test.d.ts.map +1 -0
- package/dist/utils/changelog.test.js +126 -0
- package/dist/utils/scripts.d.ts +13 -0
- package/dist/utils/scripts.d.ts.map +1 -0
- package/dist/utils/scripts.js +30 -0
- package/dist/utils/scripts.test.d.ts +2 -0
- package/dist/utils/scripts.test.d.ts.map +1 -0
- package/dist/utils/scripts.test.js +58 -0
- package/dist/utils/version.d.ts +24 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +71 -0
- package/dist/utils/version.test.d.ts +2 -0
- package/dist/utils/version.test.d.ts.map +1 -0
- package/dist/utils/version.test.js +78 -0
- package/dist/utils/workspace.d.ts +14 -0
- package/dist/utils/workspace.d.ts.map +1 -0
- package/dist/utils/workspace.js +174 -0
- package/dist/utils/workspace.test.d.ts +2 -0
- package/dist/utils/workspace.test.d.ts.map +1 -0
- package/dist/utils/workspace.test.js +124 -0
- package/package.json +56 -0
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/cli.ts", "../src/utils/workspace.ts", "../src/i18n/locales/zh.ts", "../src/i18n/locales/en.ts", "../src/i18n/locales/ja.ts", "../src/i18n/locales/ko.ts", "../src/i18n/index.ts", "../src/prompts.ts", "../src/utils/version.ts", "../src/utils/scripts.ts", "../src/publisher.ts", "../src/utils/changelog.ts", "../src/logo.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"#!/usr/bin/env bun\n\n/**\n * CLI 入口文件\n * \n * Copyright (c) 2024 ccode\n * Licensed under the MIT License\n */\nimport ora from \"ora\";\nimport chalk from \"chalk\";\nimport { getWorkspaceInfo } from \"./utils/workspace\";\nimport {\n selectPackage,\n inputChangelog,\n selectVersion,\n selectScript,\n confirmPushTag,\n confirmRegistry,\n confirmOtp,\n confirmPublish,\n confirmGenerateChangelog,\n} from \"./prompts\";\nimport { runScript } from \"./utils/scripts\";\nimport { generateTag } from \"./utils/version\";\nimport { publish } from \"./publisher\";\nimport { showLogo, showSuccessMessage } from \"./logo\";\nimport type { PublishConfig } from \"./types\";\nimport { t } from \"./i18n\";\n\n/**\n * 主函数\n */\nasync function main() {\n try {\n // 显示 logo\n showLogo();\n\n // 获取 workspace 信息\n const workspaceInfo = getWorkspaceInfo();\n\n // 选择包(如果是 monorepo)\n let selectedPackage;\n if (workspaceInfo.isMonorepo) {\n selectedPackage = await selectPackage(workspaceInfo.packages);\n } else {\n selectedPackage = workspaceInfo.packages[0];\n }\n\n console.log(\n chalk.green(`\\n✅ ${t(\"package.selectedPackage\")}: ${chalk.bold(selectedPackage.name)} (${selectedPackage.version})`)\n );\n\n // 选择版本(先选择版本,以便生成默认 changelog)\n const { version: newVersion } = await selectVersion(selectedPackage.version);\n\n // 输入 changelog(传入包信息和版本信息,以便生成默认内容)\n const changelog = await inputChangelog(\n selectedPackage.name,\n selectedPackage.version,\n newVersion\n );\n\n // 生成 tag\n const tag = generateTag(selectedPackage.name, newVersion);\n\n // 选择脚本\n const script = await selectScript(selectedPackage);\n\n // 执行脚本(如果选择了)\n if (script) {\n const spinner = ora(`${t(\"script.running\")}: ${chalk.cyan(script)}`).start();\n try {\n await runScript(selectedPackage, script);\n spinner.succeed(`${t(\"script.success\")}: ${chalk.cyan(script)}`);\n } catch (error) {\n spinner.fail(`${t(\"script.failed\")}: ${chalk.red(script)}`);\n throw error;\n }\n }\n\n // 确认是否推送 tag\n const pushTag = await confirmPushTag();\n\n // 确认 registry\n const registry = await confirmRegistry();\n\n // 确认是否生成 changelog\n const generateChangelog = await confirmGenerateChangelog();\n\n // 确认是否需要输入 OTP\n const otp = await confirmOtp();\n\n // 构建发布配置\n const config: PublishConfig = {\n package: selectedPackage,\n changelog,\n newVersion,\n tag,\n script,\n pushTag,\n registry,\n generateChangelog,\n otp,\n };\n\n // 最终确认\n const confirmed = await confirmPublish(config);\n if (!confirmed) {\n console.log(chalk.yellow(`\\n❌ ${t(\"publish.cancelled\")}`));\n process.exit(0);\n }\n\n // 开始发布\n const publishSpinner = ora(t(\"publish.publishing\")).start();\n\n try {\n await publish(config);\n publishSpinner.succeed(t(\"publish.success\"));\n \n // 显示成功提示\n showSuccessMessage(selectedPackage.name, newVersion, registry);\n } catch (error) {\n publishSpinner.fail(t(\"publish.failed\"));\n console.error(chalk.red(`\\n❌ ${t(\"publish.error\")}:`), error);\n process.exit(1);\n }\n } catch (error) {\n console.error(chalk.red(`\\n❌ ${t(\"publish.generalError\")}:`), error);\n process.exit(1);\n }\n}\n\n// 运行主函数\nmain();\n",
|
|
6
|
+
"/**\n * Workspace 相关工具函数\n */\nimport { readFileSync, existsSync, readdirSync, statSync } from \"fs\";\nimport { join, resolve } from \"path\";\nimport type { PackageInfo, WorkspaceInfo } from \"../types\";\nimport { t } from \"../i18n\";\n\n/**\n * 读取 package.json 文件\n */\nfunction readPackageJson(path: string): Record<string, any> | null {\n const packageJsonPath = join(path, \"package.json\");\n if (!existsSync(packageJsonPath)) {\n return null;\n }\n \n try {\n const content = readFileSync(packageJsonPath, \"utf-8\");\n return JSON.parse(content);\n } catch {\n return null;\n }\n}\n\n/**\n * 检查是否是 monorepo 项目\n */\nfunction isMonorepo(packageJson: Record<string, any>): boolean {\n // 检查是否有 workspaces 字段\n if (packageJson.workspaces && Array.isArray(packageJson.workspaces)) {\n return true;\n }\n \n // 检查是否有 workspaces.packages 字段(pnpm/npm 7+)\n if (packageJson.workspaces?.packages && Array.isArray(packageJson.workspaces.packages)) {\n return true;\n }\n \n return false;\n}\n\n/**\n * 解析 workspace 模式\n */\nfunction parseWorkspacePatterns(workspaces: string[] | { packages?: string[] }): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces;\n }\n \n if (workspaces?.packages) {\n return workspaces.packages;\n }\n \n return [];\n}\n\n/**\n * 匹配包路径是否满足 workspace 模式\n */\nfunction matchesPattern(path: string, pattern: string): boolean {\n // 简单的 glob 匹配实现\n const regex = pattern\n .replace(/\\*\\*/g, \".*\")\n .replace(/\\*/g, \"[^/]*\")\n .replace(/\\//g, \"\\\\/\");\n \n return new RegExp(`^${regex}$`).test(path);\n}\n\n/**\n * 扫描目录下的包\n */\nfunction scanPackages(\n rootPath: string,\n patterns: string[],\n found: PackageInfo[] = []\n): PackageInfo[] {\n const rootPackageJson = readPackageJson(rootPath);\n if (!rootPackageJson) {\n return found;\n }\n\n // 递归扫描目录\n function scanDirectory(dir: string, depth: number = 0) {\n if (depth > 10) return; // 防止无限递归\n \n try {\n const entries = readdirSync(dir);\n \n for (const entry of entries) {\n const fullPath = join(dir, entry);\n // 计算相对路径,使用 path.relative 确保跨平台兼容\n const relativePath = fullPath.startsWith(rootPath)\n ? fullPath.slice(rootPath.length).replace(/^[/\\\\]/, \"\")\n : fullPath;\n \n // 跳过 node_modules 和隐藏目录\n if (entry.startsWith(\".\") || entry === \"node_modules\") {\n continue;\n }\n \n const stat = statSync(fullPath);\n \n if (stat.isDirectory()) {\n // 检查是否匹配 workspace 模式\n const matches = patterns.some((pattern) => matchesPattern(relativePath, pattern));\n \n if (matches) {\n const packageJson = readPackageJson(fullPath);\n if (packageJson && packageJson.name) {\n found.push({\n name: packageJson.name,\n version: packageJson.version || \"0.0.0\",\n path: fullPath,\n packageJson,\n });\n }\n } else {\n // 继续递归扫描\n scanDirectory(fullPath, depth + 1);\n }\n }\n }\n } catch (error) {\n // 忽略权限错误等\n }\n }\n\n scanDirectory(rootPath);\n return found;\n}\n\n/**\n * 获取 workspace 信息\n */\nexport function getWorkspaceInfo(workingDir: string = process.cwd()): WorkspaceInfo {\n const rootPath = resolve(workingDir);\n const rootPackageJson = readPackageJson(rootPath);\n \n if (!rootPackageJson) {\n throw new Error(t(\"workspace.packageJsonNotFound\"));\n }\n\n const isMonorepoProject = isMonorepo(rootPackageJson);\n \n if (!isMonorepoProject) {\n // 单仓库项目\n return {\n isMonorepo: false,\n packages: [\n {\n name: rootPackageJson.name || \"unknown\",\n version: rootPackageJson.version || \"0.0.0\",\n path: rootPath,\n packageJson: rootPackageJson,\n },\n ],\n rootPackageJson,\n rootPath,\n };\n }\n\n // Monorepo 项目\n const workspaceConfig = rootPackageJson.workspaces;\n const patterns = parseWorkspacePatterns(workspaceConfig);\n \n if (patterns.length === 0) {\n throw new Error(t(\"workspace.workspacesConfigInvalid\"));\n }\n\n const packages = scanPackages(rootPath, patterns);\n \n // 如果没有找到包,至少包含根包\n if (packages.length === 0 && rootPackageJson.name) {\n packages.push({\n name: rootPackageJson.name,\n version: rootPackageJson.version || \"0.0.0\",\n path: rootPath,\n packageJson: rootPackageJson,\n });\n }\n\n return {\n isMonorepo: true,\n packages,\n rootPackageJson,\n rootPath,\n };\n}\n\n/**\n * 根据包名查找包信息\n */\nexport function findPackageByName(\n workspaceInfo: WorkspaceInfo,\n packageName: string\n): PackageInfo | undefined {\n return workspaceInfo.packages.find((pkg) => pkg.name === packageName);\n}\n\n/**\n * 根据路径查找包信息\n */\nexport function findPackageByPath(\n workspaceInfo: WorkspaceInfo,\n packagePath: string\n): PackageInfo | undefined {\n const resolvedPath = resolve(packagePath);\n return workspaceInfo.packages.find((pkg) => resolve(pkg.path) === resolvedPath);\n}\n",
|
|
7
|
+
"/**\n * 中文语言包\n */\nexport default {\n // 通用\n common: {\n yes: \"是\",\n no: \"否\",\n skip: \"跳过\",\n cancel: \"取消\",\n confirm: \"确认\",\n error: \"错误\",\n success: \"成功\",\n },\n\n // 包选择\n package: {\n selectPackage: \"请选择要发布的包\",\n selectedPackage: \"已选择包\",\n },\n\n // Changelog\n changelog: {\n input: \"请输入 changelog(单行输入,支持多次输入,输入空行结束)\",\n singleLineHint: \"支持多次单行输入,输入空行结束。如果输入为空,将使用默认的版本升级记录\",\n empty: \"changelog 不能为空\",\n generate: \"是否生成 CHANGELOG.md 文件?\",\n usingDefault: \"使用默认 changelog:版本升级记录\",\n defaultContent: \"升级版本号: {currentVersion} → {newVersion}\",\n },\n\n // 版本\n version: {\n selectType: \"选择版本类型\",\n currentVersion: \"当前版本\",\n finalVersion: \"最终版本\",\n customVersion: \"自定义版本号\",\n customVersionDesc: \"手动输入版本号\",\n inputVersion: \"请输入版本号\",\n example: \"示例\",\n versionEmpty: \"版本号不能为空\",\n patch: \"补丁版本 - 修复 bug\",\n minor: \"次版本 - 新功能,向后兼容\",\n major: \"主版本 - 破坏性变更\",\n invalid: \"无效的版本号\",\n invalidWithVersion: \"无效的版本号: {version}\",\n cannotGenerate: \"无法生成下一个版本号\",\n unsupportedType: \"不支持的发布类型\",\n unsupportedTypeWithType: \"不支持的发布类型: {type}\",\n versionFormat: \"{current} -> {next}\",\n },\n\n // 脚本\n script: {\n select: \"请选择要执行的脚本(通常是 build)\",\n noScripts: \"该包没有 scripts\",\n running: \"执行脚本\",\n success: \"脚本执行成功\",\n failed: \"脚本执行失败\",\n notFound: \"脚本不存在\",\n notFoundWithName: \"脚本 \\\"{name}\\\" 不存在\",\n executionFailed: \"脚本执行失败,退出码: {exitCode}\",\n },\n\n // Git\n git: {\n pushTag: \"是否推送 git tag?\",\n createTagFailed: \"创建 git tag 失败,退出码: {exitCode}\",\n pushTagFailed: \"推送 git tag 失败,退出码: {exitCode}\",\n },\n\n // Registry\n registry: {\n input: \"请输入 npm registry 地址\",\n empty: \"registry 地址不能为空\",\n invalid: \"请输入有效的 URL\",\n },\n\n // 发布\n publish: {\n preview: \"发布配置预览\",\n packageName: \"包名\",\n currentVersion: \"当前版本\",\n newVersion: \"新版本\",\n tag: \"Tag\",\n changelog: \"Changelog\",\n registry: \"Registry\",\n pushTag: \"推送 Tag\",\n generateChangelog: \"生成 Changelog\",\n script: \"执行脚本\",\n confirm: \"确认发布?\",\n publishing: \"正在发布到 npm...\",\n success: \"发布成功!\",\n failed: \"发布失败\",\n cancelled: \"已取消发布\",\n error: \"发布过程中出现错误\",\n generalError: \"错误\",\n npmPublishFailed: \"npm 发布失败,退出码: {exitCode}\",\n npmNotLoggedIn: \"未登录到 npm registry: {registry},请先运行 'npm login --registry {registry}' 登录\",\n npmAuthCheckFailed: \"检查 npm 登录状态失败 (registry: {registry}): {error}\",\n needOtp: \"是否需要输入 npm 发布的一次性代码(OTP)?\",\n inputOtp: \"请输入一次性代码(OTP)\",\n otpEmpty: \"一次性代码不能为空\",\n otpInvalid: \"一次性代码必须是 6 位数字\",\n otp: \"一次性代码(OTP)\",\n rollingBack: \"发布失败,正在回滚修改...\",\n rollbackComplete: \"回滚完成\",\n rollbackFailed: \"回滚失败,请手动恢复版本号和 changelog:\",\n },\n\n // 成功消息\n success: {\n title: \"发布成功!\",\n packageName: \"包名\",\n version: \"版本\",\n registry: \"Registry\",\n thanks: \"感谢使用 bun-push!\",\n },\n\n // Changelog 类型\n changelogTypes: {\n added: \"新增\",\n changed: \"变更\",\n deprecated: \"废弃\",\n removed: \"移除\",\n fixed: \"修复\",\n security: \"安全\",\n },\n\n // Workspace\n workspace: {\n packageJsonNotFound: \"未找到 package.json 文件\",\n workspacesConfigInvalid: \"workspaces 配置无效\",\n packageNotFound: \"未找到要发布的包\",\n packageNotFoundByPath: \"未找到路径为 {path} 的包\",\n monorepoRequiresPath: \"monorepo 模式下必须指定 packagePath 或使用 CLI 模式\",\n },\n};\n",
|
|
8
|
+
"/**\n * English language pack\n */\nexport default {\n // Common\n common: {\n yes: \"Yes\",\n no: \"No\",\n skip: \"Skip\",\n cancel: \"Cancel\",\n confirm: \"Confirm\",\n error: \"Error\",\n success: \"Success\",\n },\n\n // Package selection\n package: {\n selectPackage: \"Select package to publish\",\n selectedPackage: \"Selected package\",\n },\n\n // Changelog\n changelog: {\n input: \"Enter changelog (single line input, supports multiple inputs, press Enter to finish)\",\n singleLineHint: \"Supports multiple single-line inputs, press Enter to finish. If input is empty, default version upgrade record will be used\",\n empty: \"changelog cannot be empty\",\n generate: \"Generate CHANGELOG.md file?\",\n usingDefault: \"Using default changelog: version upgrade record\",\n defaultContent: \"Upgrade version: {currentVersion} → {newVersion}\",\n },\n\n // Version\n version: {\n selectType: \"Select version type\",\n currentVersion: \"Current version\",\n finalVersion: \"Final version\",\n customVersion: \"Custom version\",\n customVersionDesc: \"Enter version manually\",\n inputVersion: \"Enter version number\",\n example: \"Example\",\n versionEmpty: \"Version cannot be empty\",\n patch: \"Patch version - Bug fixes\",\n minor: \"Minor version - New features, backward compatible\",\n major: \"Major version - Breaking changes\",\n invalid: \"Invalid version number\",\n invalidWithVersion: \"Invalid version number: {version}\",\n cannotGenerate: \"Cannot generate next version\",\n unsupportedType: \"Unsupported release type\",\n unsupportedTypeWithType: \"Unsupported release type: {type}\",\n versionFormat: \"{current} -> {next}\",\n },\n\n // Script\n script: {\n select: \"Select script to run (usually build)\",\n noScripts: \"This package has no scripts\",\n running: \"Running script\",\n success: \"Script executed successfully\",\n failed: \"Script execution failed\",\n notFound: \"Script not found\",\n notFoundWithName: \"Script \\\"{name}\\\" not found\",\n executionFailed: \"Script execution failed, exit code: {exitCode}\",\n },\n\n // Git\n git: {\n pushTag: \"Push git tag?\",\n createTagFailed: \"Failed to create git tag, exit code: {exitCode}\",\n pushTagFailed: \"Failed to push git tag, exit code: {exitCode}\",\n },\n\n // Registry\n registry: {\n input: \"Enter npm registry address\",\n empty: \"Registry address cannot be empty\",\n invalid: \"Please enter a valid URL\",\n },\n\n // Publish\n publish: {\n preview: \"Publish configuration preview\",\n packageName: \"Package name\",\n currentVersion: \"Current version\",\n newVersion: \"New version\",\n tag: \"Tag\",\n changelog: \"Changelog\",\n registry: \"Registry\",\n pushTag: \"Push Tag\",\n generateChangelog: \"Generate Changelog\",\n script: \"Script\",\n confirm: \"Confirm publish?\",\n publishing: \"Publishing to npm...\",\n success: \"Published successfully!\",\n failed: \"Publish failed\",\n cancelled: \"Publish cancelled\",\n error: \"Error during publish\",\n generalError: \"Error\",\n npmPublishFailed: \"npm publish failed, exit code: {exitCode}\",\n npmNotLoggedIn: \"Not logged in to npm registry: {registry}, please run 'npm login --registry {registry}' first\",\n npmAuthCheckFailed: \"Failed to check npm login status (registry: {registry}): {error}\",\n needOtp: \"Do you need to enter npm publish one-time code (OTP)?\",\n inputOtp: \"Enter one-time code (OTP)\",\n otpEmpty: \"One-time code cannot be empty\",\n otpInvalid: \"One-time code must be 6 digits\",\n otp: \"One-time code (OTP)\",\n rollingBack: \"Publish failed, rolling back changes...\",\n rollbackComplete: \"Rollback completed\",\n rollbackFailed: \"Rollback failed, please manually restore version and changelog:\",\n },\n\n // Success message\n success: {\n title: \"Published successfully!\",\n packageName: \"Package name\",\n version: \"Version\",\n registry: \"Registry\",\n thanks: \"Thanks for using bun-push!\",\n },\n\n // Changelog types\n changelogTypes: {\n added: \"Added\",\n changed: \"Changed\",\n deprecated: \"Deprecated\",\n removed: \"Removed\",\n fixed: \"Fixed\",\n security: \"Security\",\n },\n\n // Workspace\n workspace: {\n packageJsonNotFound: \"package.json file not found\",\n workspacesConfigInvalid: \"workspaces configuration is invalid\",\n packageNotFound: \"Package not found\",\n packageNotFoundByPath: \"Package not found at path: {path}\",\n monorepoRequiresPath: \"In monorepo mode, packagePath must be specified or use CLI mode\",\n },\n};\n",
|
|
9
|
+
"/**\n * 日本語言語パック\n */\nexport default {\n // 共通\n common: {\n yes: \"はい\",\n no: \"いいえ\",\n skip: \"スキップ\",\n cancel: \"キャンセル\",\n confirm: \"確認\",\n error: \"エラー\",\n success: \"成功\",\n },\n\n // パッケージ選択\n package: {\n selectPackage: \"公開するパッケージを選択してください\",\n selectedPackage: \"選択されたパッケージ\",\n },\n\n // Changelog\n changelog: {\n input: \"changelogを入力してください(1行入力、複数回入力対応、Enterキーで終了)\",\n singleLineHint: \"複数回の1行入力をサポート、Enterキーで終了。入力が空の場合、デフォルトのバージョンアップグレード記録が使用されます\",\n empty: \"changelogは空にできません\",\n generate: \"CHANGELOG.mdファイルを生成しますか?\",\n usingDefault: \"デフォルトのchangelogを使用:バージョンアップグレード記録\",\n defaultContent: \"バージョンアップグレード: {currentVersion} → {newVersion}\",\n },\n\n // バージョン\n version: {\n selectType: \"バージョンタイプを選択\",\n currentVersion: \"現在のバージョン\",\n finalVersion: \"最終バージョン\",\n customVersion: \"カスタムバージョン\",\n customVersionDesc: \"バージョンを手動で入力\",\n inputVersion: \"バージョン番号を入力してください\",\n example: \"例\",\n versionEmpty: \"バージョンは空にできません\",\n patch: \"パッチバージョン - バグ修正\",\n minor: \"マイナーバージョン - 新機能、後方互換\",\n major: \"メジャーバージョン - 破壊的変更\",\n invalid: \"無効なバージョン番号\",\n invalidWithVersion: \"無効なバージョン番号: {version}\",\n cannotGenerate: \"次のバージョンを生成できません\",\n unsupportedType: \"サポートされていないリリースタイプ\",\n unsupportedTypeWithType: \"サポートされていないリリースタイプ: {type}\",\n versionFormat: \"{current} -> {next}\",\n },\n\n // スクリプト\n script: {\n select: \"実行するスクリプトを選択してください(通常はbuild)\",\n noScripts: \"このパッケージにはスクリプトがありません\",\n running: \"スクリプトを実行中\",\n success: \"スクリプトの実行に成功しました\",\n failed: \"スクリプトの実行に失敗しました\",\n notFound: \"スクリプトが見つかりません\",\n notFoundWithName: \"スクリプト \\\"{name}\\\" が見つかりません\",\n executionFailed: \"スクリプトの実行に失敗しました、終了コード: {exitCode}\",\n },\n\n // Git\n git: {\n pushTag: \"git tagをプッシュしますか?\",\n createTagFailed: \"git tagの作成に失敗しました、終了コード: {exitCode}\",\n pushTagFailed: \"git tagのプッシュに失敗しました、終了コード: {exitCode}\",\n },\n\n // Registry\n registry: {\n input: \"npm registryアドレスを入力してください\",\n empty: \"registryアドレスは空にできません\",\n invalid: \"有効なURLを入力してください\",\n },\n\n // 公開\n publish: {\n preview: \"公開設定プレビュー\",\n packageName: \"パッケージ名\",\n currentVersion: \"現在のバージョン\",\n newVersion: \"新しいバージョン\",\n tag: \"Tag\",\n changelog: \"Changelog\",\n registry: \"Registry\",\n pushTag: \"Tagをプッシュ\",\n generateChangelog: \"Changelogを生成\",\n script: \"スクリプト\",\n confirm: \"公開を確認しますか?\",\n publishing: \"npmに公開中...\",\n success: \"公開に成功しました!\",\n failed: \"公開に失敗しました\",\n cancelled: \"公開がキャンセルされました\",\n error: \"公開中にエラーが発生しました\",\n generalError: \"エラー\",\n npmPublishFailed: \"npm公開に失敗しました、終了コード: {exitCode}\",\n npmNotLoggedIn: \"npm registry にログインしていません: {registry},先に 'npm login --registry {registry}' を実行してください\",\n npmAuthCheckFailed: \"npm ログイン状態の確認に失敗しました (registry: {registry}): {error}\",\n needOtp: \"npm公開のワンタイムコード(OTP)を入力する必要がありますか?\",\n inputOtp: \"ワンタイムコード(OTP)を入力してください\",\n otpEmpty: \"ワンタイムコードは空にできません\",\n otpInvalid: \"ワンタイムコードは6桁の数字である必要があります\",\n otp: \"ワンタイムコード(OTP)\",\n rollingBack: \"公開に失敗しました、変更をロールバック中...\",\n rollbackComplete: \"ロールバックが完了しました\",\n rollbackFailed: \"ロールバックに失敗しました、バージョンとchangelogを手動で復元してください:\",\n },\n\n // 成功メッセージ\n success: {\n title: \"公開に成功しました!\",\n packageName: \"パッケージ名\",\n version: \"バージョン\",\n registry: \"Registry\",\n thanks: \"bun-pushをご利用いただきありがとうございます!\",\n },\n\n // Changelogタイプ\n changelogTypes: {\n added: \"追加\",\n changed: \"変更\",\n deprecated: \"非推奨\",\n removed: \"削除\",\n fixed: \"修正\",\n security: \"セキュリティ\",\n },\n\n // Workspace\n workspace: {\n packageJsonNotFound: \"package.jsonファイルが見つかりません\",\n workspacesConfigInvalid: \"workspaces設定が無効です\",\n packageNotFound: \"パッケージが見つかりません\",\n packageNotFoundByPath: \"パス {path} にパッケージが見つかりません\",\n monorepoRequiresPath: \"monorepoモードでは、packagePathを指定するかCLIモードを使用する必要があります\",\n },\n};\n",
|
|
10
|
+
"/**\n * 한국어 언어 팩\n */\nexport default {\n // 공통\n common: {\n yes: \"예\",\n no: \"아니오\",\n skip: \"건너뛰기\",\n cancel: \"취소\",\n confirm: \"확인\",\n error: \"오류\",\n success: \"성공\",\n },\n\n // 패키지 선택\n package: {\n selectPackage: \"게시할 패키지를 선택하세요\",\n selectedPackage: \"선택된 패키지\",\n },\n\n // Changelog\n changelog: {\n input: \"changelog를 입력하세요 (한 줄 입력, 여러 번 입력 지원, Enter 키로 종료)\",\n singleLineHint: \"여러 번의 한 줄 입력을 지원하며, Enter 키로 종료합니다. 입력이 비어 있으면 기본 버전 업그레이드 기록이 사용됩니다\",\n empty: \"changelog는 비어 있을 수 없습니다\",\n generate: \"CHANGELOG.md 파일을 생성하시겠습니까?\",\n usingDefault: \"기본 changelog 사용: 버전 업그레이드 기록\",\n defaultContent: \"버전 업그레이드: {currentVersion} → {newVersion}\",\n },\n\n // 버전\n version: {\n selectType: \"버전 유형 선택\",\n currentVersion: \"현재 버전\",\n finalVersion: \"최종 버전\",\n customVersion: \"사용자 정의 버전\",\n customVersionDesc: \"버전을 수동으로 입력\",\n inputVersion: \"버전 번호를 입력하세요\",\n example: \"예\",\n versionEmpty: \"버전은 비어 있을 수 없습니다\",\n patch: \"패치 버전 - 버그 수정\",\n minor: \"마이너 버전 - 새 기능, 하위 호환\",\n major: \"메이저 버전 - 주요 변경 사항\",\n invalid: \"유효하지 않은 버전 번호\",\n invalidWithVersion: \"유효하지 않은 버전 번호: {version}\",\n cannotGenerate: \"다음 버전을 생성할 수 없습니다\",\n unsupportedType: \"지원되지 않는 릴리스 유형\",\n unsupportedTypeWithType: \"지원되지 않는 릴리스 유형: {type}\",\n versionFormat: \"{current} -> {next}\",\n },\n\n // 스크립트\n script: {\n select: \"실행할 스크립트를 선택하세요 (보통 build)\",\n noScripts: \"이 패키지에는 스크립트가 없습니다\",\n running: \"스크립트 실행 중\",\n success: \"스크립트 실행 성공\",\n failed: \"스크립트 실행 실패\",\n notFound: \"스크립트를 찾을 수 없습니다\",\n notFoundWithName: \"스크립트 \\\"{name}\\\"를 찾을 수 없습니다\",\n executionFailed: \"스크립트 실행 실패, 종료 코드: {exitCode}\",\n },\n\n // Git\n git: {\n pushTag: \"git tag를 푸시하시겠습니까?\",\n createTagFailed: \"git tag 생성 실패, 종료 코드: {exitCode}\",\n pushTagFailed: \"git tag 푸시 실패, 종료 코드: {exitCode}\",\n },\n\n // Registry\n registry: {\n input: \"npm registry 주소를 입력하세요\",\n empty: \"registry 주소는 비어 있을 수 없습니다\",\n invalid: \"유효한 URL을 입력하세요\",\n },\n\n // 게시\n publish: {\n preview: \"게시 구성 미리보기\",\n packageName: \"패키지 이름\",\n currentVersion: \"현재 버전\",\n newVersion: \"새 버전\",\n tag: \"Tag\",\n changelog: \"Changelog\",\n registry: \"Registry\",\n pushTag: \"Tag 푸시\",\n generateChangelog: \"Changelog 생성\",\n script: \"스크립트\",\n confirm: \"게시를 확인하시겠습니까?\",\n publishing: \"npm에 게시 중...\",\n success: \"게시 성공!\",\n failed: \"게시 실패\",\n cancelled: \"게시 취소됨\",\n error: \"게시 중 오류 발생\",\n generalError: \"오류\",\n npmPublishFailed: \"npm 게시 실패, 종료 코드: {exitCode}\",\n npmNotLoggedIn: \"npm registry에 로그인하지 않았습니다: {registry},먼저 'npm login --registry {registry}'를 실행하세요\",\n npmAuthCheckFailed: \"npm 로그인 상태 확인 실패 (registry: {registry}): {error}\",\n needOtp: \"npm 게시 일회용 코드(OTP)를 입력해야 합니까?\",\n inputOtp: \"일회용 코드(OTP)를 입력하세요\",\n otpEmpty: \"일회용 코드는 비어 있을 수 없습니다\",\n otpInvalid: \"일회용 코드는 6자리 숫자여야 합니다\",\n otp: \"일회용 코드(OTP)\",\n rollingBack: \"게시 실패, 변경 사항 롤백 중...\",\n rollbackComplete: \"롤백 완료\",\n rollbackFailed: \"롤백 실패, 버전과 changelog를 수동으로 복원하세요:\",\n },\n\n // 성공 메시지\n success: {\n title: \"게시 성공!\",\n packageName: \"패키지 이름\",\n version: \"버전\",\n registry: \"Registry\",\n thanks: \"bun-push를 사용해 주셔서 감사합니다!\",\n },\n\n // Changelog 유형\n changelogTypes: {\n added: \"추가됨\",\n changed: \"변경됨\",\n deprecated: \"사용 중단됨\",\n removed: \"제거됨\",\n fixed: \"수정됨\",\n security: \"보안\",\n },\n\n // Workspace\n workspace: {\n packageJsonNotFound: \"package.json 파일을 찾을 수 없습니다\",\n workspacesConfigInvalid: \"workspaces 구성이 유효하지 않습니다\",\n packageNotFound: \"패키지를 찾을 수 없습니다\",\n packageNotFoundByPath: \"경로 {path}에서 패키지를 찾을 수 없습니다\",\n monorepoRequiresPath: \"monorepo 모드에서는 packagePath를 지정하거나 CLI 모드를 사용해야 합니다\",\n },\n};\n",
|
|
11
|
+
"/**\n * 国际化模块\n */\nimport zh from \"./locales/zh\";\nimport en from \"./locales/en\";\nimport ja from \"./locales/ja\";\nimport ko from \"./locales/ko\";\n\nexport type Language = \"zh\" | \"en\" | \"ja\" | \"ko\";\n\nexport const SUPPORTED_LANGUAGES: Language[] = [\"zh\", \"en\", \"ja\", \"ko\"];\n\nconst translations = {\n zh,\n en,\n ja,\n ko,\n};\n\nlet currentLanguage: Language = \"zh\";\n\n/**\n * 检测系统语言\n */\nfunction detectLanguage(): Language {\n // 优先从环境变量获取\n const envLang = process.env.LANG || process.env.LANGUAGE || process.env.LC_ALL || process.env.LC_MESSAGES || \"\";\n \n // 从环境变量解析语言代码\n if (envLang) {\n // 支持格式: zh_CN.UTF-8, zh-CN.UTF-8, zh_CN, zh-CN 等\n const langMatch = envLang.match(/(?:^|_|-)(zh|en|ja|ko)(?:[._-]|$)/i);\n if (langMatch) {\n const lang = langMatch[1].toLowerCase() as Language;\n if (SUPPORTED_LANGUAGES.includes(lang)) {\n return lang;\n }\n }\n }\n \n // 从系统 locale 获取(使用 Intl API)\n try {\n const locale = Intl.DateTimeFormat().resolvedOptions().locale;\n const lang = locale.split(\"-\")[0].toLowerCase() as Language;\n \n if (SUPPORTED_LANGUAGES.includes(lang)) {\n return lang;\n }\n } catch {\n // 忽略错误\n }\n\n // 尝试从 Intl.Collator 获取\n try {\n const collator = new Intl.Collator();\n const locale = collator.resolvedOptions().locale;\n const lang = locale.split(\"-\")[0].toLowerCase() as Language;\n \n if (SUPPORTED_LANGUAGES.includes(lang)) {\n return lang;\n }\n } catch {\n // 忽略错误\n }\n\n // 默认返回中文\n return \"zh\";\n}\n\n/**\n * 设置语言\n */\nexport function setLanguage(lang: Language): void {\n if (SUPPORTED_LANGUAGES.includes(lang)) {\n currentLanguage = lang;\n }\n}\n\n/**\n * 获取当前语言\n */\nexport function getLanguage(): Language {\n return currentLanguage;\n}\n\n/**\n * 初始化语言(自动检测)\n */\nexport function initLanguage(): void {\n // 优先检查环境变量\n const envLang = process.env.BUN_PUSH_LANG as Language | undefined;\n if (envLang && SUPPORTED_LANGUAGES.includes(envLang)) {\n currentLanguage = envLang;\n return;\n }\n\n // 自动检测系统语言\n currentLanguage = detectLanguage();\n}\n\n/**\n * 翻译函数\n * @param key 翻译键\n * @param params 参数对象,用于替换占位符 {key}\n */\nexport function t(key: string, params?: Record<string, string | number>): string {\n const keys = key.split(\".\");\n let value: any = translations[currentLanguage];\n\n for (const k of keys) {\n if (value && typeof value === \"object\" && k in value) {\n value = value[k];\n } else {\n // 如果当前语言找不到,尝试使用中文\n if (currentLanguage !== \"zh\") {\n value = translations.zh;\n for (const k2 of keys) {\n if (value && typeof value === \"object\" && k2 in value) {\n value = value[k2];\n } else {\n return key; // 如果都找不到,返回 key\n }\n }\n } else {\n return key; // 如果都找不到,返回 key\n }\n }\n }\n\n let result = typeof value === \"string\" ? value : key;\n\n // 替换参数占位符\n if (params) {\n for (const [paramKey, paramValue] of Object.entries(params)) {\n result = result.replace(new RegExp(`\\\\{${paramKey}\\\\}`, \"g\"), String(paramValue));\n }\n }\n\n return result;\n}\n\n// 初始化语言\ninitLanguage();\n",
|
|
12
|
+
"/**\n * 交互式命令行提示\n */\nimport prompts from \"prompts\";\nimport chalk from \"chalk\";\nimport type { PackageInfo, PublishConfig } from \"./types\";\nimport { getNextVersion, RELEASE_TYPES, getReleaseTypeDescription, isValidVersion, type StandardReleaseType } from \"./utils/version\";\nimport { getPackageScripts } from \"./utils/scripts\";\nimport { t } from \"./i18n\";\n\n/**\n * 选择要发布的包(monorepo 模式)\n */\nexport async function selectPackage(packages: PackageInfo[]): Promise<PackageInfo> {\n if (packages.length === 1) {\n return packages[0];\n }\n\n const { value } = await prompts({\n type: \"select\",\n name: \"value\",\n message: t(\"package.selectPackage\"),\n choices: packages.map((pkg) => ({\n title: `${pkg.name} (${pkg.version})`,\n value: pkg,\n description: pkg.path,\n })),\n });\n\n if (!value) {\n process.exit(0);\n }\n\n return value;\n}\n\n/**\n * 生成默认的 changelog 内容\n */\nfunction generateDefaultChangelog(packageName: string, currentVersion: string, newVersion: string): string {\n return t(\"changelog.defaultContent\", { packageName, currentVersion, newVersion });\n}\n\n/**\n * 输入 changelog(单行输入,支持多次输入)\n * 如果用户输入为空或空格,将使用默认的版本升级记录\n */\nexport async function inputChangelog(\n packageName: string,\n currentVersion: string,\n newVersion: string\n): Promise<string> {\n // 使用 Node.js 内置的 readline 模块\n const { createInterface } = await import(\"readline\");\n \n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n console.log(chalk.cyan(t(\"changelog.input\")));\n console.log(chalk.gray(t(\"changelog.singleLineHint\")));\n\n const lines: string[] = [];\n let lineNumber = 1;\n\n return new Promise((resolve) => {\n const promptLine = () => {\n rl.setPrompt(chalk.gray(`[${lineNumber}] `));\n rl.prompt();\n };\n\n promptLine();\n\n rl.on(\"line\", (line: string) => {\n const trimmed = line.trim();\n \n // 如果输入为空或空格,且已有内容,结束输入\n if (trimmed === \"\" && lines.length > 0) {\n rl.close();\n return;\n }\n \n // 如果输入为空或空格,且没有内容,使用默认 changelog\n if (trimmed === \"\" && lines.length === 0) {\n rl.close();\n return;\n }\n \n // 保存非空行\n if (trimmed !== \"\") {\n lines.push(trimmed);\n lineNumber++;\n promptLine();\n }\n });\n\n rl.on(\"close\", () => {\n const result = lines.join(\"\\n\").trim();\n \n // 如果结果为空或只有空格,使用默认 changelog\n if (!result) {\n const defaultChangelog = generateDefaultChangelog(packageName, currentVersion, newVersion);\n console.log(chalk.yellow(t(\"changelog.usingDefault\")));\n resolve(defaultChangelog);\n return;\n }\n\n resolve(result);\n });\n\n rl.on(\"SIGINT\", () => {\n rl.close();\n process.exit(0);\n });\n });\n}\n\n/**\n * 确认是否生成 changelog 文件\n */\nexport async function confirmGenerateChangelog(): Promise<boolean> {\n const { value } = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: t(\"changelog.generate\"),\n initial: true,\n });\n\n if (value === undefined) {\n process.exit(0);\n }\n\n return value;\n}\n\n/**\n * 选择版本类型并生成版本号\n */\nexport async function selectVersion(currentVersion: string): Promise<{\n version: string;\n releaseType: string;\n}> {\n const choices: Array<{ title: string; value: string; description: string }> = RELEASE_TYPES.map((type) => {\n const nextVersion = getNextVersion(currentVersion, type);\n return {\n title: getReleaseTypeDescription(type),\n value: type,\n description: `${t(\"version.currentVersion\")}: ${chalk.cyan(currentVersion)} → ${t(\"version.finalVersion\")}: ${chalk.bold.green(nextVersion)}`,\n };\n });\n\n // 添加自定义版本选项\n choices.push({\n title: t(\"version.customVersion\"),\n value: \"custom\",\n description: t(\"version.customVersionDesc\"),\n });\n\n const { value: releaseType } = await prompts({\n type: \"select\",\n name: \"value\",\n message: `${t(\"version.currentVersion\")}: ${chalk.cyan(currentVersion)} | ${t(\"version.selectType\")}`,\n choices,\n });\n\n if (!releaseType) {\n process.exit(0);\n }\n\n if (releaseType === \"custom\") {\n const { value: customVersion } = await prompts({\n type: \"text\",\n name: \"value\",\n message: `${t(\"version.inputVersion\")} ${chalk.gray(`(${t(\"version.example\")}: 1.0.0-beta.1)`)}`,\n validate: (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) {\n return t(\"version.versionEmpty\");\n }\n if (!isValidVersion(trimmed)) {\n return t(\"version.invalidWithVersion\", { version: trimmed });\n }\n return true;\n },\n });\n\n if (!customVersion) {\n process.exit(0);\n }\n\n const trimmedVersion = customVersion.trim();\n if (!isValidVersion(trimmedVersion)) {\n throw new Error(t(\"version.invalidWithVersion\", { version: trimmedVersion }));\n }\n\n return {\n version: trimmedVersion,\n releaseType: \"custom\",\n };\n }\n\n // 类型守卫:确保 releaseType 是 StandardReleaseType\n if (RELEASE_TYPES.includes(releaseType as StandardReleaseType)) {\n return {\n version: getNextVersion(currentVersion, releaseType as StandardReleaseType),\n releaseType,\n };\n }\n\n // 如果类型不匹配,抛出错误\n throw new Error(t(\"version.unsupportedTypeWithType\", { type: releaseType }));\n}\n\n/**\n * 选择要执行的脚本\n */\nexport async function selectScript(packageInfo: PackageInfo): Promise<string | undefined> {\n const scripts = getPackageScripts(packageInfo);\n\n if (scripts.length === 0) {\n // 如果没有 scripts,直接返回 undefined\n return undefined;\n }\n\n const choices = scripts.map((script) => ({\n title: script,\n value: script,\n }));\n\n choices.push({\n title: t(\"common.skip\"),\n value: \"skip\",\n });\n\n const { value: answer } = await prompts({\n type: \"select\",\n name: \"value\",\n message: t(\"script.select\"),\n choices,\n });\n\n if (!answer) {\n process.exit(0);\n }\n\n return answer === \"skip\" ? undefined : answer;\n}\n\n/**\n * 确认是否推送 git tag\n */\nexport async function confirmPushTag(): Promise<boolean> {\n const { value } = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: t(\"git.pushTag\"),\n initial: true,\n });\n\n if (value === undefined) {\n process.exit(0);\n }\n\n return value;\n}\n\n/**\n * 确认是否需要输入 npm OTP\n */\nexport async function confirmOtp(): Promise<string | undefined> {\n const { value: needOtp } = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: t(\"publish.needOtp\"),\n initial: false,\n });\n\n if (needOtp === undefined) {\n process.exit(0);\n }\n\n if (!needOtp) {\n return undefined;\n }\n\n const { value: otp } = await prompts({\n type: \"text\",\n name: \"value\",\n message: t(\"publish.inputOtp\"),\n validate: (input: string) => {\n const trimmed = input.trim();\n if (!trimmed) {\n return t(\"publish.otpEmpty\");\n }\n // OTP 通常是 6 位数字\n if (!/^\\d{6}$/.test(trimmed)) {\n return t(\"publish.otpInvalid\");\n }\n return true;\n },\n });\n\n if (!otp) {\n process.exit(0);\n }\n\n return otp.trim();\n}\n\n/**\n * 确认 npm registry 地址\n */\nexport async function confirmRegistry(): Promise<string> {\n const { value } = await prompts({\n type: \"text\",\n name: \"value\",\n message: t(\"registry.input\"),\n initial: process.env.NPM_CONFIG_REGISTRY || 'https://registry.npmjs.org/',\n validate: (input: string) => {\n if (!input.trim()) {\n return t(\"registry.empty\");\n }\n try {\n new URL(input);\n return true;\n } catch {\n return t(\"registry.invalid\");\n }\n },\n });\n\n if (!value) {\n process.exit(0);\n }\n\n return value.trim();\n}\n\n/**\n * 最终确认发布\n */\nexport async function confirmPublish(config: PublishConfig): Promise<boolean> {\n console.log(chalk.bold(`\\n📦 ${t(\"publish.preview\")}`));\n console.log(chalk.gray(\"─\".repeat(50)));\n console.log(chalk.cyan(`${t(\"publish.packageName\")}:`), config.package.name);\n console.log(chalk.cyan(`${t(\"publish.currentVersion\")}:`), config.package.version);\n console.log(chalk.cyan(`${t(\"publish.newVersion\")}:`), config.newVersion);\n console.log(chalk.cyan(`${t(\"publish.tag\")}:`), config.tag);\n console.log(chalk.cyan(`${t(\"publish.changelog\")}:`), config.changelog);\n console.log(chalk.cyan(`${t(\"publish.registry\")}:`), config.registry);\n console.log(chalk.cyan(`${t(\"publish.pushTag\")}:`), config.pushTag ? t(\"common.yes\") : t(\"common.no\"));\n console.log(chalk.cyan(`${t(\"publish.generateChangelog\")}:`), config.generateChangelog ? t(\"common.yes\") : t(\"common.no\"));\n if (config.otp) {\n console.log(chalk.cyan(`${t(\"publish.otp\")}:`), chalk.gray(\"***\"));\n }\n if (config.script) {\n console.log(chalk.cyan(`${t(\"publish.script\")}:`), config.script);\n }\n console.log(chalk.gray(\"─\".repeat(50)));\n\n const { value } = await prompts({\n type: \"confirm\",\n name: \"value\",\n message: t(\"publish.confirm\"),\n initial: true,\n });\n\n if (value === undefined) {\n process.exit(0);\n }\n\n return value;\n}\n",
|
|
13
|
+
"/**\n * 版本管理相关工具函数\n */\nimport semver from \"semver\";\nimport { t } from \"../i18n\";\n\n/**\n * 可用的发布类型(仅支持标准版本)\n */\nexport type StandardReleaseType = \"patch\" | \"minor\" | \"major\";\nexport const RELEASE_TYPES: StandardReleaseType[] = [\"patch\", \"minor\", \"major\"];\n\n/**\n * 生成下一个版本号\n */\nexport function getNextVersion(\n currentVersion: string,\n releaseType: StandardReleaseType = \"patch\"\n): string {\n if (!semver.valid(currentVersion)) {\n throw new Error(t(\"version.invalidWithVersion\", { version: currentVersion }));\n }\n\n const nextVersion = semver.inc(currentVersion, releaseType);\n if (!nextVersion) {\n throw new Error(t(\"version.cannotGenerate\"));\n }\n\n return nextVersion;\n}\n\n/**\n * 验证版本号格式\n * 只接受标准的语义化版本号格式:major.minor.patch\n * 不接受预发布版本(如 1.0.0-alpha)和构建元数据(如 1.0.0+20130313)\n */\nexport function isValidVersion(version: string): boolean {\n // 首先检查是否为空\n if (!version || typeof version !== \"string\") {\n return false;\n }\n\n const trimmed = version.trim();\n if (!trimmed) {\n return false;\n }\n\n // 使用正则表达式验证:必须是三个数字,用点分隔,不包含其他字符\n // 格式:major.minor.patch,其中 major、minor、patch 都是非负整数\n const standardVersionPattern = /^\\d+\\.\\d+\\.\\d+$/;\n if (!standardVersionPattern.test(trimmed)) {\n return false;\n }\n\n // 使用 semver.valid 进行二次验证,确保版本号有效\n // 如果 semver.valid 返回 null,说明版本号无效(如数字超出范围)\n const valid = semver.valid(trimmed);\n if (!valid) {\n return false;\n }\n\n // 确保 semver.valid 返回的版本号与输入的版本号完全一致\n // 这样可以排除预发布版本和构建元数据的情况\n // 例如:\"1.0.0-alpha\" 会被 semver.valid 规范化为 \"1.0.0-alpha\",但输入是 \"1.0.0-alpha\"\n // 而 \"1.0.0\" 会被规范化为 \"1.0.0\",输入也是 \"1.0.0\",所以应该相等\n // 但如果输入包含预发布或构建元数据,semver.valid 可能返回不同的值\n return valid === trimmed;\n}\n\n/**\n * 生成 git tag 名称\n */\nexport function generateTag(packageName: string, version: string): string {\n // 移除 @scope/ 前缀(如果有)\n const nameWithoutScope = packageName.replace(/^@[^/]+\\//, \"\");\n return `${nameWithoutScope}@${version}`;\n}\n\n/**\n * 获取发布类型的描述\n */\nexport function getReleaseTypeDescription(type: StandardReleaseType): string {\n const descriptions: Record<StandardReleaseType, string> = {\n patch: t(\"version.patch\"),\n minor: t(\"version.minor\"),\n major: t(\"version.major\"),\n };\n return descriptions[type];\n}\n",
|
|
14
|
+
"/**\n * Scripts 相关工具函数\n */\nimport type { PackageInfo } from \"../types\";\nimport { t } from \"../i18n\";\n\n/**\n * 获取包的所有 scripts\n */\nexport function getPackageScripts(packageInfo: PackageInfo): string[] {\n const scripts = packageInfo.packageJson.scripts;\n if (!scripts || typeof scripts !== \"object\") {\n return [];\n }\n\n return Object.keys(scripts);\n}\n\n/**\n * 执行脚本\n */\nexport async function runScript(\n packageInfo: PackageInfo,\n scriptName: string\n): Promise<void> {\n const scripts = packageInfo.packageJson.scripts;\n if (!scripts || !scripts[scriptName]) {\n throw new Error(t(\"script.notFoundWithName\", { name: scriptName }));\n }\n\n // 使用 Bun 执行脚本\n const proc = Bun.spawn([\"bun\", \"run\", scriptName], {\n cwd: packageInfo.path,\n stdout: \"inherit\",\n stderr: \"inherit\",\n });\n\n const exitCode = await proc.exited;\n if (exitCode !== 0) {\n throw new Error(t(\"script.executionFailed\", { exitCode }));\n }\n}\n",
|
|
15
|
+
"/**\n * npm 发布逻辑\n */\nimport { writeFileSync, readFileSync, existsSync, unlinkSync } from \"fs\";\nimport { join } from \"path\";\nimport type { PublishConfig } from \"./types\";\nimport { updateChangelog, readChangelog } from \"./utils/changelog\";\nimport { t } from \"./i18n\";\n\n/**\n * 读取 package.json 中的版本号\n */\nfunction readPackageVersion(packagePath: string): string {\n const packageJsonPath = join(packagePath, \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n return packageJson.version;\n}\n\n/**\n * 更新 package.json 中的版本号\n */\nfunction updatePackageVersion(packagePath: string, newVersion: string): void {\n const packageJsonPath = join(packagePath, \"package.json\");\n const packageJson = JSON.parse(readFileSync(packageJsonPath, \"utf-8\"));\n \n packageJson.version = newVersion;\n \n writeFileSync(\n packageJsonPath,\n JSON.stringify(packageJson, null, 2) + \"\\n\",\n \"utf-8\"\n );\n}\n\n/**\n * 恢复 package.json 中的版本号\n */\nfunction restorePackageVersion(packagePath: string, oldVersion: string): void {\n updatePackageVersion(packagePath, oldVersion);\n}\n\n/**\n * 恢复 CHANGELOG.md 文件\n */\nfunction restoreChangelog(packagePath: string, oldContent: string): void {\n const changelogPath = join(packagePath, \"CHANGELOG.md\");\n \n if (oldContent === \"\") {\n // 如果原始内容为空,说明原始没有 changelog 文件,删除新创建的文件(如果存在)\n if (existsSync(changelogPath)) {\n try {\n unlinkSync(changelogPath);\n } catch (error) {\n // 如果删除失败,尝试写入空内容(作为后备方案)\n writeFileSync(changelogPath, \"\", \"utf-8\");\n }\n }\n } else {\n // 恢复原始内容\n writeFileSync(changelogPath, oldContent, \"utf-8\");\n }\n}\n\n/**\n * 创建 git tag\n */\nasync function createGitTag(tag: string): Promise<void> {\n const proc = Bun.spawn([\"git\", \"tag\", tag], {\n stdout: \"inherit\",\n stderr: \"inherit\",\n });\n\n const exitCode = await proc.exited;\n if (exitCode !== 0) {\n throw new Error(t(\"git.createTagFailed\", { exitCode }));\n }\n}\n\n/**\n * 删除 git tag(用于回滚)\n */\nasync function deleteGitTag(tag: string): Promise<void> {\n const proc = Bun.spawn([\"git\", \"tag\", \"-d\", tag], {\n stdout: \"pipe\",\n stderr: \"pipe\",\n });\n\n await proc.exited;\n // 即使删除失败也不抛出错误,因为 tag 可能不存在\n}\n\n/**\n * 推送 git tag\n */\nasync function pushGitTag(tag: string): Promise<void> {\n const proc = Bun.spawn([\"git\", \"push\", \"origin\", tag], {\n stdout: \"inherit\",\n stderr: \"inherit\",\n });\n\n const exitCode = await proc.exited;\n if (exitCode !== 0) {\n throw new Error(t(\"git.pushTagFailed\", { exitCode }));\n }\n}\n\n/**\n * 检查 npm 登录状态\n * 使用 bun pm whoami 检查登录状态\n */\nasync function checkNpmAuth(registry: string): Promise<void> {\n // Bun 的包管理器兼容 npm 命令\n const proc = Bun.spawn(\n [\"bun\", \"pm\", \"whoami\"],\n {\n stdout: \"pipe\",\n stderr: \"pipe\",\n }\n );\n\n const exitCode = await proc.exited;\n \n if (exitCode !== 0) {\n // 获取错误输出\n const stderr = await new Response(proc.stderr).text();\n const errorMsg = stderr.trim();\n \n // 检查是否是未登录错误\n if (errorMsg.includes(\"not logged in\") || errorMsg.includes(\"Unauthorized\") || errorMsg === \"\") {\n throw new Error(t(\"publish.npmNotLoggedIn\", { registry }));\n }\n \n throw new Error(t(\"publish.npmAuthCheckFailed\", { registry, error: errorMsg }));\n }\n\n // 获取用户名\n const stdout = await new Response(proc.stdout).text();\n const username = stdout.trim();\n \n if (!username) {\n throw new Error(t(\"publish.npmNotLoggedIn\", { registry }));\n }\n}\n\n/**\n * 发布到 npm\n */\nasync function publishToNpm(packagePath: string, registry: string, otp?: string): Promise<void> {\n const args = [\"bun\", \"publish\", \"--registry\", registry];\n \n // 如果提供了 OTP,添加到命令参数中\n if (otp) {\n args.push(\"--otp\", otp);\n }\n\n const proc = Bun.spawn(args, {\n cwd: packagePath,\n stdout: \"inherit\",\n stderr: \"inherit\",\n env: {\n ...process.env,\n NPM_CONFIG_REGISTRY: registry,\n },\n });\n\n const exitCode = await proc.exited;\n if (exitCode !== 0) {\n return Promise.reject(new Error(t(\"publish.npmPublishFailed\", { exitCode })));\n }\n}\n\n/**\n * 发布包\n * 如果发布失败,会自动回滚版本号和 changelog 的修改\n */\nexport async function publish(config: PublishConfig): Promise<void> {\n // 保存原始值,用于失败时回滚\n const originalVersion = readPackageVersion(config.package.path);\n const originalChangelog = config.generateChangelog \n ? readChangelog(config.package.path) \n : \"\";\n let gitTagCreated = false;\n\n try {\n // 1. 更新版本号\n updatePackageVersion(config.package.path, config.newVersion);\n\n // 2. 生成 changelog 文件(如果配置了)\n if (config.generateChangelog) {\n updateChangelog(config.package.path, config.newVersion, config.changelog);\n }\n\n // 3. 检查 npm 登录状态\n await checkNpmAuth(config.registry);\n\n // 4. 创建 git tag(如果配置了推送 tag)\n if (config.pushTag) {\n await createGitTag(config.tag);\n gitTagCreated = true;\n }\n\n // 5. 发布到 npm\n await publishToNpm(config.package.path, config.registry, config.otp);\n\n // 6. 推送 git tag(如果配置了)\n if (config.pushTag) {\n await pushGitTag(config.tag);\n }\n } catch (error) {\n // 发布失败,回滚修改\n console.error(t(\"publish.rollingBack\") || \"发布失败,正在回滚修改...\");\n \n try {\n // 恢复版本号\n restorePackageVersion(config.package.path, originalVersion);\n \n // 恢复 changelog(如果修改了)\n if (config.generateChangelog) {\n restoreChangelog(config.package.path, originalChangelog);\n }\n \n // 删除已创建的 git tag(如果创建了)\n if (gitTagCreated) {\n await deleteGitTag(config.tag);\n }\n \n console.error(t(\"publish.rollbackComplete\") || \"回滚完成\");\n } catch (rollbackError) {\n // 回滚失败,记录错误但不抛出,因为原始错误更重要\n console.error(\n t(\"publish.rollbackFailed\") || \"回滚失败,请手动恢复版本号和 changelog:\",\n rollbackError\n );\n }\n \n // 重新抛出原始错误\n throw error;\n }\n}\n",
|
|
16
|
+
"/**\n * Changelog 生成工具\n */\nimport { readFileSync, writeFileSync, existsSync } from \"fs\";\nimport { join } from \"path\";\nimport { t } from \"../i18n\";\n\n/**\n * Changelog 条目类型\n */\nexport type ChangelogType = \"added\" | \"changed\" | \"deprecated\" | \"removed\" | \"fixed\" | \"security\";\n\n/**\n * Changelog 条目\n */\nexport interface ChangelogEntry {\n type: ChangelogType;\n description: string;\n}\n\n/**\n * 生成 changelog 条目文本\n */\nfunction formatChangelogEntry(entry: ChangelogEntry): string {\n const typeLabels: Record<ChangelogType, string> = {\n added: t(\"changelogTypes.added\"),\n changed: t(\"changelogTypes.changed\"),\n deprecated: t(\"changelogTypes.deprecated\"),\n removed: t(\"changelogTypes.removed\"),\n fixed: t(\"changelogTypes.fixed\"),\n security: t(\"changelogTypes.security\"),\n };\n\n return `- ${typeLabels[entry.type]}: ${entry.description}`;\n}\n\n/**\n * 解析 changelog 文本为条目\n */\nexport function parseChangelog(changelogText: string): ChangelogEntry[] {\n const entries: ChangelogEntry[] = [];\n const lines = changelogText.split(\"\\n\").filter((line) => line.trim());\n\n // 支持多语言的类型标签映射\n const typeMaps: Record<string, Record<string, ChangelogType>> = {\n zh: { 新增: \"added\", 变更: \"changed\", 废弃: \"deprecated\", 移除: \"removed\", 修复: \"fixed\", 安全: \"security\" },\n en: { Added: \"added\", Changed: \"changed\", Deprecated: \"deprecated\", Removed: \"removed\", Fixed: \"fixed\", Security: \"security\" },\n ja: { 追加: \"added\", 変更: \"changed\", 非推奨: \"deprecated\", 削除: \"removed\", 修正: \"fixed\", セキュリティ: \"security\" },\n ko: { 추가됨: \"added\", 변경됨: \"changed\", 사용중단됨: \"deprecated\", 제거됨: \"removed\", 수정됨: \"fixed\", 보안: \"security\" },\n };\n\n // 构建所有语言的匹配模式\n const allTypeLabels: string[] = [];\n for (const langMap of Object.values(typeMaps)) {\n allTypeLabels.push(...Object.keys(langMap));\n }\n const typePattern = allTypeLabels.join(\"|\");\n\n for (const line of lines) {\n // 匹配格式: - 类型: 描述 或 - Type: description\n const matchWithDash = line.match(new RegExp(`^-\\\\s*(${typePattern}):\\\\s*(.+)$`));\n if (matchWithDash) {\n const [, typeLabel, description] = matchWithDash;\n \n // 在所有语言映射中查找\n let type: ChangelogType | undefined;\n for (const langMap of Object.values(typeMaps)) {\n if (typeLabel in langMap) {\n type = langMap[typeLabel];\n break;\n }\n }\n\n if (type) {\n entries.push({ type, description: description.trim() });\n continue;\n }\n }\n \n // 匹配格式: 类型: 描述(没有 - 前缀)\n const matchWithoutDash = line.match(new RegExp(`^(${typePattern}):\\\\s*(.+)$`));\n if (matchWithoutDash) {\n const [, typeLabel, description] = matchWithoutDash;\n \n // 在所有语言映射中查找\n let type: ChangelogType | undefined;\n for (const langMap of Object.values(typeMaps)) {\n if (typeLabel in langMap) {\n type = langMap[typeLabel];\n break;\n }\n }\n\n if (type) {\n entries.push({ type, description: description.trim() });\n continue;\n }\n }\n \n // 简单格式: - 描述(默认为 added)\n if (line.trim().startsWith(\"-\")) {\n const description = line.replace(/^-\\s*/, \"\").trim();\n if (description) {\n entries.push({ type: \"added\", description });\n continue;\n }\n }\n \n // 简单格式: 描述(没有 - 前缀,默认为 added)\n const trimmedLine = line.trim();\n if (trimmedLine) {\n entries.push({ type: \"added\", description: trimmedLine });\n }\n }\n\n return entries;\n}\n\n/**\n * 生成 changelog 版本区块\n */\nexport function generateChangelogSection(\n version: string,\n date: string,\n entries: ChangelogEntry[]\n): string {\n const sections: Record<ChangelogType, string[]> = {\n added: [],\n changed: [],\n deprecated: [],\n removed: [],\n fixed: [],\n security: [],\n };\n\n // 按类型分组\n for (const entry of entries) {\n sections[entry.type].push(formatChangelogEntry(entry));\n }\n\n const lines: string[] = [];\n lines.push(`## [${version}] - ${date}`);\n lines.push(\"\");\n\n // 按顺序输出各个类型\n const typeOrder: ChangelogType[] = [\"added\", \"changed\", \"deprecated\", \"removed\", \"fixed\", \"security\"];\n for (const type of typeOrder) {\n if (sections[type].length > 0) {\n const typeLabels: Record<ChangelogType, string> = {\n added: `### ${t(\"changelogTypes.added\")}`,\n changed: `### ${t(\"changelogTypes.changed\")}`,\n deprecated: `### ${t(\"changelogTypes.deprecated\")}`,\n removed: `### ${t(\"changelogTypes.removed\")}`,\n fixed: `### ${t(\"changelogTypes.fixed\")}`,\n security: `### ${t(\"changelogTypes.security\")}`,\n };\n lines.push(typeLabels[type]);\n lines.push(\"\");\n lines.push(...sections[type]);\n lines.push(\"\");\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * 读取现有的 CHANGELOG.md\n */\nexport function readChangelog(packagePath: string): string {\n const changelogPath = join(packagePath, \"CHANGELOG.md\");\n if (!existsSync(changelogPath)) {\n return \"\";\n }\n\n try {\n return readFileSync(changelogPath, \"utf-8\");\n } catch {\n return \"\";\n }\n}\n\n/**\n * 更新 CHANGELOG.md 文件\n */\nexport function updateChangelog(\n packagePath: string,\n version: string,\n changelogText: string\n): void {\n const changelogPath = join(packagePath, \"CHANGELOG.md\");\n const existingContent = readChangelog(packagePath);\n\n // 解析用户输入的 changelog\n const entries = parseChangelog(changelogText);\n \n // 生成日期(YYYY-MM-DD 格式)\n const date = new Date().toISOString().split(\"T\")[0];\n\n // 生成新版本区块\n const newSection = generateChangelogSection(version, date, entries);\n\n // 构建新的 changelog 内容\n let newContent = \"\";\n\n if (existingContent) {\n // 如果已有 changelog,在开头插入新版本\n // 查找第一个版本区块的位置\n const versionMatch = existingContent.match(/^##\\s+\\[/m);\n if (versionMatch && versionMatch.index !== undefined) {\n // 在第一个版本区块前插入新版本\n newContent =\n existingContent.slice(0, versionMatch.index) +\n newSection +\n \"\\n\\n\" +\n existingContent.slice(versionMatch.index);\n } else {\n // 如果没有找到版本区块,直接在前面添加\n newContent = newSection + \"\\n\\n\" + existingContent;\n }\n } else {\n // 如果没有现有 changelog,创建新的\n // 根据语言生成不同的头部说明\n const lang = t(\"common.yes\") === \"是\" ? \"zh-CN\" : t(\"common.yes\") === \"Yes\" ? \"en\" : t(\"common.yes\") === \"はい\" ? \"ja\" : \"ko\";\n const headers: Record<string, string> = {\n \"zh-CN\": `# Changelog\\n\\n所有重要的项目变更都会记录在这个文件中。\\n\\n格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),\\n本项目遵循 [语义化版本](https://semver.org/lang/zh-CN/)。\\n\\n`,\n en: `# Changelog\\n\\nAll notable changes to this project will be documented in this file.\\n\\nThe format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),\\nand this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).\\n\\n`,\n ja: `# Changelog\\n\\nこのプロジェクトの重要な変更はすべてこのファイルに記録されます。\\n\\n形式は [Keep a Changelog](https://keepachangelog.com/ja/1.0.0/) に基づいており、\\nこのプロジェクトは [セマンティックバージョニング](https://semver.org/lang/ja/) に準拠しています。\\n\\n`,\n ko: `# Changelog\\n\\n이 프로젝트의 모든 중요한 변경 사항은 이 파일에 기록됩니다.\\n\\n형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.0.0/)를 기반으로 하며,\\n이 프로젝트는 [시맨틱 버전 관리](https://semver.org/lang/ko/)를 준수합니다.\\n\\n`,\n };\n newContent = `${headers[lang] || headers.en}${newSection}\\n`;\n }\n\n // 写入文件\n writeFileSync(changelogPath, newContent, \"utf-8\");\n}\n\n/**\n * 从简单文本生成格式化的 changelog 条目\n */\nexport function formatSimpleChangelog(text: string): ChangelogEntry[] {\n // 如果文本包含类型标记(冒号),尝试解析它\n // parseChangelog 已经支持多语言类型标签\n if (text.includes(\":\")) {\n const parsed = parseChangelog(text);\n // 如果解析成功(找到了类型标签),返回解析结果\n if (parsed.length > 0 && parsed.some((entry) => entry.type !== \"added\" || entry.description.includes(\":\"))) {\n return parsed;\n }\n }\n\n // 否则,将每行作为一个 added 类型的条目\n const lines = text.split(\"\\n\").filter((line) => line.trim());\n return lines.map((line) => ({\n type: \"added\" as ChangelogType,\n description: line.trim(),\n }));\n}\n",
|
|
17
|
+
"/**\n * bun-push logo 和成功提示\n */\nimport chalk from \"chalk\";\nimport figlet from \"figlet\";\nimport { t } from \"./i18n\";\n\n/**\n * 显示 logo\n */\nexport function showLogo(): void {\n try {\n // 使用 figlet 生成 ASCII art\n const asciiText = figlet.textSync(\"bun-push\", {\n font: \"Standard\", // 使用标准字体,比较紧凑\n horizontalLayout: \"default\",\n verticalLayout: \"default\",\n });\n\n // 将 ASCII art 按行分割,并为每行添加颜色\n const lines = asciiText.split(\"\\n\").filter((line: string) => line.trim().length > 0);\n \n if (lines.length === 0) {\n // 如果 figlet 生成失败,使用简单文本\n console.log(chalk.cyan.bold(\"\\n bun-push\\n\"));\n return;\n }\n\n const coloredLines = lines.map((line: string, index: number) => {\n // 根据位置使用不同颜色\n const midPoint = Math.floor(line.length / 2);\n if (index < lines.length / 2) {\n // 上半部分(bun)使用红色和黄色\n return chalk.red(line.substring(0, midPoint)) + \n chalk.yellow(line.substring(midPoint));\n } else {\n // 下半部分(push)使用紫色和蓝色\n return chalk.magenta(line.substring(0, midPoint)) + \n chalk.blue(line.substring(midPoint));\n }\n });\n\n const logo = \"\\n\" + coloredLines.join(\"\\n\") + \"\\n\";\n console.log(logo);\n } catch (error) {\n // 如果 figlet 不可用,使用简单的文本 logo\n console.log(chalk.cyan.bold(\"\\n bun-push\\n\"));\n }\n}\n\n/**\n * 显示成功提示\n */\nexport function showSuccessMessage(packageName: string, version: string, registry: string): void {\n console.log(chalk.green.bold(`\\n✅ ${t(\"success.title\")}\\n`));\n console.log(chalk.gray(\"─\".repeat(60)));\n console.log(chalk.cyan.bold(`📦 ${t(\"success.packageName\")}:`), chalk.white(packageName));\n console.log(chalk.cyan.bold(`🏷️ ${t(\"success.version\")}:`), chalk.white(version));\n console.log(chalk.cyan.bold(`🌐 ${t(\"success.registry\")}:`), chalk.white(registry));\n console.log(chalk.gray(\"─\".repeat(60)));\n console.log(chalk.green(`\\n🎉 ${t(\"success.thanks\")}\\n`));\n}\n"
|
|
18
|
+
],
|
|
19
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;AAQA;AACA;;;ACNA;AACA;;;ACDA,IAAe;AAAA,EAEb,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AAAA,EAGA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,yBAAyB;AAAA,IACzB,eAAe;AAAA,EACjB;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AAAA,EAGA,KAAK;AAAA,IACH,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EAGA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EAGA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EAGA,WAAW;AAAA,IACT,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AACF;;;ACtIA,IAAe;AAAA,EAEb,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AAAA,EAGA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,yBAAyB;AAAA,IACzB,eAAe;AAAA,EACjB;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AAAA,EAGA,KAAK;AAAA,IACH,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EAGA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EAGA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EAGA,WAAW;AAAA,IACT,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AACF;;;ACtIA,IAAe;AAAA,EAEb,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AAAA,EAGA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,yBAAyB;AAAA,IACzB,eAAe;AAAA,EACjB;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AAAA,EAGA,KAAK;AAAA,IACH,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EAGA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EAGA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EAGA,WAAW;AAAA,IACT,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AACF;;;ACtIA,IAAe;AAAA,EAEb,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,eAAe;AAAA,IACf,iBAAiB;AAAA,EACnB;AAAA,EAGA,WAAW;AAAA,IACT,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP,UAAU;AAAA,IACV,cAAc;AAAA,IACd,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,cAAc;AAAA,IACd,SAAS;AAAA,IACT,cAAc;AAAA,IACd,OAAO;AAAA,IACP,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,yBAAyB;AAAA,IACzB,eAAe;AAAA,EACjB;AAAA,EAGA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AAAA,EAGA,KAAK;AAAA,IACH,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,eAAe;AAAA,EACjB;AAAA,EAGA,UAAU;AAAA,IACR,OAAO;AAAA,IACP,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AAAA,EAGA,SAAS;AAAA,IACP,SAAS;AAAA,IACT,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,WAAW;AAAA,IACX,UAAU;AAAA,IACV,SAAS;AAAA,IACT,mBAAmB;AAAA,IACnB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,WAAW;AAAA,IACX,OAAO;AAAA,IACP,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,KAAK;AAAA,IACL,aAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,EAClB;AAAA,EAGA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,aAAa;AAAA,IACb,SAAS;AAAA,IACT,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EAGA,gBAAgB;AAAA,IACd,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,IACP,UAAU;AAAA,EACZ;AAAA,EAGA,WAAW;AAAA,IACT,qBAAqB;AAAA,IACrB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,uBAAuB;AAAA,IACvB,sBAAsB;AAAA,EACxB;AACF;;;AC/HO,IAAM,sBAAkC,CAAC,MAAM,MAAM,MAAM,IAAI;AAEtE,IAAM,eAAe;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,kBAA4B;AAKhC,SAAS,cAAc,GAAa;AAAA,EAElC,MAAM,UAAU,QAAQ,IAAI,QAAQ,QAAQ,IAAI,YAAY,QAAQ,IAAI,UAAU,QAAQ,IAAI,eAAe;AAAA,EAG7G,IAAI,SAAS;AAAA,IAEX,MAAM,YAAY,QAAQ,MAAM,oCAAoC;AAAA,IACpE,IAAI,WAAW;AAAA,MACb,MAAM,OAAO,UAAU,GAAG,YAAY;AAAA,MACtC,IAAI,oBAAoB,SAAS,IAAI,GAAG;AAAA,QACtC,OAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI;AAAA,IACF,MAAM,SAAS,KAAK,eAAe,EAAE,gBAAgB,EAAE;AAAA,IACvD,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,GAAG,YAAY;AAAA,IAE9C,IAAI,oBAAoB,SAAS,IAAI,GAAG;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EAKR,IAAI;AAAA,IACF,MAAM,WAAW,IAAI,KAAK;AAAA,IAC1B,MAAM,SAAS,SAAS,gBAAgB,EAAE;AAAA,IAC1C,MAAM,OAAO,OAAO,MAAM,GAAG,EAAE,GAAG,YAAY;AAAA,IAE9C,IAAI,oBAAoB,SAAS,IAAI,GAAG;AAAA,MACtC,OAAO;AAAA,IACT;AAAA,IACA,MAAM;AAAA,EAKR,OAAO;AAAA;AAsBF,SAAS,YAAY,GAAS;AAAA,EAEnC,MAAM,UAAU,QAAQ,IAAI;AAAA,EAC5B,IAAI,WAAW,oBAAoB,SAAS,OAAO,GAAG;AAAA,IACpD,kBAAkB;AAAA,IAClB;AAAA,EACF;AAAA,EAGA,kBAAkB,eAAe;AAAA;AAQ5B,SAAS,CAAC,CAAC,KAAa,QAAkD;AAAA,EAC/E,MAAM,OAAO,IAAI,MAAM,GAAG;AAAA,EAC1B,IAAI,QAAa,aAAa;AAAA,EAE9B,WAAW,KAAK,MAAM;AAAA,IACpB,IAAI,SAAS,OAAO,UAAU,YAAY,KAAK,OAAO;AAAA,MACpD,QAAQ,MAAM;AAAA,IAChB,EAAO;AAAA,MAEL,IAAI,oBAAoB,MAAM;AAAA,QAC5B,QAAQ,aAAa;AAAA,QACrB,WAAW,MAAM,MAAM;AAAA,UACrB,IAAI,SAAS,OAAO,UAAU,YAAY,MAAM,OAAO;AAAA,YACrD,QAAQ,MAAM;AAAA,UAChB,EAAO;AAAA,YACL,OAAO;AAAA;AAAA,QAEX;AAAA,MACF,EAAO;AAAA,QACL,OAAO;AAAA;AAAA;AAAA,EAGb;AAAA,EAEA,IAAI,SAAS,OAAO,UAAU,WAAW,QAAQ;AAAA,EAGjD,IAAI,QAAQ;AAAA,IACV,YAAY,UAAU,eAAe,OAAO,QAAQ,MAAM,GAAG;AAAA,MAC3D,SAAS,OAAO,QAAQ,IAAI,OAAO,MAAM,eAAe,GAAG,GAAG,OAAO,UAAU,CAAC;AAAA,IAClF;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAIT,aAAa;;;ALnIb,SAAS,eAAe,CAAC,MAA0C;AAAA,EACjE,MAAM,kBAAkB,KAAK,MAAM,cAAc;AAAA,EACjD,IAAI,CAAC,WAAW,eAAe,GAAG;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,IACF,MAAM,UAAU,aAAa,iBAAiB,OAAO;AAAA,IACrD,OAAO,KAAK,MAAM,OAAO;AAAA,IACzB,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOX,SAAS,UAAU,CAAC,aAA2C;AAAA,EAE7D,IAAI,YAAY,cAAc,MAAM,QAAQ,YAAY,UAAU,GAAG;AAAA,IACnE,OAAO;AAAA,EACT;AAAA,EAGA,IAAI,YAAY,YAAY,YAAY,MAAM,QAAQ,YAAY,WAAW,QAAQ,GAAG;AAAA,IACtF,OAAO;AAAA,EACT;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,sBAAsB,CAAC,YAA0D;AAAA,EACxF,IAAI,MAAM,QAAQ,UAAU,GAAG;AAAA,IAC7B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI,YAAY,UAAU;AAAA,IACxB,OAAO,WAAW;AAAA,EACpB;AAAA,EAEA,OAAO,CAAC;AAAA;AAMV,SAAS,cAAc,CAAC,MAAc,SAA0B;AAAA,EAE9D,MAAM,QAAQ,QACX,QAAQ,SAAS,IAAI,EACrB,QAAQ,OAAO,OAAO,EACtB,QAAQ,OAAO,KAAK;AAAA,EAEvB,OAAO,IAAI,OAAO,IAAI,QAAQ,EAAE,KAAK,IAAI;AAAA;AAM3C,SAAS,YAAY,CACnB,UACA,UACA,QAAuB,CAAC,GACT;AAAA,EACf,MAAM,kBAAkB,gBAAgB,QAAQ;AAAA,EAChD,IAAI,CAAC,iBAAiB;AAAA,IACpB,OAAO;AAAA,EACT;AAAA,EAGA,SAAS,aAAa,CAAC,KAAa,QAAgB,GAAG;AAAA,IACrD,IAAI,QAAQ;AAAA,MAAI;AAAA,IAEhB,IAAI;AAAA,MACF,MAAM,UAAU,YAAY,GAAG;AAAA,MAE/B,WAAW,SAAS,SAAS;AAAA,QAC3B,MAAM,WAAW,KAAK,KAAK,KAAK;AAAA,QAEhC,MAAM,eAAe,SAAS,WAAW,QAAQ,IAC7C,SAAS,MAAM,SAAS,MAAM,EAAE,QAAQ,UAAU,EAAE,IACpD;AAAA,QAGJ,IAAI,MAAM,WAAW,GAAG,KAAK,UAAU,gBAAgB;AAAA,UACrD;AAAA,QACF;AAAA,QAEA,MAAM,OAAO,SAAS,QAAQ;AAAA,QAE9B,IAAI,KAAK,YAAY,GAAG;AAAA,UAEtB,MAAM,UAAU,SAAS,KAAK,CAAC,YAAY,eAAe,cAAc,OAAO,CAAC;AAAA,UAEhF,IAAI,SAAS;AAAA,YACX,MAAM,cAAc,gBAAgB,QAAQ;AAAA,YAC5C,IAAI,eAAe,YAAY,MAAM;AAAA,cACnC,MAAM,KAAK;AAAA,gBACT,MAAM,YAAY;AAAA,gBAClB,SAAS,YAAY,WAAW;AAAA,gBAChC,MAAM;AAAA,gBACN;AAAA,cACF,CAAC;AAAA,YACH;AAAA,UACF,EAAO;AAAA,YAEL,cAAc,UAAU,QAAQ,CAAC;AAAA;AAAA,QAErC;AAAA,MACF;AAAA,MACA,OAAO,OAAO;AAAA;AAAA,EAKlB,cAAc,QAAQ;AAAA,EACtB,OAAO;AAAA;AAMF,SAAS,gBAAgB,CAAC,aAAqB,QAAQ,IAAI,GAAkB;AAAA,EAClF,MAAM,WAAW,QAAQ,UAAU;AAAA,EACnC,MAAM,kBAAkB,gBAAgB,QAAQ;AAAA,EAEhD,IAAI,CAAC,iBAAiB;AAAA,IACpB,MAAM,IAAI,MAAM,EAAE,+BAA+B,CAAC;AAAA,EACpD;AAAA,EAEA,MAAM,oBAAoB,WAAW,eAAe;AAAA,EAEpD,IAAI,CAAC,mBAAmB;AAAA,IAEtB,OAAO;AAAA,MACL,YAAY;AAAA,MACZ,UAAU;AAAA,QACR;AAAA,UACE,MAAM,gBAAgB,QAAQ;AAAA,UAC9B,SAAS,gBAAgB,WAAW;AAAA,UACpC,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAGA,MAAM,kBAAkB,gBAAgB;AAAA,EACxC,MAAM,WAAW,uBAAuB,eAAe;AAAA,EAEvD,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB,MAAM,IAAI,MAAM,EAAE,mCAAmC,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,WAAW,aAAa,UAAU,QAAQ;AAAA,EAGhD,IAAI,SAAS,WAAW,KAAK,gBAAgB,MAAM;AAAA,IACjD,SAAS,KAAK;AAAA,MACZ,MAAM,gBAAgB;AAAA,MACtB,SAAS,gBAAgB,WAAW;AAAA,MACpC,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACL,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;;;AMzLF;AACA;;;ACDA;AAOO,IAAM,gBAAuC,CAAC,SAAS,SAAS,OAAO;AAKvE,SAAS,cAAc,CAC5B,gBACA,cAAmC,SAC3B;AAAA,EACR,IAAI,CAAC,OAAO,MAAM,cAAc,GAAG;AAAA,IACjC,MAAM,IAAI,MAAM,EAAE,8BAA8B,EAAE,SAAS,eAAe,CAAC,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAM,cAAc,OAAO,IAAI,gBAAgB,WAAW;AAAA,EAC1D,IAAI,CAAC,aAAa;AAAA,IAChB,MAAM,IAAI,MAAM,EAAE,wBAAwB,CAAC;AAAA,EAC7C;AAAA,EAEA,OAAO;AAAA;AAQF,SAAS,cAAc,CAAC,SAA0B;AAAA,EAEvD,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAAA,IAC3C,OAAO;AAAA,EACT;AAAA,EAEA,MAAM,UAAU,QAAQ,KAAK;AAAA,EAC7B,IAAI,CAAC,SAAS;AAAA,IACZ,OAAO;AAAA,EACT;AAAA,EAIA,MAAM,yBAAyB;AAAA,EAC/B,IAAI,CAAC,uBAAuB,KAAK,OAAO,GAAG;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EAIA,MAAM,QAAQ,OAAO,MAAM,OAAO;AAAA,EAClC,IAAI,CAAC,OAAO;AAAA,IACV,OAAO;AAAA,EACT;AAAA,EAOA,OAAO,UAAU;AAAA;AAMZ,SAAS,WAAW,CAAC,aAAqB,SAAyB;AAAA,EAExE,MAAM,mBAAmB,YAAY,QAAQ,aAAa,EAAE;AAAA,EAC5D,OAAO,GAAG,oBAAoB;AAAA;AAMzB,SAAS,yBAAyB,CAAC,MAAmC;AAAA,EAC3E,MAAM,eAAoD;AAAA,IACxD,OAAO,EAAE,eAAe;AAAA,IACxB,OAAO,EAAE,eAAe;AAAA,IACxB,OAAO,EAAE,eAAe;AAAA,EAC1B;AAAA,EACA,OAAO,aAAa;AAAA;;;AC9Ef,SAAS,iBAAiB,CAAC,aAAoC;AAAA,EACpE,MAAM,UAAU,YAAY,YAAY;AAAA,EACxC,IAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAAA,IAC3C,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,OAAO,OAAO,KAAK,OAAO;AAAA;AAM5B,eAAsB,SAAS,CAC7B,aACA,YACe;AAAA,EACf,MAAM,UAAU,YAAY,YAAY;AAAA,EACxC,IAAI,CAAC,WAAW,CAAC,QAAQ,aAAa;AAAA,IACpC,MAAM,IAAI,MAAM,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC,CAAC;AAAA,EACpE;AAAA,EAGA,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,OAAO,UAAU,GAAG;AAAA,IACjD,KAAK,YAAY;AAAA,IACjB,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,WAAW,MAAM,KAAK;AAAA,EAC5B,IAAI,aAAa,GAAG;AAAA,IAClB,MAAM,IAAI,MAAM,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;AAAA,EAC3D;AAAA;;;AF3BF,eAAsB,aAAa,CAAC,UAA+C;AAAA,EACjF,IAAI,SAAS,WAAW,GAAG;AAAA,IACzB,OAAO,SAAS;AAAA,EAClB;AAAA,EAEA,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,uBAAuB;AAAA,IAClC,SAAS,SAAS,IAAI,CAAC,SAAS;AAAA,MAC9B,OAAO,GAAG,IAAI,SAAS,IAAI;AAAA,MAC3B,OAAO;AAAA,MACP,aAAa,IAAI;AAAA,IACnB,EAAE;AAAA,EACJ,CAAC;AAAA,EAED,IAAI,CAAC,OAAO;AAAA,IACV,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO;AAAA;AAMT,SAAS,wBAAwB,CAAC,aAAqB,gBAAwB,YAA4B;AAAA,EACzG,OAAO,EAAE,4BAA4B,EAAE,aAAa,gBAAgB,WAAW,CAAC;AAAA;AAOlF,eAAsB,cAAc,CAClC,aACA,gBACA,YACiB;AAAA,EAEjB,QAAQ,oBAAoB,MAAa;AAAA,EAEzC,MAAM,KAAK,gBAAgB;AAAA,IACzB,OAAO,QAAQ;AAAA,IACf,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAAA,EAED,QAAQ,IAAI,MAAM,KAAK,EAAE,iBAAiB,CAAC,CAAC;AAAA,EAC5C,QAAQ,IAAI,MAAM,KAAK,EAAE,0BAA0B,CAAC,CAAC;AAAA,EAErD,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,aAAa;AAAA,EAEjB,OAAO,IAAI,QAAQ,CAAC,aAAY;AAAA,IAC9B,MAAM,aAAa,MAAM;AAAA,MACvB,GAAG,UAAU,MAAM,KAAK,IAAI,cAAc,CAAC;AAAA,MAC3C,GAAG,OAAO;AAAA;AAAA,IAGZ,WAAW;AAAA,IAEX,GAAG,GAAG,QAAQ,CAAC,SAAiB;AAAA,MAC9B,MAAM,UAAU,KAAK,KAAK;AAAA,MAG1B,IAAI,YAAY,MAAM,MAAM,SAAS,GAAG;AAAA,QACtC,GAAG,MAAM;AAAA,QACT;AAAA,MACF;AAAA,MAGA,IAAI,YAAY,MAAM,MAAM,WAAW,GAAG;AAAA,QACxC,GAAG,MAAM;AAAA,QACT;AAAA,MACF;AAAA,MAGA,IAAI,YAAY,IAAI;AAAA,QAClB,MAAM,KAAK,OAAO;AAAA,QAClB;AAAA,QACA,WAAW;AAAA,MACb;AAAA,KACD;AAAA,IAED,GAAG,GAAG,SAAS,MAAM;AAAA,MACnB,MAAM,SAAS,MAAM,KAAK;AAAA,CAAI,EAAE,KAAK;AAAA,MAGrC,IAAI,CAAC,QAAQ;AAAA,QACX,MAAM,mBAAmB,yBAAyB,aAAa,gBAAgB,UAAU;AAAA,QACzF,QAAQ,IAAI,MAAM,OAAO,EAAE,wBAAwB,CAAC,CAAC;AAAA,QACrD,SAAQ,gBAAgB;AAAA,QACxB;AAAA,MACF;AAAA,MAEA,SAAQ,MAAM;AAAA,KACf;AAAA,IAED,GAAG,GAAG,UAAU,MAAM;AAAA,MACpB,GAAG,MAAM;AAAA,MACT,QAAQ,KAAK,CAAC;AAAA,KACf;AAAA,GACF;AAAA;AAMH,eAAsB,wBAAwB,GAAqB;AAAA,EACjE,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,oBAAoB;AAAA,IAC/B,SAAS;AAAA,EACX,CAAC;AAAA,EAED,IAAI,UAAU,WAAW;AAAA,IACvB,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO;AAAA;AAMT,eAAsB,aAAa,CAAC,gBAGjC;AAAA,EACD,MAAM,UAAwE,cAAc,IAAI,CAAC,SAAS;AAAA,IACxG,MAAM,cAAc,eAAe,gBAAgB,IAAI;AAAA,IACvD,OAAO;AAAA,MACL,OAAO,0BAA0B,IAAI;AAAA,MACrC,OAAO;AAAA,MACP,aAAa,GAAG,EAAE,wBAAwB,MAAM,MAAM,KAAK,cAAc,YAAM,EAAE,sBAAsB,MAAM,MAAM,KAAK,MAAM,WAAW;AAAA,IAC3I;AAAA,GACD;AAAA,EAGD,QAAQ,KAAK;AAAA,IACX,OAAO,EAAE,uBAAuB;AAAA,IAChC,OAAO;AAAA,IACP,aAAa,EAAE,2BAA2B;AAAA,EAC5C,CAAC;AAAA,EAED,QAAQ,OAAO,gBAAgB,MAAM,QAAQ;AAAA,IAC3C,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,GAAG,EAAE,wBAAwB,MAAM,MAAM,KAAK,cAAc,OAAO,EAAE,oBAAoB;AAAA,IAClG;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,aAAa;AAAA,IAChB,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,IAAI,gBAAgB,UAAU;AAAA,IAC5B,QAAQ,OAAO,kBAAkB,MAAM,QAAQ;AAAA,MAC7C,MAAM;AAAA,MACN,MAAM;AAAA,MACN,SAAS,GAAG,EAAE,sBAAsB,KAAK,MAAM,KAAK,IAAI,EAAE,iBAAiB,kBAAkB;AAAA,MAC7F,UAAU,CAAC,UAAkB;AAAA,QAC3B,MAAM,UAAU,MAAM,KAAK;AAAA,QAC3B,IAAI,CAAC,SAAS;AAAA,UACZ,OAAO,EAAE,sBAAsB;AAAA,QACjC;AAAA,QACA,IAAI,CAAC,eAAe,OAAO,GAAG;AAAA,UAC5B,OAAO,EAAE,8BAA8B,EAAE,SAAS,QAAQ,CAAC;AAAA,QAC7D;AAAA,QACA,OAAO;AAAA;AAAA,IAEX,CAAC;AAAA,IAED,IAAI,CAAC,eAAe;AAAA,MAClB,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IAEA,MAAM,iBAAiB,cAAc,KAAK;AAAA,IAC1C,IAAI,CAAC,eAAe,cAAc,GAAG;AAAA,MACnC,MAAM,IAAI,MAAM,EAAE,8BAA8B,EAAE,SAAS,eAAe,CAAC,CAAC;AAAA,IAC9E;AAAA,IAEA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EAGA,IAAI,cAAc,SAAS,WAAkC,GAAG;AAAA,IAC9D,OAAO;AAAA,MACL,SAAS,eAAe,gBAAgB,WAAkC;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAAA,EAGA,MAAM,IAAI,MAAM,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAC,CAAC;AAAA;AAM7E,eAAsB,YAAY,CAAC,aAAuD;AAAA,EACxF,MAAM,UAAU,kBAAkB,WAAW;AAAA,EAE7C,IAAI,QAAQ,WAAW,GAAG;AAAA,IAExB;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAAQ,IAAI,CAAC,YAAY;AAAA,IACvC,OAAO;AAAA,IACP,OAAO;AAAA,EACT,EAAE;AAAA,EAEF,QAAQ,KAAK;AAAA,IACX,OAAO,EAAE,aAAa;AAAA,IACtB,OAAO;AAAA,EACT,CAAC;AAAA,EAED,QAAQ,OAAO,WAAW,MAAM,QAAQ;AAAA,IACtC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,eAAe;AAAA,IAC1B;AAAA,EACF,CAAC;AAAA,EAED,IAAI,CAAC,QAAQ;AAAA,IACX,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO,WAAW,SAAS,YAAY;AAAA;AAMzC,eAAsB,cAAc,GAAqB;AAAA,EACvD,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,aAAa;AAAA,IACxB,SAAS;AAAA,EACX,CAAC;AAAA,EAED,IAAI,UAAU,WAAW;AAAA,IACvB,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO;AAAA;AAMT,eAAsB,UAAU,GAAgC;AAAA,EAC9D,QAAQ,OAAO,YAAY,MAAM,QAAQ;AAAA,IACvC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,iBAAiB;AAAA,IAC5B,SAAS;AAAA,EACX,CAAC;AAAA,EAED,IAAI,YAAY,WAAW;AAAA,IACzB,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,IAAI,CAAC,SAAS;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,QAAQ,OAAO,QAAQ,MAAM,QAAQ;AAAA,IACnC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,kBAAkB;AAAA,IAC7B,UAAU,CAAC,UAAkB;AAAA,MAC3B,MAAM,UAAU,MAAM,KAAK;AAAA,MAC3B,IAAI,CAAC,SAAS;AAAA,QACZ,OAAO,EAAE,kBAAkB;AAAA,MAC7B;AAAA,MAEA,IAAI,CAAC,UAAU,KAAK,OAAO,GAAG;AAAA,QAC5B,OAAO,EAAE,oBAAoB;AAAA,MAC/B;AAAA,MACA,OAAO;AAAA;AAAA,EAEX,CAAC;AAAA,EAED,IAAI,CAAC,KAAK;AAAA,IACR,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO,IAAI,KAAK;AAAA;AAMlB,eAAsB,eAAe,GAAoB;AAAA,EACvD,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,gBAAgB;AAAA,IAC3B,SAAS,QAAQ,IAAI,uBAAuB;AAAA,IAC5C,UAAU,CAAC,UAAkB;AAAA,MAC3B,IAAI,CAAC,MAAM,KAAK,GAAG;AAAA,QACjB,OAAO,EAAE,gBAAgB;AAAA,MAC3B;AAAA,MACA,IAAI;AAAA,QACF,IAAI,IAAI,KAAK;AAAA,QACb,OAAO;AAAA,QACP,MAAM;AAAA,QACN,OAAO,EAAE,kBAAkB;AAAA;AAAA;AAAA,EAGjC,CAAC;AAAA,EAED,IAAI,CAAC,OAAO;AAAA,IACV,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA;AAMpB,eAAsB,cAAc,CAAC,QAAyC;AAAA,EAC5E,QAAQ,IAAI,MAAM,KAAK;AAAA,eAAO,EAAE,iBAAiB,GAAG,CAAC;AAAA,EACrD,QAAQ,IAAI,MAAM,KAAK,SAAG,OAAO,EAAE,CAAC,CAAC;AAAA,EACrC,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,qBAAqB,IAAI,GAAG,OAAO,QAAQ,IAAI;AAAA,EAC3E,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,wBAAwB,IAAI,GAAG,OAAO,QAAQ,OAAO;AAAA,EACjF,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,oBAAoB,IAAI,GAAG,OAAO,UAAU;AAAA,EACxE,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,aAAa,IAAI,GAAG,OAAO,GAAG;AAAA,EAC1D,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,mBAAmB,IAAI,GAAG,OAAO,SAAS;AAAA,EACtE,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,kBAAkB,IAAI,GAAG,OAAO,QAAQ;AAAA,EACpE,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,iBAAiB,IAAI,GAAG,OAAO,UAAU,EAAE,YAAY,IAAI,EAAE,WAAW,CAAC;AAAA,EACrG,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,2BAA2B,IAAI,GAAG,OAAO,oBAAoB,EAAE,YAAY,IAAI,EAAE,WAAW,CAAC;AAAA,EACzH,IAAI,OAAO,KAAK;AAAA,IACd,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,aAAa,IAAI,GAAG,MAAM,KAAK,KAAK,CAAC;AAAA,EACnE;AAAA,EACA,IAAI,OAAO,QAAQ;AAAA,IACjB,QAAQ,IAAI,MAAM,KAAK,GAAG,EAAE,gBAAgB,IAAI,GAAG,OAAO,MAAM;AAAA,EAClE;AAAA,EACA,QAAQ,IAAI,MAAM,KAAK,SAAG,OAAO,EAAE,CAAC,CAAC;AAAA,EAErC,QAAQ,UAAU,MAAM,QAAQ;AAAA,IAC9B,MAAM;AAAA,IACN,MAAM;AAAA,IACN,SAAS,EAAE,iBAAiB;AAAA,IAC5B,SAAS;AAAA,EACX,CAAC;AAAA,EAED,IAAI,UAAU,WAAW;AAAA,IACvB,QAAQ,KAAK,CAAC;AAAA,EAChB;AAAA,EAEA,OAAO;AAAA;;;AGjXT,0BAAS,gCAAe,6BAAc;AACtC,iBAAS;;;ACDT,yBAAS,4CAA6B;AACtC,iBAAS;AAmBT,SAAS,oBAAoB,CAAC,OAA+B;AAAA,EAC3D,MAAM,aAA4C;AAAA,IAChD,OAAO,EAAE,sBAAsB;AAAA,IAC/B,SAAS,EAAE,wBAAwB;AAAA,IACnC,YAAY,EAAE,2BAA2B;AAAA,IACzC,SAAS,EAAE,wBAAwB;AAAA,IACnC,OAAO,EAAE,sBAAsB;AAAA,IAC/B,UAAU,EAAE,yBAAyB;AAAA,EACvC;AAAA,EAEA,OAAO,KAAK,WAAW,MAAM,UAAU,MAAM;AAAA;AAMxC,SAAS,cAAc,CAAC,eAAyC;AAAA,EACtE,MAAM,UAA4B,CAAC;AAAA,EACnC,MAAM,QAAQ,cAAc,MAAM;AAAA,CAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,CAAC;AAAA,EAGpE,MAAM,WAA0D;AAAA,IAC9D,IAAI,EAAE,kBAAG,SAAS,kBAAI,WAAW,kBAAI,cAAc,kBAAI,WAAW,kBAAI,SAAS,kBAAI,WAAW;AAAA,IAC9F,IAAI,EAAE,OAAO,SAAS,SAAS,WAAW,YAAY,cAAc,SAAS,WAAW,OAAO,SAAS,UAAU,WAAW;AAAA,IAC7H,IAAI,EAAE,kBAAG,SAAS,kBAAI,WAAW,0BAAK,cAAc,kBAAI,WAAW,kBAAI,SAAS,kDAAQ,WAAW;AAAA,IACnG,IAAI,EAAE,0BAAI,SAAS,0BAAK,WAAW,0CAAO,cAAc,0BAAK,WAAW,0BAAK,SAAS,kBAAI,WAAW;AAAA,EACvG;AAAA,EAGA,MAAM,gBAA0B,CAAC;AAAA,EACjC,WAAW,WAAW,OAAO,OAAO,QAAQ,GAAG;AAAA,IAC7C,cAAc,KAAK,GAAG,OAAO,KAAK,OAAO,CAAC;AAAA,EAC5C;AAAA,EACA,MAAM,cAAc,cAAc,KAAK,GAAG;AAAA,EAE1C,WAAW,QAAQ,OAAO;AAAA,IAExB,MAAM,gBAAgB,KAAK,MAAM,IAAI,OAAO,UAAU,wBAAwB,CAAC;AAAA,IAC/E,IAAI,eAAe;AAAA,MACjB,SAAS,WAAW,eAAe;AAAA,MAGnC,IAAI;AAAA,MACJ,WAAW,WAAW,OAAO,OAAO,QAAQ,GAAG;AAAA,QAC7C,IAAI,aAAa,SAAS;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,MAAM;AAAA,QACR,QAAQ,KAAK,EAAE,MAAM,aAAa,YAAY,KAAK,EAAE,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,IAGA,MAAM,mBAAmB,KAAK,MAAM,IAAI,OAAO,KAAK,wBAAwB,CAAC;AAAA,IAC7E,IAAI,kBAAkB;AAAA,MACpB,SAAS,WAAW,eAAe;AAAA,MAGnC,IAAI;AAAA,MACJ,WAAW,WAAW,OAAO,OAAO,QAAQ,GAAG;AAAA,QAC7C,IAAI,aAAa,SAAS;AAAA,UACxB,OAAO,QAAQ;AAAA,UACf;AAAA,QACF;AAAA,MACF;AAAA,MAEA,IAAI,MAAM;AAAA,QACR,QAAQ,KAAK,EAAE,MAAM,aAAa,YAAY,KAAK,EAAE,CAAC;AAAA,QACtD;AAAA,MACF;AAAA,IACF;AAAA,IAGA,IAAI,KAAK,KAAK,EAAE,WAAW,GAAG,GAAG;AAAA,MAC/B,MAAM,cAAc,KAAK,QAAQ,SAAS,EAAE,EAAE,KAAK;AAAA,MACnD,IAAI,aAAa;AAAA,QACf,QAAQ,KAAK,EAAE,MAAM,SAAS,YAAY,CAAC;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IAGA,MAAM,cAAc,KAAK,KAAK;AAAA,IAC9B,IAAI,aAAa;AAAA,MACf,QAAQ,KAAK,EAAE,MAAM,SAAS,aAAa,YAAY,CAAC;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,OAAO;AAAA;AAMF,SAAS,wBAAwB,CACtC,SACA,MACA,SACQ;AAAA,EACR,MAAM,WAA4C;AAAA,IAChD,OAAO,CAAC;AAAA,IACR,SAAS,CAAC;AAAA,IACV,YAAY,CAAC;AAAA,IACb,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,IACR,UAAU,CAAC;AAAA,EACb;AAAA,EAGA,WAAW,SAAS,SAAS;AAAA,IAC3B,SAAS,MAAM,MAAM,KAAK,qBAAqB,KAAK,CAAC;AAAA,EACvD;AAAA,EAEA,MAAM,QAAkB,CAAC;AAAA,EACzB,MAAM,KAAK,OAAO,cAAc,MAAM;AAAA,EACtC,MAAM,KAAK,EAAE;AAAA,EAGb,MAAM,YAA6B,CAAC,SAAS,WAAW,cAAc,WAAW,SAAS,UAAU;AAAA,EACpG,WAAW,QAAQ,WAAW;AAAA,IAC5B,IAAI,SAAS,MAAM,SAAS,GAAG;AAAA,MAC7B,MAAM,aAA4C;AAAA,QAChD,OAAO,OAAO,EAAE,sBAAsB;AAAA,QACtC,SAAS,OAAO,EAAE,wBAAwB;AAAA,QAC1C,YAAY,OAAO,EAAE,2BAA2B;AAAA,QAChD,SAAS,OAAO,EAAE,wBAAwB;AAAA,QAC1C,OAAO,OAAO,EAAE,sBAAsB;AAAA,QACtC,UAAU,OAAO,EAAE,yBAAyB;AAAA,MAC9C;AAAA,MACA,MAAM,KAAK,WAAW,KAAK;AAAA,MAC3B,MAAM,KAAK,EAAE;AAAA,MACb,MAAM,KAAK,GAAG,SAAS,KAAK;AAAA,MAC5B,MAAM,KAAK,EAAE;AAAA,IACf;AAAA,EACF;AAAA,EAEA,OAAO,MAAM,KAAK;AAAA,CAAI;AAAA;AAMjB,SAAS,aAAa,CAAC,aAA6B;AAAA,EACzD,MAAM,gBAAgB,MAAK,aAAa,cAAc;AAAA,EACtD,IAAI,CAAC,YAAW,aAAa,GAAG;AAAA,IAC9B,OAAO;AAAA,EACT;AAAA,EAEA,IAAI;AAAA,IACF,OAAO,cAAa,eAAe,OAAO;AAAA,IAC1C,MAAM;AAAA,IACN,OAAO;AAAA;AAAA;AAOJ,SAAS,eAAe,CAC7B,aACA,SACA,eACM;AAAA,EACN,MAAM,gBAAgB,MAAK,aAAa,cAAc;AAAA,EACtD,MAAM,kBAAkB,cAAc,WAAW;AAAA,EAGjD,MAAM,UAAU,eAAe,aAAa;AAAA,EAG5C,MAAM,OAAO,IAAI,KAAK,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EAGjD,MAAM,aAAa,yBAAyB,SAAS,MAAM,OAAO;AAAA,EAGlE,IAAI,aAAa;AAAA,EAEjB,IAAI,iBAAiB;AAAA,IAGnB,MAAM,eAAe,gBAAgB,MAAM,WAAW;AAAA,IACtD,IAAI,gBAAgB,aAAa,UAAU,WAAW;AAAA,MAEpD,aACE,gBAAgB,MAAM,GAAG,aAAa,KAAK,IAC3C,aACA;AAAA;AAAA,IACA,gBAAgB,MAAM,aAAa,KAAK;AAAA,IAC5C,EAAO;AAAA,MAEL,aAAa,aAAa;AAAA;AAAA,IAAS;AAAA;AAAA,EAEvC,EAAO;AAAA,IAGL,MAAM,OAAO,EAAE,YAAY,MAAM,WAAK,UAAU,EAAE,YAAY,MAAM,QAAQ,OAAO,EAAE,YAAY,MAAM,iBAAO,OAAO;AAAA,IACrH,MAAM,UAAkC;AAAA,MACtC,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MACT,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MACJ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MACJ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IACN;AAAA,IACA,aAAa,GAAG,QAAQ,SAAS,QAAQ,KAAK;AAAA;AAAA;AAAA,EAIhD,cAAc,eAAe,YAAY,OAAO;AAAA;;;AD9NlD,SAAS,kBAAkB,CAAC,aAA6B;AAAA,EACvD,MAAM,kBAAkB,MAAK,aAAa,cAAc;AAAA,EACxD,MAAM,cAAc,KAAK,MAAM,cAAa,iBAAiB,OAAO,CAAC;AAAA,EACrE,OAAO,YAAY;AAAA;AAMrB,SAAS,oBAAoB,CAAC,aAAqB,YAA0B;AAAA,EAC3E,MAAM,kBAAkB,MAAK,aAAa,cAAc;AAAA,EACxD,MAAM,cAAc,KAAK,MAAM,cAAa,iBAAiB,OAAO,CAAC;AAAA,EAErE,YAAY,UAAU;AAAA,EAEtB,eACE,iBACA,KAAK,UAAU,aAAa,MAAM,CAAC,IAAI;AAAA,GACvC,OACF;AAAA;AAMF,SAAS,qBAAqB,CAAC,aAAqB,YAA0B;AAAA,EAC5E,qBAAqB,aAAa,UAAU;AAAA;AAM9C,SAAS,gBAAgB,CAAC,aAAqB,YAA0B;AAAA,EACvE,MAAM,gBAAgB,MAAK,aAAa,cAAc;AAAA,EAEtD,IAAI,eAAe,IAAI;AAAA,IAErB,IAAI,YAAW,aAAa,GAAG;AAAA,MAC7B,IAAI;AAAA,QACF,WAAW,aAAa;AAAA,QACxB,OAAO,OAAO;AAAA,QAEd,eAAc,eAAe,IAAI,OAAO;AAAA;AAAA,IAE5C;AAAA,EACF,EAAO;AAAA,IAEL,eAAc,eAAe,YAAY,OAAO;AAAA;AAAA;AAOpD,eAAe,YAAY,CAAC,KAA4B;AAAA,EACtD,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,OAAO,GAAG,GAAG;AAAA,IAC1C,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,WAAW,MAAM,KAAK;AAAA,EAC5B,IAAI,aAAa,GAAG;AAAA,IAClB,MAAM,IAAI,MAAM,EAAE,uBAAuB,EAAE,SAAS,CAAC,CAAC;AAAA,EACxD;AAAA;AAMF,eAAe,YAAY,CAAC,KAA4B;AAAA,EACtD,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,OAAO,MAAM,GAAG,GAAG;AAAA,IAChD,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,KAAK;AAAA;AAOb,eAAe,UAAU,CAAC,KAA4B;AAAA,EACpD,MAAM,OAAO,IAAI,MAAM,CAAC,OAAO,QAAQ,UAAU,GAAG,GAAG;AAAA,IACrD,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CAAC;AAAA,EAED,MAAM,WAAW,MAAM,KAAK;AAAA,EAC5B,IAAI,aAAa,GAAG;AAAA,IAClB,MAAM,IAAI,MAAM,EAAE,qBAAqB,EAAE,SAAS,CAAC,CAAC;AAAA,EACtD;AAAA;AAOF,eAAe,YAAY,CAAC,UAAiC;AAAA,EAE3D,MAAM,OAAO,IAAI,MACf,CAAC,OAAO,MAAM,QAAQ,GACtB;AAAA,IACE,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV,CACF;AAAA,EAEA,MAAM,WAAW,MAAM,KAAK;AAAA,EAE5B,IAAI,aAAa,GAAG;AAAA,IAElB,MAAM,SAAS,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,IACpD,MAAM,WAAW,OAAO,KAAK;AAAA,IAG7B,IAAI,SAAS,SAAS,eAAe,KAAK,SAAS,SAAS,cAAc,KAAK,aAAa,IAAI;AAAA,MAC9F,MAAM,IAAI,MAAM,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;AAAA,IAC3D;AAAA,IAEA,MAAM,IAAI,MAAM,EAAE,8BAA8B,EAAE,UAAU,OAAO,SAAS,CAAC,CAAC;AAAA,EAChF;AAAA,EAGA,MAAM,SAAS,MAAM,IAAI,SAAS,KAAK,MAAM,EAAE,KAAK;AAAA,EACpD,MAAM,WAAW,OAAO,KAAK;AAAA,EAE7B,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,IAAI,MAAM,EAAE,0BAA0B,EAAE,SAAS,CAAC,CAAC;AAAA,EAC3D;AAAA;AAMF,eAAe,YAAY,CAAC,aAAqB,UAAkB,KAA6B;AAAA,EAC9F,MAAM,OAAO,CAAC,OAAO,WAAW,cAAc,QAAQ;AAAA,EAGtD,IAAI,KAAK;AAAA,IACP,KAAK,KAAK,SAAS,GAAG;AAAA,EACxB;AAAA,EAEA,MAAM,OAAO,IAAI,MAAM,MAAM;AAAA,IAC3B,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,QAAQ;AAAA,IACR,KAAK;AAAA,SACA,QAAQ;AAAA,MACX,qBAAqB;AAAA,IACvB;AAAA,EACF,CAAC;AAAA,EAED,MAAM,WAAW,MAAM,KAAK;AAAA,EAC5B,IAAI,aAAa,GAAG;AAAA,IAClB,OAAO,QAAQ,OAAO,IAAI,MAAM,EAAE,4BAA4B,EAAE,SAAS,CAAC,CAAC,CAAC;AAAA,EAC9E;AAAA;AAOF,eAAsB,OAAO,CAAC,QAAsC;AAAA,EAElE,MAAM,kBAAkB,mBAAmB,OAAO,QAAQ,IAAI;AAAA,EAC9D,MAAM,oBAAoB,OAAO,oBAC7B,cAAc,OAAO,QAAQ,IAAI,IACjC;AAAA,EACJ,IAAI,gBAAgB;AAAA,EAEpB,IAAI;AAAA,IAEF,qBAAqB,OAAO,QAAQ,MAAM,OAAO,UAAU;AAAA,IAG3D,IAAI,OAAO,mBAAmB;AAAA,MAC5B,gBAAgB,OAAO,QAAQ,MAAM,OAAO,YAAY,OAAO,SAAS;AAAA,IAC1E;AAAA,IAGA,MAAM,aAAa,OAAO,QAAQ;AAAA,IAGlC,IAAI,OAAO,SAAS;AAAA,MAClB,MAAM,aAAa,OAAO,GAAG;AAAA,MAC7B,gBAAgB;AAAA,IAClB;AAAA,IAGA,MAAM,aAAa,OAAO,QAAQ,MAAM,OAAO,UAAU,OAAO,GAAG;AAAA,IAGnE,IAAI,OAAO,SAAS;AAAA,MAClB,MAAM,WAAW,OAAO,GAAG;AAAA,IAC7B;AAAA,IACA,OAAO,OAAO;AAAA,IAEd,QAAQ,MAAM,EAAE,qBAAqB,KAAK,uEAAe;AAAA,IAEzD,IAAI;AAAA,MAEF,sBAAsB,OAAO,QAAQ,MAAM,eAAe;AAAA,MAG1D,IAAI,OAAO,mBAAmB;AAAA,QAC5B,iBAAiB,OAAO,QAAQ,MAAM,iBAAiB;AAAA,MACzD;AAAA,MAGA,IAAI,eAAe;AAAA,QACjB,MAAM,aAAa,OAAO,GAAG;AAAA,MAC/B;AAAA,MAEA,QAAQ,MAAM,EAAE,0BAA0B,KAAK,0BAAK;AAAA,MACpD,OAAO,eAAe;AAAA,MAEtB,QAAQ,MACN,EAAE,wBAAwB,KAAK,mGAC/B,aACF;AAAA;AAAA,IAIF,MAAM;AAAA;AAAA;;;AEzOV;AACA;AAMO,SAAS,QAAQ,GAAS;AAAA,EAC/B,IAAI;AAAA,IAEF,MAAM,YAAY,OAAO,SAAS,YAAY;AAAA,MAC5C,MAAM;AAAA,MACN,kBAAkB;AAAA,MAClB,gBAAgB;AAAA,IAClB,CAAC;AAAA,IAGD,MAAM,QAAQ,UAAU,MAAM;AAAA,CAAI,EAAE,OAAO,CAAC,SAAiB,KAAK,KAAK,EAAE,SAAS,CAAC;AAAA,IAEnF,IAAI,MAAM,WAAW,GAAG;AAAA,MAEtB,QAAQ,IAAI,OAAM,KAAK,KAAK;AAAA;AAAA,CAAgB,CAAC;AAAA,MAC7C;AAAA,IACF;AAAA,IAEA,MAAM,eAAe,MAAM,IAAI,CAAC,MAAc,UAAkB;AAAA,MAE9D,MAAM,WAAW,KAAK,MAAM,KAAK,SAAS,CAAC;AAAA,MAC3C,IAAI,QAAQ,MAAM,SAAS,GAAG;AAAA,QAE5B,OAAO,OAAM,IAAI,KAAK,UAAU,GAAG,QAAQ,CAAC,IACrC,OAAM,OAAO,KAAK,UAAU,QAAQ,CAAC;AAAA,MAC9C,EAAO;AAAA,QAEL,OAAO,OAAM,QAAQ,KAAK,UAAU,GAAG,QAAQ,CAAC,IACzC,OAAM,KAAK,KAAK,UAAU,QAAQ,CAAC;AAAA;AAAA,KAE7C;AAAA,IAED,MAAM,OAAO;AAAA,IAAO,aAAa,KAAK;AAAA,CAAI,IAAI;AAAA;AAAA,IAC9C,QAAQ,IAAI,IAAI;AAAA,IAChB,OAAO,OAAO;AAAA,IAEd,QAAQ,IAAI,OAAM,KAAK,KAAK;AAAA;AAAA,CAAgB,CAAC;AAAA;AAAA;AAO1C,SAAS,kBAAkB,CAAC,aAAqB,SAAiB,UAAwB;AAAA,EAC/F,QAAQ,IAAI,OAAM,MAAM,KAAK;AAAA,SAAM,EAAE,eAAe;AAAA,CAAK,CAAC;AAAA,EAC1D,QAAQ,IAAI,OAAM,KAAK,SAAG,OAAO,EAAE,CAAC,CAAC;AAAA,EACrC,QAAQ,IAAI,OAAM,KAAK,KAAK,gBAAK,EAAE,qBAAqB,IAAI,GAAG,OAAM,MAAM,WAAW,CAAC;AAAA,EACvF,QAAQ,IAAI,OAAM,KAAK,KAAK,uBAAO,EAAE,iBAAiB,IAAI,GAAG,OAAM,MAAM,OAAO,CAAC;AAAA,EACjF,QAAQ,IAAI,OAAM,KAAK,KAAK,gBAAK,EAAE,kBAAkB,IAAI,GAAG,OAAM,MAAM,QAAQ,CAAC;AAAA,EACjF,QAAQ,IAAI,OAAM,KAAK,SAAG,OAAO,EAAE,CAAC,CAAC;AAAA,EACrC,QAAQ,IAAI,OAAM,MAAM;AAAA,eAAO,EAAE,gBAAgB;AAAA,CAAK,CAAC;AAAA;;;AZ5BzD,eAAe,IAAI,GAAG;AAAA,EACpB,IAAI;AAAA,IAEF,SAAS;AAAA,IAGT,MAAM,gBAAgB,iBAAiB;AAAA,IAGvC,IAAI;AAAA,IACJ,IAAI,cAAc,YAAY;AAAA,MAC5B,kBAAkB,MAAM,cAAc,cAAc,QAAQ;AAAA,IAC9D,EAAO;AAAA,MACL,kBAAkB,cAAc,SAAS;AAAA;AAAA,IAG3C,QAAQ,IACN,OAAM,MAAM;AAAA,SAAM,EAAE,yBAAyB,MAAM,OAAM,KAAK,gBAAgB,IAAI,MAAM,gBAAgB,UAAU,CACpH;AAAA,IAGA,QAAQ,SAAS,eAAe,MAAM,cAAc,gBAAgB,OAAO;AAAA,IAG3E,MAAM,YAAY,MAAM,eACtB,gBAAgB,MAChB,gBAAgB,SAChB,UACF;AAAA,IAGA,MAAM,MAAM,YAAY,gBAAgB,MAAM,UAAU;AAAA,IAGxD,MAAM,SAAS,MAAM,aAAa,eAAe;AAAA,IAGjD,IAAI,QAAQ;AAAA,MACV,MAAM,UAAU,IAAI,GAAG,EAAE,gBAAgB,MAAM,OAAM,KAAK,MAAM,GAAG,EAAE,MAAM;AAAA,MAC3E,IAAI;AAAA,QACF,MAAM,UAAU,iBAAiB,MAAM;AAAA,QACvC,QAAQ,QAAQ,GAAG,EAAE,gBAAgB,MAAM,OAAM,KAAK,MAAM,GAAG;AAAA,QAC/D,OAAO,OAAO;AAAA,QACd,QAAQ,KAAK,GAAG,EAAE,eAAe,MAAM,OAAM,IAAI,MAAM,GAAG;AAAA,QAC1D,MAAM;AAAA;AAAA,IAEV;AAAA,IAGA,MAAM,UAAU,MAAM,eAAe;AAAA,IAGrC,MAAM,WAAW,MAAM,gBAAgB;AAAA,IAGvC,MAAM,oBAAoB,MAAM,yBAAyB;AAAA,IAGzD,MAAM,MAAM,MAAM,WAAW;AAAA,IAG7B,MAAM,SAAwB;AAAA,MAC5B,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IAGA,MAAM,YAAY,MAAM,eAAe,MAAM;AAAA,IAC7C,IAAI,CAAC,WAAW;AAAA,MACd,QAAQ,IAAI,OAAM,OAAO;AAAA,SAAM,EAAE,mBAAmB,GAAG,CAAC;AAAA,MACxD,QAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,IAGA,MAAM,iBAAiB,IAAI,EAAE,oBAAoB,CAAC,EAAE,MAAM;AAAA,IAE1D,IAAI;AAAA,MACF,MAAM,QAAQ,MAAM;AAAA,MACpB,eAAe,QAAQ,EAAE,iBAAiB,CAAC;AAAA,MAG3C,mBAAmB,gBAAgB,MAAM,YAAY,QAAQ;AAAA,MAC7D,OAAO,OAAO;AAAA,MACd,eAAe,KAAK,EAAE,gBAAgB,CAAC;AAAA,MACvC,QAAQ,MAAM,OAAM,IAAI;AAAA,SAAM,EAAE,eAAe,IAAI,GAAG,KAAK;AAAA,MAC3D,QAAQ,KAAK,CAAC;AAAA;AAAA,IAEhB,OAAO,OAAO;AAAA,IACd,QAAQ,MAAM,OAAM,IAAI;AAAA,SAAM,EAAE,sBAAsB,IAAI,GAAG,KAAK;AAAA,IAClE,QAAQ,KAAK,CAAC;AAAA;AAAA;AAKlB,KAAK;",
|
|
20
|
+
"debugId": "5DAA9E169C926ABE64756E2164756E21",
|
|
21
|
+
"names": []
|
|
22
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type Language = "zh" | "en" | "ja" | "ko";
|
|
2
|
+
export declare const SUPPORTED_LANGUAGES: Language[];
|
|
3
|
+
/**
|
|
4
|
+
* 设置语言
|
|
5
|
+
*/
|
|
6
|
+
export declare function setLanguage(lang: Language): void;
|
|
7
|
+
/**
|
|
8
|
+
* 获取当前语言
|
|
9
|
+
*/
|
|
10
|
+
export declare function getLanguage(): Language;
|
|
11
|
+
/**
|
|
12
|
+
* 初始化语言(自动检测)
|
|
13
|
+
*/
|
|
14
|
+
export declare function initLanguage(): void;
|
|
15
|
+
/**
|
|
16
|
+
* 翻译函数
|
|
17
|
+
* @param key 翻译键
|
|
18
|
+
* @param params 参数对象,用于替换占位符 {key}
|
|
19
|
+
*/
|
|
20
|
+
export declare function t(key: string, params?: Record<string, string | number>): string;
|
|
21
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAEjD,eAAO,MAAM,mBAAmB,EAAE,QAAQ,EAA6B,CAAC;AA2DxE;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI,CAIhD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,QAAQ,CAEtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,IAAI,CAUnC;AAED;;;;GAIG;AACH,wBAAgB,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAkC/E"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 国际化模块
|
|
3
|
+
*/
|
|
4
|
+
import zh from "./locales/zh";
|
|
5
|
+
import en from "./locales/en";
|
|
6
|
+
import ja from "./locales/ja";
|
|
7
|
+
import ko from "./locales/ko";
|
|
8
|
+
export const SUPPORTED_LANGUAGES = ["zh", "en", "ja", "ko"];
|
|
9
|
+
const translations = {
|
|
10
|
+
zh,
|
|
11
|
+
en,
|
|
12
|
+
ja,
|
|
13
|
+
ko,
|
|
14
|
+
};
|
|
15
|
+
let currentLanguage = "zh";
|
|
16
|
+
/**
|
|
17
|
+
* 检测系统语言
|
|
18
|
+
*/
|
|
19
|
+
function detectLanguage() {
|
|
20
|
+
// 优先从环境变量获取
|
|
21
|
+
const envLang = process.env.LANG || process.env.LANGUAGE || process.env.LC_ALL || process.env.LC_MESSAGES || "";
|
|
22
|
+
// 从环境变量解析语言代码
|
|
23
|
+
if (envLang) {
|
|
24
|
+
// 支持格式: zh_CN.UTF-8, zh-CN.UTF-8, zh_CN, zh-CN 等
|
|
25
|
+
const langMatch = envLang.match(/(?:^|_|-)(zh|en|ja|ko)(?:[._-]|$)/i);
|
|
26
|
+
if (langMatch) {
|
|
27
|
+
const lang = langMatch[1].toLowerCase();
|
|
28
|
+
if (SUPPORTED_LANGUAGES.includes(lang)) {
|
|
29
|
+
return lang;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
// 从系统 locale 获取(使用 Intl API)
|
|
34
|
+
try {
|
|
35
|
+
const locale = Intl.DateTimeFormat().resolvedOptions().locale;
|
|
36
|
+
const lang = locale.split("-")[0].toLowerCase();
|
|
37
|
+
if (SUPPORTED_LANGUAGES.includes(lang)) {
|
|
38
|
+
return lang;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
// 忽略错误
|
|
43
|
+
}
|
|
44
|
+
// 尝试从 Intl.Collator 获取
|
|
45
|
+
try {
|
|
46
|
+
const collator = new Intl.Collator();
|
|
47
|
+
const locale = collator.resolvedOptions().locale;
|
|
48
|
+
const lang = locale.split("-")[0].toLowerCase();
|
|
49
|
+
if (SUPPORTED_LANGUAGES.includes(lang)) {
|
|
50
|
+
return lang;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
// 忽略错误
|
|
55
|
+
}
|
|
56
|
+
// 默认返回中文
|
|
57
|
+
return "zh";
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* 设置语言
|
|
61
|
+
*/
|
|
62
|
+
export function setLanguage(lang) {
|
|
63
|
+
if (SUPPORTED_LANGUAGES.includes(lang)) {
|
|
64
|
+
currentLanguage = lang;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 获取当前语言
|
|
69
|
+
*/
|
|
70
|
+
export function getLanguage() {
|
|
71
|
+
return currentLanguage;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 初始化语言(自动检测)
|
|
75
|
+
*/
|
|
76
|
+
export function initLanguage() {
|
|
77
|
+
// 优先检查环境变量
|
|
78
|
+
const envLang = process.env.NPM_PUSH_LANG;
|
|
79
|
+
if (envLang && SUPPORTED_LANGUAGES.includes(envLang)) {
|
|
80
|
+
currentLanguage = envLang;
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// 自动检测系统语言
|
|
84
|
+
currentLanguage = detectLanguage();
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* 翻译函数
|
|
88
|
+
* @param key 翻译键
|
|
89
|
+
* @param params 参数对象,用于替换占位符 {key}
|
|
90
|
+
*/
|
|
91
|
+
export function t(key, params) {
|
|
92
|
+
const keys = key.split(".");
|
|
93
|
+
let value = translations[currentLanguage];
|
|
94
|
+
for (const k of keys) {
|
|
95
|
+
if (value && typeof value === "object" && k in value) {
|
|
96
|
+
value = value[k];
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
// 如果当前语言找不到,尝试使用中文
|
|
100
|
+
if (currentLanguage !== "zh") {
|
|
101
|
+
value = translations.zh;
|
|
102
|
+
for (const k2 of keys) {
|
|
103
|
+
if (value && typeof value === "object" && k2 in value) {
|
|
104
|
+
value = value[k2];
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
return key; // 如果都找不到,返回 key
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
return key; // 如果都找不到,返回 key
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
let result = typeof value === "string" ? value : key;
|
|
117
|
+
// 替换参数占位符
|
|
118
|
+
if (params) {
|
|
119
|
+
for (const [paramKey, paramValue] of Object.entries(params)) {
|
|
120
|
+
result = result.replace(new RegExp(`\\{${paramKey}\\}`, "g"), String(paramValue));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
// 初始化语言
|
|
126
|
+
initLanguage();
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* English language pack
|
|
3
|
+
*/
|
|
4
|
+
declare const _default: {
|
|
5
|
+
common: {
|
|
6
|
+
yes: string;
|
|
7
|
+
no: string;
|
|
8
|
+
skip: string;
|
|
9
|
+
cancel: string;
|
|
10
|
+
confirm: string;
|
|
11
|
+
error: string;
|
|
12
|
+
success: string;
|
|
13
|
+
};
|
|
14
|
+
package: {
|
|
15
|
+
selectPackage: string;
|
|
16
|
+
selectedPackage: string;
|
|
17
|
+
};
|
|
18
|
+
changelog: {
|
|
19
|
+
input: string;
|
|
20
|
+
singleLineHint: string;
|
|
21
|
+
empty: string;
|
|
22
|
+
generate: string;
|
|
23
|
+
usingDefault: string;
|
|
24
|
+
defaultContent: string;
|
|
25
|
+
};
|
|
26
|
+
version: {
|
|
27
|
+
selectType: string;
|
|
28
|
+
currentVersion: string;
|
|
29
|
+
finalVersion: string;
|
|
30
|
+
customVersion: string;
|
|
31
|
+
customVersionDesc: string;
|
|
32
|
+
inputVersion: string;
|
|
33
|
+
example: string;
|
|
34
|
+
versionEmpty: string;
|
|
35
|
+
patch: string;
|
|
36
|
+
minor: string;
|
|
37
|
+
major: string;
|
|
38
|
+
invalid: string;
|
|
39
|
+
invalidWithVersion: string;
|
|
40
|
+
cannotGenerate: string;
|
|
41
|
+
unsupportedType: string;
|
|
42
|
+
unsupportedTypeWithType: string;
|
|
43
|
+
versionFormat: string;
|
|
44
|
+
};
|
|
45
|
+
script: {
|
|
46
|
+
select: string;
|
|
47
|
+
noScripts: string;
|
|
48
|
+
running: string;
|
|
49
|
+
success: string;
|
|
50
|
+
failed: string;
|
|
51
|
+
notFound: string;
|
|
52
|
+
notFoundWithName: string;
|
|
53
|
+
executionFailed: string;
|
|
54
|
+
};
|
|
55
|
+
git: {
|
|
56
|
+
pushTag: string;
|
|
57
|
+
createTagFailed: string;
|
|
58
|
+
pushTagFailed: string;
|
|
59
|
+
};
|
|
60
|
+
registry: {
|
|
61
|
+
input: string;
|
|
62
|
+
empty: string;
|
|
63
|
+
invalid: string;
|
|
64
|
+
};
|
|
65
|
+
publish: {
|
|
66
|
+
preview: string;
|
|
67
|
+
packageName: string;
|
|
68
|
+
currentVersion: string;
|
|
69
|
+
newVersion: string;
|
|
70
|
+
tag: string;
|
|
71
|
+
changelog: string;
|
|
72
|
+
registry: string;
|
|
73
|
+
pushTag: string;
|
|
74
|
+
generateChangelog: string;
|
|
75
|
+
script: string;
|
|
76
|
+
confirm: string;
|
|
77
|
+
publishing: string;
|
|
78
|
+
success: string;
|
|
79
|
+
failed: string;
|
|
80
|
+
cancelled: string;
|
|
81
|
+
error: string;
|
|
82
|
+
generalError: string;
|
|
83
|
+
npmPublishFailed: string;
|
|
84
|
+
npmNotLoggedIn: string;
|
|
85
|
+
npmAuthCheckFailed: string;
|
|
86
|
+
needOtp: string;
|
|
87
|
+
inputOtp: string;
|
|
88
|
+
otpEmpty: string;
|
|
89
|
+
otpInvalid: string;
|
|
90
|
+
otp: string;
|
|
91
|
+
rollingBack: string;
|
|
92
|
+
rollbackComplete: string;
|
|
93
|
+
rollbackFailed: string;
|
|
94
|
+
};
|
|
95
|
+
success: {
|
|
96
|
+
title: string;
|
|
97
|
+
packageName: string;
|
|
98
|
+
version: string;
|
|
99
|
+
registry: string;
|
|
100
|
+
thanks: string;
|
|
101
|
+
};
|
|
102
|
+
changelogTypes: {
|
|
103
|
+
added: string;
|
|
104
|
+
changed: string;
|
|
105
|
+
deprecated: string;
|
|
106
|
+
removed: string;
|
|
107
|
+
fixed: string;
|
|
108
|
+
security: string;
|
|
109
|
+
};
|
|
110
|
+
workspace: {
|
|
111
|
+
packageJsonNotFound: string;
|
|
112
|
+
workspacesConfigInvalid: string;
|
|
113
|
+
packageNotFound: string;
|
|
114
|
+
packageNotFoundByPath: string;
|
|
115
|
+
monorepoRequiresPath: string;
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export default _default;
|
|
119
|
+
//# sourceMappingURL=en.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"en.d.ts","sourceRoot":"","sources":["../../../src/i18n/locales/en.ts"],"names":[],"mappings":"AAAA;;GAEG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACH,wBAsIE"}
|