6a493760cf
* refactor: move and rename the interfaces/classes closes #272 * docs: update the readme and action to describe the new options for milestones * refactor: split the tests into multiple files * feat(milestones): add new options to exempt all milestones * test: add coverage for the default values * test(milestones): add more coverage (wip) * test(milestones): add more coverage for the multiple exempt milestones * test: reduce duplicated code * test: change some describes * test: add more coverage * test: add more coverage * test: add final coverage * build(tsc): add missing project flag to build with the right tsconfig * test(milestones): use each to reduce the complexity of the tests * chore: fix an eslint issue with prettier on windows the end of line was wrong each time the os process the files * docs: move the contribution section to a dedicated file add more content to help the debug * chore: make sure the rebase is ok
94 lines
2.5 KiB
TypeScript
94 lines
2.5 KiB
TypeScript
import deburr from 'lodash.deburr';
|
|
import {wordsToList} from '../functions/words-to-list';
|
|
import {IIssuesProcessorOptions} from '../interfaces/issues-processor-options';
|
|
import {Issue} from './issue';
|
|
|
|
type CleanMilestone = string;
|
|
|
|
export class Milestones {
|
|
private static _cleanMilestone(label: Readonly<string>): CleanMilestone {
|
|
return deburr(label.toLowerCase());
|
|
}
|
|
|
|
private readonly _options: IIssuesProcessorOptions;
|
|
private readonly _issue: Issue;
|
|
|
|
constructor(options: Readonly<IIssuesProcessorOptions>, issue: Issue) {
|
|
this._options = options;
|
|
this._issue = issue;
|
|
}
|
|
|
|
shouldExemptMilestones(): boolean {
|
|
if (this._shouldExemptAllMilestones()) {
|
|
return true;
|
|
}
|
|
|
|
const exemptMilestones: string[] = this._getExemptMilestones();
|
|
|
|
return exemptMilestones.some((exemptMilestone: Readonly<string>): boolean =>
|
|
this._hasMilestone(exemptMilestone)
|
|
);
|
|
}
|
|
|
|
private _getExemptMilestones(): string[] {
|
|
return wordsToList(
|
|
this._issue.isPullRequest
|
|
? this._getExemptPullRequestMilestones()
|
|
: this._getExemptIssueMilestones()
|
|
);
|
|
}
|
|
|
|
private _getExemptIssueMilestones(): string {
|
|
return this._options.exemptIssueMilestones !== ''
|
|
? this._options.exemptIssueMilestones
|
|
: this._options.exemptMilestones;
|
|
}
|
|
|
|
private _getExemptPullRequestMilestones(): string {
|
|
return this._options.exemptPrMilestones !== ''
|
|
? this._options.exemptPrMilestones
|
|
: this._options.exemptMilestones;
|
|
}
|
|
|
|
private _hasMilestone(milestone: Readonly<string>): boolean {
|
|
if (!this._issue.milestone) {
|
|
return false;
|
|
}
|
|
|
|
return (
|
|
Milestones._cleanMilestone(milestone) ===
|
|
Milestones._cleanMilestone(this._issue.milestone.title)
|
|
);
|
|
}
|
|
|
|
private _shouldExemptAllMilestones(): boolean {
|
|
if (this._issue.milestone) {
|
|
return this._issue.isPullRequest
|
|
? this._shouldExemptAllPullRequestMilestones()
|
|
: this._shouldExemptAllIssueMilestones();
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
private _shouldExemptAllIssueMilestones(): boolean {
|
|
if (this._options.exemptAllIssueMilestones === true) {
|
|
return true;
|
|
} else if (this._options.exemptAllIssueMilestones === false) {
|
|
return false;
|
|
}
|
|
|
|
return this._options.exemptAllMilestones;
|
|
}
|
|
|
|
private _shouldExemptAllPullRequestMilestones(): boolean {
|
|
if (this._options.exemptAllPrMilestones === true) {
|
|
return true;
|
|
} else if (this._options.exemptAllPrMilestones === false) {
|
|
return false;
|
|
}
|
|
|
|
return this._options.exemptAllMilestones;
|
|
}
|
|
}
|