bktide 1.0.1755559112 → 1.0.1755639164
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -0
- package/dist/commands/ShowBuild.js +31 -5
- package/dist/commands/ShowBuild.js.map +1 -1
- package/dist/formatters/build-detail/PlainTextFormatter.js +533 -180
- package/dist/formatters/build-detail/PlainTextFormatter.js.map +1 -1
- package/dist/formatters/builds/PlainTextFormatter.js +4 -2
- package/dist/formatters/builds/PlainTextFormatter.js.map +1 -1
- package/dist/formatters/pipelines/PlainTextFormatter.js +3 -6
- package/dist/formatters/pipelines/PlainTextFormatter.js.map +1 -1
- package/dist/graphql/fragments/index.js +3 -0
- package/dist/graphql/fragments/index.js.map +1 -0
- package/dist/graphql/fragments/jobs.js +112 -0
- package/dist/graphql/fragments/jobs.js.map +1 -0
- package/dist/graphql/queries.js +35 -53
- package/dist/graphql/queries.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/scripts/extract-data-patterns.js +118 -0
- package/dist/scripts/extract-data-patterns.js.map +1 -0
- package/dist/services/BuildkiteClient.js +109 -32
- package/dist/services/BuildkiteClient.js.map +1 -1
- package/dist/services/BuildkiteRestClient.js +8 -7
- package/dist/services/BuildkiteRestClient.js.map +1 -1
- package/dist/test-helpers/DataProfiler.js +307 -0
- package/dist/test-helpers/DataProfiler.js.map +1 -0
- package/dist/test-helpers/PatternMockGenerator.js +590 -0
- package/dist/test-helpers/PatternMockGenerator.js.map +1 -0
- package/dist/ui/theme.js +193 -8
- package/dist/ui/theme.js.map +1 -1
- package/dist/utils/terminal-links.js +165 -0
- package/dist/utils/terminal-links.js.map +1 -0
- package/package.json +19 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PatternMockGenerator.js","sourceRoot":"/","sources":["test-helpers/PatternMockGenerator.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * PatternMockGenerator uses extracted data patterns to generate realistic mock data\n */\n\nimport { faker } from '@faker-js/faker';\nimport { MockList } from '@graphql-tools/mock';\nimport type { DataPatterns, Distribution } from './DataProfiler.js';\nimport { promises as fs } from 'fs';\n\nexport class PatternMockGenerator {\n private patterns: DataPatterns | null = null;\n private readonly patternsPath: string;\n private useDefaultPatterns = false;\n\n constructor(patternsPath = './test/fixtures/data-patterns.json') {\n this.patternsPath = patternsPath;\n }\n\n async loadPatterns(): Promise<void> {\n try {\n const data = await fs.readFile(this.patternsPath, 'utf-8');\n this.patterns = JSON.parse(data);\n console.log(`✓ Loaded data patterns from ${this.patternsPath}`);\n } catch (error) {\n console.warn(`⚠️ Could not load patterns from ${this.patternsPath}, using defaults`);\n this.useDefaultPatterns = true;\n }\n }\n\n generateMocks() {\n if (!this.patterns && !this.useDefaultPatterns) {\n throw new Error('Patterns not loaded. Call loadPatterns() first.');\n }\n\n return {\n // Core types\n Build: () => ({\n id: faker.string.uuid(),\n number: this.generateBuildNumber(),\n state: this.generateBuildState(),\n branch: this.generateBranch(),\n message: this.generateCommitMessage(),\n commit: faker.git.commitSha(),\n createdAt: faker.date.recent({ days: 30 }).toISOString(),\n scheduledAt: faker.date.recent({ days: 30 }).toISOString(),\n startedAt: faker.date.recent({ days: 30 }).toISOString(),\n finishedAt: this.generateFinishedAt(),\n canceledAt: null,\n url: `https://buildkite.com/${faker.word.noun()}/${faker.word.noun()}/builds/${faker.number.int({ min: 1, max: 9999 })}`,\n webUrl: `https://buildkite.com/${faker.word.noun()}/${faker.word.noun()}/builds/${faker.number.int({ min: 1, max: 9999 })}`,\n pullRequest: this.generatePullRequest(),\n rebuiltFrom: null,\n jobs: this.generateJobs(),\n annotations: this.generateAnnotations(),\n createdBy: this.generateCreator(),\n pipeline: this.generatePipelineRef(),\n organization: this.generateOrganizationRef()\n }),\n\n Pipeline: () => ({\n id: faker.string.uuid(),\n graphqlId: faker.string.uuid(),\n slug: this.generatePipelineSlug(),\n name: this.generatePipelineName(),\n description: faker.datatype.boolean({ probability: 0.7 }) \n ? faker.lorem.sentence() \n : null,\n url: `https://buildkite.com/${faker.word.noun()}/${faker.word.noun()}`,\n webUrl: `https://buildkite.com/${faker.word.noun()}/${faker.word.noun()}`,\n repository: this.generateRepository(),\n defaultBranch: this.generateDefaultBranch(),\n visibility: this.generateVisibility(),\n archived: faker.datatype.boolean({ probability: 0.05 }),\n createdAt: faker.date.past({ years: 2 }).toISOString(),\n createdBy: this.generateCreator(),\n builds: () => new MockList([0, 10]),\n organization: this.generateOrganizationRef()\n }),\n\n Job: () => this.generateJob(),\n\n JobTypeCommand: () => ({\n ...this.generateJobBase(),\n __typename: 'JobTypeCommand',\n command: faker.helpers.arrayElement([\n 'npm test',\n 'yarn build',\n 'make test',\n './scripts/test.sh',\n 'docker build .',\n 'pytest',\n 'cargo test'\n ]),\n exitStatus: this.generateExitStatus(),\n passed: faker.datatype.boolean({ probability: 0.85 }),\n softFailed: faker.datatype.boolean({ probability: 0.02 }),\n parallelGroupIndex: this.generateParallelGroupIndex(),\n parallelGroupTotal: this.generateParallelGroupTotal(),\n retriedAutomatically: faker.datatype.boolean({ \n probability: this.patterns?.jobs.retryRates.automatic || 0.05 \n }),\n retriedManually: faker.datatype.boolean({ \n probability: this.patterns?.jobs.retryRates.manual || 0.02 \n }),\n retryType: null,\n agent: this.generateAgent(),\n agentQueryRules: [],\n artifacts: () => new MockList([0, 5])\n }),\n\n JobTypeWait: () => ({\n ...this.generateJobBase(),\n __typename: 'JobTypeWait',\n continueOnFailure: faker.datatype.boolean({ probability: 0.1 })\n }),\n\n JobTypeTrigger: () => ({\n ...this.generateJobBase(),\n __typename: 'JobTypeTrigger',\n triggered: faker.datatype.boolean({ probability: 0.9 }),\n triggeredBuild: faker.datatype.boolean({ probability: 0.9 }) \n ? { id: faker.string.uuid() }\n : null\n }),\n\n Organization: () => ({\n id: faker.string.uuid(),\n graphqlId: faker.string.uuid(),\n slug: this.generateOrganizationSlug(),\n name: this.generateOrganizationName(),\n url: `https://buildkite.com/${faker.word.noun()}`,\n webUrl: `https://buildkite.com/${faker.word.noun()}`,\n pipelines: () => new MockList(\n this.selectByDistribution(\n this.patterns?.organizations.pipelineCount || { \n values: [{ value: 10, frequency: 0.5, count: 1 }] \n }\n )\n ),\n members: () => new MockList(\n this.selectByDistribution(\n this.patterns?.organizations.memberCount || { \n values: [{ value: 5, frequency: 0.5, count: 1 }] \n }\n )\n ),\n teams: () => new MockList([1, 5]),\n createdAt: faker.date.past({ years: 3 }).toISOString()\n }),\n\n Annotation: () => ({\n id: faker.string.uuid(),\n context: this.generateAnnotationContext(),\n style: this.generateAnnotationStyle(),\n bodyHtml: this.generateAnnotationBody(),\n createdAt: faker.date.recent({ days: 1 }).toISOString(),\n updatedAt: faker.date.recent({ days: 1 }).toISOString()\n }),\n\n User: () => ({\n id: faker.string.uuid(),\n uuid: faker.string.uuid(),\n name: this.generateUserName(),\n email: this.generateUserEmail(),\n avatar: {\n url: faker.image.avatar()\n },\n bot: faker.datatype.boolean({ \n probability: this.patterns?.builds.creatorPatterns.botUsers || 0.1 \n })\n }),\n\n Agent: () => this.generateAgent(),\n\n Viewer: () => ({\n id: faker.string.uuid(),\n user: {\n id: faker.string.uuid(),\n uuid: faker.string.uuid(),\n name: faker.person.fullName(),\n email: faker.internet.email()\n },\n organizations: () => new MockList([1, 5])\n }),\n\n // Scalar types\n DateTime: () => faker.date.recent().toISOString(),\n ISO8601Date: () => faker.date.recent().toISOString().split('T')[0],\n JSON: () => JSON.stringify({ key: faker.word.noun(), value: faker.word.verb() }),\n YAML: () => `key: ${faker.word.noun()}\\nvalue: ${faker.word.verb()}`,\n Int: () => faker.number.int({ min: 0, max: 1000 }),\n Float: () => faker.number.float({ min: 0, max: 1000, multipleOf: 0.01 }),\n Boolean: () => faker.datatype.boolean(),\n String: () => faker.lorem.word()\n };\n }\n\n private selectByDistribution<T>(distribution: Distribution<T>): T {\n if (!distribution.values || distribution.values.length === 0) {\n // Return a default value based on type\n return 0 as T;\n }\n\n const random = Math.random();\n let cumulative = 0;\n \n for (const item of distribution.values) {\n cumulative += item.frequency;\n if (random <= cumulative) {\n return item.value;\n }\n }\n \n return distribution.values[0].value;\n }\n\n private generateBuildNumber(): number {\n if (this.patterns?.builds.numberRange) {\n const { min, max } = this.patterns.builds.numberRange;\n return faker.number.int({ min, max });\n }\n return faker.number.int({ min: 1, max: 9999 });\n }\n\n private generateBuildState(): string {\n if (this.patterns?.builds.states) {\n return this.selectByDistribution(this.patterns.builds.states);\n }\n return faker.helpers.arrayElement([\n 'PASSED', 'FAILED', 'RUNNING', 'SCHEDULED', \n 'CANCELED', 'CANCELING', 'BLOCKED', 'NOT_RUN'\n ]);\n }\n\n private generateBranch(): string {\n if (!this.patterns?.builds.branches) {\n return faker.git.branch();\n }\n\n const formats = this.patterns.builds.branches.formats;\n const random = Math.random();\n \n if (random < formats.feature) {\n return `feature/${faker.word.verb()}-${faker.word.noun()}`;\n } else if (random < formats.feature + formats.bugfix) {\n return `bugfix/${faker.word.verb()}-${faker.word.noun()}`;\n } else if (random < formats.feature + formats.bugfix + formats.release) {\n return `release/${faker.system.semver()}`;\n } else if (random < formats.feature + formats.bugfix + formats.release + formats.main) {\n return faker.helpers.arrayElement(['main', 'master', 'develop']);\n } else {\n return faker.git.branch();\n }\n }\n\n private generateCommitMessage(): string {\n if (!this.patterns?.builds.messagePatterns) {\n return faker.git.commitMessage();\n }\n\n const patterns = this.patterns.builds.messagePatterns;\n const useConventional = Math.random() < patterns.conventionalCommits;\n const useEmoji = Math.random() < patterns.hasEmoji;\n const useGithubRef = Math.random() < patterns.githubRefs;\n const useJiraRef = Math.random() < patterns.jiraRefs;\n const useMultiline = Math.random() < patterns.multiline;\n \n let message = '';\n \n if (useConventional) {\n const type = faker.helpers.arrayElement([\n 'feat', 'fix', 'docs', 'style', 'refactor', \n 'test', 'chore', 'perf', 'ci', 'build'\n ]);\n const scope = Math.random() < 0.3 ? `(${faker.word.noun()})` : '';\n message = `${type}${scope}: `;\n }\n \n if (useEmoji) {\n message += faker.helpers.arrayElement(['🎉', '🚀', '✨', '🔧', '📦', '👷', '🐛', '⚡️', '✅', '💚']) + ' ';\n }\n \n message += faker.git.commitMessage();\n \n if (useGithubRef) {\n message += ` (#${faker.number.int({ min: 1, max: 9999 })})`;\n }\n \n if (useJiraRef) {\n const project = faker.helpers.arrayElement(['PROJ', 'TEAM', 'BUG', 'FEAT']);\n message += ` ${project}-${faker.number.int({ min: 1, max: 9999 })}`;\n }\n \n if (useMultiline) {\n message += '\\n\\n' + faker.lorem.paragraph();\n }\n \n return message;\n }\n\n private generateFinishedAt(): string | null {\n const shouldBeFinished = Math.random() < 0.9;\n if (shouldBeFinished) {\n return faker.date.recent({ days: 30 }).toISOString();\n }\n return null;\n }\n\n private generatePullRequest() {\n const hasPR = Math.random() < 0.3;\n if (!hasPR) return null;\n \n return {\n id: faker.number.int({ min: 1, max: 9999 }).toString(),\n base: faker.git.branch(),\n repository: `https://github.com/${faker.word.noun()}/${faker.word.noun()}`\n };\n }\n\n private generateJobs() {\n const count = this.patterns?.builds.jobCounts \n ? this.selectByDistribution(this.patterns.builds.jobCounts)\n : faker.number.int({ min: 1, max: 10 });\n \n return () => new MockList(count);\n }\n\n private generateAnnotations() {\n const count = this.patterns?.builds.annotationCounts \n ? this.selectByDistribution(this.patterns.builds.annotationCounts)\n : faker.number.int({ min: 0, max: 3 });\n \n return () => new MockList(count);\n }\n\n private generateCreator() {\n return {\n id: faker.string.uuid(),\n name: this.generateUserName(),\n email: this.generateUserEmail(),\n avatar: {\n url: faker.image.avatar()\n }\n };\n }\n\n private generateUserName(): string {\n if (this.patterns?.builds.creatorPatterns.nameFormats) {\n const format = this.selectByDistribution(\n this.patterns.builds.creatorPatterns.nameFormats\n );\n \n switch (format) {\n case 'full-name':\n return faker.person.fullName();\n case 'dotted':\n return `${faker.person.firstName()}.${faker.person.lastName()}`.toLowerCase();\n case 'hyphenated':\n return `${faker.person.firstName()}-${faker.person.lastName()}`.toLowerCase();\n case 'underscored':\n return `${faker.person.firstName()}_${faker.person.lastName()}`.toLowerCase();\n case 'lowercase':\n return faker.internet.username().toLowerCase();\n default:\n return faker.person.fullName();\n }\n }\n \n return faker.person.fullName();\n }\n\n private generateUserEmail(): string {\n if (this.patterns?.builds.creatorPatterns.domains) {\n const domain = this.selectByDistribution(\n this.patterns.builds.creatorPatterns.domains\n );\n return `${faker.internet.username()}@${domain}`.toLowerCase();\n }\n \n return faker.internet.email();\n }\n\n private generatePipelineSlug(): string {\n const format = this.patterns?.pipelines.slugFormats \n ? this.selectByDistribution(this.patterns.pipelines.slugFormats)\n : 'kebab-case';\n \n const words = [faker.word.noun(), faker.word.verb()];\n \n switch (format) {\n case 'kebab-case':\n return words.join('-').toLowerCase();\n case 'snake_case':\n return words.join('_').toLowerCase();\n case 'camelCase':\n return words[0].toLowerCase() + words.slice(1).map(w => \n w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()\n ).join('');\n default:\n return words.join('').toLowerCase();\n }\n }\n\n private generatePipelineName(): string {\n const length = this.patterns?.pipelines.nameLength?.average || 20;\n const variance = 10;\n const targetLength = Math.max(\n 5,\n Math.floor(length + (Math.random() - 0.5) * variance)\n );\n \n let name = faker.company.name();\n while (name.length < targetLength) {\n name += ' ' + faker.word.noun();\n }\n \n return name.substring(0, targetLength);\n }\n\n private generateRepository() {\n const provider = this.patterns?.pipelines.repositoryProviders\n ? this.selectByDistribution(this.patterns.pipelines.repositoryProviders)\n : 'github';\n \n const org = faker.word.noun();\n const repo = faker.word.noun();\n \n switch (provider) {\n case 'github':\n return {\n url: `https://github.com/${org}/${repo}`,\n provider: { name: 'GitHub' }\n };\n case 'gitlab':\n return {\n url: `https://gitlab.com/${org}/${repo}`,\n provider: { name: 'GitLab' }\n };\n case 'bitbucket':\n return {\n url: `https://bitbucket.org/${org}/${repo}`,\n provider: { name: 'Bitbucket' }\n };\n default:\n return {\n url: `git@git.example.com:${org}/${repo}.git`,\n provider: { name: 'Git' }\n };\n }\n }\n\n private generateDefaultBranch(): string {\n if (this.patterns?.pipelines.defaultBranches) {\n return this.selectByDistribution(this.patterns.pipelines.defaultBranches);\n }\n return faker.helpers.arrayElement(['main', 'master', 'develop']);\n }\n\n private generateVisibility(): string {\n if (this.patterns?.pipelines.visibility) {\n return this.selectByDistribution(this.patterns.pipelines.visibility);\n }\n return faker.helpers.arrayElement(['PRIVATE', 'PUBLIC']);\n }\n\n private generateJobBase() {\n return {\n id: faker.string.uuid(),\n uuid: faker.string.uuid(),\n label: this.generateJobLabel(),\n state: this.generateJobState(),\n runAt: faker.date.recent({ days: 1 }).toISOString(),\n scheduledAt: faker.date.recent({ days: 1 }).toISOString(),\n startedAt: faker.date.recent({ days: 1 }).toISOString(),\n finishedAt: faker.date.recent({ days: 1 }).toISOString(),\n canceledAt: null,\n unblockable: faker.datatype.boolean({ probability: 0.1 }),\n unblockUrl: null,\n url: `https://buildkite.com/${faker.word.noun()}/${faker.word.noun()}/builds/${faker.number.int()}/jobs/${faker.string.uuid()}`,\n webUrl: `https://buildkite.com/${faker.word.noun()}/${faker.word.noun()}/builds/${faker.number.int()}#${faker.string.uuid()}`,\n build: { id: faker.string.uuid() }\n };\n }\n\n private generateJob() {\n const type = faker.helpers.arrayElement(['command', 'wait', 'trigger']);\n \n switch (type) {\n case 'wait':\n return { __typename: 'JobTypeWait' };\n case 'trigger':\n return { __typename: 'JobTypeTrigger' };\n default:\n return { __typename: 'JobTypeCommand' };\n }\n }\n\n private generateJobLabel(): string {\n if (this.patterns?.jobs.labelPatterns) {\n const pattern = this.selectByDistribution(this.patterns.jobs.labelPatterns);\n return pattern\n .replace(':version', faker.system.semver())\n .replace(':os', faker.helpers.arrayElement(['linux', 'ubuntu', 'macos', 'windows']))\n .replace(':test', faker.helpers.arrayElement(['unit', 'integration', 'e2e', 'smoke']))\n .replace(':sha', faker.git.commitSha().substring(0, 7));\n }\n \n return faker.helpers.arrayElement([\n `Test on ${faker.helpers.arrayElement(['Node', 'Python', 'Ruby'])} ${faker.system.semver()}`,\n 'Build Docker Image',\n 'Deploy to Staging',\n 'Run Integration Tests',\n 'Lint and Format',\n 'Security Scan',\n 'Performance Tests'\n ]);\n }\n\n private generateJobState(): string {\n return faker.helpers.arrayElement([\n 'PENDING', 'WAITING', 'BLOCKED', 'UNBLOCKED', 'LIMITING',\n 'LIMITED', 'SCHEDULED', 'ASSIGNED', 'ACCEPTED', 'RUNNING',\n 'FINISHED', 'CANCELING', 'CANCELED', 'TIMING_OUT', \n 'TIMED_OUT', 'SKIPPED', 'BROKEN'\n ]);\n }\n\n private generateExitStatus(): number | null {\n if (this.patterns?.jobs.exitStatusDistribution) {\n return this.selectByDistribution(this.patterns.jobs.exitStatusDistribution);\n }\n \n const hasExitStatus = Math.random() < 0.95;\n if (!hasExitStatus) return null;\n \n // Most jobs succeed (0), some fail (1), rare other codes\n const random = Math.random();\n if (random < 0.85) return 0;\n if (random < 0.95) return 1;\n return faker.helpers.arrayElement([2, 127, 128, 130, 137]);\n }\n\n private generateParallelGroupIndex(): number | null {\n const hasParallel = Math.random() < 0.2;\n if (!hasParallel) return null;\n return faker.number.int({ min: 0, max: 9 });\n }\n\n private generateParallelGroupTotal(): number | null {\n const hasParallel = Math.random() < 0.2;\n if (!hasParallel) return null;\n return faker.number.int({ min: 2, max: 10 });\n }\n\n private generateAgent() {\n return {\n id: faker.string.uuid(),\n uuid: faker.string.uuid(),\n name: faker.helpers.arrayElement([\n `agent-${faker.word.noun()}-${faker.number.int({ min: 1, max: 99 })}`,\n `buildkite-agent-${faker.string.alphanumeric(8)}`,\n `${faker.helpers.arrayElement(['linux', 'macos', 'windows'])}-${faker.number.int({ min: 1, max: 20 })}`\n ]),\n hostname: faker.internet.domainName(),\n version: faker.system.semver(),\n isRunningJob: faker.datatype.boolean({ probability: 0.3 })\n };\n }\n\n private generateOrganizationSlug(): string {\n const format = this.patterns?.organizations.slugFormats \n ? this.selectByDistribution(this.patterns.organizations.slugFormats)\n : 'kebab-case';\n \n const name = faker.company.name().toLowerCase();\n \n switch (format) {\n case 'kebab-case':\n return name.replace(/\\s+/g, '-').replace(/[^a-z0-9-]/g, '');\n case 'snake_case':\n return name.replace(/\\s+/g, '_').replace(/[^a-z0-9_]/g, '');\n default:\n return name.replace(/[^a-z0-9]/g, '');\n }\n }\n\n private generateOrganizationName(): string {\n const length = this.patterns?.organizations.nameLength?.average || 15;\n const variance = 10;\n const targetLength = Math.max(\n 3,\n Math.floor(length + (Math.random() - 0.5) * variance)\n );\n \n let name = faker.company.name();\n while (name.length < targetLength) {\n name += ' ' + faker.company.buzzNoun();\n }\n \n return name.substring(0, targetLength);\n }\n\n private generatePipelineRef() {\n return {\n id: faker.string.uuid(),\n slug: this.generatePipelineSlug(),\n name: this.generatePipelineName()\n };\n }\n\n private generateOrganizationRef() {\n return {\n id: faker.string.uuid(),\n slug: this.generateOrganizationSlug(),\n name: this.generateOrganizationName()\n };\n }\n\n private generateAnnotationContext(): string {\n return faker.helpers.arrayElement([\n 'test-results',\n 'coverage',\n 'lint',\n 'security',\n 'performance',\n 'deployment',\n 'release-notes'\n ]);\n }\n\n private generateAnnotationStyle(): string {\n return faker.helpers.arrayElement(['info', 'warning', 'error', 'success']);\n }\n\n private generateAnnotationBody(): string {\n const useMarkdown = Math.random() < 0.6;\n \n if (useMarkdown) {\n const style = faker.helpers.arrayElement(['summary', 'detailed', 'table']);\n \n switch (style) {\n case 'summary':\n return `<h3>${faker.lorem.sentence()}</h3>\n<p>${faker.lorem.paragraph()}</p>\n<ul>\n <li>✅ ${faker.lorem.sentence()}</li>\n <li>⚠️ ${faker.lorem.sentence()}</li>\n <li>❌ ${faker.lorem.sentence()}</li>\n</ul>`;\n \n case 'detailed':\n return `<details>\n <summary>${faker.lorem.sentence()}</summary>\n <p>${faker.lorem.paragraph()}</p>\n <pre><code>${faker.hacker.phrase()}</code></pre>\n</details>`;\n \n case 'table':\n return `<table>\n <thead>\n <tr>\n <th>Test</th>\n <th>Status</th>\n <th>Duration</th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <td>${faker.hacker.noun()}</td>\n <td>✅ Passed</td>\n <td>${faker.number.float({ min: 0.1, max: 10, multipleOf: 0.1 })}s</td>\n </tr>\n <tr>\n <td>${faker.hacker.noun()}</td>\n <td>❌ Failed</td>\n <td>${faker.number.float({ min: 0.1, max: 10, multipleOf: 0.1 })}s</td>\n </tr>\n </tbody>\n</table>`;\n \n default:\n return `<p>${faker.lorem.paragraph()}</p>`;\n }\n }\n \n return `<p>${faker.lorem.paragraph()}</p>`;\n }\n}\n"]}
|
package/dist/ui/theme.js
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import chalk from 'chalk';
|
|
8
8
|
import { getSymbols } from './symbols.js';
|
|
9
|
+
import { terminalLink } from '../utils/terminal-links.js';
|
|
9
10
|
function isTTY() {
|
|
10
11
|
return Boolean(process.stdout.isTTY);
|
|
11
12
|
}
|
|
@@ -36,7 +37,7 @@ export const SEMANTIC_COLORS = {
|
|
|
36
37
|
// Data type highlighting
|
|
37
38
|
identifier: (s) => colorEnabled() ? chalk.cyan(s) : s,
|
|
38
39
|
count: (s) => colorEnabled() ? chalk.magenta(s) : s,
|
|
39
|
-
url: (s) =>
|
|
40
|
+
url: (s, label) => terminalLink(s, label),
|
|
40
41
|
// De-emphasis (auxiliary information)
|
|
41
42
|
dim: (s) => colorEnabled() ? chalk.dim(s) : s,
|
|
42
43
|
muted: (s) => colorEnabled() ? chalk.gray(s) : s,
|
|
@@ -141,22 +142,28 @@ export var TipStyle;
|
|
|
141
142
|
/**
|
|
142
143
|
* Format tips with consistent styling based on context
|
|
143
144
|
*/
|
|
144
|
-
export function formatTips(tips, style = TipStyle.GROUPED) {
|
|
145
|
+
export function formatTips(tips, style = TipStyle.GROUPED, includeTurnOff = true) {
|
|
145
146
|
if (tips.length === 0)
|
|
146
147
|
return '';
|
|
148
|
+
// Add the turn-off tip if not already included
|
|
149
|
+
const allTips = [...tips];
|
|
150
|
+
const turnOffMessage = 'Use --no-tips to hide these hints';
|
|
151
|
+
if (includeTurnOff && !tips.some(tip => tip.includes('--no-tips'))) {
|
|
152
|
+
allTips.push(turnOffMessage);
|
|
153
|
+
}
|
|
147
154
|
switch (style) {
|
|
148
155
|
case TipStyle.GROUPED:
|
|
149
|
-
return formatGroupedTips(
|
|
156
|
+
return formatGroupedTips(allTips);
|
|
150
157
|
case TipStyle.INDIVIDUAL:
|
|
151
|
-
return formatIndividualTips(
|
|
158
|
+
return formatIndividualTips(allTips);
|
|
152
159
|
case TipStyle.ACTIONS:
|
|
153
|
-
return formatActionTips(
|
|
160
|
+
return formatActionTips(allTips);
|
|
154
161
|
case TipStyle.FIXES:
|
|
155
|
-
return formatFixTips(
|
|
162
|
+
return formatFixTips(allTips);
|
|
156
163
|
case TipStyle.BOX:
|
|
157
|
-
return formatTipBox(
|
|
164
|
+
return formatTipBox(allTips); // Use existing function
|
|
158
165
|
default:
|
|
159
|
-
return formatGroupedTips(
|
|
166
|
+
return formatGroupedTips(allTips);
|
|
160
167
|
}
|
|
161
168
|
}
|
|
162
169
|
function formatGroupedTips(tips) {
|
|
@@ -277,4 +284,182 @@ export function shouldDecorate(format) {
|
|
|
277
284
|
const f = (format || '').toLowerCase();
|
|
278
285
|
return f !== 'json' && f !== 'alfred' && colorEnabled();
|
|
279
286
|
}
|
|
287
|
+
/**
|
|
288
|
+
* Icon Display Modes
|
|
289
|
+
*/
|
|
290
|
+
export var IconMode;
|
|
291
|
+
(function (IconMode) {
|
|
292
|
+
IconMode["EMOJI"] = "emoji";
|
|
293
|
+
IconMode["UTF8"] = "utf8";
|
|
294
|
+
IconMode["ASCII"] = "ascii"; // ASCII-only fallback
|
|
295
|
+
})(IconMode || (IconMode = {}));
|
|
296
|
+
/**
|
|
297
|
+
* Build and Job State Icons
|
|
298
|
+
* Each has emoji, UTF-8, and ASCII alternatives
|
|
299
|
+
*/
|
|
300
|
+
export const STATE_ICONS = {
|
|
301
|
+
PASSED: {
|
|
302
|
+
emoji: '✅',
|
|
303
|
+
utf8: '✓', // U+2713 Check mark
|
|
304
|
+
ascii: '[OK]'
|
|
305
|
+
},
|
|
306
|
+
FAILED: {
|
|
307
|
+
emoji: '❌',
|
|
308
|
+
utf8: '✗', // U+2717 Ballot X
|
|
309
|
+
ascii: '[FAIL]'
|
|
310
|
+
},
|
|
311
|
+
RUNNING: {
|
|
312
|
+
emoji: '🔄',
|
|
313
|
+
utf8: '↻', // U+21BB Clockwise arrow
|
|
314
|
+
ascii: '[RUN]'
|
|
315
|
+
},
|
|
316
|
+
BLOCKED: {
|
|
317
|
+
emoji: '⏸️',
|
|
318
|
+
utf8: '‖', // U+2016 Double vertical line
|
|
319
|
+
ascii: '[BLOCK]'
|
|
320
|
+
},
|
|
321
|
+
CANCELED: {
|
|
322
|
+
emoji: '🚫',
|
|
323
|
+
utf8: '⊘', // U+2298 Circled division slash
|
|
324
|
+
ascii: '[CANCEL]'
|
|
325
|
+
},
|
|
326
|
+
SCHEDULED: {
|
|
327
|
+
emoji: '📅',
|
|
328
|
+
utf8: '⏰', // U+23F0 Alarm clock
|
|
329
|
+
ascii: '[SCHED]'
|
|
330
|
+
},
|
|
331
|
+
SKIPPED: {
|
|
332
|
+
emoji: '⏭️',
|
|
333
|
+
utf8: '»', // U+00BB Right-pointing double angle
|
|
334
|
+
ascii: '[SKIP]'
|
|
335
|
+
},
|
|
336
|
+
UNKNOWN: {
|
|
337
|
+
emoji: '❓',
|
|
338
|
+
utf8: '?', // Regular question mark
|
|
339
|
+
ascii: '[?]'
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
/**
|
|
343
|
+
* Annotation Style Icons
|
|
344
|
+
*/
|
|
345
|
+
export const ANNOTATION_ICONS = {
|
|
346
|
+
ERROR: {
|
|
347
|
+
emoji: '❌',
|
|
348
|
+
utf8: '✗', // U+2717 Ballot X
|
|
349
|
+
ascii: '[ERR]'
|
|
350
|
+
},
|
|
351
|
+
WARNING: {
|
|
352
|
+
emoji: '⚠️',
|
|
353
|
+
utf8: '⚠', // U+26A0 Warning sign (without emoji variant)
|
|
354
|
+
ascii: '[WARN]'
|
|
355
|
+
},
|
|
356
|
+
INFO: {
|
|
357
|
+
emoji: 'ℹ️',
|
|
358
|
+
utf8: 'ℹ', // U+2139 Information source (no circle)
|
|
359
|
+
ascii: '[INFO]'
|
|
360
|
+
},
|
|
361
|
+
SUCCESS: {
|
|
362
|
+
emoji: '✅',
|
|
363
|
+
utf8: '✓', // U+2713 Check mark
|
|
364
|
+
ascii: '[OK]'
|
|
365
|
+
},
|
|
366
|
+
DEFAULT: {
|
|
367
|
+
emoji: '📝',
|
|
368
|
+
utf8: '◆', // U+25C6 Black diamond
|
|
369
|
+
ascii: '[NOTE]'
|
|
370
|
+
}
|
|
371
|
+
};
|
|
372
|
+
/**
|
|
373
|
+
* Progress and Debug Icons
|
|
374
|
+
*/
|
|
375
|
+
export const PROGRESS_ICONS = {
|
|
376
|
+
TIMING: {
|
|
377
|
+
emoji: '⏱️',
|
|
378
|
+
utf8: '⧗', // U+29D7 Black hourglass
|
|
379
|
+
ascii: '[TIME]'
|
|
380
|
+
},
|
|
381
|
+
STARTING: {
|
|
382
|
+
emoji: '🕒',
|
|
383
|
+
utf8: '◷', // U+25F7 White circle with upper right quadrant
|
|
384
|
+
ascii: '[>>>]'
|
|
385
|
+
},
|
|
386
|
+
RETRY: {
|
|
387
|
+
emoji: '🔄',
|
|
388
|
+
utf8: '↻', // U+21BB Clockwise arrow
|
|
389
|
+
ascii: '[RETRY]'
|
|
390
|
+
},
|
|
391
|
+
SUCCESS_LOG: {
|
|
392
|
+
emoji: '✅',
|
|
393
|
+
utf8: '✓', // U+2713 Check mark
|
|
394
|
+
ascii: '[✓]'
|
|
395
|
+
},
|
|
396
|
+
BLOCKED_MESSAGE: {
|
|
397
|
+
emoji: '🚫',
|
|
398
|
+
utf8: '⊘', // U+2298 Circled division slash
|
|
399
|
+
ascii: '[BLOCKED]'
|
|
400
|
+
},
|
|
401
|
+
PARALLEL: {
|
|
402
|
+
emoji: '📊',
|
|
403
|
+
utf8: '═', // U+2550 Box drawings double horizontal
|
|
404
|
+
ascii: '[||]'
|
|
405
|
+
}
|
|
406
|
+
};
|
|
407
|
+
/**
|
|
408
|
+
* Get current icon mode based on environment and flags
|
|
409
|
+
*/
|
|
410
|
+
export function getIconMode() {
|
|
411
|
+
// Check command-line flags first
|
|
412
|
+
if (process.argv.includes('--ascii')) {
|
|
413
|
+
return IconMode.ASCII;
|
|
414
|
+
}
|
|
415
|
+
if (process.argv.includes('--emoji')) {
|
|
416
|
+
return IconMode.EMOJI;
|
|
417
|
+
}
|
|
418
|
+
// Check environment variables
|
|
419
|
+
if (process.env.BKTIDE_ASCII === '1') {
|
|
420
|
+
return IconMode.ASCII;
|
|
421
|
+
}
|
|
422
|
+
if (process.env.BKTIDE_EMOJI === '1') {
|
|
423
|
+
return IconMode.EMOJI;
|
|
424
|
+
}
|
|
425
|
+
// Default to UTF-8 symbols (clean, universal, works in most modern terminals)
|
|
426
|
+
// ASCII is only used if explicitly requested via flag or env var
|
|
427
|
+
return IconMode.UTF8;
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Helper to get icon based on current mode
|
|
431
|
+
*/
|
|
432
|
+
export function getIcon(iconDef) {
|
|
433
|
+
const mode = getIconMode();
|
|
434
|
+
switch (mode) {
|
|
435
|
+
case IconMode.ASCII:
|
|
436
|
+
return iconDef.ascii;
|
|
437
|
+
case IconMode.UTF8:
|
|
438
|
+
return iconDef.utf8;
|
|
439
|
+
default:
|
|
440
|
+
return iconDef.emoji;
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
/**
|
|
444
|
+
* Get state icon for build/job states
|
|
445
|
+
*/
|
|
446
|
+
export function getStateIcon(state) {
|
|
447
|
+
const upperState = state.toUpperCase().replace('CANCELING', 'CANCELED');
|
|
448
|
+
const iconDef = STATE_ICONS[upperState] || STATE_ICONS.UNKNOWN;
|
|
449
|
+
return getIcon(iconDef);
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Get annotation style icon
|
|
453
|
+
*/
|
|
454
|
+
export function getAnnotationIcon(style) {
|
|
455
|
+
const upperStyle = style.toUpperCase();
|
|
456
|
+
const iconDef = ANNOTATION_ICONS[upperStyle] || ANNOTATION_ICONS.DEFAULT;
|
|
457
|
+
return getIcon(iconDef);
|
|
458
|
+
}
|
|
459
|
+
/**
|
|
460
|
+
* Get progress/debug icon
|
|
461
|
+
*/
|
|
462
|
+
export function getProgressIcon(type) {
|
|
463
|
+
return getIcon(PROGRESS_ICONS[type]);
|
|
464
|
+
}
|
|
280
465
|
//# sourceMappingURL=theme.js.map
|
package/dist/ui/theme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theme.js","sourceRoot":"/","sources":["ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,SAAS,KAAK;IACZ,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC;IACrD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,KAAK,EAAE,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kCAAkC;IAClC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;IAC/E,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;IACxE,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;IAEtE,yBAAyB;IACzB,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;IAEvE,sCAAsC;IACtC,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;IAC5D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;IAEpE,qBAAqB;IACrB,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;CAChF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,MAAM;KACd;IAED,iBAAiB;IACjB,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,WAAW;KACnB;IAED,iBAAiB;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,WAAW;KACnB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,UAAU;KAClB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,OAAO;KACf;IAED,gBAAgB;IAChB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,IAAI;QAC3B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,OAAO;KACf;IACD,SAAS,EAAE;QACT,KAAK,EAAE,eAAe,CAAC,IAAI;QAC3B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,SAAS;KACjB;IAED,kBAAkB;IAClB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,MAAM;KACd;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAkD;IAElD,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,kBAAkB,CAAC,gBAAmD,CAAC,CAAC;IACtF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;IAEtC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAClD,mCAAmC;QACnC,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED,mCAAmC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,+BAAmB,CAAA;IACnB,qCAAyB,CAAA;IACzB,+BAAmB,CAAA;IACnB,2BAAe,CAAA;IACf,uBAAW,CAAA,CAAc,yCAAyC;AACpE,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAc,EACd,QAAkB,QAAQ,CAAC,OAAO;IAElC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ,CAAC,OAAO;YACnB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,KAAK,QAAQ,CAAC,UAAU;YACtB,OAAO,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACpC,KAAK,QAAQ,CAAC,OAAO;YACnB,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAChC,KAAK,QAAQ,CAAC,KAAK;YACjB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;QAC7B,KAAK,QAAQ,CAAC,GAAG;YACf,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,wBAAwB;QACrD;YACE,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAc;IAC1C,OAAO,IAAI;SACR,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,KAAc;IACzD,MAAM,SAAS,GAAG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAExD,uCAAuC;IACvC,IAAI,SAAS,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACtC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAEzC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAqB,EACrB,OAIC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gBAAgB;IAChB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,0BAA0B;IAC1B,IAAI,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,eAAe;IACf,IAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAc;IAC3D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC7G,CAAC;IAED,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,WAAsB;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACtB,+CAA+C;YAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,eAAe,CAAC,KAAK;IAC5B,IAAI,EAAE,eAAe,CAAC,OAAO;IAC7B,OAAO,EAAE,eAAe,CAAC,OAAO;IAChC,IAAI,EAAE,eAAe,CAAC,IAAI;IAC1B,KAAK,EAAE,eAAe,CAAC,KAAK;IAC5B,SAAS,EAAE,eAAe,CAAC,SAAS;IACpC,GAAG,EAAE,eAAe,CAAC,GAAG;CACzB,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAEpC,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,YAAY,EAAE,CAAC;AAC1D,CAAC","sourcesContent":["/**\n * Enhanced Visual Design System for bktide CLI\n * \n * This module implements a comprehensive color and typography system\n * that enhances information hierarchy and accessibility.\n */\nimport chalk from 'chalk';\nimport { getSymbols } from './symbols.js';\n\nfunction isTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\nfunction colorEnabled(): boolean {\n if (process.env.NO_COLOR) return false;\n const mode = process.env.BKTIDE_COLOR_MODE || 'auto';\n if (mode === 'never') return false;\n if (mode === 'always') return true;\n return isTTY();\n}\n\n/**\n * Semantic color system for different information types\n * Using colorblind-safe palette\n */\nexport const SEMANTIC_COLORS = {\n // Status colors (colorblind-safe)\n success: (s: string) => colorEnabled() ? chalk.blue(s) : s,\n error: (s: string) => colorEnabled() ? chalk.rgb(255, 140, 0)(s) : s,\n warning: (s: string) => colorEnabled() ? chalk.yellow(s) : s,\n info: (s: string) => colorEnabled() ? chalk.cyan(s) : s,\n \n // Typography emphasis levels\n heading: (s: string) => colorEnabled() ? chalk.bold.underline(s) : `== ${s} ==`,\n subheading: (s: string) => colorEnabled() ? chalk.bold(s) : `** ${s} **`,\n label: (s: string) => colorEnabled() ? chalk.bold(s) : s.toUpperCase(),\n \n // Data type highlighting\n identifier: (s: string) => colorEnabled() ? chalk.cyan(s) : s,\n count: (s: string) => colorEnabled() ? chalk.magenta(s) : s,\n url: (s: string) => colorEnabled() ? chalk.underline.cyan(s) : `<${s}>`,\n \n // De-emphasis (auxiliary information)\n dim: (s: string) => colorEnabled() ? chalk.dim(s) : s,\n muted: (s: string) => colorEnabled() ? chalk.gray(s) : s,\n tip: (s: string) => colorEnabled() ? chalk.dim(s) : `(${s})`,\n help: (s: string) => colorEnabled() ? chalk.dim.italic(s) : `[${s}]`,\n \n // Special formatting\n highlight: (s: string) => colorEnabled() ? chalk.magenta(s) : s,\n code: (s: string) => colorEnabled() ? chalk.bgGray.white(` ${s} `) : `\\`${s}\\``,\n};\n\n/**\n * Build status specific theming\n * Matches conventions from GitHub Actions, CircleCI, Jenkins\n */\nexport const BUILD_STATUS_THEME = {\n // Success states\n PASSED: {\n color: SEMANTIC_COLORS.success,\n symbol: '✓',\n ascii: '[OK]',\n },\n \n // Failure states\n FAILED: {\n color: SEMANTIC_COLORS.error,\n symbol: '✖',\n ascii: '[FAIL]',\n },\n FAILING: {\n color: (s: string) => colorEnabled() ? chalk.rgb(255, 165, 0)(s) : s,\n symbol: '⚠',\n ascii: '[FAILING]',\n },\n \n // Warning states\n BLOCKED: {\n color: SEMANTIC_COLORS.warning,\n symbol: '⚠',\n ascii: '[BLOCKED]',\n },\n CANCELED: {\n color: SEMANTIC_COLORS.warning,\n symbol: '⊘',\n ascii: '[CANCEL]',\n },\n CANCELING: {\n color: SEMANTIC_COLORS.warning,\n symbol: '⊘',\n ascii: '[...]',\n },\n \n // Active states\n RUNNING: {\n color: SEMANTIC_COLORS.info,\n symbol: '↻',\n ascii: '[RUN]',\n },\n SCHEDULED: {\n color: SEMANTIC_COLORS.info,\n symbol: '⏱',\n ascii: '[QUEUE]',\n },\n \n // Inactive states\n SKIPPED: {\n color: SEMANTIC_COLORS.muted,\n symbol: '−',\n ascii: '[SKIP]',\n },\n NOT_RUN: {\n color: SEMANTIC_COLORS.muted,\n symbol: '○',\n ascii: '[--]',\n },\n};\n\n/**\n * Format a build status with appropriate color and symbol\n */\nexport function formatBuildStatus(\n status: string, \n options?: { useSymbol?: boolean; ascii?: boolean }\n): string {\n // Normalize status to uppercase for theme lookup\n const normalizedStatus = status.toUpperCase();\n const theme = BUILD_STATUS_THEME[normalizedStatus as keyof typeof BUILD_STATUS_THEME];\n if (!theme) {\n return SEMANTIC_COLORS.muted(status);\n }\n \n const useSymbol = options?.useSymbol ?? true;\n const ascii = options?.ascii ?? false;\n \n if (useSymbol) {\n const symbol = ascii ? theme.ascii : theme.symbol;\n // Keep original casing for display\n return `${symbol} ${theme.color(status)}`;\n }\n \n // Keep original casing for display\n return theme.color(status);\n}\n\n/**\n * Tip display styles for different contexts\n */\nexport enum TipStyle {\n GROUPED = 'grouped', // Tips: with arrows\n INDIVIDUAL = 'individual', // → Individual arrows\n ACTIONS = 'actions', // Next steps: with arrows\n FIXES = 'fixes', // To fix this: numbered\n BOX = 'box' // Fancy box with arrows (wide terminals)\n}\n\n/**\n * Format tips with consistent styling based on context\n */\nexport function formatTips(\n tips: string[], \n style: TipStyle = TipStyle.GROUPED\n): string {\n if (tips.length === 0) return '';\n \n switch (style) {\n case TipStyle.GROUPED:\n return formatGroupedTips(tips);\n case TipStyle.INDIVIDUAL:\n return formatIndividualTips(tips);\n case TipStyle.ACTIONS:\n return formatActionTips(tips);\n case TipStyle.FIXES:\n return formatFixTips(tips);\n case TipStyle.BOX:\n return formatTipBox(tips); // Use existing function\n default:\n return formatGroupedTips(tips);\n }\n}\n\nfunction formatGroupedTips(tips: string[]): string {\n const lines: string[] = [];\n lines.push(SEMANTIC_COLORS.dim('Tips:'));\n tips.forEach(tip => {\n lines.push(SEMANTIC_COLORS.dim(` → ${tip}`));\n });\n return lines.join('\\n');\n}\n\nfunction formatIndividualTips(tips: string[]): string {\n return tips\n .map(tip => SEMANTIC_COLORS.dim(`→ ${tip}`))\n .join('\\n');\n}\n\nfunction formatActionTips(tips: string[]): string {\n const lines: string[] = [];\n lines.push(SEMANTIC_COLORS.dim('Next steps:'));\n tips.forEach(tip => {\n lines.push(SEMANTIC_COLORS.dim(` → ${tip}`));\n });\n return lines.join('\\n');\n}\n\nfunction formatFixTips(tips: string[]): string {\n const lines: string[] = [];\n lines.push(SEMANTIC_COLORS.subheading('To fix this:'));\n tips.forEach((tip, i) => {\n lines.push(` ${i + 1}. ${tip}`);\n });\n return lines.join('\\n');\n}\n\n/**\n * Create a formatted tip box for better visual separation\n * Only used in wide terminals\n */\nexport function formatTipBox(tips: string[], width?: number): string {\n const termWidth = width || process.stdout.columns || 80;\n \n // Only use fancy box in wide terminals\n if (termWidth < 80 || !colorEnabled()) {\n return formatGroupedTips(tips);\n }\n \n const lines: string[] = [];\n const boxWidth = Math.min(termWidth - 4, 60);\n const border = '─'.repeat(boxWidth - 10);\n \n lines.push(SEMANTIC_COLORS.dim(`┌─ Tips ${border}`));\n tips.forEach(tip => {\n lines.push(SEMANTIC_COLORS.dim(`│ → ${tip}`));\n });\n lines.push(SEMANTIC_COLORS.dim(`└${'─'.repeat(boxWidth - 1)}`));\n \n return lines.join('\\n');\n}\n\n/**\n * Format an error message with consistent styling\n */\nexport function formatError(\n error: string | Error, \n options?: { \n showHelp?: boolean; \n helpCommand?: string;\n suggestions?: string[];\n }\n): string {\n const lines: string[] = [];\n const symbols = getSymbols();\n \n // Error header\n lines.push(`${SEMANTIC_COLORS.error(symbols.error)} ${chalk.bold('Error')}`);\n lines.push('');\n \n // Error message\n const message = typeof error === 'string' ? error : error.message;\n lines.push(message);\n \n // Suggestions if provided\n if (options?.suggestions && options.suggestions.length > 0) {\n lines.push('');\n lines.push(formatTips(options.suggestions, TipStyle.FIXES));\n }\n \n // Help command\n if (options?.showHelp && options?.helpCommand) {\n lines.push('');\n lines.push(SEMANTIC_COLORS.help(`Need help? Run: ${options.helpCommand}`));\n }\n \n return lines.join('\\n');\n}\n\n/**\n * Format a success message (subtle, not redundant)\n */\nexport function formatSuccess(message: string, count?: number): string {\n const symbols = getSymbols();\n \n if (count !== undefined) {\n return `${SEMANTIC_COLORS.success(symbols.success)} ${message} ${SEMANTIC_COLORS.count(count.toString())}`;\n }\n \n return `${SEMANTIC_COLORS.success(symbols.success)} ${message}`;\n}\n\n/**\n * Format empty state messages\n */\nexport function formatEmptyState(\n message: string,\n suggestions?: string[]\n): string {\n const lines: string[] = [];\n \n lines.push(SEMANTIC_COLORS.dim(message));\n \n if (suggestions && suggestions.length > 0) {\n lines.push('');\n suggestions.forEach(s => {\n // Make commands stand out from the dimmed text\n const formatted = s.replace(/--\\w+[^ ]*/g, match => chalk.reset(match));\n lines.push(SEMANTIC_COLORS.dim(formatted));\n });\n }\n \n return lines.join('\\n');\n}\n\n/**\n * Legacy color exports for backward compatibility\n * @deprecated Use SEMANTIC_COLORS instead\n */\nexport const COLORS = {\n error: SEMANTIC_COLORS.error,\n warn: SEMANTIC_COLORS.warning,\n success: SEMANTIC_COLORS.success,\n info: SEMANTIC_COLORS.info,\n muted: SEMANTIC_COLORS.muted,\n highlight: SEMANTIC_COLORS.highlight,\n dim: SEMANTIC_COLORS.dim,\n};\n\n// Export symbols from the symbols module\nexport const SYMBOLS = getSymbols();\n\nexport function shouldDecorate(format?: string): boolean {\n const f = (format || '').toLowerCase();\n return f !== 'json' && f !== 'alfred' && colorEnabled();\n}\n\n\n"]}
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"/","sources":["ui/theme.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,SAAS,KAAK;IACZ,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,MAAM,CAAC;IACrD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,KAAK,EAAE,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,kCAAkC;IAClC,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEvD,6BAA6B;IAC7B,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;IAC/E,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;IACxE,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;IAEtE,yBAAyB;IACzB,UAAU,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7D,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,GAAG,EAAE,CAAC,CAAS,EAAE,KAAc,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,EAAE,KAAK,CAAC;IAE1D,sCAAsC;IACtC,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,GAAG,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;IAC5D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG;IAEpE,qBAAqB;IACrB,SAAS,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI;CAChF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,iBAAiB;IACjB,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,MAAM;KACd;IAED,iBAAiB;IACjB,MAAM,EAAE;QACN,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,WAAW;KACnB;IAED,iBAAiB;IACjB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,WAAW;KACnB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,UAAU;KAClB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,eAAe,CAAC,OAAO;QAC9B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,OAAO;KACf;IAED,gBAAgB;IAChB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,IAAI;QAC3B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,OAAO;KACf;IACD,SAAS,EAAE;QACT,KAAK,EAAE,eAAe,CAAC,IAAI;QAC3B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,SAAS;KACjB;IAED,kBAAkB;IAClB,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,eAAe,CAAC,KAAK;QAC5B,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,MAAM;KACd;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAc,EACd,OAAkD;IAElD,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,KAAK,GAAG,kBAAkB,CAAC,gBAAmD,CAAC,CAAC;IACtF,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,IAAI,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,KAAK,CAAC;IAEtC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;QAClD,mCAAmC;QACnC,OAAO,GAAG,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;IAC5C,CAAC;IAED,mCAAmC;IACnC,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,QAMX;AAND,WAAY,QAAQ;IAClB,+BAAmB,CAAA;IACnB,qCAAyB,CAAA;IACzB,+BAAmB,CAAA;IACnB,2BAAe,CAAA;IACf,uBAAW,CAAA,CAAc,yCAAyC;AACpE,CAAC,EANW,QAAQ,KAAR,QAAQ,QAMnB;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CACxB,IAAc,EACd,QAAkB,QAAQ,CAAC,OAAO,EAClC,iBAA0B,IAAI;IAE9B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEjC,+CAA+C;IAC/C,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1B,MAAM,cAAc,GAAG,mCAAmC,CAAC;IAC3D,IAAI,cAAc,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC/B,CAAC;IAED,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,QAAQ,CAAC,OAAO;YACnB,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpC,KAAK,QAAQ,CAAC,UAAU;YACtB,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,QAAQ,CAAC,OAAO;YACnB,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACnC,KAAK,QAAQ,CAAC,KAAK;YACjB,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;QAChC,KAAK,QAAQ,CAAC,GAAG;YACf,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;QACxD;YACE,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAc;IAC1C,OAAO,IAAI;SACR,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;SAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAc;IACtC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACnC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;QACtB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAc,EAAE,KAAc;IACzD,MAAM,SAAS,GAAG,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IAExD,uCAAuC;IACvC,IAAI,SAAS,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACtC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IAEzC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,MAAM,EAAE,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;QACjB,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAEhE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAqB,EACrB,OAIC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7E,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,gBAAgB;IAChB,MAAM,OAAO,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,0BAA0B;IAC1B,IAAI,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,eAAe;IACf,IAAI,OAAO,EAAE,QAAQ,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,KAAc;IAC3D,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;IAC7G,CAAC;IAED,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC;AAClE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAe,EACf,WAAsB;IAEtB,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;IAEzC,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;YACtB,+CAA+C;YAC/C,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;YACxE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,KAAK,EAAE,eAAe,CAAC,KAAK;IAC5B,IAAI,EAAE,eAAe,CAAC,OAAO;IAC7B,OAAO,EAAE,eAAe,CAAC,OAAO;IAChC,IAAI,EAAE,eAAe,CAAC,IAAI;IAC1B,KAAK,EAAE,eAAe,CAAC,KAAK;IAC5B,SAAS,EAAE,eAAe,CAAC,SAAS;IACpC,GAAG,EAAE,eAAe,CAAC,GAAG;CACzB,CAAC;AAEF,yCAAyC;AACzC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAEpC,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,OAAO,CAAC,KAAK,MAAM,IAAI,CAAC,KAAK,QAAQ,IAAI,YAAY,EAAE,CAAC;AAC1D,CAAC;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,QAIX;AAJD,WAAY,QAAQ;IAClB,2BAAe,CAAA;IACf,yBAAa,CAAA;IACb,2BAAe,CAAA,CAAK,sBAAsB;AAC5C,CAAC,EAJW,QAAQ,KAAR,QAAQ,QAInB;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAM,oBAAoB;QACnC,KAAK,EAAE,MAAM;KACd;IACD,MAAM,EAAE;QACN,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAM,kBAAkB;QACjC,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,yBAAyB;QACxC,KAAK,EAAE,OAAO;KACf;IACD,OAAO,EAAE;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,8BAA8B;QAC7C,KAAK,EAAE,SAAS;KACjB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,gCAAgC;QAC/C,KAAK,EAAE,UAAU;KAClB;IACD,SAAS,EAAE;QACT,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,qBAAqB;QACpC,KAAK,EAAE,SAAS;KACjB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,qCAAqC;QACpD,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAM,wBAAwB;QACvC,KAAK,EAAE,KAAK;KACb;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK,EAAE;QACL,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAM,kBAAkB;QACjC,KAAK,EAAE,OAAO;KACf;IACD,OAAO,EAAE;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,8CAA8C;QAC7D,KAAK,EAAE,QAAQ;KAChB;IACD,IAAI,EAAE;QACJ,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAO,wCAAwC;QACxD,KAAK,EAAE,QAAQ;KAChB;IACD,OAAO,EAAE;QACP,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAM,oBAAoB;QACnC,KAAK,EAAE,MAAM;KACd;IACD,OAAO,EAAE;QACP,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,uBAAuB;QACtC,KAAK,EAAE,QAAQ;KAChB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,MAAM,EAAE;QACN,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,yBAAyB;QACxC,KAAK,EAAE,QAAQ;KAChB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,gDAAgD;QAC/D,KAAK,EAAE,OAAO;KACf;IACD,KAAK,EAAE;QACL,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,yBAAyB;QACxC,KAAK,EAAE,SAAS;KACjB;IACD,WAAW,EAAE;QACX,KAAK,EAAE,GAAG;QACV,IAAI,EAAE,GAAG,EAAM,oBAAoB;QACnC,KAAK,EAAE,KAAK;KACb;IACD,eAAe,EAAE;QACf,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,gCAAgC;QAC/C,KAAK,EAAE,WAAW;KACnB;IACD,QAAQ,EAAE;QACR,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,GAAG,EAAM,wCAAwC;QACvD,KAAK,EAAE,MAAM;KACd;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,iCAAiC;IACjC,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,EAAE,CAAC;QACrC,OAAO,QAAQ,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,8EAA8E;IAC9E,iEAAiE;IACjE,OAAO,QAAQ,CAAC,IAAI,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAuD;IAC7E,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;IAC3B,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,QAAQ,CAAC,KAAK;YACjB,OAAO,OAAO,CAAC,KAAK,CAAC;QACvB,KAAK,QAAQ,CAAC,IAAI;YAChB,OAAO,OAAO,CAAC,IAAI,CAAC;QACtB;YACE,OAAO,OAAO,CAAC,KAAK,CAAC;IACzB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,WAAW,CAAC,UAAsC,CAAC,IAAI,WAAW,CAAC,OAAO,CAAC;IAC3F,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,UAA2C,CAAC,IAAI,gBAAgB,CAAC,OAAO,CAAC;IAC1G,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiC;IAC/D,OAAO,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;AACvC,CAAC","sourcesContent":["/**\n * Enhanced Visual Design System for bktide CLI\n * \n * This module implements a comprehensive color and typography system\n * that enhances information hierarchy and accessibility.\n */\nimport chalk from 'chalk';\nimport { getSymbols } from './symbols.js';\nimport { terminalLink } from '../utils/terminal-links.js';\n\nfunction isTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\nfunction colorEnabled(): boolean {\n if (process.env.NO_COLOR) return false;\n const mode = process.env.BKTIDE_COLOR_MODE || 'auto';\n if (mode === 'never') return false;\n if (mode === 'always') return true;\n return isTTY();\n}\n\n/**\n * Semantic color system for different information types\n * Using colorblind-safe palette\n */\nexport const SEMANTIC_COLORS = {\n // Status colors (colorblind-safe)\n success: (s: string) => colorEnabled() ? chalk.blue(s) : s,\n error: (s: string) => colorEnabled() ? chalk.rgb(255, 140, 0)(s) : s,\n warning: (s: string) => colorEnabled() ? chalk.yellow(s) : s,\n info: (s: string) => colorEnabled() ? chalk.cyan(s) : s,\n \n // Typography emphasis levels\n heading: (s: string) => colorEnabled() ? chalk.bold.underline(s) : `== ${s} ==`,\n subheading: (s: string) => colorEnabled() ? chalk.bold(s) : `** ${s} **`,\n label: (s: string) => colorEnabled() ? chalk.bold(s) : s.toUpperCase(),\n \n // Data type highlighting\n identifier: (s: string) => colorEnabled() ? chalk.cyan(s) : s,\n count: (s: string) => colorEnabled() ? chalk.magenta(s) : s,\n url: (s: string, label?: string) => terminalLink(s, label),\n \n // De-emphasis (auxiliary information)\n dim: (s: string) => colorEnabled() ? chalk.dim(s) : s,\n muted: (s: string) => colorEnabled() ? chalk.gray(s) : s,\n tip: (s: string) => colorEnabled() ? chalk.dim(s) : `(${s})`,\n help: (s: string) => colorEnabled() ? chalk.dim.italic(s) : `[${s}]`,\n \n // Special formatting\n highlight: (s: string) => colorEnabled() ? chalk.magenta(s) : s,\n code: (s: string) => colorEnabled() ? chalk.bgGray.white(` ${s} `) : `\\`${s}\\``,\n};\n\n/**\n * Build status specific theming\n * Matches conventions from GitHub Actions, CircleCI, Jenkins\n */\nexport const BUILD_STATUS_THEME = {\n // Success states\n PASSED: {\n color: SEMANTIC_COLORS.success,\n symbol: '✓',\n ascii: '[OK]',\n },\n \n // Failure states\n FAILED: {\n color: SEMANTIC_COLORS.error,\n symbol: '✖',\n ascii: '[FAIL]',\n },\n FAILING: {\n color: (s: string) => colorEnabled() ? chalk.rgb(255, 165, 0)(s) : s,\n symbol: '⚠',\n ascii: '[FAILING]',\n },\n \n // Warning states\n BLOCKED: {\n color: SEMANTIC_COLORS.warning,\n symbol: '⚠',\n ascii: '[BLOCKED]',\n },\n CANCELED: {\n color: SEMANTIC_COLORS.warning,\n symbol: '⊘',\n ascii: '[CANCEL]',\n },\n CANCELING: {\n color: SEMANTIC_COLORS.warning,\n symbol: '⊘',\n ascii: '[...]',\n },\n \n // Active states\n RUNNING: {\n color: SEMANTIC_COLORS.info,\n symbol: '↻',\n ascii: '[RUN]',\n },\n SCHEDULED: {\n color: SEMANTIC_COLORS.info,\n symbol: '⏱',\n ascii: '[QUEUE]',\n },\n \n // Inactive states\n SKIPPED: {\n color: SEMANTIC_COLORS.muted,\n symbol: '−',\n ascii: '[SKIP]',\n },\n NOT_RUN: {\n color: SEMANTIC_COLORS.muted,\n symbol: '○',\n ascii: '[--]',\n },\n};\n\n/**\n * Format a build status with appropriate color and symbol\n */\nexport function formatBuildStatus(\n status: string, \n options?: { useSymbol?: boolean; ascii?: boolean }\n): string {\n // Normalize status to uppercase for theme lookup\n const normalizedStatus = status.toUpperCase();\n const theme = BUILD_STATUS_THEME[normalizedStatus as keyof typeof BUILD_STATUS_THEME];\n if (!theme) {\n return SEMANTIC_COLORS.muted(status);\n }\n \n const useSymbol = options?.useSymbol ?? true;\n const ascii = options?.ascii ?? false;\n \n if (useSymbol) {\n const symbol = ascii ? theme.ascii : theme.symbol;\n // Keep original casing for display\n return `${symbol} ${theme.color(status)}`;\n }\n \n // Keep original casing for display\n return theme.color(status);\n}\n\n/**\n * Tip display styles for different contexts\n */\nexport enum TipStyle {\n GROUPED = 'grouped', // Tips: with arrows\n INDIVIDUAL = 'individual', // → Individual arrows\n ACTIONS = 'actions', // Next steps: with arrows\n FIXES = 'fixes', // To fix this: numbered\n BOX = 'box' // Fancy box with arrows (wide terminals)\n}\n\n/**\n * Format tips with consistent styling based on context\n */\nexport function formatTips(\n tips: string[], \n style: TipStyle = TipStyle.GROUPED,\n includeTurnOff: boolean = true\n): string {\n if (tips.length === 0) return '';\n \n // Add the turn-off tip if not already included\n const allTips = [...tips];\n const turnOffMessage = 'Use --no-tips to hide these hints';\n if (includeTurnOff && !tips.some(tip => tip.includes('--no-tips'))) {\n allTips.push(turnOffMessage);\n }\n \n switch (style) {\n case TipStyle.GROUPED:\n return formatGroupedTips(allTips);\n case TipStyle.INDIVIDUAL:\n return formatIndividualTips(allTips);\n case TipStyle.ACTIONS:\n return formatActionTips(allTips);\n case TipStyle.FIXES:\n return formatFixTips(allTips);\n case TipStyle.BOX:\n return formatTipBox(allTips); // Use existing function\n default:\n return formatGroupedTips(allTips);\n }\n}\n\nfunction formatGroupedTips(tips: string[]): string {\n const lines: string[] = [];\n lines.push(SEMANTIC_COLORS.dim('Tips:'));\n tips.forEach(tip => {\n lines.push(SEMANTIC_COLORS.dim(` → ${tip}`));\n });\n return lines.join('\\n');\n}\n\nfunction formatIndividualTips(tips: string[]): string {\n return tips\n .map(tip => SEMANTIC_COLORS.dim(`→ ${tip}`))\n .join('\\n');\n}\n\nfunction formatActionTips(tips: string[]): string {\n const lines: string[] = [];\n lines.push(SEMANTIC_COLORS.dim('Next steps:'));\n tips.forEach(tip => {\n lines.push(SEMANTIC_COLORS.dim(` → ${tip}`));\n });\n return lines.join('\\n');\n}\n\nfunction formatFixTips(tips: string[]): string {\n const lines: string[] = [];\n lines.push(SEMANTIC_COLORS.subheading('To fix this:'));\n tips.forEach((tip, i) => {\n lines.push(` ${i + 1}. ${tip}`);\n });\n return lines.join('\\n');\n}\n\n/**\n * Create a formatted tip box for better visual separation\n * Only used in wide terminals\n */\nexport function formatTipBox(tips: string[], width?: number): string {\n const termWidth = width || process.stdout.columns || 80;\n \n // Only use fancy box in wide terminals\n if (termWidth < 80 || !colorEnabled()) {\n return formatGroupedTips(tips);\n }\n \n const lines: string[] = [];\n const boxWidth = Math.min(termWidth - 4, 60);\n const border = '─'.repeat(boxWidth - 10);\n \n lines.push(SEMANTIC_COLORS.dim(`┌─ Tips ${border}`));\n tips.forEach(tip => {\n lines.push(SEMANTIC_COLORS.dim(`│ → ${tip}`));\n });\n lines.push(SEMANTIC_COLORS.dim(`└${'─'.repeat(boxWidth - 1)}`));\n \n return lines.join('\\n');\n}\n\n/**\n * Format an error message with consistent styling\n */\nexport function formatError(\n error: string | Error, \n options?: { \n showHelp?: boolean; \n helpCommand?: string;\n suggestions?: string[];\n }\n): string {\n const lines: string[] = [];\n const symbols = getSymbols();\n \n // Error header\n lines.push(`${SEMANTIC_COLORS.error(symbols.error)} ${chalk.bold('Error')}`);\n lines.push('');\n \n // Error message\n const message = typeof error === 'string' ? error : error.message;\n lines.push(message);\n \n // Suggestions if provided\n if (options?.suggestions && options.suggestions.length > 0) {\n lines.push('');\n lines.push(formatTips(options.suggestions, TipStyle.FIXES));\n }\n \n // Help command\n if (options?.showHelp && options?.helpCommand) {\n lines.push('');\n lines.push(SEMANTIC_COLORS.help(`Need help? Run: ${options.helpCommand}`));\n }\n \n return lines.join('\\n');\n}\n\n/**\n * Format a success message (subtle, not redundant)\n */\nexport function formatSuccess(message: string, count?: number): string {\n const symbols = getSymbols();\n \n if (count !== undefined) {\n return `${SEMANTIC_COLORS.success(symbols.success)} ${message} ${SEMANTIC_COLORS.count(count.toString())}`;\n }\n \n return `${SEMANTIC_COLORS.success(symbols.success)} ${message}`;\n}\n\n/**\n * Format empty state messages\n */\nexport function formatEmptyState(\n message: string,\n suggestions?: string[]\n): string {\n const lines: string[] = [];\n \n lines.push(SEMANTIC_COLORS.dim(message));\n \n if (suggestions && suggestions.length > 0) {\n lines.push('');\n suggestions.forEach(s => {\n // Make commands stand out from the dimmed text\n const formatted = s.replace(/--\\w+[^ ]*/g, match => chalk.reset(match));\n lines.push(SEMANTIC_COLORS.dim(formatted));\n });\n }\n \n return lines.join('\\n');\n}\n\n/**\n * Legacy color exports for backward compatibility\n * @deprecated Use SEMANTIC_COLORS instead\n */\nexport const COLORS = {\n error: SEMANTIC_COLORS.error,\n warn: SEMANTIC_COLORS.warning,\n success: SEMANTIC_COLORS.success,\n info: SEMANTIC_COLORS.info,\n muted: SEMANTIC_COLORS.muted,\n highlight: SEMANTIC_COLORS.highlight,\n dim: SEMANTIC_COLORS.dim,\n};\n\n// Export symbols from the symbols module\nexport const SYMBOLS = getSymbols();\n\nexport function shouldDecorate(format?: string): boolean {\n const f = (format || '').toLowerCase();\n return f !== 'json' && f !== 'alfred' && colorEnabled();\n}\n\n/**\n * Icon Display Modes\n */\nexport enum IconMode {\n EMOJI = 'emoji', // Full emoji support\n UTF8 = 'utf8', // UTF-8 symbols (no emoji)\n ASCII = 'ascii' // ASCII-only fallback\n}\n\n/**\n * Build and Job State Icons\n * Each has emoji, UTF-8, and ASCII alternatives\n */\nexport const STATE_ICONS = {\n PASSED: {\n emoji: '✅',\n utf8: '✓', // U+2713 Check mark\n ascii: '[OK]'\n },\n FAILED: {\n emoji: '❌',\n utf8: '✗', // U+2717 Ballot X\n ascii: '[FAIL]'\n },\n RUNNING: {\n emoji: '🔄',\n utf8: '↻', // U+21BB Clockwise arrow\n ascii: '[RUN]'\n },\n BLOCKED: {\n emoji: '⏸️',\n utf8: '‖', // U+2016 Double vertical line\n ascii: '[BLOCK]'\n },\n CANCELED: {\n emoji: '🚫',\n utf8: '⊘', // U+2298 Circled division slash\n ascii: '[CANCEL]'\n },\n SCHEDULED: {\n emoji: '📅',\n utf8: '⏰', // U+23F0 Alarm clock\n ascii: '[SCHED]'\n },\n SKIPPED: {\n emoji: '⏭️',\n utf8: '»', // U+00BB Right-pointing double angle\n ascii: '[SKIP]'\n },\n UNKNOWN: {\n emoji: '❓',\n utf8: '?', // Regular question mark\n ascii: '[?]'\n }\n};\n\n/**\n * Annotation Style Icons\n */\nexport const ANNOTATION_ICONS = {\n ERROR: {\n emoji: '❌',\n utf8: '✗', // U+2717 Ballot X\n ascii: '[ERR]'\n },\n WARNING: {\n emoji: '⚠️',\n utf8: '⚠', // U+26A0 Warning sign (without emoji variant)\n ascii: '[WARN]'\n },\n INFO: {\n emoji: 'ℹ️',\n utf8: 'ℹ', // U+2139 Information source (no circle)\n ascii: '[INFO]'\n },\n SUCCESS: {\n emoji: '✅',\n utf8: '✓', // U+2713 Check mark\n ascii: '[OK]'\n },\n DEFAULT: {\n emoji: '📝',\n utf8: '◆', // U+25C6 Black diamond\n ascii: '[NOTE]'\n }\n};\n\n/**\n * Progress and Debug Icons\n */\nexport const PROGRESS_ICONS = {\n TIMING: {\n emoji: '⏱️',\n utf8: '⧗', // U+29D7 Black hourglass\n ascii: '[TIME]'\n },\n STARTING: {\n emoji: '🕒',\n utf8: '◷', // U+25F7 White circle with upper right quadrant\n ascii: '[>>>]'\n },\n RETRY: {\n emoji: '🔄',\n utf8: '↻', // U+21BB Clockwise arrow\n ascii: '[RETRY]'\n },\n SUCCESS_LOG: {\n emoji: '✅',\n utf8: '✓', // U+2713 Check mark\n ascii: '[✓]'\n },\n BLOCKED_MESSAGE: {\n emoji: '🚫',\n utf8: '⊘', // U+2298 Circled division slash\n ascii: '[BLOCKED]'\n },\n PARALLEL: {\n emoji: '📊',\n utf8: '═', // U+2550 Box drawings double horizontal\n ascii: '[||]'\n }\n};\n\n/**\n * Get current icon mode based on environment and flags\n */\nexport function getIconMode(): IconMode {\n // Check command-line flags first\n if (process.argv.includes('--ascii')) {\n return IconMode.ASCII;\n }\n if (process.argv.includes('--emoji')) {\n return IconMode.EMOJI;\n }\n \n // Check environment variables\n if (process.env.BKTIDE_ASCII === '1') {\n return IconMode.ASCII;\n }\n if (process.env.BKTIDE_EMOJI === '1') {\n return IconMode.EMOJI;\n }\n \n // Default to UTF-8 symbols (clean, universal, works in most modern terminals)\n // ASCII is only used if explicitly requested via flag or env var\n return IconMode.UTF8;\n}\n\n/**\n * Helper to get icon based on current mode\n */\nexport function getIcon(iconDef: { emoji: string; utf8: string; ascii: string }): string {\n const mode = getIconMode();\n switch (mode) {\n case IconMode.ASCII:\n return iconDef.ascii;\n case IconMode.UTF8:\n return iconDef.utf8;\n default:\n return iconDef.emoji;\n }\n}\n\n/**\n * Get state icon for build/job states\n */\nexport function getStateIcon(state: string): string {\n const upperState = state.toUpperCase().replace('CANCELING', 'CANCELED');\n const iconDef = STATE_ICONS[upperState as keyof typeof STATE_ICONS] || STATE_ICONS.UNKNOWN;\n return getIcon(iconDef);\n}\n\n/**\n * Get annotation style icon\n */\nexport function getAnnotationIcon(style: string): string {\n const upperStyle = style.toUpperCase();\n const iconDef = ANNOTATION_ICONS[upperStyle as keyof typeof ANNOTATION_ICONS] || ANNOTATION_ICONS.DEFAULT;\n return getIcon(iconDef);\n}\n\n/**\n * Get progress/debug icon\n */\nexport function getProgressIcon(type: keyof typeof PROGRESS_ICONS): string {\n return getIcon(PROGRESS_ICONS[type]);\n}\n\n\n"]}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal hyperlink support for clickable URLs
|
|
3
|
+
*
|
|
4
|
+
* Uses OSC 8 escape sequences for terminals that support it.
|
|
5
|
+
* Similar to color handling, provides auto-detection with override options.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
/**
|
|
9
|
+
* Check if the terminal supports hyperlinks
|
|
10
|
+
* Based on known terminal programs and environment variables
|
|
11
|
+
*/
|
|
12
|
+
function supportsHyperlinks() {
|
|
13
|
+
// Check for common CI environments where hyperlinks won't work
|
|
14
|
+
if (process.env.CI) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const termProgram = process.env.TERM_PROGRAM?.toLowerCase() || '';
|
|
18
|
+
const termName = process.env.TERM?.toLowerCase() || '';
|
|
19
|
+
// Known terminals that support OSC 8 hyperlinks
|
|
20
|
+
const supportedTerminals = [
|
|
21
|
+
'vscode',
|
|
22
|
+
'cursor',
|
|
23
|
+
'iterm.app',
|
|
24
|
+
'iterm2',
|
|
25
|
+
'hyper',
|
|
26
|
+
'wezterm',
|
|
27
|
+
'kitty',
|
|
28
|
+
'ghostty',
|
|
29
|
+
'tabby',
|
|
30
|
+
'terminus',
|
|
31
|
+
'konsole',
|
|
32
|
+
'rio',
|
|
33
|
+
];
|
|
34
|
+
// Check TERM_PROGRAM
|
|
35
|
+
if (supportedTerminals.some(t => termProgram.includes(t))) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
// Check TERM for some terminals
|
|
39
|
+
if (termName.includes('kitty') || termName.includes('wezterm')) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
// Windows Terminal sets this
|
|
43
|
+
if (process.env.WT_SESSION) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
// VS Code integrated terminal
|
|
47
|
+
if (process.env.VSCODE_GIT_IPC_HANDLE || process.env.VSCODE_INJECTION) {
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if TTY is available (similar to color detection)
|
|
54
|
+
*/
|
|
55
|
+
function isTTY() {
|
|
56
|
+
return Boolean(process.stdout.isTTY);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Determine if hyperlinks should be enabled
|
|
60
|
+
* Follows same pattern as color detection
|
|
61
|
+
*/
|
|
62
|
+
export function hyperlinksEnabled() {
|
|
63
|
+
// Respect NO_COLOR as it indicates plain text preference
|
|
64
|
+
if (process.env.NO_COLOR)
|
|
65
|
+
return false;
|
|
66
|
+
// Check for explicit hyperlink mode
|
|
67
|
+
const mode = process.env.BKTIDE_HYPERLINK_MODE || process.env.FORCE_HYPERLINK || 'auto';
|
|
68
|
+
if (mode === 'never' || mode === '0')
|
|
69
|
+
return false;
|
|
70
|
+
if (mode === 'always' || mode === '1')
|
|
71
|
+
return true;
|
|
72
|
+
// Auto mode: check if TTY and terminal supports it
|
|
73
|
+
return isTTY() && supportsHyperlinks();
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Format a terminal hyperlink using OSC 8 escape sequence
|
|
77
|
+
*
|
|
78
|
+
* @param url - The URL to link to
|
|
79
|
+
* @param label - Optional label text (defaults to URL)
|
|
80
|
+
* @returns Formatted string with hyperlink if supported, fallback otherwise
|
|
81
|
+
*/
|
|
82
|
+
export function terminalLink(url, label) {
|
|
83
|
+
const text = label || url;
|
|
84
|
+
if (!url) {
|
|
85
|
+
return text;
|
|
86
|
+
}
|
|
87
|
+
// If hyperlinks are enabled, use OSC 8 escape sequence
|
|
88
|
+
if (hyperlinksEnabled()) {
|
|
89
|
+
// OSC 8 format: ESC]8;;URL\aLABEL\ESC]8;;\a
|
|
90
|
+
// \x1b = ESC, \x07 = BEL (more compatible than ST)
|
|
91
|
+
return `\x1b]8;;${url}\x07${text}\x1b]8;;\x07`;
|
|
92
|
+
}
|
|
93
|
+
// Fallback: use chalk underline if colors are enabled
|
|
94
|
+
// This matches the existing url formatting in theme.ts
|
|
95
|
+
if (process.stdout.isTTY && !process.env.NO_COLOR) {
|
|
96
|
+
return chalk.underline.cyan(text);
|
|
97
|
+
}
|
|
98
|
+
// Final fallback: plain text with angle brackets if URL differs from label
|
|
99
|
+
if (label && label !== url) {
|
|
100
|
+
return `${label} <${url}>`;
|
|
101
|
+
}
|
|
102
|
+
return `<${url}>`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Create a hyperlink with automatic Buildkite URL construction
|
|
106
|
+
*
|
|
107
|
+
* @param org - Organization slug
|
|
108
|
+
* @param pipeline - Pipeline slug (optional)
|
|
109
|
+
* @param buildNumber - Build number (optional)
|
|
110
|
+
* @param label - Optional label text
|
|
111
|
+
*/
|
|
112
|
+
export function buildkiteLink(org, pipeline, buildNumber, label) {
|
|
113
|
+
let url = `https://buildkite.com/${org}`;
|
|
114
|
+
if (pipeline) {
|
|
115
|
+
url += `/${pipeline}`;
|
|
116
|
+
if (buildNumber) {
|
|
117
|
+
url += `/builds/${buildNumber}`;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return terminalLink(url, label);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Create a GitHub pull request link
|
|
124
|
+
*
|
|
125
|
+
* @param repoUrl - Repository URL (GitHub format)
|
|
126
|
+
* @param prNumber - Pull request number or ID
|
|
127
|
+
* @param label - Optional label text
|
|
128
|
+
*/
|
|
129
|
+
export function githubPRLink(repoUrl, prNumber, label) {
|
|
130
|
+
// Extract owner/repo from various GitHub URL formats
|
|
131
|
+
const match = repoUrl.match(/github\.com[/:]([^/]+)\/([^/.]+)/);
|
|
132
|
+
if (!match) {
|
|
133
|
+
return label || `PR #${prNumber}`;
|
|
134
|
+
}
|
|
135
|
+
const [, owner, repo] = match;
|
|
136
|
+
const url = `https://github.com/${owner}/${repo}/pull/${prNumber}`;
|
|
137
|
+
return terminalLink(url, label || `PR #${prNumber}`);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Parse and linkify URLs in text content
|
|
141
|
+
* Useful for annotation content that might contain URLs
|
|
142
|
+
*
|
|
143
|
+
* @param text - Text that might contain URLs
|
|
144
|
+
* @returns Text with URLs converted to hyperlinks
|
|
145
|
+
*/
|
|
146
|
+
export function linkifyUrls(text) {
|
|
147
|
+
if (!hyperlinksEnabled()) {
|
|
148
|
+
return text;
|
|
149
|
+
}
|
|
150
|
+
// Simple URL regex - matches http(s) URLs
|
|
151
|
+
const urlRegex = /https?:\/\/[^\s<>"\{\}\|\\\^\[\]`]+/gi;
|
|
152
|
+
return text.replace(urlRegex, (url) => {
|
|
153
|
+
// Clean up common trailing punctuation that might not be part of the URL
|
|
154
|
+
const cleanUrl = url.replace(/[.,;:!?]+$/, '');
|
|
155
|
+
const trailing = url.slice(cleanUrl.length);
|
|
156
|
+
return terminalLink(cleanUrl) + trailing;
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Format a help URL with appropriate styling
|
|
161
|
+
*/
|
|
162
|
+
export function helpLink(url, label = 'Learn more') {
|
|
163
|
+
return terminalLink(url, label);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=terminal-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-links.js","sourceRoot":"/","sources":["utils/terminal-links.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B;;;GAGG;AACH,SAAS,kBAAkB;IACzB,+DAA+D;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAClE,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAEvD,gDAAgD;IAChD,MAAM,kBAAkB,GAAG;QACzB,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,QAAQ;QACR,OAAO;QACP,SAAS;QACT,OAAO;QACP,SAAS;QACT,OAAO;QACP,UAAU;QACV,SAAS;QACT,KAAK;KACN,CAAC;IAEF,qBAAqB;IACrB,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAgC;IAChC,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAA6B;IAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACtE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,SAAS,KAAK;IACZ,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB;IAC/B,yDAAyD;IACzD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAEvC,oCAAoC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC;IAExF,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,GAAG;QAAE,OAAO,IAAI,CAAC;IAEnD,mDAAmD;IACnD,OAAO,KAAK,EAAE,IAAI,kBAAkB,EAAE,CAAC;AACzC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,GAAW,EAAE,KAAc;IACtD,MAAM,IAAI,GAAG,KAAK,IAAI,GAAG,CAAC;IAE1B,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uDAAuD;IACvD,IAAI,iBAAiB,EAAE,EAAE,CAAC;QACxB,4CAA4C;QAC5C,mDAAmD;QACnD,OAAO,WAAW,GAAG,OAAO,IAAI,cAAc,CAAC;IACjD,CAAC;IAED,sDAAsD;IACtD,uDAAuD;IACvD,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAClD,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED,2EAA2E;IAC3E,IAAI,KAAK,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAC3B,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,CAAC;IAC7B,CAAC;IAED,OAAO,IAAI,GAAG,GAAG,CAAC;AACpB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAC3B,GAAW,EACX,QAAiB,EACjB,WAAoB,EACpB,KAAc;IAEd,IAAI,GAAG,GAAG,yBAAyB,GAAG,EAAE,CAAC;IAEzC,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;QACtB,IAAI,WAAW,EAAE,CAAC;YAChB,GAAG,IAAI,WAAW,WAAW,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAED,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAC1B,OAAe,EACf,QAAyB,EACzB,KAAc;IAEd,qDAAqD;IACrD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAChE,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,KAAK,IAAI,OAAO,QAAQ,EAAE,CAAC;IACpC,CAAC;IAED,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC9B,MAAM,GAAG,GAAG,sBAAsB,KAAK,IAAI,IAAI,SAAS,QAAQ,EAAE,CAAC;IAEnE,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,uCAAuC,CAAC;IAEzD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;QACpC,yEAAyE;QACzE,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5C,OAAO,YAAY,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,QAAgB,YAAY;IAChE,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAClC,CAAC","sourcesContent":["/**\n * Terminal hyperlink support for clickable URLs\n * \n * Uses OSC 8 escape sequences for terminals that support it.\n * Similar to color handling, provides auto-detection with override options.\n */\n\nimport chalk from 'chalk';\n\n/**\n * Check if the terminal supports hyperlinks\n * Based on known terminal programs and environment variables\n */\nfunction supportsHyperlinks(): boolean {\n // Check for common CI environments where hyperlinks won't work\n if (process.env.CI) {\n return false;\n }\n\n const termProgram = process.env.TERM_PROGRAM?.toLowerCase() || '';\n const termName = process.env.TERM?.toLowerCase() || '';\n \n // Known terminals that support OSC 8 hyperlinks\n const supportedTerminals = [\n 'vscode',\n 'cursor',\n 'iterm.app',\n 'iterm2',\n 'hyper',\n 'wezterm',\n 'kitty',\n 'ghostty',\n 'tabby',\n 'terminus',\n 'konsole',\n 'rio',\n ];\n \n // Check TERM_PROGRAM\n if (supportedTerminals.some(t => termProgram.includes(t))) {\n return true;\n }\n \n // Check TERM for some terminals\n if (termName.includes('kitty') || termName.includes('wezterm')) {\n return true;\n }\n \n // Windows Terminal sets this\n if (process.env.WT_SESSION) {\n return true;\n }\n \n // VS Code integrated terminal\n if (process.env.VSCODE_GIT_IPC_HANDLE || process.env.VSCODE_INJECTION) {\n return true;\n }\n \n return false;\n}\n\n/**\n * Check if TTY is available (similar to color detection)\n */\nfunction isTTY(): boolean {\n return Boolean(process.stdout.isTTY);\n}\n\n/**\n * Determine if hyperlinks should be enabled\n * Follows same pattern as color detection\n */\nexport function hyperlinksEnabled(): boolean {\n // Respect NO_COLOR as it indicates plain text preference\n if (process.env.NO_COLOR) return false;\n \n // Check for explicit hyperlink mode\n const mode = process.env.BKTIDE_HYPERLINK_MODE || process.env.FORCE_HYPERLINK || 'auto';\n \n if (mode === 'never' || mode === '0') return false;\n if (mode === 'always' || mode === '1') return true;\n \n // Auto mode: check if TTY and terminal supports it\n return isTTY() && supportsHyperlinks();\n}\n\n/**\n * Format a terminal hyperlink using OSC 8 escape sequence\n * \n * @param url - The URL to link to\n * @param label - Optional label text (defaults to URL)\n * @returns Formatted string with hyperlink if supported, fallback otherwise\n */\nexport function terminalLink(url: string, label?: string): string {\n const text = label || url;\n \n if (!url) {\n return text;\n }\n \n // If hyperlinks are enabled, use OSC 8 escape sequence\n if (hyperlinksEnabled()) {\n // OSC 8 format: ESC]8;;URL\\aLABEL\\ESC]8;;\\a\n // \\x1b = ESC, \\x07 = BEL (more compatible than ST)\n return `\\x1b]8;;${url}\\x07${text}\\x1b]8;;\\x07`;\n }\n \n // Fallback: use chalk underline if colors are enabled\n // This matches the existing url formatting in theme.ts\n if (process.stdout.isTTY && !process.env.NO_COLOR) {\n return chalk.underline.cyan(text);\n }\n \n // Final fallback: plain text with angle brackets if URL differs from label\n if (label && label !== url) {\n return `${label} <${url}>`;\n }\n \n return `<${url}>`;\n}\n\n/**\n * Create a hyperlink with automatic Buildkite URL construction\n * \n * @param org - Organization slug\n * @param pipeline - Pipeline slug (optional)\n * @param buildNumber - Build number (optional)\n * @param label - Optional label text\n */\nexport function buildkiteLink(\n org: string,\n pipeline?: string,\n buildNumber?: number,\n label?: string\n): string {\n let url = `https://buildkite.com/${org}`;\n \n if (pipeline) {\n url += `/${pipeline}`;\n if (buildNumber) {\n url += `/builds/${buildNumber}`;\n }\n }\n \n return terminalLink(url, label);\n}\n\n/**\n * Create a GitHub pull request link\n * \n * @param repoUrl - Repository URL (GitHub format)\n * @param prNumber - Pull request number or ID\n * @param label - Optional label text\n */\nexport function githubPRLink(\n repoUrl: string,\n prNumber: string | number,\n label?: string\n): string {\n // Extract owner/repo from various GitHub URL formats\n const match = repoUrl.match(/github\\.com[/:]([^/]+)\\/([^/.]+)/);\n if (!match) {\n return label || `PR #${prNumber}`;\n }\n \n const [, owner, repo] = match;\n const url = `https://github.com/${owner}/${repo}/pull/${prNumber}`;\n \n return terminalLink(url, label || `PR #${prNumber}`);\n}\n\n/**\n * Parse and linkify URLs in text content\n * Useful for annotation content that might contain URLs\n * \n * @param text - Text that might contain URLs\n * @returns Text with URLs converted to hyperlinks\n */\nexport function linkifyUrls(text: string): string {\n if (!hyperlinksEnabled()) {\n return text;\n }\n \n // Simple URL regex - matches http(s) URLs\n const urlRegex = /https?:\\/\\/[^\\s<>\"\\{\\}\\|\\\\\\^\\[\\]`]+/gi;\n \n return text.replace(urlRegex, (url) => {\n // Clean up common trailing punctuation that might not be part of the URL\n const cleanUrl = url.replace(/[.,;:!?]+$/, '');\n const trailing = url.slice(cleanUrl.length);\n \n return terminalLink(cleanUrl) + trailing;\n });\n}\n\n/**\n * Format a help URL with appropriate styling\n */\nexport function helpLink(url: string, label: string = 'Learn more'): string {\n return terminalLink(url, label);\n}\n"]}
|