modded7/tools/tasks/changelog/definitions.ts
tracer4b b526677126 Questbook Update + Buildscript Improvements (#681)
[EXPAND]
[[messages]]
messageTitle = "QB Update for GT 2.8 (#681)"
messageBody = """
[QB]
[DETAILS]
details = ["Fixes many Quest Book issues", "Updates QB with changes in GT 2.8"]
[DETAILS]
"""

[[messages]]
messageTitle = "Buildscript Refactor (#681)"
messageBody = """
[INTERNAL]
[DETAILS]
details = ["**Important: Buildscript has changed from `npx gulp...` or `gulp...` to `npm run gulp...`**!", "Moves to Node 16 Package Management + Typescript Strict Mode", "New Port QB, Check QB and Fix QB Tasks"]
[DETAILS]
"""
[EXPAND]


Co-authored-by: Integer Limit <103940576+IntegerLimit@users.noreply.github.com>
Co-authored-by: Ghzdude <44148655+ghzdude@users.noreply.github.com>
Co-authored-by: SparkedTheorem <162088357+SparkedTheorem@users.noreply.github.com>
2024-05-14 21:57:00 +10:00

308 lines
8.7 KiB
TypeScript

import {
Category,
Commit,
FixUpInfo,
IgnoreCheck,
Ignored,
IgnoreLogic,
Parser,
SubCategory,
} from "#types/changelogTypes.ts";
import { modpackManifest } from "#globals";
import { parseCommitBody } from "./parser.ts";
import { parseFixUp } from "./specialParser.ts";
/* Values */
export const defaultIndentation = "";
export const indentationLevel = " ";
/*
Link to the repo, with a slash at the end.
All URLs will be appended to this.
*/
export const repoLink = "https://github.com/Nomi-CEu/Nomi-CEu/";
/* Keys */
/* Special Handling Keys */
export const skipKey = "[SKIP]";
export const expandKey = "[EXPAND]";
export const expandList = "messages";
export const detailsKey = "[DETAILS]";
export const detailsList = "details";
export const detailsRoot = "detail";
export const noCategoryKey = "[NO CATEGORY]";
export const combineKey = "[COMBINE]";
export const combineList = "commits";
export const combineRoot = "commit";
export const fixUpKey = "[FIXUP]";
export const fixUpList = "fixes";
export const ignoreKey = "[IGNORE]";
export const modInfoKey = "[MOD INFO]";
export const modInfoList = "infos";
export const priorityKey = "[PRIORITY]";
/* Sub Category Keys */
// Mode Category Keys
const normalMode: SubCategory = { commitKey: "[NM]", keyName: "Normal Mode" };
const hardMode: SubCategory = { commitKey: "[HM]", keyName: "Hard Mode" };
/* Misc Sub Category Keys */
const qolChanges: SubCategory = {
commitKey: "[QOL]",
keyName: "Quality of Life",
};
/* Set Sub Categories (Sub Categories that do not let any commit in) */
const bothModes: SubCategory = { keyName: "Both Modes" };
const modUpdates: SubCategory = { keyName: "Mod Updates" };
const modAdditions: SubCategory = { keyName: "Mod Additions" };
const modRemovals: SubCategory = { keyName: "Mod Removals" };
/* Default Sub Categories (Sub Categories that allow any commit in) */
const emptySubCategory: SubCategory = { commitKey: "", keyName: "" };
const other: SubCategory = { commitKey: "", keyName: "Other" };
/* Category Keys: */
const breakingCategory: Category = {
commitKey: "[BREAKING]",
categoryName: "Breaking Changes",
defaultSubCategory: emptySubCategory,
subCategories: [emptySubCategory],
};
const balancingCategory: Category = {
commitKey: "[BALANCING]",
categoryName: "Balancing Changes",
defaultSubCategory: bothModes,
subCategories: [bothModes, normalMode, hardMode],
};
const performanceCategory: Category = {
commitKey: "[PERFORMANCE]",
categoryName: "Performance Improvements",
defaultSubCategory: emptySubCategory,
subCategories: [emptySubCategory],
};
const featureCategory: Category = {
commitKey: "[FEATURE]",
categoryName: "Feature Additions",
defaultSubCategory: bothModes,
subCategories: [qolChanges, bothModes, normalMode, hardMode],
};
const questBookCategory: Category = {
commitKey: "[QB]",
categoryName: "Quest Book Changes",
defaultSubCategory: bothModes,
subCategories: [bothModes, normalMode, hardMode],
};
const bugCategory: Category = {
commitKey: "[BUG]",
categoryName: "Bug Fixes",
defaultSubCategory: bothModes,
subCategories: [bothModes, normalMode, hardMode],
};
const generalCategory: Category = {
commitKey: "[GENERAL]",
categoryName: "General Changes",
defaultSubCategory: other,
subCategories: [modUpdates, modAdditions, modRemovals, other],
};
const internalCategory: Category = {
commitKey: "[INTERNAL]",
categoryName: "Internal Changes",
defaultSubCategory: emptySubCategory,
subCategories: [emptySubCategory],
};
/**
* Category List
* <p>
* The order that the categories appear here will be the order that they appear in the changelog, and their priority.
*/
export const categories: Category[] = [
breakingCategory,
balancingCategory,
performanceCategory,
featureCategory,
questBookCategory,
bugCategory,
generalCategory,
internalCategory,
];
/* Parsing Util Methods */
const defaultSkipCallback = (
_commit: Commit,
_commitMessage: string,
commitBody?: string,
): boolean => {
if (!commitBody) return false;
return commitBody.includes(skipKey);
};
const defaultParsingCallback = async (
parser: Parser,
commit: Commit,
commitMessage: string,
commitBody?: string,
): Promise<boolean | Ignored> => {
if (!commitBody) return false;
return parseCommitBody(commitMessage, commitBody, commit, parser);
};
/* Parsing Categories */
const fixupParsing: Parser = {
skipCallback: () => false,
// No need to care about message/body, never parse expand/details commits
itemCallback: (
_parser,
commit,
_commitMessage: string,
_commitBody?: string,
fix?: FixUpInfo,
) => parseFixUp(commit, fix),
addCommitListCallback: () => false,
addSHACallback: () => false,
// Don't apply fixup if it is not meant to apply to fixes
applyFixCalback: (fix) =>
fix.changeFixes === undefined ||
fix.changeFixes === null ||
(fix.changeFixes as boolean),
};
const overridesParsing: Parser = {
dirs: [modpackManifest.overrides],
skipCallback: defaultSkipCallback,
itemCallback: defaultParsingCallback,
leftOverCallback: (commit, commitMessage, _commitBody, subMessages) => {
generalCategory.changelogSection
?.get(generalCategory.defaultSubCategory)
?.push({
commitMessage: commitMessage,
commitObject: commit,
subChangelogMessages: subMessages,
});
},
addCommitListCallback: () => true,
};
const manifestParsing: Parser = {
dirs: ["manifest.json"],
skipCallback: defaultSkipCallback,
itemCallback: defaultParsingCallback,
addCommitListCallback: () => true,
};
const finalParsing: Parser = {
skipCallback: defaultSkipCallback,
itemCallback: defaultParsingCallback,
addCommitListCallback: (_commit, parsed) => parsed,
};
/**
* Parsers
* <p>
* The order that the categories appear here will be the order that they are parsed in.<p>
* Note that unless `addSHA` of the category is set to false, a commit parsed in a previous category will not be allowed to be parsed in future categories,
* even if they fit in the dirs.
*/
export const changelogParsers: Parser[] = [
fixupParsing,
overridesParsing,
manifestParsing,
finalParsing,
];
/* Parsing Information / Allocations for Mod Changes */
export type ModChangesType = "added" | "removed" | "updated";
/**
* An Allocation for mod changes categories to grab from.
*/
export interface ModChangesAllocation {
/**
* Category to put in.
*/
category: Category;
/**
* Sub category of the category to put in.
*/
subCategory: SubCategory;
/**
* The template to use.<p><p>
* Keys:<p>
* `{{{ modName }}}` replaced by mod name,<p>
* `{{{ oldVersion }}}` replaced by the old version (if applicable)<p>
* `{{{ newVersion }}}` replaced by the new version (if applicable)
*/
template: string;
}
// These templates must be triple bracketed, because we don't want these to be html safe
export const modChangesAllocations: Record<
ModChangesType,
ModChangesAllocation
> = {
added: {
category: generalCategory,
subCategory: modAdditions,
template: "{{{ modName }}}: *v{{{ newVersion }}}*",
},
updated: {
category: generalCategory,
subCategory: modUpdates,
template: "{{{ modName }}}: *v{{{ oldVersion }}} ⇥ v{{{ newVersion }}}*",
},
removed: {
category: generalCategory,
subCategory: modRemovals,
template: "{{{ modName }}}: *v{{{ oldVersion }}}*",
},
};
// Ignore Allocations
/* Ignore Checks */
const targetBeforeCheck: IgnoreCheck = (tag, data) => !data.tags.has(tag);
const targetAfterCheck: IgnoreCheck = (tag, data) => data.tags.has(tag);
const compareBeforeCheck: IgnoreCheck = (tag, data) =>
!data.compareTags.has(tag);
const compareAfterCheck: IgnoreCheck = (tag, data) => data.compareTags.has(tag);
const compareIsCheck: IgnoreCheck = (tag, data) => data.since === tag;
const compareNotCheck: IgnoreCheck = (tag, data) => data.since !== tag;
const targetIsCheck: IgnoreCheck = (tag, data) => data.to === tag;
const targetNotCheck: IgnoreCheck = (tag, data) => data.to !== tag;
/* Ignore Checks Map */
export const ignoreChecks: Record<string, IgnoreCheck> = {
targetBefore: targetBeforeCheck,
targetAfter: targetAfterCheck,
compareBefore: compareBeforeCheck,
compareAfter: compareAfterCheck,
compareIs: compareIsCheck,
compareNot: compareNotCheck,
targetIs: targetIsCheck,
targetNot: targetNotCheck,
};
/* Ignore Logic */
const andLogic: IgnoreLogic = (checkResults) =>
checkResults.filter((result) => !result).length === 0;
const orLogic: IgnoreLogic = (checkResults) =>
checkResults.filter((result) => result).length > 0;
const nandLogic: IgnoreLogic = (checkResults) => !andLogic(checkResults);
const norLogic: IgnoreLogic = (checkResults) => !orLogic(checkResults);
/* Ignore Logic Map */
export const ignoreLogics: Record<string, IgnoreLogic> = {
and: andLogic,
or: orLogic,
nand: nandLogic,
nor: norLogic,
};
/* Default Ignore Logic */
export const defaultIgnoreLogic: IgnoreLogic = andLogic;