Add "Playing It Safe" draft and improve type-checking

- Remove most type assertions and improve types
- Validate wordCount property
- Add "Vore Day" tag
- Add licenses
This commit is contained in:
Bad Manners 2024-08-03 20:33:49 -03:00
parent 17ef8c652c
commit fe908a4989
37 changed files with 1309 additions and 841 deletions

View file

@ -84,7 +84,8 @@ function getUsernameForWebsite(user: CollectionEntry<"users">, website: Website)
}
break;
default:
throw new Error(`Unhandled Website "${website}"`);
let _: never = website;
throw new Error(`Unhandled website "${website}"`);
}
} else {
return link[1].replace(/^@/, "");
@ -174,9 +175,9 @@ export const getStaticPaths: GetStaticPaths = async () => {
export const GET: APIRoute<Props, Params> = async ({ props: { story }, site }) => {
const { lang } = story.data;
const copyrightedCharacters = await formatCopyrightedCharacters(story.data.copyrightedCharacters);
const authorsList = await getEntries([story.data.authors].flat());
const commissioner = story.data.commissioner && (await getEntry(story.data.commissioner));
const requester = story.data.requester && (await getEntry(story.data.requester));
const authorsList = await getEntries(story.data.authors);
const commissionersList = story.data.commissioner && (await getEntries(story.data.commissioner));
const requestersList = story.data.requester && (await getEntries(story.data.requester));
const description = Object.fromEntries(
WEBSITE_LIST.map<[ExportWebsiteName, string]>(({ website, exportFormat }) => {
@ -185,14 +186,24 @@ export const GET: APIRoute<Props, Params> = async ({ props: { story }, site }) =
const storyDescription = (
[
story.data.description,
`*${t(lang, "story/warnings", story.data.wordCount, story.data.contentWarning.trim())}*`,
`*${t(lang, "story/warnings", story.data.wordCount, story.data.contentWarning)}*`,
t(
lang,
"export_story/writing",
authorsList.map((author) => u(author)),
),
requester && t(lang, "export_story/request_for", u(requester)),
commissioner && t(lang, "export_story/commissioned_by", u(commissioner)),
requestersList &&
t(
lang,
"export_story/request_for",
requestersList.map((requester) => u(requester)),
),
commissionersList &&
t(
lang,
"export_story/commissioned_by",
commissionersList.map((commissioner) => u(commissioner)),
),
...copyrightedCharacters.map(([user, characterList]) =>
characterList[0] == ""
? t(lang, "characters/all_characters_are_copyrighted_by", u(user))
@ -206,12 +217,7 @@ export const GET: APIRoute<Props, Params> = async ({ props: { story }, site }) =
(_, group1, group2) => `[${group1}](${new URL(group2, site).toString()})`,
);
if (exportFormat === "bbcode") {
return [
website,
markdownToBbcode(storyDescription)
.replaceAll(/\n\n\n+/g, "\n\n")
.trim(),
];
return [website, markdownToBbcode(storyDescription).replaceAll(/\n\n\n+/g, "\n\n")];
} else if (exportFormat === "markdown") {
return [website, storyDescription.replaceAll(/\n\n\n+/g, "\n\n").trim()];
} else {
@ -227,8 +233,20 @@ export const GET: APIRoute<Props, Params> = async ({ props: { story }, site }) =
"story/authors",
authorsList.map((author) => getUsernameForLang(author, lang)),
)}\n` +
(commissioner ? `${t(lang, "story/commissioned_by", getUsernameForLang(commissioner, lang))}\n` : "") +
(requester ? `${t(lang, "story/requested_by", getUsernameForLang(requester, lang))}\n` : "");
(requestersList
? `${t(
lang,
"story/requested_by",
requestersList.map((requester) => getUsernameForLang(requester, lang)),
)}\n`
: "") +
(commissionersList
? `${t(
lang,
"story/commissioned_by",
commissionersList.map((commissioner) => getUsernameForLang(commissioner, lang)),
)}\n`
: "");
const storyText = `${storyHeader}\n===\n\n${story.body.replaceAll(/\\([=*])/g, "$1")}`
.replaceAll(/\n\n\n+/g, "\n\n")