@vibe-validate/cli 0.17.6 → 0.18.0-rc.1
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/bin/vibe-validate +4 -0
- package/dist/bin/vibe-validate.js +4 -0
- package/dist/bin/vibe-validate.js.map +1 -1
- package/dist/bin/vv +4 -0
- package/dist/commands/cleanup.d.ts.map +1 -1
- package/dist/commands/cleanup.js +5 -2
- package/dist/commands/cleanup.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +3 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create-extractor.d.ts.map +1 -1
- package/dist/commands/create-extractor.js +3 -1
- package/dist/commands/create-extractor.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +11 -5
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/generate-workflow.d.ts.map +1 -1
- package/dist/commands/generate-workflow.js +6 -2
- package/dist/commands/generate-workflow.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +19 -9
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +3 -1
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pre-commit.d.ts.map +1 -1
- package/dist/commands/pre-commit.js +3 -1
- package/dist/commands/pre-commit.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +11 -9
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/state.d.ts.map +1 -1
- package/dist/commands/state.js +11 -6
- package/dist/commands/state.js.map +1 -1
- package/dist/commands/watch-pr.d.ts +16 -0
- package/dist/commands/watch-pr.d.ts.map +1 -1
- package/dist/commands/watch-pr.js +574 -320
- package/dist/commands/watch-pr.js.map +1 -1
- package/dist/schemas/watch-pr-result.schema.d.ts +2010 -0
- package/dist/schemas/watch-pr-result.schema.d.ts.map +1 -0
- package/dist/schemas/watch-pr-result.schema.js +335 -0
- package/dist/schemas/watch-pr-result.schema.js.map +1 -0
- package/dist/schemas/watch-pr-schema.d.ts +6 -6
- package/dist/services/cache-manager.d.ts +113 -0
- package/dist/services/cache-manager.d.ts.map +1 -0
- package/dist/services/cache-manager.js +211 -0
- package/dist/services/cache-manager.js.map +1 -0
- package/dist/services/ci-providers/github-actions.d.ts.map +1 -1
- package/dist/services/ci-providers/github-actions.js +10 -16
- package/dist/services/ci-providers/github-actions.js.map +1 -1
- package/dist/services/external-check-extractor.d.ts +66 -0
- package/dist/services/external-check-extractor.d.ts.map +1 -0
- package/dist/services/external-check-extractor.js +114 -0
- package/dist/services/external-check-extractor.js.map +1 -0
- package/dist/services/extraction-mode-detector.d.ts +85 -0
- package/dist/services/extraction-mode-detector.d.ts.map +1 -0
- package/dist/services/extraction-mode-detector.js +200 -0
- package/dist/services/extraction-mode-detector.js.map +1 -0
- package/dist/services/github-fetcher.d.ts +210 -0
- package/dist/services/github-fetcher.d.ts.map +1 -0
- package/dist/services/github-fetcher.js +412 -0
- package/dist/services/github-fetcher.js.map +1 -0
- package/dist/services/history-summary-builder.d.ts +74 -0
- package/dist/services/history-summary-builder.d.ts.map +1 -0
- package/dist/services/history-summary-builder.js +199 -0
- package/dist/services/history-summary-builder.js.map +1 -0
- package/dist/services/watch-pr-orchestrator.d.ts +119 -0
- package/dist/services/watch-pr-orchestrator.d.ts.map +1 -0
- package/dist/services/watch-pr-orchestrator.js +420 -0
- package/dist/services/watch-pr-orchestrator.js.map +1 -0
- package/dist/utils/command-name.d.ts +21 -0
- package/dist/utils/command-name.d.ts.map +1 -0
- package/dist/utils/command-name.js +45 -0
- package/dist/utils/command-name.js.map +1 -0
- package/dist/utils/pid-lock.d.ts.map +1 -1
- package/dist/utils/pid-lock.js +3 -3
- package/dist/utils/pid-lock.js.map +1 -1
- package/dist/utils/temp-files.d.ts.map +1 -1
- package/dist/utils/temp-files.js +2 -2
- package/dist/utils/temp-files.js.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExtractionModeDetector - Detect and extract errors from GitHub Actions logs
|
|
3
|
+
*
|
|
4
|
+
* Supports two modes:
|
|
5
|
+
* 1. Matrix mode: Validate YAML output with extraction field (pass through faithfully)
|
|
6
|
+
* 2. Non-matrix mode: Raw test output (detect extractor and extract errors)
|
|
7
|
+
*
|
|
8
|
+
* Try matrix first, fall back to non-matrix if YAML not found.
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
import { autoDetectAndExtract } from '@vibe-validate/extractors';
|
|
13
|
+
import YAML from 'yaml';
|
|
14
|
+
/**
|
|
15
|
+
* ExtractionModeDetector - Detect extraction mode and extract errors
|
|
16
|
+
*
|
|
17
|
+
* Tries matrix mode first (YAML with extraction field), falls back to non-matrix mode.
|
|
18
|
+
*/
|
|
19
|
+
export class ExtractionModeDetector {
|
|
20
|
+
/**
|
|
21
|
+
* Detect extraction mode and extract errors
|
|
22
|
+
*
|
|
23
|
+
* @param check - GitHub Actions check
|
|
24
|
+
* @param logs - Raw log output
|
|
25
|
+
* @returns ErrorExtractorResult or null if extraction failed
|
|
26
|
+
*/
|
|
27
|
+
async detectAndExtract(check, logs) {
|
|
28
|
+
// Handle empty logs
|
|
29
|
+
if (!logs || logs.trim().length === 0) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
// Try matrix mode first
|
|
33
|
+
const matrixResult = await this.extractFromMatrixMode(logs);
|
|
34
|
+
if (matrixResult) {
|
|
35
|
+
return matrixResult;
|
|
36
|
+
}
|
|
37
|
+
// Fall back to non-matrix mode
|
|
38
|
+
return await this.extractFromNonMatrixMode(check.name, logs);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Extract from matrix mode (validate YAML output)
|
|
42
|
+
*
|
|
43
|
+
* Looks for YAML markers (---...---) and extracts the "extraction" field.
|
|
44
|
+
*
|
|
45
|
+
* @param logs - Raw log output
|
|
46
|
+
* @returns ErrorExtractorResult or null if not matrix mode
|
|
47
|
+
*/
|
|
48
|
+
async extractFromMatrixMode(logs) {
|
|
49
|
+
try {
|
|
50
|
+
// Strip GitHub Actions log prefixes from each line
|
|
51
|
+
// Format: <job-name>\t<step-name>\t[BOM]<timestamp> <content>
|
|
52
|
+
// Where BOM is optional UTF-8 BOM (U+FEFF)
|
|
53
|
+
const cleanedLogs = logs
|
|
54
|
+
.split('\n')
|
|
55
|
+
.map((line) => this.stripLogPrefix(line))
|
|
56
|
+
.join('\n');
|
|
57
|
+
// Find YAML document between --- markers (using RegExp.exec for sonarjs compliance)
|
|
58
|
+
// eslint-disable-next-line sonarjs/slow-regex -- NOSONAR: False positive - regex is safe for YAML markers
|
|
59
|
+
const yamlRegex = /^---\s*\n([\s\S]*?)\n---\s*$/m;
|
|
60
|
+
const yamlMatch = yamlRegex.exec(cleanedLogs);
|
|
61
|
+
if (!yamlMatch) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
// Parse and extract from YAML
|
|
65
|
+
const yamlContent = yamlMatch[1];
|
|
66
|
+
const parsed = YAML.parse(yamlContent);
|
|
67
|
+
if (!parsed || typeof parsed !== 'object') {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
// Try extracting from root level first, then nested
|
|
71
|
+
return this.extractFromYAML(parsed);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// YAML parsing failed - not matrix mode
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Extract from non-matrix mode (raw test output)
|
|
80
|
+
*
|
|
81
|
+
* Detects extractor from check name or logs, then runs extraction.
|
|
82
|
+
*
|
|
83
|
+
* @param _checkName - Check name (unused - autoDetectAndExtract handles detection)
|
|
84
|
+
* @param logs - Raw log output
|
|
85
|
+
* @returns ErrorExtractorResult or null if extraction failed
|
|
86
|
+
*/
|
|
87
|
+
async extractFromNonMatrixMode(_checkName, logs) {
|
|
88
|
+
try {
|
|
89
|
+
// Strip GitHub Actions log prefixes (same cleaning as matrix mode)
|
|
90
|
+
const cleanedLogs = logs
|
|
91
|
+
.split('\n')
|
|
92
|
+
.map((line) => this.stripLogPrefix(line))
|
|
93
|
+
.join('\n');
|
|
94
|
+
// Use autoDetectAndExtract from @vibe-validate/extractors
|
|
95
|
+
// It handles extractor detection and extraction automatically
|
|
96
|
+
return autoDetectAndExtract(cleanedLogs);
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// Extraction failed
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Strip GitHub Actions log prefix from a single line
|
|
105
|
+
*
|
|
106
|
+
* @param line - Log line
|
|
107
|
+
* @returns Cleaned line
|
|
108
|
+
*/
|
|
109
|
+
stripLogPrefix(line) {
|
|
110
|
+
// Match GitHub Actions log prefix (job name + step name + timestamp with optional BOM)
|
|
111
|
+
// Example: "Run job\tStep name\t2025-12-16T16:33:10.1212265Z content"
|
|
112
|
+
const githubActionsRegex = /^[^\t]+\t[^\t]+\t\uFEFF?\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z\s(.*)$/;
|
|
113
|
+
const githubMatch = githubActionsRegex.exec(line);
|
|
114
|
+
if (githubMatch) {
|
|
115
|
+
return githubMatch[1]; // Return content after prefix
|
|
116
|
+
}
|
|
117
|
+
// Fall back to simple timestamp stripping (for non-GitHub Actions logs)
|
|
118
|
+
const timestampRegex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z\s(.*)$/;
|
|
119
|
+
const timestampMatch = timestampRegex.exec(line);
|
|
120
|
+
if (timestampMatch) {
|
|
121
|
+
return timestampMatch[1]; // Return content after timestamp and space
|
|
122
|
+
}
|
|
123
|
+
return line; // Return line as-is if no prefix matched
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Extract ErrorExtractorResult from parsed YAML
|
|
127
|
+
*
|
|
128
|
+
* Tries root level first (vibe-validate run output), then nested (vibe-validate validate output)
|
|
129
|
+
*
|
|
130
|
+
* @param parsed - Parsed YAML object
|
|
131
|
+
* @returns ErrorExtractorResult or null
|
|
132
|
+
*/
|
|
133
|
+
extractFromYAML(parsed) {
|
|
134
|
+
// Check if extraction field exists at root (vibe-validate run output)
|
|
135
|
+
if ('extraction' in parsed) {
|
|
136
|
+
const extraction = this.validateExtraction(parsed.extraction);
|
|
137
|
+
if (extraction) {
|
|
138
|
+
return extraction;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Check if extraction is nested in phases/steps (vibe-validate validate output)
|
|
142
|
+
if ('phases' in parsed && Array.isArray(parsed.phases)) {
|
|
143
|
+
return this.extractFromPhases(parsed.phases);
|
|
144
|
+
}
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Extract ErrorExtractorResult from phases array (validate output)
|
|
149
|
+
*
|
|
150
|
+
* @param phases - Phases array
|
|
151
|
+
* @returns ErrorExtractorResult or null
|
|
152
|
+
*/
|
|
153
|
+
extractFromPhases(phases) {
|
|
154
|
+
for (const phase of phases) {
|
|
155
|
+
const extraction = this.extractFromPhaseSteps(phase);
|
|
156
|
+
if (extraction) {
|
|
157
|
+
return extraction;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Extract ErrorExtractorResult from a single phase's steps
|
|
164
|
+
*
|
|
165
|
+
* @param phase - Phase object
|
|
166
|
+
* @returns ErrorExtractorResult or null
|
|
167
|
+
*/
|
|
168
|
+
extractFromPhaseSteps(phase) {
|
|
169
|
+
if (!phase || typeof phase !== 'object' || !('steps' in phase) || !Array.isArray(phase.steps)) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
for (const step of phase.steps) {
|
|
173
|
+
if (step && typeof step === 'object' && 'extraction' in step) {
|
|
174
|
+
const extraction = this.validateExtraction(step.extraction);
|
|
175
|
+
if (extraction) {
|
|
176
|
+
// Return first extraction found (usually the failed step)
|
|
177
|
+
return extraction;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return null;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Validate extraction structure
|
|
185
|
+
*
|
|
186
|
+
* @param extraction - Extraction object
|
|
187
|
+
* @returns ErrorExtractorResult or null
|
|
188
|
+
*/
|
|
189
|
+
validateExtraction(extraction) {
|
|
190
|
+
if (extraction &&
|
|
191
|
+
typeof extraction === 'object' &&
|
|
192
|
+
'summary' in extraction &&
|
|
193
|
+
'totalErrors' in extraction &&
|
|
194
|
+
'errors' in extraction) {
|
|
195
|
+
return extraction;
|
|
196
|
+
}
|
|
197
|
+
return null;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=extraction-mode-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extraction-mode-detector.js","sourceRoot":"","sources":["../../src/services/extraction-mode-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHubFetcher - Fetch PR metadata and check results from GitHub API
|
|
3
|
+
*
|
|
4
|
+
* Uses `gh` CLI to fetch:
|
|
5
|
+
* - Complete PR metadata (title, author, labels, linked issues, etc.)
|
|
6
|
+
* - Check results (GitHub Actions + external status checks)
|
|
7
|
+
* - Run logs from GitHub Actions
|
|
8
|
+
* - File changes from git diff
|
|
9
|
+
*
|
|
10
|
+
* @packageDocumentation
|
|
11
|
+
*/
|
|
12
|
+
import type { ChangesContext, CheckConclusion, CheckStatus, PRMetadata } from '../schemas/watch-pr-result.schema.js';
|
|
13
|
+
/**
|
|
14
|
+
* Check result (internal type for classification)
|
|
15
|
+
*/
|
|
16
|
+
export interface CheckResult {
|
|
17
|
+
/** Check type (github_action or external) */
|
|
18
|
+
type: 'github_action' | 'external';
|
|
19
|
+
/** Check name */
|
|
20
|
+
name: string;
|
|
21
|
+
/** Check status */
|
|
22
|
+
status: CheckStatus;
|
|
23
|
+
/** Check conclusion (if completed) */
|
|
24
|
+
conclusion?: CheckConclusion;
|
|
25
|
+
/** GitHub run ID (for GitHub Actions) */
|
|
26
|
+
run_id?: number;
|
|
27
|
+
/** Workflow name (for GitHub Actions) */
|
|
28
|
+
workflow?: string;
|
|
29
|
+
/** Started at (ISO 8601) */
|
|
30
|
+
started_at?: string;
|
|
31
|
+
/** Duration (human-readable) */
|
|
32
|
+
duration?: string;
|
|
33
|
+
/** URL (for external checks) */
|
|
34
|
+
url?: string;
|
|
35
|
+
/** Provider name (for external checks) */
|
|
36
|
+
provider?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Run details (returned by fetchRunDetails)
|
|
40
|
+
*/
|
|
41
|
+
export interface RunDetails {
|
|
42
|
+
/** GitHub run ID */
|
|
43
|
+
run_id: number;
|
|
44
|
+
/** Check/job name */
|
|
45
|
+
name: string;
|
|
46
|
+
/** Workflow name */
|
|
47
|
+
workflow: string;
|
|
48
|
+
/** Run status */
|
|
49
|
+
status: CheckStatus;
|
|
50
|
+
/** Run conclusion (if completed) */
|
|
51
|
+
conclusion?: CheckConclusion;
|
|
52
|
+
/** Started at (ISO 8601) */
|
|
53
|
+
started_at: string;
|
|
54
|
+
/** Duration (human-readable) */
|
|
55
|
+
duration: string;
|
|
56
|
+
/** Run URL */
|
|
57
|
+
url: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* GitHubFetcher - Fetch PR data from GitHub API via gh CLI
|
|
61
|
+
*/
|
|
62
|
+
export declare class GitHubFetcher {
|
|
63
|
+
private readonly owner?;
|
|
64
|
+
private readonly repo?;
|
|
65
|
+
/**
|
|
66
|
+
* Create GitHubFetcher
|
|
67
|
+
*
|
|
68
|
+
* @param owner - Repository owner (optional, defaults to current repo)
|
|
69
|
+
* @param repo - Repository name (optional, defaults to current repo)
|
|
70
|
+
*/
|
|
71
|
+
constructor(owner?: string, repo?: string);
|
|
72
|
+
/**
|
|
73
|
+
* Fetch complete PR metadata
|
|
74
|
+
*
|
|
75
|
+
* @param prNumber - PR number
|
|
76
|
+
* @returns PR metadata
|
|
77
|
+
*/
|
|
78
|
+
fetchPRDetails(prNumber: number): Promise<PRMetadata>;
|
|
79
|
+
/**
|
|
80
|
+
* Fetch check results (GitHub Actions + external)
|
|
81
|
+
*
|
|
82
|
+
* @param prNumber - PR number
|
|
83
|
+
* @returns Check results
|
|
84
|
+
*/
|
|
85
|
+
fetchChecks(prNumber: number): Promise<CheckResult[]>;
|
|
86
|
+
/**
|
|
87
|
+
* Fetch run logs for a GitHub Actions run
|
|
88
|
+
*
|
|
89
|
+
* @param runId - GitHub run ID
|
|
90
|
+
* @returns Raw log output
|
|
91
|
+
*/
|
|
92
|
+
fetchRunLogs(runId: number): Promise<string>;
|
|
93
|
+
/**
|
|
94
|
+
* Fetch details for a specific GitHub Actions run
|
|
95
|
+
*
|
|
96
|
+
* Useful for watching specific failed runs to test extraction.
|
|
97
|
+
*
|
|
98
|
+
* @param runId - GitHub run ID
|
|
99
|
+
* @returns Run details
|
|
100
|
+
*/
|
|
101
|
+
fetchRunDetails(runId: number): Promise<RunDetails>;
|
|
102
|
+
/**
|
|
103
|
+
* Fetch all workflow runs for a PR
|
|
104
|
+
*
|
|
105
|
+
* @param prNumber - PR number
|
|
106
|
+
* @returns List of workflow runs
|
|
107
|
+
*/
|
|
108
|
+
fetchRunsForPR(prNumber: number): Promise<Array<{
|
|
109
|
+
run_id: number;
|
|
110
|
+
workflow_name: string;
|
|
111
|
+
status: string;
|
|
112
|
+
conclusion: string | null;
|
|
113
|
+
started_at: string;
|
|
114
|
+
}>>;
|
|
115
|
+
/**
|
|
116
|
+
* Fetch file changes for a PR
|
|
117
|
+
*
|
|
118
|
+
* Uses git diff --numstat to get file change statistics.
|
|
119
|
+
*
|
|
120
|
+
* @param _prNumber - PR number (unused - we use git diff from current branch)
|
|
121
|
+
* @returns File change context
|
|
122
|
+
*/
|
|
123
|
+
fetchFileChanges(_prNumber: number): Promise<ChangesContext>;
|
|
124
|
+
/**
|
|
125
|
+
* Classify check type
|
|
126
|
+
*
|
|
127
|
+
* @param check - Check object from GitHub API
|
|
128
|
+
* @returns 'CheckRun' or 'StatusContext'
|
|
129
|
+
*/
|
|
130
|
+
private classifyCheck;
|
|
131
|
+
/**
|
|
132
|
+
* Map CheckRun to internal CheckResult
|
|
133
|
+
*
|
|
134
|
+
* @param check - CheckRun from GitHub API
|
|
135
|
+
* @returns CheckResult
|
|
136
|
+
*/
|
|
137
|
+
private mapCheckRun;
|
|
138
|
+
/**
|
|
139
|
+
* Map StatusContext to internal CheckResult
|
|
140
|
+
*
|
|
141
|
+
* @param check - StatusContext from GitHub API
|
|
142
|
+
* @returns CheckResult
|
|
143
|
+
*/
|
|
144
|
+
private mapStatusContext;
|
|
145
|
+
/**
|
|
146
|
+
* Extract run ID from GitHub Actions URL
|
|
147
|
+
*
|
|
148
|
+
* @param url - GitHub Actions URL
|
|
149
|
+
* @returns Run ID or null
|
|
150
|
+
*/
|
|
151
|
+
private extractRunId;
|
|
152
|
+
/**
|
|
153
|
+
* Extract workflow name from check name
|
|
154
|
+
*
|
|
155
|
+
* @param checkName - Check name (e.g., "CI / Build")
|
|
156
|
+
* @returns Workflow name
|
|
157
|
+
*/
|
|
158
|
+
private extractWorkflowName;
|
|
159
|
+
/**
|
|
160
|
+
* Calculate duration between two timestamps
|
|
161
|
+
*
|
|
162
|
+
* @param start - Start time (ISO 8601)
|
|
163
|
+
* @param end - End time (ISO 8601, optional - defaults to now)
|
|
164
|
+
* @returns Human-readable duration (e.g., "2m30s")
|
|
165
|
+
*/
|
|
166
|
+
private calculateDuration;
|
|
167
|
+
/**
|
|
168
|
+
* Normalize GitHub status to CheckStatus
|
|
169
|
+
*
|
|
170
|
+
* @param status - GitHub status
|
|
171
|
+
* @returns CheckStatus
|
|
172
|
+
*/
|
|
173
|
+
private normalizeStatus;
|
|
174
|
+
/**
|
|
175
|
+
* Normalize GitHub conclusion to CheckConclusion
|
|
176
|
+
*
|
|
177
|
+
* @param conclusion - GitHub conclusion
|
|
178
|
+
* @returns CheckConclusion
|
|
179
|
+
*/
|
|
180
|
+
private normalizeConclusion;
|
|
181
|
+
/**
|
|
182
|
+
* Normalize StatusContext state to CheckConclusion
|
|
183
|
+
*
|
|
184
|
+
* @param state - StatusContext state
|
|
185
|
+
* @returns CheckConclusion
|
|
186
|
+
*/
|
|
187
|
+
private normalizeStatusContextState;
|
|
188
|
+
/**
|
|
189
|
+
* Normalize merge state status
|
|
190
|
+
*
|
|
191
|
+
* @param status - GitHub merge state status
|
|
192
|
+
* @returns MergeStateStatus
|
|
193
|
+
*/
|
|
194
|
+
private normalizeMergeStateStatus;
|
|
195
|
+
/**
|
|
196
|
+
* Extract linked issues from closing issues references
|
|
197
|
+
*
|
|
198
|
+
* @param closingIssuesReferences - Closing issues references from GitHub API
|
|
199
|
+
* @returns Linked issues
|
|
200
|
+
*/
|
|
201
|
+
private extractLinkedIssues;
|
|
202
|
+
/**
|
|
203
|
+
* Detect provider from check name
|
|
204
|
+
*
|
|
205
|
+
* @param checkName - Check name
|
|
206
|
+
* @returns Provider name
|
|
207
|
+
*/
|
|
208
|
+
private detectProvider;
|
|
209
|
+
}
|
|
210
|
+
//# sourceMappingURL=github-fetcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-fetcher.d.ts","sourceRoot":"","sources":["../../src/services/github-fetcher.ts"],"names":[],"mappings":"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"}
|