@issue-linker/core
Version:
Core library for issue-linker functionality
116 lines • 5.15 kB
JavaScript
// Application layer - Use case for checking issue references in text
import * as v from "valibot";
import { createErrorResult, createExcludedResult, createInvalidResult, createNoIssuesResult, createSkippedResult, createValidResult, } from "../domain/result-factory.js";
import { CheckMessageArgsSchema, } from "../domain/validation-schemas.js";
import { getGitHubToken } from "../infrastructure/env-accessor.js";
import { getGitRemoteUrl } from "../infrastructure/git-client.js";
import { parseRepositoryFromGitUrl } from "../infrastructure/git-url-parser.js";
import { getIssue } from "../infrastructure/github-client.js";
import { findIssueNumbers } from "../infrastructure/issue-finder.js";
import { parseRepositoryString } from "../infrastructure/repository-parser.js";
import { findSkipMarker } from "../infrastructure/skip-marker-checker.js";
import { isIssueStateAllowed, shouldExclude, } from "../infrastructure/validation-matcher.js";
/**
* Main use case for checking if text contains valid issue numbers
* @param args - Arguments for the check
* @returns Result of the check
*/
export async function checkMessage(args) {
// Step 1: Validate args
const validationResult = v.safeParse(CheckMessageArgsSchema, args);
if (!validationResult.success) {
const input = {
text: args.text ?? "",
checkMode: "default",
issueStatus: "all",
repo: "",
...(args.actionMode && { actionMode: args.actionMode }),
};
const error = new Error(validationResult.issues[0]?.message ?? "Invalid arguments provided");
return createErrorResult(error, input);
}
const validatedArgs = validationResult.output;
const checkMode = validatedArgs.checkMode;
const issueStatus = validatedArgs.issueStatus;
try {
// Get repository information early for input config
const repository = validatedArgs.repo
? parseRepositoryString(validatedArgs.repo)
: parseRepositoryFromGitUrl(await getGitRemoteUrl());
const repo = `${repository.owner}/${repository.repo}`;
// Build input config
const input = {
text: validatedArgs.text,
checkMode,
...(validatedArgs.extract && { extract: validatedArgs.extract }),
...(validatedArgs.exclude && { exclude: validatedArgs.exclude }),
issueStatus,
repo: repo,
...(validatedArgs.actionMode && { actionMode: validatedArgs.actionMode }),
};
// Step 2: Check for skip markers
const skipMarker = findSkipMarker(validatedArgs.text);
if (skipMarker) {
return createSkippedResult(input, skipMarker);
}
// Step 3: Check exclusion
const excludeResult = shouldExclude(validatedArgs.text, checkMode, validatedArgs.exclude);
if (excludeResult.excluded) {
return createExcludedResult(input, excludeResult.pattern);
}
// Step 4: Find issue numbers
const issueNumbers = findIssueNumbers(validatedArgs.text, checkMode, validatedArgs.extract);
if (issueNumbers.length === 0) {
return createNoIssuesResult(input);
}
// Step 5: Validate each issue number
const githubToken = validatedArgs.githubToken ?? getGitHubToken();
const validIssues = [];
const notFoundIssues = [];
const wrongStateIssues = [];
for (const issueNumber of issueNumbers) {
const result = await getIssue(repository.owner, repository.repo, issueNumber, githubToken, validatedArgs.hostname);
if (!result.found) {
notFoundIssues.push(issueNumber);
}
else if (result.issue &&
!isIssueStateAllowed(result.issue.state, issueStatus)) {
wrongStateIssues.push({
number: issueNumber,
actualState: result.issue.state,
});
}
else if (result.issue) {
validIssues.push(issueNumber);
}
}
// Step 6: Create result based on findings
const issues = {
found: issueNumbers,
valid: validIssues,
notFound: notFoundIssues,
wrongState: wrongStateIssues,
};
if (validIssues.length > 0 &&
notFoundIssues.length === 0 &&
wrongStateIssues.length === 0) {
return createValidResult(issues, input);
}
else {
return createInvalidResult(issues, input);
}
}
catch (error) {
// Error handling - create minimal input config if we don't have repo info yet
const input = {
text: validatedArgs.text,
checkMode,
...(validatedArgs.exclude && { exclude: validatedArgs.exclude }),
issueStatus,
repo: validatedArgs.repo ?? "",
...(validatedArgs.actionMode && { actionMode: validatedArgs.actionMode }),
};
return createErrorResult(error, input);
}
}
//# sourceMappingURL=check-message-use-case.js.map