bktide 1.0.1755547716 β 1.0.1755568192
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/dist/commands/ShowBuild.js +92 -0
- package/dist/commands/ShowBuild.js.map +1 -0
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/formatters/FormatterFactory.js +4 -0
- package/dist/formatters/FormatterFactory.js.map +1 -1
- package/dist/formatters/build-detail/AlfredFormatter.js +113 -0
- package/dist/formatters/build-detail/AlfredFormatter.js.map +1 -0
- package/dist/formatters/build-detail/Formatter.js +3 -0
- package/dist/formatters/build-detail/Formatter.js.map +1 -0
- package/dist/formatters/build-detail/JsonFormatter.js +132 -0
- package/dist/formatters/build-detail/JsonFormatter.js.map +1 -0
- package/dist/formatters/build-detail/PlainTextFormatter.js +851 -0
- package/dist/formatters/build-detail/PlainTextFormatter.js.map +1 -0
- package/dist/formatters/build-detail/index.js +21 -0
- package/dist/formatters/build-detail/index.js.map +1 -0
- 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/queries.js +185 -0
- package/dist/graphql/queries.js.map +1 -1
- package/dist/index.js +22 -1
- package/dist/index.js.map +1 -1
- package/dist/services/BuildkiteClient.js +87 -26
- 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/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 +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildkiteClient.js","sourceRoot":"/","sources":["services/BuildkiteClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { GraphQLClient } from 'graphql-request';\nimport { CacheManager } from './CacheManager.js';\n// Import the queries - we'll use them for both string queries and typed SDK\nimport { \n GET_VIEWER, \n GET_ORGANIZATIONS, \n GET_PIPELINES, \n GET_BUILDS, \n GET_VIEWER_BUILDS,\n GET_BUILD_ANNOTATIONS\n} from '../graphql/queries.js';\n// Import generated types\nimport { \n GetViewerQuery, \n GetOrganizationsQuery, \n GetPipelinesQuery, \n GetPipelinesQueryVariables,\n GetBuildsQuery,\n GetBuildsQueryVariables,\n GetViewerBuildsQuery,\n GetViewerBuildsQueryVariables,\n} from '../graphql/generated/sdk.js';\nimport { logger } from './logger.js';\n\n// Note: We're now using the automatically generated types from GraphQL Codegen\n\nexport interface BuildkiteClientOptions {\n debug?: boolean;\n baseUrl?: string;\n caching?: boolean;\n cacheTTLs?: Partial<{\n viewer: number;\n organizations: number;\n pipelines: number;\n builds: number;\n default: number;\n }>;\n}\n\nexport interface RateLimitInfo {\n remaining: number;\n limit: number;\n reset: number;\n}\n\n/**\n * BuildkiteClient provides methods to interact with the Buildkite GraphQL API\n */\nexport class BuildkiteClient {\n private client: GraphQLClient;\n private token: string;\n private baseUrl: string = 'https://graphql.buildkite.com/v1';\n private cacheManager: CacheManager | null = null;\n private debug: boolean = false;\n private rateLimitInfo: RateLimitInfo | null = null;\n /**\n * Create a new BuildkiteClient\n * @param token Your Buildkite API token\n * @param options Configuration options\n */\n constructor(token: string, options?: BuildkiteClientOptions, debug?: boolean) {\n this.token = token;\n this.debug = debug || options?.debug || false;\n \n if (this.debug) {\n logger.debug('Initializing BuildkiteClient with options:', {\n baseUrl: options?.baseUrl || this.baseUrl,\n caching: options?.caching !== false,\n debug: this.debug,\n tokenLength: token ? token.length : 0\n });\n }\n \n if (options?.baseUrl) {\n this.baseUrl = options.baseUrl;\n }\n\n this.client = new GraphQLClient(this.baseUrl, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n },\n });\n\n // Initialize cache if caching is enabled\n if (options?.caching !== false) {\n if (this.debug) {\n logger.debug('BuildkiteClient constructor - creating CacheManager');\n }\n this.cacheManager = new CacheManager(options?.cacheTTLs, this.debug);\n // Initialize cache and set token hash (async, but we don't wait)\n this.initCache();\n } else {\n if (this.debug) {\n logger.debug('BuildkiteClient constructor - caching disabled');\n }\n }\n }\n\n /**\n * Initialize cache asynchronously\n */\n private async initCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.init();\n await this.cacheManager.setTokenHash(this.token);\n }\n }\n\n /**\n * Execute a GraphQL query\n * @param query The GraphQL query\n * @param variables Variables for the query\n * @returns The query response\n */\n public async query<T = unknown, V extends Record<string, any> = Record<string, any>>(\n query: string,\n variables?: V\n ): Promise<T> {\n try {\n const startTime = process.hrtime.bigint();\n const operationName = query.match(/query\\s+(\\w+)?/)?.[1] || 'UnnamedQuery';\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: ${operationName}`);\n }\n \n // Check if result is in cache\n if (this.cacheManager) {\n if (this.debug) {\n logger.debug('query() - cacheManager exists, checking cache');\n }\n const cachedResult = await this.cacheManager.get<T>(query, variables);\n \n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: ${operationName}`);\n }\n return cachedResult;\n }\n }\n \n const response = await this.client.request<T>(query, variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(query, response, variables);\n }\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: ${operationName} (${duration.toFixed(2)}ms)`);\n }\n \n return response;\n } catch (error: unknown) {\n const isAuthError = this.isAuthenticationError(error as any);\n if (isAuthError && this.debug) {\n logger.debug('Authentication error detected, not caching result');\n }\n \n if (this.debug) {\n logger.error(error as any, 'Error in GraphQL query');\n // Log raw error information\n logger.debug('Raw error object:', { \n error, \n type: typeof error, \n constructor: (error as any)?.constructor?.name,\n keys: error && typeof error === 'object' ? Object.keys(error as any) : undefined\n });\n // Log more detailed error information\n if (error instanceof Error && 'response' in (error as any)) {\n const response = (error as any).response;\n logger.debug('GraphQL error details:', {\n status: response?.status,\n statusText: response?.statusText,\n errors: response?.errors,\n data: response?.data,\n headers: response?.headers ? Object.fromEntries(response.headers.entries()) : undefined\n });\n }\n }\n throw error;\n }\n }\n\n /**\n * Check if an error is an authentication error\n */\n private isAuthenticationError(error: any): boolean {\n // Check for common authentication error patterns\n if (error.response?.errors) {\n const errors = error.response.errors;\n return errors.some((err: any) => \n err.message?.includes('unauthorized') || \n err.message?.includes('authentication') || \n err.message?.includes('permission') ||\n err.message?.includes('invalid token')\n );\n }\n \n // Check for HTTP status codes that indicate auth issues\n if (error.response?.status) {\n const status = error.response.status;\n return status === 401 || status === 403;\n }\n \n // Check error message directly\n if (error.message) {\n return error.message.includes('unauthorized') || \n error.message.includes('authentication') || \n error.message.includes('permission') ||\n error.message.includes('invalid token');\n }\n \n return false;\n }\n\n /**\n * Execute a GraphQL mutation\n * @param mutation The GraphQL mutation\n * @param variables Variables for the mutation\n * @returns The mutation response\n */\n public async mutate<T = unknown, V extends Record<string, any> = Record<string, any>>(\n mutation: string,\n variables?: V\n ): Promise<T> {\n try {\n const startTime = process.hrtime.bigint();\n const operationName = mutation.match(/mutation\\s+(\\w+)?/)?.[1] || 'UnnamedMutation';\n if (this.debug) {\n logger.debug(`π Starting GraphQL mutation: ${operationName}`);\n }\n \n const result = await this.client.request<T>(mutation, variables);\n \n // Invalidate relevant caches after mutations\n if (this.cacheManager) {\n // Determine what cache types to invalidate based on mutation name/content\n if (mutation.includes('Pipeline')) {\n await this.cacheManager.invalidateType('pipelines');\n } else if (mutation.includes('Build')) {\n await this.cacheManager.invalidateType('builds');\n }\n }\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n logger.debug(`β
GraphQL mutation completed: ${operationName} (${duration.toFixed(2)}ms)`);\n \n return result;\n } catch (error) {\n logger.error('GraphQL mutation error:', error);\n throw error;\n }\n }\n\n /**\n * Get the organization slugs for the current viewer\n * @returns An array of organization slugs the current user belongs to\n */\n public async getViewerOrganizationSlugs(): Promise<string[]> {\n try {\n const startTime = process.hrtime.bigint();\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: getViewerOrganizationSlugs`);\n }\n \n // Get the organizations using our query\n if (this.debug) {\n logger.debug('About to call this.query with GET_ORGANIZATIONS');\n }\n const data = await this.query<GetOrganizationsQuery>(GET_ORGANIZATIONS.toString());\n if (this.debug) {\n logger.debug('Successfully got data from this.query');\n }\n \n if (this.debug) {\n logger.debug('Raw GraphQL response for organizations:', {\n hasData: !!data,\n hasViewer: !!data?.viewer,\n hasOrganizations: !!data?.viewer?.organizations,\n hasEdges: !!data?.viewer?.organizations?.edges,\n edgesLength: data?.viewer?.organizations?.edges?.length || 0\n });\n }\n \n // Use our helper method to process the response\n const organizations = this.processOrganizationsResponse(data);\n \n if (this.debug) {\n logger.debug('Processed organizations:', {\n count: organizations.length,\n organizations: organizations.map(org => ({ id: org.id, name: org.name, slug: org.slug }))\n });\n }\n \n if (organizations.length === 0) {\n if (this.debug) {\n logger.debug('No organizations found in response', { data });\n }\n return []\n }\n \n // Map to just the slugs\n const slugs = organizations.map(org => org.slug);\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
Found ${slugs.length} organizations (${duration.toFixed(2)}ms)`);\n }\n \n return slugs;\n } catch (error) {\n if (this.debug) {\n logger.debug('GraphQL query failed', {\n error: error instanceof Error ? error.message : String(error),\n details: error instanceof Error ? error : undefined\n });\n \n // Log more detailed error information\n if (error instanceof Error && 'response' in error) {\n const response = (error as any).response;\n logger.debug('GraphQL error response:', {\n status: response?.status,\n statusText: response?.statusText,\n errors: response?.errors,\n data: response?.data\n });\n }\n \n // Log detailed error information\n logger.debug('Error in getViewerOrganizationSlugs:', {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorType: error?.constructor?.name,\n hasResponse: error instanceof Error && 'response' in error,\n response: error instanceof Error && 'response' in error ? (error as any).response : undefined\n });\n }\n throw new Error('Failed to determine your organizations', { cause: error });\n }\n }\n\n /**\n * Clear all cache entries\n */\n public async clearCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.clear();\n }\n }\n\n /**\n * Invalidate a specific cache type\n */\n public async invalidateCache(type: string): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.invalidateType(type);\n }\n }\n\n /**\n * Get the current viewer information with type safety\n * @returns The viewer data\n */\n public async getViewer(): Promise<GetViewerQuery> {\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: GetViewer`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetViewerQuery>(GET_VIEWER.toString(), {});\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: GetViewer`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetViewerQuery>(GET_VIEWER.toString());\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_VIEWER.toString(), result, {});\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: GetViewer (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get organizations for the current viewer\n * @returns An array of organization objects with id, name, and slug\n */\n public async getOrganizations(): Promise<Array<{ id: string; name: string; slug: string; }>> {\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: GetOrganizations`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetOrganizationsQuery>(GET_ORGANIZATIONS.toString(), {});\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: GetOrganizations`);\n }\n return this.processOrganizationsResponse(cachedResult);\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetOrganizationsQuery>(GET_ORGANIZATIONS.toString());\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_ORGANIZATIONS.toString(), result, {});\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: GetOrganizations (${duration.toFixed(2)}ms)`);\n }\n\n return this.processOrganizationsResponse(result);\n }\n\n /**\n * Process the raw GraphQL organizations response into a clean array\n * @param data The raw GraphQL response\n * @returns A processed array of organization objects\n * @private\n */\n private processOrganizationsResponse(data: GetOrganizationsQuery): Array<{ id: string; name: string; slug: string; }> {\n if (!data?.viewer?.organizations?.edges) {\n return [];\n }\n \n const edges = data.viewer.organizations.edges;\n \n // Filter out null edges and map to non-null nodes\n const organizations = edges\n .filter((edge): edge is NonNullable<typeof edge> => edge !== null)\n .map(edge => edge.node)\n .filter((node): node is NonNullable<typeof node> => node !== null);\n \n return organizations;\n }\n\n /**\n * Get pipelines for an organization with type safety\n * @param organizationSlug The organization slug\n * @param first Number of pipelines to retrieve\n * @param after Cursor for pagination\n * @returns The pipelines data\n */\n public async getPipelines(\n organizationSlug: string, \n first?: number, \n after?: string\n ): Promise<GetPipelinesQuery> {\n const variables: GetPipelinesQueryVariables = {\n organizationSlug,\n first,\n after,\n };\n\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: GetPipelines for ${organizationSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetPipelinesQuery>(GET_PIPELINES.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: GetPipelines`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetPipelinesQuery>(GET_PIPELINES.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_PIPELINES.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: GetPipelines (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get builds for a pipeline with type safety\n * @param pipelineSlug The pipeline slug\n * @param organizationSlug The organization slug\n * @param first Number of builds to retrieve\n * @returns The builds data\n */\n public async getBuilds(\n pipelineSlug: string,\n organizationSlug: string,\n first?: number\n ): Promise<GetBuildsQuery> {\n const variables: GetBuildsQueryVariables = {\n pipelineSlug,\n organizationSlug,\n first,\n };\n\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: GetBuilds for ${pipelineSlug} in ${organizationSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetBuildsQuery>(GET_BUILDS.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: GetBuilds`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetBuildsQuery>(GET_BUILDS.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_BUILDS.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: GetBuilds (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get builds for the current viewer with type safety\n * @param first Number of builds to retrieve\n * @returns The viewer builds data\n */\n public async getViewerBuilds(first: number): Promise<GetViewerBuildsQuery> {\n const variables: GetViewerBuildsQueryVariables = {\n first,\n };\n\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: GetViewerBuilds`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetViewerBuildsQuery>(GET_VIEWER_BUILDS.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: GetViewerBuilds`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetViewerBuildsQuery>(GET_VIEWER_BUILDS.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_VIEWER_BUILDS.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: GetViewerBuilds (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get the current rate limit information\n * @returns Current rate limit information or null if not available\n */\n public getRateLimitInfo(): RateLimitInfo | null {\n return this.rateLimitInfo;\n }\n\n /**\n * Get annotations for a build with type safety\n * @param buildSlug The build slug (e.g., \"org/pipeline/number\")\n * @returns The build annotations data\n */\n public async getBuildAnnotations(buildSlug: string): Promise<any> {\n const variables = {\n buildSlug,\n };\n\n if (this.debug) {\n logger.debug(`π Starting GraphQL query: GetBuildAnnotations for ${buildSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<any>(GET_BUILD_ANNOTATIONS.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`β
Served from cache: GetBuildAnnotations`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<any>(GET_BUILD_ANNOTATIONS.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_BUILD_ANNOTATIONS.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
GraphQL query completed: GetBuildAnnotations (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"BuildkiteClient.js","sourceRoot":"/","sources":["services/BuildkiteClient.ts"],"names":[],"mappings":"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","sourcesContent":["import { GraphQLClient } from 'graphql-request';\nimport { CacheManager } from './CacheManager.js';\nimport { getProgressIcon } from '../ui/theme.js';\n// Import the queries - we'll use them for both string queries and typed SDK\nimport { \n GET_VIEWER, \n GET_ORGANIZATIONS, \n GET_PIPELINES, \n GET_BUILDS, \n GET_VIEWER_BUILDS,\n GET_BUILD_ANNOTATIONS,\n GET_BUILD_SUMMARY,\n GET_BUILD_FULL\n} from '../graphql/queries.js';\n// Import generated types\nimport { \n GetViewerQuery, \n GetOrganizationsQuery, \n GetPipelinesQuery, \n GetPipelinesQueryVariables,\n GetBuildsQuery,\n GetBuildsQueryVariables,\n GetViewerBuildsQuery,\n GetViewerBuildsQueryVariables,\n} from '../graphql/generated/sdk.js';\nimport { logger } from './logger.js';\n\n// Note: We're now using the automatically generated types from GraphQL Codegen\n\nexport interface BuildkiteClientOptions {\n debug?: boolean;\n baseUrl?: string;\n caching?: boolean;\n cacheTTLs?: Partial<{\n viewer: number;\n organizations: number;\n pipelines: number;\n builds: number;\n default: number;\n }>;\n}\n\nexport interface RateLimitInfo {\n remaining: number;\n limit: number;\n reset: number;\n}\n\n/**\n * BuildkiteClient provides methods to interact with the Buildkite GraphQL API\n */\nexport class BuildkiteClient {\n private client: GraphQLClient;\n private token: string;\n private baseUrl: string = 'https://graphql.buildkite.com/v1';\n private cacheManager: CacheManager | null = null;\n private debug: boolean = false;\n private rateLimitInfo: RateLimitInfo | null = null;\n /**\n * Create a new BuildkiteClient\n * @param token Your Buildkite API token\n * @param options Configuration options\n */\n constructor(token: string, options?: BuildkiteClientOptions, debug?: boolean) {\n this.token = token;\n this.debug = debug || options?.debug || false;\n \n if (this.debug) {\n logger.debug('Initializing BuildkiteClient with options:', {\n baseUrl: options?.baseUrl || this.baseUrl,\n caching: options?.caching !== false,\n debug: this.debug,\n tokenLength: token ? token.length : 0\n });\n }\n \n if (options?.baseUrl) {\n this.baseUrl = options.baseUrl;\n }\n\n this.client = new GraphQLClient(this.baseUrl, {\n headers: {\n Authorization: `Bearer ${this.token}`,\n },\n });\n\n // Initialize cache if caching is enabled\n if (options?.caching !== false) {\n if (this.debug) {\n logger.debug('BuildkiteClient constructor - creating CacheManager');\n }\n this.cacheManager = new CacheManager(options?.cacheTTLs, this.debug);\n // Initialize cache and set token hash (async, but we don't wait)\n this.initCache();\n } else {\n if (this.debug) {\n logger.debug('BuildkiteClient constructor - caching disabled');\n }\n }\n }\n\n /**\n * Initialize cache asynchronously\n */\n private async initCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.init();\n await this.cacheManager.setTokenHash(this.token);\n }\n }\n\n /**\n * Execute a GraphQL query\n * @param query The GraphQL query\n * @param variables Variables for the query\n * @returns The query response\n */\n public async query<T = unknown, V extends Record<string, any> = Record<string, any>>(\n query: string,\n variables?: V\n ): Promise<T> {\n try {\n const startTime = process.hrtime.bigint();\n const operationName = query.match(/query\\s+(\\w+)?/)?.[1] || 'UnnamedQuery';\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: ${operationName}`);\n }\n \n // Check if result is in cache\n if (this.cacheManager) {\n if (this.debug) {\n logger.debug('query() - cacheManager exists, checking cache');\n }\n const cachedResult = await this.cacheManager.get<T>(query, variables);\n \n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: ${operationName}`);\n }\n return cachedResult;\n }\n }\n \n const response = await this.client.request<T>(query, variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(query, response, variables);\n }\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: ${operationName} (${duration.toFixed(2)}ms)`);\n }\n \n return response;\n } catch (error: unknown) {\n const isAuthError = this.isAuthenticationError(error as any);\n if (isAuthError && this.debug) {\n logger.debug('Authentication error detected, not caching result');\n }\n \n if (this.debug) {\n logger.error(error as any, 'Error in GraphQL query');\n // Log raw error information\n logger.debug('Raw error object:', { \n error, \n type: typeof error, \n constructor: (error as any)?.constructor?.name,\n keys: error && typeof error === 'object' ? Object.keys(error as any) : undefined\n });\n // Log more detailed error information\n if (error instanceof Error && 'response' in (error as any)) {\n const response = (error as any).response;\n logger.debug('GraphQL error details:', {\n status: response?.status,\n statusText: response?.statusText,\n errors: response?.errors,\n data: response?.data,\n headers: response?.headers ? Object.fromEntries(response.headers.entries()) : undefined\n });\n }\n }\n throw error;\n }\n }\n\n /**\n * Check if an error is an authentication error\n */\n private isAuthenticationError(error: any): boolean {\n // Check for common authentication error patterns\n if (error.response?.errors) {\n const errors = error.response.errors;\n return errors.some((err: any) => \n err.message?.includes('unauthorized') || \n err.message?.includes('authentication') || \n err.message?.includes('permission') ||\n err.message?.includes('invalid token')\n );\n }\n \n // Check for HTTP status codes that indicate auth issues\n if (error.response?.status) {\n const status = error.response.status;\n return status === 401 || status === 403;\n }\n \n // Check error message directly\n if (error.message) {\n return error.message.includes('unauthorized') || \n error.message.includes('authentication') || \n error.message.includes('permission') ||\n error.message.includes('invalid token');\n }\n \n return false;\n }\n\n /**\n * Execute a GraphQL mutation\n * @param mutation The GraphQL mutation\n * @param variables Variables for the mutation\n * @returns The mutation response\n */\n public async mutate<T = unknown, V extends Record<string, any> = Record<string, any>>(\n mutation: string,\n variables?: V\n ): Promise<T> {\n try {\n const startTime = process.hrtime.bigint();\n const operationName = mutation.match(/mutation\\s+(\\w+)?/)?.[1] || 'UnnamedMutation';\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL mutation: ${operationName}`);\n }\n \n const result = await this.client.request<T>(mutation, variables);\n \n // Invalidate relevant caches after mutations\n if (this.cacheManager) {\n // Determine what cache types to invalidate based on mutation name/content\n if (mutation.includes('Pipeline')) {\n await this.cacheManager.invalidateType('pipelines');\n } else if (mutation.includes('Build')) {\n await this.cacheManager.invalidateType('builds');\n }\n }\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL mutation completed: ${operationName} (${duration.toFixed(2)}ms)`);\n \n return result;\n } catch (error) {\n logger.error('GraphQL mutation error:', error);\n throw error;\n }\n }\n\n /**\n * Get the organization slugs for the current viewer\n * @returns An array of organization slugs the current user belongs to\n */\n public async getViewerOrganizationSlugs(): Promise<string[]> {\n try {\n const startTime = process.hrtime.bigint();\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: getViewerOrganizationSlugs`);\n }\n \n // Get the organizations using our query\n if (this.debug) {\n logger.debug('About to call this.query with GET_ORGANIZATIONS');\n }\n const data = await this.query<GetOrganizationsQuery>(GET_ORGANIZATIONS.toString());\n if (this.debug) {\n logger.debug('Successfully got data from this.query');\n }\n \n if (this.debug) {\n logger.debug('Raw GraphQL response for organizations:', {\n hasData: !!data,\n hasViewer: !!data?.viewer,\n hasOrganizations: !!data?.viewer?.organizations,\n hasEdges: !!data?.viewer?.organizations?.edges,\n edgesLength: data?.viewer?.organizations?.edges?.length || 0\n });\n }\n \n // Use our helper method to process the response\n const organizations = this.processOrganizationsResponse(data);\n \n if (this.debug) {\n logger.debug('Processed organizations:', {\n count: organizations.length,\n organizations: organizations.map(org => ({ id: org.id, name: org.name, slug: org.slug }))\n });\n }\n \n if (organizations.length === 0) {\n if (this.debug) {\n logger.debug('No organizations found in response', { data });\n }\n return []\n }\n \n // Map to just the slugs\n const slugs = organizations.map(org => org.slug);\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Found ${slugs.length} organizations (${duration.toFixed(2)}ms)`);\n }\n \n return slugs;\n } catch (error) {\n if (this.debug) {\n logger.debug('GraphQL query failed', {\n error: error instanceof Error ? error.message : String(error),\n details: error instanceof Error ? error : undefined\n });\n \n // Log more detailed error information\n if (error instanceof Error && 'response' in error) {\n const response = (error as any).response;\n logger.debug('GraphQL error response:', {\n status: response?.status,\n statusText: response?.statusText,\n errors: response?.errors,\n data: response?.data\n });\n }\n \n // Log detailed error information\n logger.debug('Error in getViewerOrganizationSlugs:', {\n errorMessage: error instanceof Error ? error.message : String(error),\n errorType: error?.constructor?.name,\n hasResponse: error instanceof Error && 'response' in error,\n response: error instanceof Error && 'response' in error ? (error as any).response : undefined\n });\n }\n throw new Error('Failed to determine your organizations', { cause: error });\n }\n }\n\n /**\n * Clear all cache entries\n */\n public async clearCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.clear();\n }\n }\n\n /**\n * Invalidate a specific cache type\n */\n public async invalidateCache(type: string): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.invalidateType(type);\n }\n }\n\n /**\n * Get the current viewer information with type safety\n * @returns The viewer data\n */\n public async getViewer(): Promise<GetViewerQuery> {\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetViewer`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetViewerQuery>(GET_VIEWER.toString(), {});\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetViewer`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetViewerQuery>(GET_VIEWER.toString());\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_VIEWER.toString(), result, {});\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetViewer (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get organizations for the current viewer\n * @returns An array of organization objects with id, name, and slug\n */\n public async getOrganizations(): Promise<Array<{ id: string; name: string; slug: string; }>> {\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetOrganizations`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetOrganizationsQuery>(GET_ORGANIZATIONS.toString(), {});\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetOrganizations`);\n }\n return this.processOrganizationsResponse(cachedResult);\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetOrganizationsQuery>(GET_ORGANIZATIONS.toString());\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_ORGANIZATIONS.toString(), result, {});\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetOrganizations (${duration.toFixed(2)}ms)`);\n }\n\n return this.processOrganizationsResponse(result);\n }\n\n /**\n * Process the raw GraphQL organizations response into a clean array\n * @param data The raw GraphQL response\n * @returns A processed array of organization objects\n * @private\n */\n private processOrganizationsResponse(data: GetOrganizationsQuery): Array<{ id: string; name: string; slug: string; }> {\n if (!data?.viewer?.organizations?.edges) {\n return [];\n }\n \n const edges = data.viewer.organizations.edges;\n \n // Filter out null edges and map to non-null nodes\n const organizations = edges\n .filter((edge): edge is NonNullable<typeof edge> => edge !== null)\n .map(edge => edge.node)\n .filter((node): node is NonNullable<typeof node> => node !== null);\n \n return organizations;\n }\n\n /**\n * Get pipelines for an organization with type safety\n * @param organizationSlug The organization slug\n * @param first Number of pipelines to retrieve\n * @param after Cursor for pagination\n * @returns The pipelines data\n */\n public async getPipelines(\n organizationSlug: string, \n first?: number, \n after?: string\n ): Promise<GetPipelinesQuery> {\n const variables: GetPipelinesQueryVariables = {\n organizationSlug,\n first,\n after,\n };\n\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetPipelines for ${organizationSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetPipelinesQuery>(GET_PIPELINES.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetPipelines`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetPipelinesQuery>(GET_PIPELINES.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_PIPELINES.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetPipelines (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get builds for a pipeline with type safety\n * @param pipelineSlug The pipeline slug\n * @param organizationSlug The organization slug\n * @param first Number of builds to retrieve\n * @returns The builds data\n */\n public async getBuilds(\n pipelineSlug: string,\n organizationSlug: string,\n first?: number\n ): Promise<GetBuildsQuery> {\n const variables: GetBuildsQueryVariables = {\n pipelineSlug,\n organizationSlug,\n first,\n };\n\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetBuilds for ${pipelineSlug} in ${organizationSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetBuildsQuery>(GET_BUILDS.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetBuilds`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetBuildsQuery>(GET_BUILDS.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_BUILDS.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetBuilds (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get builds for the current viewer with type safety\n * @param first Number of builds to retrieve\n * @returns The viewer builds data\n */\n public async getViewerBuilds(first: number): Promise<GetViewerBuildsQuery> {\n const variables: GetViewerBuildsQueryVariables = {\n first,\n };\n\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetViewerBuilds`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<GetViewerBuildsQuery>(GET_VIEWER_BUILDS.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetViewerBuilds`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<GetViewerBuildsQuery>(GET_VIEWER_BUILDS.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_VIEWER_BUILDS.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetViewerBuilds (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n /**\n * Get the current rate limit information\n * @returns Current rate limit information or null if not available\n */\n public getRateLimitInfo(): RateLimitInfo | null {\n return this.rateLimitInfo;\n }\n\n /**\n * Get annotations for a build with type safety\n * @param buildSlug The build slug (e.g., \"org/pipeline/number\")\n * @returns The build annotations data\n */\n public async getBuildAnnotations(buildSlug: string): Promise<any> {\n const variables = {\n buildSlug,\n };\n\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetBuildAnnotations for ${buildSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<any>(GET_BUILD_ANNOTATIONS.toString(), variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetBuildAnnotations`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<any>(GET_BUILD_ANNOTATIONS.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(GET_BUILD_ANNOTATIONS.toString(), result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetBuildAnnotations (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n public async getBuildSummary(buildSlug: string): Promise<any> {\n const variables = {\n slug: buildSlug,\n };\n\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetBuildSummary for ${buildSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<any>('GET_BUILD_SUMMARY', variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetBuildSummary`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<any>(GET_BUILD_SUMMARY.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set('GET_BUILD_SUMMARY', result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetBuildSummary (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n\n public async getBuildFull(buildSlug: string): Promise<any> {\n const variables = {\n slug: buildSlug,\n };\n\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting GraphQL query: GetBuildFull for ${buildSlug}`);\n }\n\n // Check if result is in cache\n if (this.cacheManager) {\n const cachedResult = await this.cacheManager.get<any>('GET_BUILD_FULL', variables);\n if (cachedResult) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: GetBuildFull`);\n }\n return cachedResult;\n }\n }\n\n const startTime = process.hrtime.bigint();\n const result = await this.client.request<any>(GET_BUILD_FULL.toString(), variables);\n\n // Store result in cache if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set('GET_BUILD_FULL', result, variables);\n }\n\n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} GraphQL query completed: GetBuildFull (${duration.toFixed(2)}ms)`);\n }\n\n return result;\n }\n}"]}
|
|
@@ -2,6 +2,7 @@ import fetch from 'node-fetch';
|
|
|
2
2
|
import { CacheManager } from './CacheManager.js';
|
|
3
3
|
import { createHash } from 'crypto';
|
|
4
4
|
import { logger } from './logger.js';
|
|
5
|
+
import { getProgressIcon } from '../ui/theme.js';
|
|
5
6
|
/**
|
|
6
7
|
* BuildkiteRestClient provides methods to interact with the Buildkite REST API
|
|
7
8
|
*/
|
|
@@ -84,17 +85,17 @@ export class BuildkiteRestClient {
|
|
|
84
85
|
const cached = await this.cacheManager.get(cacheKey, cacheType);
|
|
85
86
|
if (cached) {
|
|
86
87
|
if (this.debug) {
|
|
87
|
-
logger.debug(
|
|
88
|
+
logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: REST ${endpoint}`);
|
|
88
89
|
}
|
|
89
90
|
return cached;
|
|
90
91
|
}
|
|
91
92
|
}
|
|
92
93
|
const startTime = process.hrtime.bigint();
|
|
93
94
|
if (this.debug) {
|
|
94
|
-
logger.debug(
|
|
95
|
-
logger.debug(
|
|
95
|
+
logger.debug(`${getProgressIcon('STARTING')} Starting REST API request: GET ${endpoint}`);
|
|
96
|
+
logger.debug(`${getProgressIcon('STARTING')} Request URL: ${url.toString()}`);
|
|
96
97
|
if (params) {
|
|
97
|
-
logger.debug(
|
|
98
|
+
logger.debug(`${getProgressIcon('STARTING')} Request params: ${JSON.stringify(params)}`);
|
|
98
99
|
}
|
|
99
100
|
}
|
|
100
101
|
try {
|
|
@@ -144,7 +145,7 @@ export class BuildkiteRestClient {
|
|
|
144
145
|
const endTime = process.hrtime.bigint();
|
|
145
146
|
const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds
|
|
146
147
|
if (this.debug) {
|
|
147
|
-
logger.debug(
|
|
148
|
+
logger.debug(`${getProgressIcon('SUCCESS_LOG')} REST API request completed: GET ${endpoint} (${duration.toFixed(2)}ms)`);
|
|
148
149
|
}
|
|
149
150
|
return data;
|
|
150
151
|
}
|
|
@@ -187,13 +188,13 @@ export class BuildkiteRestClient {
|
|
|
187
188
|
const endpoint = `/organizations/${org}/builds`;
|
|
188
189
|
const startTime = process.hrtime.bigint();
|
|
189
190
|
if (this.debug) {
|
|
190
|
-
logger.debug(
|
|
191
|
+
logger.debug(`${getProgressIcon('STARTING')} Fetching builds for organization: ${org}`);
|
|
191
192
|
}
|
|
192
193
|
const builds = await this.get(endpoint, params);
|
|
193
194
|
const endTime = process.hrtime.bigint();
|
|
194
195
|
const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds
|
|
195
196
|
if (this.debug) {
|
|
196
|
-
logger.debug(
|
|
197
|
+
logger.debug(`${getProgressIcon('SUCCESS_LOG')} Retrieved ${builds.length} builds for ${org} (${duration.toFixed(2)}ms)`);
|
|
197
198
|
}
|
|
198
199
|
return builds;
|
|
199
200
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuildkiteRestClient.js","sourceRoot":"/","sources":["services/BuildkiteRestClient.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch';\nimport { CacheManager } from './CacheManager.js';\nimport { createHash } from 'crypto';\nimport { logger } from './logger.js';\n\nexport interface BuildkiteRestClientOptions {\n baseUrl?: string;\n caching?: boolean;\n cacheTTLs?: Partial<{\n builds: number;\n default: number;\n }>;\n debug?: boolean;\n}\n\nexport interface RateLimitInfo {\n remaining: number;\n limit: number;\n reset: number;\n}\n\n/**\n * BuildkiteRestClient provides methods to interact with the Buildkite REST API\n */\nexport class BuildkiteRestClient {\n private token: string;\n private baseUrl: string = 'https://api.buildkite.com/v2';\n private cacheManager: CacheManager | null = null;\n private debug: boolean = false;\n private rateLimitInfo: RateLimitInfo | null = null;\n\n /**\n * Create a new BuildkiteRestClient\n * @param token Your Buildkite API token\n * @param options Configuration options\n */\n constructor(token: string, options?: BuildkiteRestClientOptions) {\n this.token = token;\n this.debug = options?.debug || false;\n \n if (options?.baseUrl) {\n this.baseUrl = options.baseUrl;\n }\n \n // Initialize cache if caching is enabled\n if (options?.caching !== false) {\n this.cacheManager = new CacheManager(options?.cacheTTLs, this.debug);\n // Initialize cache and set token hash (async, but we don't wait)\n this.initCache();\n }\n }\n \n /**\n * Initialize cache asynchronously\n */\n private async initCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.init();\n await this.cacheManager.setTokenHash(this.token);\n }\n }\n \n /**\n * Generate a cache key for a REST endpoint\n */\n private generateCacheKey(endpoint: string, params?: Record<string, string>): string {\n const paramsString = params ? JSON.stringify(params) : '';\n return `REST:${endpoint}:${this.hashString(paramsString)}`;\n }\n \n /**\n * Hash a string using SHA256\n */\n private hashString(str: string): string {\n return createHash('sha256').update(str).digest('hex');\n }\n\n /**\n * Get cache type from endpoint\n */\n private getCacheTypeFromEndpoint(endpoint: string): string {\n if (endpoint.includes('/builds')) {\n return 'builds';\n }\n return 'default';\n }\n\n /**\n * Make a GET request to the Buildkite REST API\n * @param endpoint The API endpoint\n * @param params Query parameters\n * @returns The API response\n */\n private async get<T = any>(endpoint: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n \n // Add query parameters\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, value);\n }\n });\n }\n \n // Generate cache key\n const cacheKey = this.generateCacheKey(endpoint, params);\n const cacheType = this.getCacheTypeFromEndpoint(endpoint);\n \n // Check cache first if enabled\n if (this.cacheManager) {\n const cached = await this.cacheManager.get(cacheKey, cacheType as any);\n if (cached) {\n if (this.debug) {\n logger.debug(`β
Served from cache: REST ${endpoint}`);\n }\n return cached as T;\n }\n }\n\n const startTime = process.hrtime.bigint();\n if (this.debug) {\n logger.debug(`π Starting REST API request: GET ${endpoint}`);\n logger.debug(`π Request URL: ${url.toString()}`);\n if (params) {\n logger.debug(`π Request params: ${JSON.stringify(params)}`);\n }\n }\n \n try {\n const response = await fetch(url.toString(), {\n headers: {\n 'Authorization': `Bearer ${this.token}`,\n 'Content-Type': 'application/json',\n },\n });\n\n // Update rate limit info from headers\n this.rateLimitInfo = {\n remaining: parseInt(response.headers.get('RateLimit-Remaining') || '0'),\n limit: parseInt(response.headers.get('RateLimit-Limit') || '0'),\n reset: parseInt(response.headers.get('RateLimit-Reset') || '0'),\n };\n\n if (this.debug) {\n logger.debug('Rate limit info:', this.rateLimitInfo);\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `API request failed with status ${response.status}: ${errorText}`;\n \n // Try to parse the error as JSON for more details\n try {\n const errorJson = JSON.parse(errorText);\n if (errorJson.message) {\n errorMessage = `API request failed: ${errorJson.message}`;\n }\n if (errorJson.errors && Array.isArray(errorJson.errors)) {\n errorMessage += `\\nErrors: ${errorJson.errors.map((e: any) => e.message).join(', ')}`;\n }\n } catch (e) {\n // If parsing fails, use the original error text\n }\n \n // Check if this is an authentication error\n const isAuthError = this.isAuthenticationError(response.status, errorMessage);\n if (isAuthError && this.debug) {\n logger.debug('Authentication error detected, not caching result');\n }\n \n throw new Error(errorMessage);\n }\n \n const data = await response.json() as T;\n \n // Cache the response if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(cacheKey, data, cacheType as any);\n }\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
REST API request completed: GET ${endpoint} (${duration.toFixed(2)}ms)`);\n }\n \n return data;\n } catch (error: unknown) {\n if (this.debug) {\n logger.error('Error in get request:', error);\n }\n throw error;\n }\n }\n\n /**\n * Check if an error is an authentication error\n */\n private isAuthenticationError(status: number, message: string): boolean {\n // Check for HTTP status codes that indicate auth issues\n if (status === 401 || status === 403) {\n return true;\n }\n \n // Check error message for auth-related keywords\n const lowerMessage = message.toLowerCase();\n return lowerMessage.includes('unauthorized') || \n lowerMessage.includes('authentication') || \n lowerMessage.includes('permission') ||\n lowerMessage.includes('invalid token');\n }\n\n /**\n * Get the current rate limit information\n * @returns Current rate limit information or null if not available\n */\n public getRateLimitInfo(): RateLimitInfo | null {\n return this.rateLimitInfo;\n }\n\n /**\n * Get builds from an organization filtered by specific parameters\n * @param org Organization slug\n * @param params Query parameters\n * @returns List of builds\n */\n public async getBuilds(org: string, params?: {\n creator?: string; // Creator's user ID, email or API access token\n pipeline?: string;\n branch?: string;\n commit?: string;\n state?: string;\n per_page?: string;\n page?: string;\n }): Promise<any[]> {\n const endpoint = `/organizations/${org}/builds`;\n const startTime = process.hrtime.bigint();\n if (this.debug) {\n logger.debug(`π Fetching builds for organization: ${org}`);\n }\n \n const builds = await this.get<any[]>(endpoint, params as Record<string, string>);\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`β
Retrieved ${builds.length} builds for ${org} (${duration.toFixed(2)}ms)`);\n }\n \n return builds;\n }\n\n\n\n public async hasBuildAccess(org: string): Promise<boolean> {\n try {\n await this.getBuilds(org, { per_page: '1' });\n return true;\n } catch (error) {\n return false;\n }\n }\n \n /**\n * Check if the current user has access to an organization\n * @param org Organization slug\n * @returns True if the user has access, false otherwise\n */\n public async hasOrganizationAccess(org: string): Promise<boolean> {\n try {\n const endpoint = `/organizations/${org}`;\n await this.get(endpoint);\n return true;\n } catch (error) {\n if (this.debug) {\n logger.debug(`User does not have access to organization: ${org}`);\n }\n return false;\n }\n }\n \n /**\n * Clear all cache entries\n */\n public async clearCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.clear();\n }\n }\n\n /**\n * Invalidate a specific cache type\n */\n public async invalidateCache(type: string): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.invalidateType(type);\n }\n }\n} "]}
|
|
1
|
+
{"version":3,"file":"BuildkiteRestClient.js","sourceRoot":"/","sources":["services/BuildkiteRestClient.ts"],"names":[],"mappings":"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","sourcesContent":["import fetch from 'node-fetch';\nimport { CacheManager } from './CacheManager.js';\nimport { createHash } from 'crypto';\nimport { logger } from './logger.js';\nimport { getProgressIcon } from '../ui/theme.js';\n\nexport interface BuildkiteRestClientOptions {\n baseUrl?: string;\n caching?: boolean;\n cacheTTLs?: Partial<{\n builds: number;\n default: number;\n }>;\n debug?: boolean;\n}\n\nexport interface RateLimitInfo {\n remaining: number;\n limit: number;\n reset: number;\n}\n\n/**\n * BuildkiteRestClient provides methods to interact with the Buildkite REST API\n */\nexport class BuildkiteRestClient {\n private token: string;\n private baseUrl: string = 'https://api.buildkite.com/v2';\n private cacheManager: CacheManager | null = null;\n private debug: boolean = false;\n private rateLimitInfo: RateLimitInfo | null = null;\n\n /**\n * Create a new BuildkiteRestClient\n * @param token Your Buildkite API token\n * @param options Configuration options\n */\n constructor(token: string, options?: BuildkiteRestClientOptions) {\n this.token = token;\n this.debug = options?.debug || false;\n \n if (options?.baseUrl) {\n this.baseUrl = options.baseUrl;\n }\n \n // Initialize cache if caching is enabled\n if (options?.caching !== false) {\n this.cacheManager = new CacheManager(options?.cacheTTLs, this.debug);\n // Initialize cache and set token hash (async, but we don't wait)\n this.initCache();\n }\n }\n \n /**\n * Initialize cache asynchronously\n */\n private async initCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.init();\n await this.cacheManager.setTokenHash(this.token);\n }\n }\n \n /**\n * Generate a cache key for a REST endpoint\n */\n private generateCacheKey(endpoint: string, params?: Record<string, string>): string {\n const paramsString = params ? JSON.stringify(params) : '';\n return `REST:${endpoint}:${this.hashString(paramsString)}`;\n }\n \n /**\n * Hash a string using SHA256\n */\n private hashString(str: string): string {\n return createHash('sha256').update(str).digest('hex');\n }\n\n /**\n * Get cache type from endpoint\n */\n private getCacheTypeFromEndpoint(endpoint: string): string {\n if (endpoint.includes('/builds')) {\n return 'builds';\n }\n return 'default';\n }\n\n /**\n * Make a GET request to the Buildkite REST API\n * @param endpoint The API endpoint\n * @param params Query parameters\n * @returns The API response\n */\n private async get<T = any>(endpoint: string, params?: Record<string, string>): Promise<T> {\n const url = new URL(`${this.baseUrl}${endpoint}`);\n \n // Add query parameters\n if (params) {\n Object.entries(params).forEach(([key, value]) => {\n if (value !== undefined && value !== null) {\n url.searchParams.append(key, value);\n }\n });\n }\n \n // Generate cache key\n const cacheKey = this.generateCacheKey(endpoint, params);\n const cacheType = this.getCacheTypeFromEndpoint(endpoint);\n \n // Check cache first if enabled\n if (this.cacheManager) {\n const cached = await this.cacheManager.get(cacheKey, cacheType as any);\n if (cached) {\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Served from cache: REST ${endpoint}`);\n }\n return cached as T;\n }\n }\n\n const startTime = process.hrtime.bigint();\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Starting REST API request: GET ${endpoint}`);\n logger.debug(`${getProgressIcon('STARTING')} Request URL: ${url.toString()}`);\n if (params) {\n logger.debug(`${getProgressIcon('STARTING')} Request params: ${JSON.stringify(params)}`);\n }\n }\n \n try {\n const response = await fetch(url.toString(), {\n headers: {\n 'Authorization': `Bearer ${this.token}`,\n 'Content-Type': 'application/json',\n },\n });\n\n // Update rate limit info from headers\n this.rateLimitInfo = {\n remaining: parseInt(response.headers.get('RateLimit-Remaining') || '0'),\n limit: parseInt(response.headers.get('RateLimit-Limit') || '0'),\n reset: parseInt(response.headers.get('RateLimit-Reset') || '0'),\n };\n\n if (this.debug) {\n logger.debug('Rate limit info:', this.rateLimitInfo);\n }\n\n if (!response.ok) {\n const errorText = await response.text();\n let errorMessage = `API request failed with status ${response.status}: ${errorText}`;\n \n // Try to parse the error as JSON for more details\n try {\n const errorJson = JSON.parse(errorText);\n if (errorJson.message) {\n errorMessage = `API request failed: ${errorJson.message}`;\n }\n if (errorJson.errors && Array.isArray(errorJson.errors)) {\n errorMessage += `\\nErrors: ${errorJson.errors.map((e: any) => e.message).join(', ')}`;\n }\n } catch (e) {\n // If parsing fails, use the original error text\n }\n \n // Check if this is an authentication error\n const isAuthError = this.isAuthenticationError(response.status, errorMessage);\n if (isAuthError && this.debug) {\n logger.debug('Authentication error detected, not caching result');\n }\n \n throw new Error(errorMessage);\n }\n \n const data = await response.json() as T;\n \n // Cache the response if caching is enabled\n if (this.cacheManager) {\n await this.cacheManager.set(cacheKey, data, cacheType as any);\n }\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} REST API request completed: GET ${endpoint} (${duration.toFixed(2)}ms)`);\n }\n \n return data;\n } catch (error: unknown) {\n if (this.debug) {\n logger.error('Error in get request:', error);\n }\n throw error;\n }\n }\n\n /**\n * Check if an error is an authentication error\n */\n private isAuthenticationError(status: number, message: string): boolean {\n // Check for HTTP status codes that indicate auth issues\n if (status === 401 || status === 403) {\n return true;\n }\n \n // Check error message for auth-related keywords\n const lowerMessage = message.toLowerCase();\n return lowerMessage.includes('unauthorized') || \n lowerMessage.includes('authentication') || \n lowerMessage.includes('permission') ||\n lowerMessage.includes('invalid token');\n }\n\n /**\n * Get the current rate limit information\n * @returns Current rate limit information or null if not available\n */\n public getRateLimitInfo(): RateLimitInfo | null {\n return this.rateLimitInfo;\n }\n\n /**\n * Get builds from an organization filtered by specific parameters\n * @param org Organization slug\n * @param params Query parameters\n * @returns List of builds\n */\n public async getBuilds(org: string, params?: {\n creator?: string; // Creator's user ID, email or API access token\n pipeline?: string;\n branch?: string;\n commit?: string;\n state?: string;\n per_page?: string;\n page?: string;\n }): Promise<any[]> {\n const endpoint = `/organizations/${org}/builds`;\n const startTime = process.hrtime.bigint();\n if (this.debug) {\n logger.debug(`${getProgressIcon('STARTING')} Fetching builds for organization: ${org}`);\n }\n \n const builds = await this.get<any[]>(endpoint, params as Record<string, string>);\n \n const endTime = process.hrtime.bigint();\n const duration = Number(endTime - startTime) / 1000000; // Convert to milliseconds\n if (this.debug) {\n logger.debug(`${getProgressIcon('SUCCESS_LOG')} Retrieved ${builds.length} builds for ${org} (${duration.toFixed(2)}ms)`);\n }\n \n return builds;\n }\n\n\n\n public async hasBuildAccess(org: string): Promise<boolean> {\n try {\n await this.getBuilds(org, { per_page: '1' });\n return true;\n } catch (error) {\n return false;\n }\n }\n \n /**\n * Check if the current user has access to an organization\n * @param org Organization slug\n * @returns True if the user has access, false otherwise\n */\n public async hasOrganizationAccess(org: string): Promise<boolean> {\n try {\n const endpoint = `/organizations/${org}`;\n await this.get(endpoint);\n return true;\n } catch (error) {\n if (this.debug) {\n logger.debug(`User does not have access to organization: ${org}`);\n }\n return false;\n }\n }\n \n /**\n * Clear all cache entries\n */\n public async clearCache(): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.clear();\n }\n }\n\n /**\n * Invalidate a specific cache type\n */\n public async invalidateCache(type: string): Promise<void> {\n if (this.cacheManager) {\n await this.cacheManager.invalidateType(type);\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
|