@yamlresume/core 0.4.2 → 0.5.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/index.d.ts +4186 -460
- package/dist/index.js +84 -83
- package/dist/index.js.map +1 -1
- package/dist/magic-string.es-PGO5ZCT3.js +14 -0
- package/dist/magic-string.es-PGO5ZCT3.js.map +1 -0
- package/package.json +3 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils/object.ts","../src/utils/date.ts","../src/utils/tex.ts","../src/utils/string.ts","../src/compiler/codegen/latex.ts","../src/compiler/parser/markdown.ts","../src/data/country.ts","../src/data/resume.ts","../src/errors/error.ts","../src/translations/options.ts","../src/translations/template.ts","../src/preprocess/transform.ts","../src/renderer/base.ts","../src/renderer/preamble.ts","../src/renderer/moderncv.ts","../src/renderer/resume.ts","../src/types/resume.ts"],"names":["isEmptyValue","value","removeKeysFromObject","obj","keysToRemove","transform","result","key","isObject","collectAllKeys","keys","visited","item","parseDate","dateStr","date","localizeDate","language","options","getDateRange","startDate","endDate","oneDay","nowInUTCSeconds","epochSecondsToLocaleDateString","epochTime","locale","milliSecondsToSeconds","ms","escapeLatex","rawEscapeLatex","isEmptyString","showIf","predicate","content","joinNonEmptyString","codes","separator","code","toCodeBlock","lang","LatexCodeGenerator","node","nodeToTeX","bulletListNodeToTeX","docNodeToTeX","listItemNodeToTeX","orderedListNodeToTeX","paragraphNodeToTeX","textNodeToTeX","fragmentToTeX","itemContent","escapedText","text","mark","applyMarkToText","fragment","MarkdownParser","input","ast","unified","remarkParse","marks","child","boldMark","processChildrenWithMarks","italicMark","linkMark","children","transformedNodes","EnglishCountryNames","SimplifiedChineseCountryNames","TraditionalChineseCountryHKNames","TraditionalChineseCountryTWNames","SpanishCountryNames","DEGREE_OPTIONS","LANGUAGE_OPTIONS","LANGUAGE_FLUENCIE_OPTIONS","SKILL_LEVEL_OPTIONS","TEMPLATE_OPTIONS","getTemplateOptionDetail","templateOption","templateOptionName","resumeItems","defaultResumeContent","filledResumeContent","fontSizeOptions","defaultTopBottomMargin","defaultLeftRightMargin","marginOptions","LOCALE_LANGUAGE_OPTIONS","getLocaleLanguageOptionDetail","localeLanguage","localeLanguageOptionName","defaultLanguage","defaultResumeLayout","defaultResume","filledResume","ErrorCategory","ErrorType","YAMLResumeError","params","error","message","_","getOptionTranslation","category","option","get","PUNCTUATIONS","TERMS","getTemplateTranslations","replaceBlankLinesWithPercent","transformSectionsWithDefaultValues","resume","merge","transformResumeValues","transformResumeSectionValues","index","transformResumeSectionComputedValues","sectionResumeComputed","sectionResumeItem","transformEducationCourses","transformEducationDegreeAreaAndScore","colon","comma","score","degree","transformKeywords","section","isArray","transformDate","transformEndDate","transformLanguage","transformLocation","country","postalCodeAndAddress","regionAndCountry","fullAddress","regionCountryAndPostalCode","transformBasicsUrl","basicsLink","transformProfileUrls","getFaIcon","network","capitalize","transformSkills","level","transformSocialLinks","link","transformSectionNames","translations","sectionName","transformSummary","summaryParser","summary","transformResumeContent","tranformFunc","transformResumeLayoutWithDefaultValues","cloneDeep","transformResumeLayoutTypography","transformResumeLayout","transformFunc","transformResume","Renderer","isCJKResume","isSpanishResume","normalizeUnit","renderDocumentClassConfig","documentClass","fontSize","renderModerncvOverride","style","renderModerncvConfig","renderLayoutConfig","top","bottom","left","right","showPageNumbers","t","b","l","r","renderCTeXConfig","_resume","renderSpanishConfig","renderFontspecConfig","numbers","linuxLibertineFont","linuxLibertineOFont","ModerncvBase","name","headline","phone","email","urls","sectionNames","education","layout","terms","dateRange","degreeAreaAndScore","courses","institution","url","work","keywords","position","languages","fluency","skills","awards","awarder","title","certificates","issuer","publications","releaseDate","publisher","references","relationship","description","organization","ModerncvBankingRenderer","ModerncvCasualRenderer","ModerncvClassicRenderer","RESUME_RENDERER_MAP","getResumeRenderer","template","SECTION_IDS","FONT_SPEC_NUMBERS_STYLE_OPTIONS"],"mappings":"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C,EAAiB,CAAA,CAC5B,eACA,CAAA,aAAA,CACA,UACA,WACA,CAAA,UAAA,CACA,QACA,CAAA,QACF,EAcaC,EAAmB,CAAA,CAC9B,WACA,CAAA,UAAA,CACA,UACA,QACA,CAAA,aAAA,CACA,YACA,CAAA,SAAA,CACA,WACA,WACA,CAAA,SAAA,CACA,WACA,CAAA,SAAA,CACA,UACA,UACA,CAAA,OAAA,CACA,QACA,CAAA,OAAA,CACA,UACA,UACA,CAAA,OAAA,CACA,UACA,CAAA,SAAA,CACA,SACA,QACA,CAAA,OAAA,CACA,UACA,CAAA,OAAA,CACA,QACA,CAAA,OAAA,CACA,WACA,CAAA,WAAA,CACA,OACA,YACA,CAAA,OAAA,CACA,SACA,CAAA,UAAA,CACA,WACA,QACA,CAAA,OAAA,CACA,QACA,CAAA,QAAA,CACA,UACA,YACA,CAAA,OAAA,CACA,UACA,CAAA,SAAA,CACA,SACA,WACA,CAAA,OAAA,CACA,QACA,CAAA,QAAA,CACA,aACA,UACA,CAAA,SAAA,CACA,SACA,CAAA,OAAA,CACA,UACA,QACA,CAAA,SAAA,CACA,QACA,CAAA,SAAA,CACA,YACA,SACA,CAAA,SAAA,CACA,SACA,CAAA,OAAA,CACA,QACA,CAAA,MAAA,CACA,SACA,CAAA,WAAA,CACA,OACA,OACA,CAAA,YAAA,CACA,QACA,CAAA,MACF,EASaC,EAA4B,CAAA,CACvC,wBACA,CAAA,6BAAA,CACA,mCACA,+BACA,CAAA,iCACF,CASaC,CAAAA,EAAAA,CAAsB,CACjC,QACA,CAAA,UAAA,CACA,cACA,CAAA,UAAA,CACA,SACA,QACF,CAAA,CAKaC,EAAmB,CAAA,CAC9B,mBACA,iBACA,CAAA,kBACF,EAIO,SAASC,GAAwBC,CAAgC,CAAA,CACtE,IAAMC,CAAAA,CAGF,CACF,kBAAA,CAAoB,CAClB,IAAA,CAAM,mBACN,WAAa,CAAA,sCACf,CACA,CAAA,iBAAA,CAAmB,CACjB,IAAM,CAAA,iBAAA,CACN,WAAa,CAAA,qCACf,EACA,kBAAoB,CAAA,CAClB,IAAM,CAAA,kBAAA,CACN,YAA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","file":"index.js","sourcesContent":["/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isObject, transform } from 'lodash-es'\n\n/**\n * Check if a value is empty\n *\n * Empty values include `undefined`, `null`, empty object and empty string\n *\n * @param value - value to check\n * @returns True if value is empty, false otherwise\n *\n * @see {@link https://stackoverflow.com/a/43233163}\n */\nexport function isEmptyValue(value: undefined | null | object | string) {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n )\n}\n\n/**\n * Remove keys from an object by their names\n *\n * @param obj - The object to remove keys from\n * @param keysToRemove - The keys to remove\n * @returns The object with the specified keys removed\n */\nexport function removeKeysFromObject<T extends object>(\n obj: T,\n keysToRemove: (string | number | symbol)[]\n): T {\n return transform(\n obj,\n (result, value: unknown, key: number | string | symbol) => {\n if (keysToRemove.includes(key)) return\n\n result[key] = isObject(value)\n ? removeKeysFromObject(value, keysToRemove)\n : value\n }\n )\n}\n\n/**\n * Tree walker function to collect all possible keys from an object recursively\n *\n * This function traverses an object tree and collects all property keys at any\n * depth. It handles arrays, nested objects, and prevents infinite loops from\n * circular references.\n *\n * @param obj - The object to walk through\n * @param keys - Set to collect all keys (optional, used for recursion)\n * @param visited - Set to track visited objects to prevent circular references\n * (optional, used for recursion)\n * @returns Set containing all keys found in the object tree\n *\n * @example\n * ```typescript\n * const obj = {\n * a: 1,\n * b: {\n * c: 2,\n * d: [{ e: 3 }]\n * }\n * }\n * const keys = collectAllKeys(obj)\n * // keys will contain: Set(['a', 'b', 'c', 'd', 'e'])\n * ```\n */\nexport function collectAllKeys(\n obj: unknown,\n keys: Set<string | number | symbol> = new Set(),\n visited: WeakSet<object> = new WeakSet()\n): Set<string | number | symbol> {\n if (obj === null || obj === undefined) {\n return keys\n }\n\n if (typeof obj === 'object') {\n // Prevent circular references\n if (visited.has(obj as object)) {\n return keys\n }\n visited.add(obj as object)\n\n if (Array.isArray(obj)) {\n // For arrays, collect keys from each element\n obj.forEach((item) => {\n collectAllKeys(item, keys, visited)\n })\n } else {\n // For objects, collect all property keys and recurse into values\n Object.keys(obj).forEach((key) => {\n keys.add(key)\n collectAllKeys((obj as Record<string, unknown>)[key], keys, visited)\n })\n }\n }\n\n return keys\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguageOption } from '@/data'\nimport { isEmptyValue } from './object'\n\n/**\n * Parse date from a string\n *\n * @param dateStr - date string, `null` or `undefined`\n * @returns Date object if parse success, otherwise `null`\n */\nexport function parseDate(dateStr: string | undefined | null): Date | null {\n if (isEmptyValue(dateStr)) return null\n\n try {\n const date = new Date(dateStr)\n // MDN says that date parsing may return NaN or raise exceptions, ref:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_date\n return Number.isNaN(date.getTime()) ? null : date\n } catch (e) {\n return null\n }\n}\n\n/**\n * Localize a date string to a specific language.\n *\n * @param date - The date string to localize.\n * @param language - The language to localize the date string to.\n * @returns The localized date string.\n */\nexport function localizeDate(\n date: string,\n language: LocaleLanguageOption | string\n): string {\n if (date === '') {\n return ''\n }\n\n // For resumes, we only care about the year and month\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n }\n\n return new Date(date).toLocaleDateString(\n isEmptyValue(language) ? 'en' : language,\n options\n )\n}\n\n/**\n * Get the date range for a given start and end date.\n *\n * @param startDate - The start date.\n * @param endDate - The end date.\n * @param language - The language to localize the date string to.\n * @returns The date range.\n */\nexport function getDateRange(\n startDate: string,\n endDate: string,\n language: LocaleLanguageOption\n): string {\n if (!startDate) {\n return ''\n }\n\n if (!endDate) {\n switch (language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw':\n return `${localizeDate(startDate, language)}至今`\n case 'es':\n return `${localizeDate(startDate, language)} hasta la fecha`\n default:\n // by default we return English's \"Present\" if language is not supported\n return `${localizeDate(startDate, language)} -- Present`\n }\n }\n\n return `${localizeDate(startDate, language)} -- ${localizeDate(\n endDate,\n language\n )}`\n}\n\n/**\n * The number of seconds in one day\n */\nexport const oneDay = 24 * 60 * 60\n\n/**\n * Get the current time in UTC seconds\n *\n * @returns The current time in UTC seconds\n */\nexport function nowInUTCSeconds(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n/**\n * Generate a local date string without timestamp for a epoch time in seconds\n *\n * @param epochTime - epoch time in seconds\n * @param locale - locale for the date string\n * @returns - a human readable date string\n */\nexport function epochSecondsToLocaleDateString(\n epochTime: number,\n locale = 'en-US'\n) {\n return new Date(epochTime * 1000).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Convert milliseconds to seconds\n */\nexport function milliSecondsToSeconds(ms: number) {\n return Math.floor(ms / 1000)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport rawEscapeLatex from 'escape-latex'\n\nimport { isEmptyValue } from './object'\n\n/**\n * A wrapper around the escape-latex that handles null and undefined values.\n *\n * @param value - value to be escaped\n * @returns escaped value\n */\nexport function escapeLatex(value: string | null | undefined) {\n if (isEmptyValue(value)) {\n return value\n }\n\n return rawEscapeLatex(value)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isEmptyValue } from './object'\n\n/**\n * Check if a string is empty or only contains whitespace\n *\n * @param value - string to check\n * @returns True if string is empty or only contains whitespace, false otherwise\n */\nexport function isEmptyString(value: string) {\n return typeof value === 'string' && value.trim().length === 0\n}\n\n/**\n * Show content if predicate is true\n *\n * @param predicate - The predicate to check\n * @param content - The content to show\n * @returns The content if predicate is true, empty string otherwise\n */\nexport function showIf(predicate: boolean, content: string) {\n return predicate ? content : ''\n}\n\n/**\n * Join an array of strings , but only if the string is not empty\n *\n * @param codes - The array of strings to join\n * @param separator - The separator to join the strings with\n * @returns The joined string\n */\nexport function joinNonEmptyString(\n codes: string[],\n separator = '\\n\\n'\n): string {\n return codes.filter((code) => !isEmptyString(code)).join(separator)\n}\n\n/**\n * Convert a string to a code block in markdown format\n *\n * @param code - The string to convert\n * @param lang - The language of the code block\n * @returns The code block\n */\nexport function toCodeBlock(code?: string, lang?: string): string {\n if (isEmptyValue(code)) {\n return ''\n }\n\n return `\\`\\`\\`${lang || ''}\\n${code}\\n\\`\\`\\``\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n BulletListNode,\n DocNode,\n Fragment,\n ListItemNode,\n Mark,\n Node,\n OrderedListNode,\n ParagraphNode,\n TextNode,\n} from '@/compiler/ast'\nimport { escapeLatex } from '@/utils'\nimport type { CodeGenerator } from './interface'\n\n/**\n * Generate LaTeX code from a Node.\n *\n * This class implements the `CodeGenerator` interface and provides a method\n * to convert an AST node into its corresponding LaTeX code.\n *\n * @see {@link CodeGenerator}\n */\nexport class LatexCodeGenerator implements CodeGenerator {\n /**\n * Generate LaTeX code from an AST node.\n *\n * @param node - The AST node to generate LaTeX code from.\n * @returns The generated LaTeX code.\n */\n generate(node: Node): string {\n return nodeToTeX(node)\n }\n}\n\n/**\n * Convert an AST node to its corresponding LaTeX code.\n *\n * @param node - The AST node to convert.\n * @returns The generated LaTeX code.\n */\nexport function nodeToTeX(node: Node): string {\n switch (node.type) {\n case 'bulletList':\n return bulletListNodeToTeX(node)\n case 'doc':\n return docNodeToTeX(node)\n case 'listItem':\n return listItemNodeToTeX(node)\n case 'orderedList':\n return orderedListNodeToTeX(node)\n case 'paragraph':\n return paragraphNodeToTeX(node)\n case 'text':\n return textNodeToTeX(node)\n }\n}\n\n/**\n * Convert a bullet list node to its corresponding LaTeX code.\n *\n * @param node - The bullet list node to convert.\n * @returns The generated LaTeX code.\n */\nfunction bulletListNodeToTeX(node: BulletListNode): string {\n return `\\\\begin{itemize}\\n${fragmentToTeX(node.content)}\\\\end{itemize}\\n`\n}\n\n/**\n * Convert a document node to its corresponding LaTeX code.\n *\n * @param node - The document node to convert.\n * @returns The generated LaTeX code.\n */\nfunction docNodeToTeX(node: DocNode): string {\n return fragmentToTeX(node.content)\n}\n\n/**\n * Convert a list item node to its corresponding LaTeX code.\n *\n * @param node - The list item node to convert.\n * @returns The generated LaTeX code.\n */\nfunction listItemNodeToTeX(node: ListItemNode): string {\n const itemContent = fragmentToTeX(node.content)\n // Here we made some special handling to make the output with more prettier\n if (itemContent.includes('\\n\\n')) {\n return `\\\\item ${itemContent.replace('\\n\\n', '\\n')}`\n }\n return `\\\\item ${itemContent}`\n}\n\n/**\n * Convert an ordered list node to its corresponding LaTeX code.\n *\n * @param node - The ordered list node to convert.\n * @returns The generated LaTeX code.\n */\nfunction orderedListNodeToTeX(node: OrderedListNode): string {\n return `\\\\begin{enumerate}\\n${fragmentToTeX(node.content)}\\\\end{enumerate}\\n`\n}\n\n/**\n * Convert a paragraph node to its corresponding LaTeX code.\n *\n * @param node - The paragraph node to convert.\n * @returns The generated LaTeX code.\n */\nfunction paragraphNodeToTeX(node: ParagraphNode): string {\n if (node.content === undefined || node.content.length === 0) {\n return '\\n'\n }\n\n // We need to output two new lines to make the paragraph a real paagraph in\n // LaTeX. However if the paragraph is empty, we just output one new line,\n // check the `if` above.\n return `${fragmentToTeX(node.content)}\\n\\n`\n}\n\n/**\n * Convert a text node to its corresponding LaTeX code.\n *\n * @param node - The text node to convert.\n * @returns The generated LaTeX code.\n */\nfunction textNodeToTeX(node: TextNode): string {\n const escapedText = escapeLatex(node.text)\n\n if (node.marks === undefined) {\n return escapedText\n }\n\n return node.marks.reduce(\n (text, mark) => applyMarkToText(text, mark),\n escapedText\n )\n}\n\n/**\n * Apply a mark to a text.\n *\n * @param text - The text to apply the mark to.\n * @param mark - The mark to apply.\n */\nfunction applyMarkToText(text: string, mark: Mark) {\n switch (mark.type) {\n case 'bold':\n return `\\\\textbf{${text}}`\n case 'italic':\n return `\\\\textit{${text}}`\n case 'underline':\n return `\\\\underline{${text}}`\n case 'link':\n return `\\\\href{${mark.attrs.href}}{${text}}`\n }\n}\n\n/**\n * Convert a fragment to its corresponding LaTeX code.\n *\n * @param fragment - The fragment to convert.\n * @returns The generated LaTeX code.\n */\nfunction fragmentToTeX(fragment: Fragment): string {\n if (fragment === undefined) {\n return ''\n }\n return fragment.map((node) => nodeToTeX(node)).join('')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Root, RootContent } from 'mdast'\nimport remarkParse from 'remark-parse'\nimport { unified } from 'unified'\n\nimport type { BoldMark, ItalicMark, LinkMark, Mark, Node } from '@/compiler/ast'\nimport type { Parser } from './interface'\n\n/**\n * Parse markdown to ast node\n *\n * Under the hood this class first parse the markdown to mdast and then\n * transform the mdast to ast node.\n *\n * @see {@link Parser}\n */\nexport class MarkdownParser implements Parser {\n /**\n * Parse markdown to ast node\n *\n * @param input - The markdown input to parse\n * @returns The ast node\n */\n parse(input: string): Node {\n const ast = unified().use(remarkParse).parse(input)\n return transform(ast)\n }\n}\n\n/**\n * Transforms an mdast node (or content) into ast node(s).\n *\n * This is a recursive descent tree walker that traverses the mdast node and\n * transforms it into a ast node representation. It accumulates formatting marks\n * (like bold, italic) as it descends.\n *\n * @param ast - The mdast node (Root or RootContent) to transform.\n * @param marks - The formatting marks accumulated from parent nodes to apply.\n * Defaults to an empty array.\n * @returns The corresponding ast node, an array of ast nodes (for nodes\n * that expand like emphasis/strong), or `null` if the mdast node type isn't\n * handled.\n */\nfunction transform(ast: Root | RootContent, marks: Mark[] = []) {\n switch (ast.type) {\n case 'root':\n return {\n type: 'doc',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'paragraph':\n return {\n type: 'paragraph',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n // Text nodes get all accumulated marks applied\n case 'text':\n return {\n type: 'text',\n text: ast.value,\n ...(marks.length > 0 && {\n marks: marks,\n }),\n }\n\n // For text nodes with marks, we accumulate the mark and pass it down to\n // children\n case 'strong': {\n const boldMark: BoldMark = { type: 'bold' }\n return processChildrenWithMarks(ast.children, [...marks, boldMark])\n }\n\n case 'emphasis': {\n const italicMark: ItalicMark = { type: 'italic' }\n return processChildrenWithMarks(ast.children, [...marks, italicMark])\n }\n\n case 'link': {\n const linkMark: LinkMark = {\n type: 'link',\n attrs: {\n href: ast.url,\n target: null,\n class: null,\n },\n }\n return processChildrenWithMarks(ast.children, [...marks, linkMark])\n }\n\n case 'listItem':\n return {\n type: 'listItem',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'list':\n return {\n type: ast.ordered ? 'orderedList' : 'bulletList',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n }\n\n return null\n}\n\n/**\n * Process children with accumulated marks\n *\n * This function processes the children of a node with accumulated marks and\n * returns a flat array of transformed nodes.\n *\n * @param children - The children of the node to process.\n * @param marks - The accumulated marks to apply to the node.\n * @returns The transformed ast node if only one results from the children,\n * otherwise an array of the transformed ast nodes.\n */\nfunction processChildrenWithMarks(children: RootContent[], marks: Mark[]) {\n // Transform each child with the accumulated marks\n const transformedNodes = children\n .map((child) => transform(child, marks))\n .filter(Boolean)\n\n // If only one node is returned (common case), return it directly\n if (transformedNodes.length === 1) {\n return transformedNodes[0]\n }\n\n // If multiple nodes (e.g., complex formatting spanning multiple text nodes),\n // return them all to be added to parent's content\n return transformedNodes\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\n/**\n * All possible countries and regions in the world.\n */\nconst COUNTRY_OPTIONS = [\n 'Afghanistan',\n 'Aland Islands',\n 'Albania',\n 'Algeria',\n 'American Samoa',\n 'Andorra',\n 'Angola',\n 'Anguilla',\n 'Antarctica',\n 'Antigua And Barbuda',\n 'Argentina',\n 'Armenia',\n 'Aruba',\n 'Australia',\n 'Austria',\n 'Azerbaijan',\n 'Bahrain',\n 'Bangladesh',\n 'Barbados',\n 'Belarus',\n 'Belgium',\n 'Belize',\n 'Benin',\n 'Bermuda',\n 'Bhutan',\n 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba',\n 'Bosnia and Herzegovina',\n 'Botswana',\n 'Bouvet Island',\n 'Brazil',\n 'British Indian Ocean Territory',\n 'Brunei',\n 'Bulgaria',\n 'Burkina Faso',\n 'Burundi',\n 'Cambodia',\n 'Cameroon',\n 'Canada',\n 'Cape Verde',\n 'Cayman Islands',\n 'Central African Republic',\n 'Chad',\n 'Chile',\n 'China',\n 'Christmas Island',\n 'Cocos (Keeling) Islands',\n 'Colombia',\n 'Comoros',\n 'Congo',\n 'Cook Islands',\n 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\",\n 'Croatia',\n 'Cuba',\n 'Curaçao',\n 'Cyprus',\n 'Czech Republic',\n 'Democratic Republic of the Congo',\n 'Denmark',\n 'Djibouti',\n 'Dominica',\n 'Dominican Republic',\n 'East Timor',\n 'Ecuador',\n 'Egypt',\n 'El Salvador',\n 'Equatorial Guinea',\n 'Eritrea',\n 'Estonia',\n 'Ethiopia',\n 'Falkland Islands',\n 'Faroe Islands',\n 'Fiji Islands',\n 'Finland',\n 'France',\n 'French Guiana',\n 'French Polynesia',\n 'French Southern Territories',\n 'Gabon',\n 'Gambia The',\n 'Georgia',\n 'Germany',\n 'Ghana',\n 'Gibraltar',\n 'Greece',\n 'Greenland',\n 'Grenada',\n 'Guadeloupe',\n 'Guam',\n 'Guatemala',\n 'Guernsey and Alderney',\n 'Guinea',\n 'Guinea-Bissau',\n 'Guyana',\n 'Haiti',\n 'Heard Island and McDonald Islands',\n 'Honduras',\n 'Hong Kong S.A.R.',\n 'Hungary',\n 'Iceland',\n 'India',\n 'Indonesia',\n 'Iran',\n 'Iraq',\n 'Ireland',\n 'Israel',\n 'Italy',\n 'Jamaica',\n 'Japan',\n 'Jersey',\n 'Jordan',\n 'Kazakhstan',\n 'Kenya',\n 'Kiribati',\n 'Kosovo',\n 'Kuwait',\n 'Kyrgyzstan',\n 'Laos',\n 'Latvia',\n 'Lebanon',\n 'Lesotho',\n 'Liberia',\n 'Libya',\n 'Liechtenstein',\n 'Lithuania',\n 'Luxembourg',\n 'Macau S.A.R.',\n 'Madagascar',\n 'Malawi',\n 'Malaysia',\n 'Maldives',\n 'Mali',\n 'Malta',\n 'Man (Isle of)',\n 'Marshall Islands',\n 'Martinique',\n 'Mauritania',\n 'Mauritius',\n 'Mayotte',\n 'Mexico',\n 'Micronesia',\n 'Moldova',\n 'Monaco',\n 'Mongolia',\n 'Montenegro',\n 'Montserrat',\n 'Morocco',\n 'Mozambique',\n 'Myanmar',\n 'Namibia',\n 'Nauru',\n 'Nepal',\n 'Netherlands',\n 'New Caledonia',\n 'New Zealand',\n 'Nicaragua',\n 'Niger',\n 'Nigeria',\n 'Niue',\n 'Norfolk Island',\n 'North Korea',\n 'North Macedonia',\n 'Northern Mariana Islands',\n 'Norway',\n 'Oman',\n 'Pakistan',\n 'Palau',\n 'Palestinian Territory Occupied',\n 'Panama',\n 'Papua new Guinea',\n 'Paraguay',\n 'Peru',\n 'Philippines',\n 'Pitcairn Island',\n 'Poland',\n 'Portugal',\n 'Puerto Rico',\n 'Qatar',\n 'Reunion',\n 'Romania',\n 'Russia',\n 'Rwanda',\n 'Saint Helena',\n 'Saint Kitts And Nevis',\n 'Saint Lucia',\n 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy',\n 'Saint-Martin (French part)',\n 'Samoa',\n 'San Marino',\n 'Sao Tome and Principe',\n 'Saudi Arabia',\n 'Senegal',\n 'Serbia',\n 'Seychelles',\n 'Sierra Leone',\n 'Singapore',\n 'Sint Maarten (Dutch part)',\n 'Slovakia',\n 'Slovenia',\n 'Solomon Islands',\n 'Somalia',\n 'South Africa',\n 'South Georgia',\n 'South Korea',\n 'South Sudan',\n 'Spain',\n 'Sri Lanka',\n 'Sudan',\n 'Suriname',\n 'Svalbard And Jan Mayen Islands',\n 'Swaziland',\n 'Sweden',\n 'Switzerland',\n 'Syria',\n 'Taiwan',\n 'Tajikistan',\n 'Tanzania',\n 'Thailand',\n 'The Bahamas',\n 'Togo',\n 'Tokelau',\n 'Tonga',\n 'Trinidad And Tobago',\n 'Tunisia',\n 'Turkey',\n 'Turkmenistan',\n 'Turks And Caicos Islands',\n 'Tuvalu',\n 'Uganda',\n 'Ukraine',\n 'United Arab Emirates',\n 'United Kingdom',\n 'United States',\n 'United States Minor Outlying Islands',\n 'Uruguay',\n 'Uzbekistan',\n 'Vanuatu',\n 'Vatican City State (Holy See)',\n 'Venezuela',\n 'Vietnam',\n 'Virgin Islands (British)',\n 'Virgin Islands (US)',\n 'Wallis And Futuna Islands',\n 'Western Sahara',\n 'Yemen',\n 'Zambia',\n 'Zimbabwe',\n] as const\n\n/**\n * Type for all possible countries and regions in the world.\n */\nexport type Country = (typeof COUNTRY_OPTIONS)[number]\n\n/**\n * Represents all possible countries & regions with their corresponding English\n * names.\n */\nexport const EnglishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Aland Islands',\n Albania: 'Albania',\n Algeria: 'Algeria',\n 'American Samoa': 'American Samoa',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarctica',\n 'Antigua And Barbuda': 'Antigua And Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaijan',\n Bahrain: 'Bahrain',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbados',\n Belarus: 'Belarus',\n Belgium: 'Belgium',\n Belize: 'Belize',\n Benin: 'Benin',\n Bermuda: 'Bermuda',\n Bhutan: 'Bhutan',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire',\n 'Bosnia and Herzegovina': 'Bosnia and Herzegovina',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Bouvet Island',\n Brazil: 'Brazil',\n 'British Indian Ocean Territory': 'British Indian Ocean Territory',\n Brunei: 'Brunei',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Cambodia',\n Cameroon: 'Cameroon',\n Canada: 'Canada',\n 'Cape Verde': 'Cape Verde',\n 'Cayman Islands': 'Cayman Islands',\n 'Central African Republic': 'Central African Republic',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Christmas Island',\n 'Cocos (Keeling) Islands': 'Cocos (Keeling) Islands',\n Colombia: 'Colombia',\n Comoros: 'Comoros',\n Congo: 'Congo',\n 'Cook Islands': 'Cook Islands',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": \"Cote D'Ivoire (Ivory Coast)\",\n Croatia: 'Croatia',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Cyprus',\n 'Czech Republic': 'Czech Republic',\n 'Democratic Republic of the Congo': 'Democratic Republic of the Congo',\n Denmark: 'Denmark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'Dominican Republic',\n 'East Timor': 'East Timor',\n Ecuador: 'Ecuador',\n Egypt: 'Egypt',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Equatorial Guinea',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Ethiopia',\n 'Falkland Islands': 'Falkland Islands',\n 'Faroe Islands': 'Faroe Islands',\n 'Fiji Islands': 'Fiji Islands',\n Finland: 'Finland',\n France: 'France',\n 'French Guiana': 'French Guiana',\n 'French Polynesia': 'French Polynesia',\n 'French Southern Territories': 'French Southern Territories',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambia The',\n Georgia: 'Georgia',\n Germany: 'Germany',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Greece',\n Greenland: 'Greenland',\n Grenada: 'Grenada',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey and Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haiti',\n 'Heard Island and McDonald Islands': 'Heard Island and McDonald Islands',\n Honduras: 'Honduras',\n 'Hong Kong S.A.R.': 'Hong Kong S.A.R.',\n Hungary: 'Hungary',\n Iceland: 'Iceland',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Iran',\n Iraq: 'Iraq',\n Ireland: 'Ireland',\n Israel: 'Israel',\n Italy: 'Italy',\n Jamaica: 'Jamaica',\n Japan: 'Japan',\n Jersey: 'Jersey',\n Jordan: 'Jordan',\n Kazakhstan: 'Kazakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kyrgyzstan',\n Laos: 'Laos',\n Latvia: 'Latvia',\n Lebanon: 'Lebanon',\n Lesotho: 'Lesotho',\n Liberia: 'Liberia',\n Libya: 'Libya',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lithuania',\n Luxembourg: 'Luxembourg',\n 'Macau S.A.R.': 'Macau S.A.R.',\n Madagascar: 'Madagascar',\n Malawi: 'Malawi',\n Malaysia: 'Malaysia',\n Maldives: 'Maldives',\n Mali: 'Mali',\n Malta: 'Malta',\n 'Man (Isle of)': 'Man (Isle of)',\n 'Marshall Islands': 'Marshall Islands',\n Martinique: 'Martinique',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauritius',\n Mayotte: 'Mayotte',\n Mexico: 'Mexico',\n Micronesia: 'Micronesia',\n Moldova: 'Moldova',\n Monaco: 'Monaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Morocco',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Netherlands',\n 'New Caledonia': 'New Caledonia',\n 'New Zealand': 'New Zealand',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Norfolk Island',\n 'North Korea': 'North Korea',\n 'North Macedonia': 'North Macedonia',\n 'Northern Mariana Islands': 'Northern Mariana Islands',\n Norway: 'Norway',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palau',\n 'Palestinian Territory Occupied': 'Palestinian Territory Occupied',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papua new Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Peru',\n Philippines: 'Philippines',\n 'Pitcairn Island': 'Pitcairn Island',\n Poland: 'Poland',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Qatar',\n Reunion: 'Reunion',\n Romania: 'Romania',\n Russia: 'Russia',\n Rwanda: 'Rwanda',\n 'Saint Helena': 'Saint Helena',\n 'Saint Kitts And Nevis': 'Saint Kitts And Nevis',\n 'Saint Lucia': 'Saint Lucia',\n 'Saint Pierre and Miquelon': 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy': 'Saint-Barthelemy',\n 'Saint-Martin (French part)': 'Saint-Martin (French part)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Sao Tome and Principe',\n 'Saudi Arabia': 'Saudi Arabia',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapore',\n 'Sint Maarten (Dutch part)': 'Sint Maarten (Dutch part)',\n Slovakia: 'Slovakia',\n Slovenia: 'Slovenia',\n 'Solomon Islands': 'Solomon Islands',\n Somalia: 'Somalia',\n 'South Africa': 'South Africa',\n 'South Georgia': 'South Georgia',\n 'South Korea': 'South Korea',\n 'South Sudan': 'South Sudan',\n Spain: 'Spain',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudan',\n Suriname: 'Suriname',\n 'Svalbard And Jan Mayen Islands': 'Svalbard And Jan Mayen Islands',\n Swaziland: 'Swaziland',\n Sweden: 'Sweden',\n Switzerland: 'Switzerland',\n Syria: 'Syria',\n Taiwan: 'Taiwan',\n Tajikistan: 'Tajikistan',\n Tanzania: 'Tanzania',\n Thailand: 'Thailand',\n 'The Bahamas': 'The Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad And Tobago',\n Tunisia: 'Tunisia',\n Turkey: 'Turkey',\n Turkmenistan: 'Turkmenistan',\n 'Turks And Caicos Islands': 'Turks And Caicos Islands',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ukraine',\n 'United Arab Emirates': 'United Arab Emirates',\n 'United Kingdom': 'United Kingdom',\n 'United States': 'United States',\n 'United States Minor Outlying Islands':\n 'United States Minor Outlying Islands',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatican City State (Holy See)',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Virgin Islands (British)',\n 'Virgin Islands (US)': 'Virgin Islands (US)',\n 'Wallis And Futuna Islands': 'Wallis And Futuna Islands',\n 'Western Sahara': 'Western Sahara',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabwe',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Simplified Chinese names.\n */\nexport const SimplifiedChineseCountryNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奥兰群岛',\n Albania: '阿尔巴尼亚',\n Algeria: '阿尔及利亚',\n 'American Samoa': '美属萨摩亚',\n Andorra: '安道尔',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南极洲',\n 'Antigua And Barbuda': '安提瓜和巴布达',\n Argentina: '阿根廷',\n Armenia: '亚美尼亚',\n Aruba: '阿鲁巴',\n Australia: '澳大利亚',\n Austria: '奥地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄罗斯',\n Belgium: '比利时',\n Belize: '伯利兹',\n Benin: '贝宁',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利维亚',\n 'Bonaire, Sint Eustatius and Saba': '博内尔岛、圣尤斯特歇斯和萨巴岛',\n 'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',\n Botswana: '博茨瓦纳',\n 'Bouvet Island': '布维岛',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英属印度洋领地',\n Brunei: '文莱',\n Bulgaria: '保加利亚',\n 'Burkina Faso': '布基纳法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麦隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '开曼群岛',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中国',\n 'Christmas Island': '圣诞岛',\n 'Cocos (Keeling) Islands': '科科斯(基林)群岛',\n Colombia: '哥伦比亚',\n Comoros: '科摩罗',\n Congo: '刚果',\n 'Cook Islands': '库克群岛',\n 'Costa Rica': '哥斯达黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克罗地亚',\n Cuba: '古巴',\n Curaçao: '库拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '刚果(金)',\n Denmark: '丹麦',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和国',\n 'East Timor': '东帝汶',\n Ecuador: '厄瓜多尔',\n Egypt: '埃及',\n 'El Salvador': '萨尔瓦多',\n 'Equatorial Guinea': '赤道几内亚',\n Eritrea: '厄立特里亚',\n Estonia: '爱沙尼亚',\n Ethiopia: '埃塞俄比亚',\n 'Falkland Islands': '福克兰群岛',\n 'Faroe Islands': '法罗群岛',\n 'Fiji Islands': '斐济',\n Finland: '芬兰',\n France: '法国',\n 'French Guiana': '法属圭亚那',\n 'French Polynesia': '法属波利尼西亚',\n 'French Southern Territories': '法属南部领地',\n Gabon: '加蓬',\n 'Gambia The': '冈比亚',\n Georgia: '格鲁吉亚',\n Germany: '德国',\n Ghana: '加纳',\n Gibraltar: '直布罗陀',\n Greece: '希腊',\n Greenland: '格陵兰岛',\n Grenada: '格林纳达',\n Guadeloupe: '瓜德罗普岛',\n Guam: '关岛',\n Guatemala: '危地马拉',\n 'Guernsey and Alderney': '根西岛',\n Guinea: '几内亚',\n 'Guinea-Bissau': '几内亚比绍',\n Guyana: '圭亚那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐纳岛及麦唐纳岛',\n Honduras: '洪都拉斯',\n 'Hong Kong S.A.R.': '中国香港',\n Hungary: '匈牙利',\n Iceland: '冰岛',\n India: '印度',\n Indonesia: '印度尼西亚',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '爱尔兰',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙买加',\n Japan: '日本',\n Jersey: '泽西岛',\n Jordan: '约旦',\n Kazakhstan: '哈萨克斯坦',\n Kenya: '肯尼亚',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉尔吉斯斯坦',\n Laos: '寮人民民主共和国',\n Latvia: '拉脱维亚',\n Lebanon: '黎巴嫩',\n Lesotho: '莱索托',\n Liberia: '利比里亚',\n Libya: '利比亚',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '卢森堡',\n 'Macau S.A.R.': '中国澳门',\n Madagascar: '马达加斯加',\n Malawi: '马拉维',\n Malaysia: '马来西亚',\n Maldives: '马尔代夫',\n Mali: '马里',\n Malta: '马耳他',\n 'Man (Isle of)': '马恩岛',\n 'Marshall Islands': '马绍尔群岛',\n Martinique: '马提尼克岛',\n Mauritania: '毛里塔尼亚',\n Mauritius: '毛里求斯',\n Mayotte: '马约特',\n Mexico: '墨西哥',\n Micronesia: '密克罗尼西亚',\n Moldova: '摩尔多瓦',\n Monaco: '摩纳哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '缅甸',\n Namibia: '纳米比亚',\n Nauru: '瑙鲁',\n Nepal: '尼泊尔',\n Netherlands: '荷兰',\n 'New Caledonia': '新喀里多尼亚',\n 'New Zealand': '新西兰',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日尔',\n Nigeria: '尼日利亚',\n Niue: '纽埃',\n 'Norfolk Island': '诺福克岛',\n 'North Korea': '朝鲜',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亚纳群岛',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕劳',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿马',\n 'Papua new Guinea': '巴布亚新几内亚',\n Paraguay: '巴拉圭',\n Peru: '秘鲁',\n Philippines: '菲律宾',\n 'Pitcairn Island': '皮特凯恩群岛',\n Poland: '波兰',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔尔',\n Reunion: '留尼汪岛',\n Romania: '罗马尼亚',\n Russia: '俄罗斯联邦',\n Rwanda: '卢旺达',\n 'Saint Helena': '圣赫勒拿',\n 'Saint Kitts And Nevis': '圣基茨和尼维斯',\n 'Saint Lucia': '圣卢西亚',\n 'Saint Pierre and Miquelon': '圣皮埃尔和密克隆',\n 'Saint Vincent And The Grenadines': '圣文森特和格林纳丁斯',\n 'Saint-Barthelemy': '圣巴泰勒米',\n 'Saint-Martin (French part)': '密克罗尼西亞',\n Samoa: '萨摩亚',\n 'San Marino': '圣马力诺',\n 'Sao Tome and Principe': '圣多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞内加尔',\n Serbia: '塞尔维亚',\n Seychelles: '塞舌尔',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '圣马丁岛(荷兰部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亚',\n 'Solomon Islands': '所罗门群岛',\n Somalia: '索马里',\n 'South Africa': '南非',\n 'South Georgia': '南乔治亚',\n 'South Korea': '韩国',\n 'South Sudan': '南苏丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里兰卡',\n Sudan: '苏丹',\n Suriname: '苏里南',\n 'Svalbard And Jan Mayen Islands': '斯瓦尔巴和扬马延群岛',\n Swaziland: '斯威士兰',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '叙利亚',\n Taiwan: '中国台湾',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亚',\n Thailand: '泰国',\n 'The Bahamas': '巴哈马',\n Togo: '多哥',\n Tokelau: '托克劳',\n Tonga: '汤加',\n 'Trinidad And Tobago': '特立尼达和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土库曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凯科斯群岛',\n Tuvalu: '图瓦卢',\n Uganda: '乌干达',\n Ukraine: '乌克兰',\n 'United Arab Emirates': '阿拉伯联合酋长国',\n 'United Kingdom': '英国',\n 'United States': '美国',\n 'United States Minor Outlying Islands': '美国本土外小岛屿',\n Uruguay: '乌拉圭',\n Uzbekistan: '乌兹别克斯坦',\n Vanuatu: '瓦努阿图',\n 'Vatican City State (Holy See)': '梵蒂冈',\n Venezuela: '委内瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '圣文森特和格林纳丁斯',\n 'Virgin Islands (US)': '维尔京群岛(美国)',\n 'Wallis And Futuna Islands': '瓦利斯群岛和富图纳群岛',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也门',\n Zambia: '赞比亚',\n Zimbabwe: '津巴布韦',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese HK names.\n */\nexport const TraditionalChineseCountryHKNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭羣島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安提瓜和巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '伯利茲',\n Benin: '貝寧',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '博茨瓦納',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '文萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布基納法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '開曼羣島',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)羣島',\n Colombia: '哥倫比亞',\n Comoros: '科摩羅',\n Congo: '剛果',\n 'Cook Islands': '庫克羣島',\n 'Costa Rica': '哥斯達黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克羅地亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多爾',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄立特里亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '埃塞俄比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅羣島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬圭亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加蓬',\n 'Gambia The': '岡比亞',\n Georgia: '格魯吉亞',\n Germany: '德國',\n Ghana: '加納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格林納達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '危地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比紹',\n Guyana: '圭亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '洪都拉斯',\n 'Hong Kong S.A.R.': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克斯坦',\n Kenya: '肯尼亞',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '萊索托',\n Liberia: '利比里亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n 'Macau S.A.R.': '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾代夫',\n Mali: '馬裏',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '毛里塔尼亞',\n Mauritius: '毛里求斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '緬甸',\n Namibia: '納米比亞',\n Nauru: '瑙魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '新西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日爾',\n Nigeria: '尼日利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕勞',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞新幾內亞',\n Paraguay: '巴拉圭',\n Peru: '祕魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔爾',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧旺達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖基茨和尼維斯',\n 'Saint Lucia': '聖盧西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森特和格林納丁斯',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亞',\n 'Solomon Islands': '所羅門羣島',\n Somalia: '索馬里',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '斯威士蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '特立尼達和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '圖瓦盧',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合酋長國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克斯坦',\n Vanuatu: '瓦努阿圖',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森特和格林納丁斯',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也門',\n Zambia: '贊比亞',\n Zimbabwe: '津巴布韋',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese TW names.\n */\nexport const TraditionalChineseCountryTWNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭群島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安地卡及巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '亞塞拜然',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴貝多',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '貝里斯',\n Benin: '貝南',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '波札那',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '汶萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布吉納法索',\n Burundi: '蒲隆地',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '維德角',\n 'Cayman Islands': '開曼群島',\n 'Central African Republic': '中非',\n Chad: '查德',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)群島',\n Colombia: '哥倫比亞',\n Comoros: '葛摩',\n Congo: '剛果',\n 'Cook Islands': '庫克群島',\n 'Costa Rica': '哥斯大黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '象牙海岸',\n Croatia: '克羅埃西亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞普勒斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多明尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄利垂亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '衣索比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅群島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬蓋亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加彭',\n 'Gambia The': '甘比亞',\n Georgia: '喬治亞',\n Germany: '德國',\n Ghana: '迦納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格瑞那達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '瓜地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比索',\n Guyana: '蓋亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '宏都拉斯',\n 'Hong Kong S.A.R.': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '義大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克',\n Kenya: '肯亞',\n Kiribati: '吉里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '賴索托',\n Liberia: '賴比瑞亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦斯登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n 'Macau S.A.R.': '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾地夫',\n Mali: '馬裡',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '茅利塔尼亞',\n Mauritius: '模里西斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫三比克',\n Myanmar: '緬甸',\n Namibia: '奈米比亞',\n Nauru: '諾魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '紐西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日',\n Nigeria: '奈及利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帛琉',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞紐幾內亞',\n Paraguay: '巴拉圭',\n Peru: '秘魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡達',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧安達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖克里斯多福及尼維斯',\n 'Saint Lucia': '聖露西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森及格瑞那丁',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙烏地阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '獅子山',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛維尼亞',\n 'Solomon Islands': '索羅門羣島',\n Somalia: '索馬利亞',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '史瓦濟蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克',\n Tanzania: '坦尚尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '千里達及托巴哥',\n Tunisia: '突尼西亞',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '吐瓦魯',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合大公國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克',\n Vanuatu: '萬那杜',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森及格瑞那丁',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '葉門',\n Zambia: '尚比亞',\n Zimbabwe: '辛巴威',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Spanish names.\n */\nexport const SpanishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afganistán',\n 'Aland Islands': 'Islas Åland',\n Albania: 'Albania',\n Algeria: 'Argelia',\n 'American Samoa': 'Samoa Americana',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguila',\n Antarctica: 'Antártida',\n 'Antigua And Barbuda': 'Antigua y Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaiyán',\n Bahrain: 'Baréin',\n Bangladesh: 'Bangladés',\n Barbados: 'Barbados',\n Belarus: 'Bielorrusia',\n Belgium: 'Bélgica',\n Belize: 'Belice',\n Benin: 'Benín',\n Bermuda: 'Bermudas',\n Bhutan: 'Bután',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, San Eustaquio y Saba',\n 'Bosnia and Herzegovina': 'Bosnia y Herzegovina',\n Botswana: 'Botsuana',\n 'Bouvet Island': 'Isla Bouvet',\n Brazil: 'Brasil',\n 'British Indian Ocean Territory': 'Territorio Británico del Océano Índico',\n Brunei: 'Brunéi',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Camboya',\n Cameroon: 'Camerún',\n Canada: 'Canadá',\n 'Cape Verde': 'Cabo Verde',\n 'Cayman Islands': 'Islas Caimán',\n 'Central African Republic': 'República Centroafricana',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Isla de Navidad',\n 'Cocos (Keeling) Islands': 'Islas Cocos',\n Colombia: 'Colombia',\n Comoros: 'Comoras',\n Congo: 'Congo',\n 'Cook Islands': 'Islas Cook',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": 'Costa de Marfil',\n Croatia: 'Croacia',\n Cuba: 'Cuba',\n Curaçao: 'Curazao',\n Cyprus: 'Chipre',\n 'Czech Republic': 'República Checa',\n 'Democratic Republic of the Congo': 'República Democrática del Congo',\n Denmark: 'Dinamarca',\n Djibouti: 'Yibuti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'República Dominicana',\n 'East Timor': 'Timor Oriental',\n Ecuador: 'Ecuador',\n Egypt: 'Egipto',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Guinea Ecuatorial',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Etiopía',\n 'Falkland Islands': 'Islas Malvinas',\n 'Faroe Islands': 'Islas Feroe',\n 'Fiji Islands': 'Fiyi',\n Finland: 'Finlandia',\n France: 'Francia',\n 'French Guiana': 'Guayana Francesa',\n 'French Polynesia': 'Polinesia Francesa',\n 'French Southern Territories': 'Tierras Australes y Antárticas Francesas',\n Gabon: 'Gabón',\n 'Gambia The': 'Gambia',\n Georgia: 'Georgia',\n Germany: 'Alemania',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Grecia',\n Greenland: 'Groenlandia',\n Grenada: 'Granada',\n Guadeloupe: 'Guadalupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey y Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bisáu',\n Guyana: 'Guyana',\n Haiti: 'Haití',\n 'Heard Island and McDonald Islands': 'Islas Heard y McDonald',\n Honduras: 'Honduras',\n 'Hong Kong S.A.R.': 'Hong Kong',\n Hungary: 'Hungría',\n Iceland: 'Islandia',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Irán',\n Iraq: 'Irak',\n Ireland: 'Irlanda',\n Israel: 'Israel',\n Italy: 'Italia',\n Jamaica: 'Jamaica',\n Japan: 'Japón',\n Jersey: 'Jersey',\n Jordan: 'Jordania',\n Kazakhstan: 'Kazajistán',\n Kenya: 'Kenia',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kirguistán',\n Laos: 'Laos',\n Latvia: 'Letonia',\n Lebanon: 'Líbano',\n Lesotho: 'Lesoto',\n Liberia: 'Liberia',\n Libya: 'Libia',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lituania',\n Luxembourg: 'Luxemburgo',\n 'Macau S.A.R.': 'Macao',\n Madagascar: 'Madagascar',\n Malawi: 'Malaui',\n Malaysia: 'Malasia',\n Maldives: 'Maldivas',\n Mali: 'Malí',\n Malta: 'Malta',\n 'Man (Isle of)': 'Isla de Man',\n 'Marshall Islands': 'Islas Marshall',\n Martinique: 'Martinica',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauricio',\n Mayotte: 'Mayotte',\n Mexico: 'México',\n Micronesia: 'Micronesia',\n Moldova: 'Moldavia',\n Monaco: 'Mónaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Marruecos',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Países Bajos',\n 'New Caledonia': 'Nueva Caledonia',\n 'New Zealand': 'Nueva Zelanda',\n Nicaragua: 'Nicaragua',\n Niger: 'Níger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Isla Norfolk',\n 'North Korea': 'Corea del Norte',\n 'North Macedonia': 'Macedonia del Norte',\n 'Northern Mariana Islands': 'Islas Marianas del Norte',\n Norway: 'Noruega',\n Oman: 'Omán',\n Pakistan: 'Pakistán',\n Palau: 'Palaos',\n 'Palestinian Territory Occupied': 'Territorio Palestino Ocupado',\n Panama: 'Panamá',\n 'Papua new Guinea': 'Papúa Nueva Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Perú',\n Philippines: 'Filipinas',\n 'Pitcairn Island': 'Islas Pitcairn',\n Poland: 'Polonia',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Catar',\n Reunion: 'Reunión',\n Romania: 'Rumania',\n Russia: 'Rusia',\n Rwanda: 'Ruanda',\n 'Saint Helena': 'Santa Elena',\n 'Saint Kitts And Nevis': 'San Cristóbal y Nieves',\n 'Saint Lucia': 'Santa Lucía',\n 'Saint Pierre and Miquelon': 'San Pedro y Miquelón',\n 'Saint Vincent And The Grenadines': 'San Vicente y las Granadinas',\n 'Saint-Barthelemy': 'San Bartolomé',\n 'Saint-Martin (French part)': 'San Martín (parte francesa)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Santo Tomé y Príncipe',\n 'Saudi Arabia': 'Arabia Saudita',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leona',\n Singapore: 'Singapur',\n 'Sint Maarten (Dutch part)': 'San Martín (parte neerlandesa)',\n Slovakia: 'Eslovaquia',\n Slovenia: 'Eslovenia',\n 'Solomon Islands': 'Islas Salomón',\n Somalia: 'Somalia',\n 'South Africa': 'Sudáfrica',\n 'South Georgia': 'Georgia del Sur',\n 'South Korea': 'Corea del Sur',\n 'South Sudan': 'Sudán del Sur',\n Spain: 'España',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudán',\n Suriname: 'Surinam',\n 'Svalbard And Jan Mayen Islands': 'Svalbard y Jan Mayen',\n Swaziland: 'Suazilandia',\n Sweden: 'Suecia',\n Switzerland: 'Suiza',\n Syria: 'Siria',\n Taiwan: 'Taiwán',\n Tajikistan: 'Tayikistán',\n Tanzania: 'Tanzania',\n Thailand: 'Tailandia',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad y Tobago',\n Tunisia: 'Túnez',\n Turkey: 'Turquía',\n Turkmenistan: 'Turkmenistán',\n 'Turks And Caicos Islands': 'Islas Turcas y Caicos',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ucrania',\n 'United Arab Emirates': 'Emiratos Árabes Unidos',\n 'United Kingdom': 'Reino Unido',\n 'United States': 'Estados Unidos',\n 'United States Minor Outlying Islands':\n 'Islas Ultramarinas Menores de Estados Unidos',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistán',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Ciudad del Vaticano',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Islas Vírgenes Británicas',\n 'Virgin Islands (US)': 'Islas Vírgenes de los Estados Unidos',\n 'Wallis And Futuna Islands': 'Wallis y Futuna',\n 'Western Sahara': 'Sahara Occidental',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabue',\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Resume, ResumeContent, ResumeItem, ResumeLayout } from '@/types'\n\n/**\n * Defines all possible degrees.\n */\nexport const DEGREE_OPTIONS = [\n 'Middle School',\n 'High School',\n 'Diploma',\n 'Associate',\n 'Bachelor',\n 'Master',\n 'Doctor',\n] as const\n\n/**\n * Type for all possible degrees.\n */\nexport type Degree = (typeof DEGREE_OPTIONS)[number]\n\n/**\n * Defines common world languages.\n *\n * This list contains the most used languages in the world.\n *\n * TODO: allow users to add their own languages\n */\nexport const LANGUAGE_OPTIONS = [\n 'Afrikaans',\n 'Albanian',\n 'Amharic',\n 'Arabic',\n 'Azerbaijani',\n 'Belarusian',\n 'Bengali',\n 'Bhojpuri',\n 'Bulgarian',\n 'Burmese',\n 'Cantonese',\n 'Catalan',\n 'Chinese',\n 'Croatian',\n 'Czech',\n 'Danish',\n 'Dutch',\n 'English',\n 'Estonian',\n 'Farsi',\n 'Filipino',\n 'Finnish',\n 'French',\n 'German',\n 'Greek',\n 'Gujarati',\n 'Hausa',\n 'Hebrew',\n 'Hindi',\n 'Hungarian',\n 'Icelandic',\n 'Igbo',\n 'Indonesian',\n 'Irish',\n 'Italian',\n 'Japanese',\n 'Javanese',\n 'Kazakh',\n 'Khmer',\n 'Korean',\n 'Lahnda',\n 'Latvian',\n 'Lithuanian',\n 'Malay',\n 'Mandarin',\n 'Marathi',\n 'Nepali',\n 'Norwegian',\n 'Oromo',\n 'Pashto',\n 'Polish',\n 'Portuguese',\n 'Romanian',\n 'Russian',\n 'Serbian',\n 'Shona',\n 'Sinhala',\n 'Slovak',\n 'Slovene',\n 'Somali',\n 'Spanish',\n 'Sundanese',\n 'Swahili',\n 'Swedish',\n 'Tagalog',\n 'Tamil',\n 'Telugu',\n 'Thai',\n 'Turkish',\n 'Ukrainian',\n 'Urdu',\n 'Uzbek',\n 'Vietnamese',\n 'Yoruba',\n 'Zulu',\n] as const\n\nexport type Language = (typeof LANGUAGE_OPTIONS)[number]\n\n/**\n * Defines language fluency levels.\n *\n * Based on the Interagency Language Roundtable (ILR) scale.\n */\nexport const LANGUAGE_FLUENCIE_OPTIONS = [\n 'Elementary Proficiency',\n 'Limited Working Proficiency',\n 'Minimum Professional Proficiency',\n 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency',\n] as const\n\nexport type LanguageFluency = (typeof LANGUAGE_FLUENCIE_OPTIONS)[number]\n\n/**\n * Defines skill proficiency levels.\n *\n * Based on common industry standards for skill assessment.\n */\nexport const SKILL_LEVEL_OPTIONS = [\n 'Novice',\n 'Beginner',\n 'Intermediate',\n 'Advanced',\n 'Expert',\n 'Master',\n] as const\n\nexport type SkillLevel = (typeof SKILL_LEVEL_OPTIONS)[number]\n\n/** Defines identifiers for the available resume templates. */\nexport const TEMPLATE_OPTIONS = [\n 'moderncv-banking',\n 'moderncv-casual',\n 'moderncv-classic',\n] as const\n\nexport type TemplateOption = (typeof TEMPLATE_OPTIONS)[number]\n\nexport function getTemplateOptionDetail(templateOption: TemplateOption) {\n const templateOptionName: Record<\n TemplateOption,\n { name: string; description: string }\n > = {\n 'moderncv-banking': {\n name: 'ModernCV Banking',\n description: 'ModernCV template with banking style',\n },\n 'moderncv-casual': {\n name: 'ModernCV Casual',\n description: 'ModernCV template with casual style',\n },\n 'moderncv-classic': {\n name: 'ModernCV Classic',\n description: 'ModernCV template with classic style',\n },\n }\n\n if (templateOption in templateOptionName) {\n return {\n id: templateOption,\n ...templateOptionName[templateOption],\n }\n }\n\n throw new Error(`Invalid template option: ${templateOption}`)\n}\n\n/** Provides default, empty item structures for each resume section type. */\nexport const resumeItems: ResumeItem = {\n award: {\n awarder: '',\n date: '',\n summary: '',\n title: '',\n },\n basics: {\n email: '',\n headline: '',\n name: '',\n phone: '',\n summary: '',\n url: '',\n },\n certificate: {\n date: '',\n issuer: '',\n name: '',\n url: '',\n },\n education: {\n area: '',\n courses: [],\n endDate: '',\n summary: '',\n institution: '',\n score: '',\n startDate: '',\n degree: null,\n url: '',\n },\n interest: {\n keywords: [],\n name: '',\n },\n language: {\n fluency: 'Elementary Proficiency',\n language: 'English',\n keywords: [],\n },\n location: {\n address: '',\n city: '',\n country: null,\n postalCode: '',\n region: '',\n },\n profile: {\n network: '',\n url: '',\n username: '',\n },\n project: {\n description: '',\n endDate: '',\n summary: '',\n keywords: [],\n name: '',\n startDate: '',\n url: '',\n },\n publication: {\n name: '',\n publisher: '',\n releaseDate: '',\n summary: '',\n url: '',\n },\n reference: {\n email: '',\n name: '',\n phone: '',\n relationship: '',\n summary: '',\n },\n skill: {\n keywords: [],\n level: null,\n name: '',\n },\n volunteer: {\n endDate: '',\n organization: '',\n position: '',\n startDate: '',\n summary: '',\n url: '',\n },\n work: {\n name: '',\n endDate: '',\n position: '',\n startDate: '',\n keywords: [],\n summary: '',\n url: '',\n },\n}\n\n/** Default content structure for a new resume, containing empty or minimal\n * sections. */\nexport const defaultResumeContent: ResumeContent = {\n awards: [],\n basics: resumeItems.basics,\n certificates: [],\n education: [resumeItems.education],\n interests: [],\n languages: [resumeItems.language],\n location: resumeItems.location,\n profiles: [resumeItems.profile],\n projects: [],\n publications: [],\n references: [],\n skills: [resumeItems.skill],\n volunteer: [],\n work: [resumeItems.work],\n}\n\n/**\n * Resume content structure containing one example item for each section.\n *\n * Useful for testing transformations and rendering.\n */\nexport const filledResumeContent: ResumeContent = {\n awards: [resumeItems.award],\n basics: resumeItems.basics,\n certificates: [resumeItems.certificate],\n education: [resumeItems.education],\n interests: [resumeItems.interest],\n languages: [resumeItems.language],\n location: resumeItems.location,\n profiles: [resumeItems.profile],\n projects: [resumeItems.project],\n publications: [resumeItems.publication],\n references: [resumeItems.reference],\n skills: [resumeItems.skill],\n volunteer: [resumeItems.volunteer],\n work: [resumeItems.work],\n}\n\n/** Available font size options for resume layout.\n *\n * LaTeX only supports these values.\n */\nexport const fontSizeOptions = ['10 pt', '11 pt', '12 pt']\n\n/** Default top/bottom margin value. */\nconst defaultTopBottomMargin = '2.5 cm'\n/** Default left/right margin value. */\nconst defaultLeftRightMargin = '1.5 cm'\n\n/** Available margin size options for resume layout. */\nexport const marginOptions = [\n defaultLeftRightMargin,\n '1.75 cm',\n '2.0 cm',\n '2.25 cm',\n defaultTopBottomMargin,\n]\n\n/** Defines supported languages for UI display and template translation.\n *\n * @see {@link https://en.wikipedia.org/wiki/IETF_language_tag}\n */\nexport const LOCALE_LANGUAGE_OPTIONS = [\n 'en',\n 'zh-hans',\n 'zh-hant-hk',\n 'zh-hant-tw',\n 'es',\n] as const\n\n/** Type for all possible locale languages. */\nexport type LocaleLanguageOption = (typeof LOCALE_LANGUAGE_OPTIONS)[number]\n\n/**\n * Get the language code and name of the given locale language.\n *\n * @param localeLanguage The locale language to get the name for.\n * @returns The language code and name of the given locale language.\n */\nexport function getLocaleLanguageOptionDetail(\n localeLanguage: LocaleLanguageOption\n) {\n const localeLanguageOptionName: Record<LocaleLanguageOption, string> = {\n en: 'English',\n 'zh-hans': 'Simplified Chinese',\n 'zh-hant-hk': 'Traditional Chinese (Hong Kong)',\n 'zh-hant-tw': 'Traditional Chinese (Taiwan)',\n es: 'Spanish',\n }\n\n if (localeLanguage in localeLanguageOptionName) {\n return {\n localeLanguage,\n name: localeLanguageOptionName[localeLanguage],\n }\n }\n\n throw new Error(`Invalid locale language: ${localeLanguage}`)\n}\n\n/** The default language used when creating a new resume layout. */\nconst defaultLanguage: LocaleLanguageOption = 'en'\n\n/** Default layout configuration for a new resume. */\nexport const defaultResumeLayout: ResumeLayout = {\n template: 'moderncv-banking',\n typography: {\n fontSize: fontSizeOptions[0],\n fontSpec: {\n numbers: 'Auto',\n },\n },\n margins: {\n top: defaultTopBottomMargin,\n bottom: defaultTopBottomMargin,\n left: defaultLeftRightMargin,\n right: defaultLeftRightMargin,\n },\n locale: {\n language: defaultLanguage,\n },\n page: {\n showPageNumbers: false,\n },\n}\n\n/** Default value when user creates a new `Resume` object. */\nexport const defaultResume: Resume = {\n id: '',\n slug: '',\n title: '',\n content: defaultResumeContent,\n layout: defaultResumeLayout,\n pdf: '',\n createdAt: '',\n updatedAt: '',\n publishedAt: '',\n}\n\n/**\n * Default value when user wants to use a filled resume.\n *\n * This is useful for testing transformations and rendering.\n */\nexport const filledResume: Resume = {\n id: '',\n slug: '',\n title: '',\n content: filledResumeContent,\n layout: defaultResumeLayout,\n pdf: '',\n createdAt: '',\n updatedAt: '',\n publishedAt: '',\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * Error categories using bitwise flags\n *\n * First 3 bits for category, last 5 bits for specific errors, total range:\n * 0-255 (8 bits), that is also the range of errno accepted by `process.exit`\n *\n * For now we have 3 categories of errors:\n *\n * - File related errors\n * - Format parsing errors\n * - LaTeX related errors\n */\nexport const ErrorCategory = {\n FILE: 0x00, // 00000000\n FORMAT: 0x20, // 00100000\n LATEX: 0x40, // 01000000\n} as const\n\n/**\n * Enum of error codes for YAMLResumeError.\n *\n * Error codes are used to identify specific errors and can be used to\n * internationalize error messages.\n */\nexport const ErrorType = {\n // File related errors (0x00 - 0x1F)\n FILE_NOT_FOUND: {\n code: 'FILE_NOT_FOUND',\n errno: ErrorCategory.FILE | 0x01,\n message: 'Resume not found: {path}',\n path: '',\n },\n FILE_READ_ERROR: {\n code: 'FILE_READ_ERROR',\n errno: ErrorCategory.FILE | 0x02,\n message: 'Failed to read resume file: {path}',\n path: '',\n },\n FILE_WRITE_ERROR: {\n code: 'FILE_WRITE_ERROR',\n errno: ErrorCategory.FILE | 0x03,\n message: 'Failed to write file: {path}',\n path: '',\n },\n FILE_CONFLICT: {\n code: 'FILE_CONFLICT',\n errno: ErrorCategory.FILE | 0x04,\n message: joinNonEmptyString(\n [\n 'File already exists: {path}.',\n 'Please choose a different filename or remove the existing file.',\n ],\n ' '\n ),\n path: '',\n },\n INVALID_EXTNAME: {\n code: 'INVALID_EXTNAME',\n errno: ErrorCategory.FILE | 0x05,\n message: joinNonEmptyString(\n [\n 'Invalid file extension: {extname}.',\n 'Supported formats are: yaml, yml, json.',\n ],\n ' '\n ),\n extname: '',\n },\n\n // Format parsing errors (0x20 - 0x3F)\n INVALID_YAML: {\n code: 'INVALID_YAML',\n errno: ErrorCategory.FORMAT | 0x01,\n message: 'Invalid YAML format: {error}',\n error: '',\n },\n INVALID_JSON: {\n code: 'INVALID_JSON',\n errno: ErrorCategory.FORMAT | 0x02,\n message: 'Invalid JSON format: {error}',\n error: '',\n },\n\n // LaTeX related errors (0x40 - 0x5F)\n LATEX_NOT_FOUND: {\n code: 'LATEX_NOT_FOUND',\n errno: ErrorCategory.LATEX | 0x01,\n message:\n 'LaTeX compiler not found. Please install either xelatex or tectonic',\n },\n LATEX_COMPILE_ERROR: {\n code: 'LATEX_COMPILE_ERROR',\n errno: ErrorCategory.LATEX | 0x02,\n message: 'LaTeX compilation failed: {error}',\n error: '',\n },\n} as const\n\n/**\n * Helper functions for working with error numbers\n */\nexport const ErrorUtils = {\n /**\n * Get the category of an error number\n *\n * @param errno - The error number\n * @returns The category name or undefined if not found\n */\n getCategory(errno: number): keyof typeof ErrorCategory | undefined {\n const category = errno & 0x60 // 01100000\n return Object.entries(ErrorCategory).find(\n ([_, value]) => value === category\n )?.[0] as keyof typeof ErrorCategory\n },\n\n /**\n * Get the subcategory (specific error) of an error number\n *\n * @param errno - The error number\n * @returns The subcategory number\n */\n getSubcategory(errno: number): number {\n return errno & 0x1f // 00011111\n },\n\n /**\n * Check if an error number belongs to a specific category\n * @param errno - The error number\n * @param category - The category to check\n * @returns True if the error belongs to the category\n */\n isCategory(errno: number, category: keyof typeof ErrorCategory): boolean {\n return (errno & 0x60) === ErrorCategory[category]\n },\n} as const\n\n/**\n * Type for the error code.\n */\nexport type ErrorCodeType = keyof typeof ErrorType\n\n/**\n * Type for the error message parameters.\n */\nexport type ErrorMessageParams = {\n [K in ErrorCodeType]: {\n [P in keyof (typeof ErrorType)[K] as P extends 'message' | 'code' | 'errno'\n ? never\n : P]: string\n }\n}\n\n/**\n * Custom error class for YAMLResume errors.\n */\nexport class YAMLResumeError<T extends ErrorCodeType> extends Error {\n public errno: number\n\n /**\n * Constructor for YAMLResumeError.\n *\n * @param code - The error code.\n * @param params - The error message parameters.\n */\n constructor(\n public code: T,\n params: ErrorMessageParams[T]\n ) {\n const error = ErrorType[code]\n const template = error.message\n const message = template.replace(\n /\\{(\\w+)\\}/g,\n // Use type assertion for safer access, especially if params can be {}\n (_, key) => (params as Record<string, string>)[key] || ''\n )\n super(message)\n this.name = 'YAMLResumeError'\n this.errno = error.errno // Set errno from the definition\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport type {\n Country,\n Degree,\n Language,\n LanguageFluency,\n SkillLevel,\n} from '@/data'\nimport {\n EnglishCountryNames,\n type LocaleLanguageOption,\n SimplifiedChineseCountryNames,\n SpanishCountryNames,\n TraditionalChineseCountryHKNames,\n TraditionalChineseCountryTWNames,\n} from '@/data'\nimport type { SectionID } from '@/types'\n\n/** Defines the structure for translated terms for a single language. */\ntype OptionTranslation = {\n /** Translations for degree types. */\n degrees: Record<Degree, string>\n /** Translations for language names. */\n languages: Record<Language, string>\n /** Translations for language fluency levels. */\n languageFluencies: Record<LanguageFluency, string>\n /** Translations for country names. */\n countries: Record<Country, string>\n /** Translations for resume section titles. */\n sections: Record<SectionID, string>\n /** Translations for skill proficiency levels. */\n skills: Record<SkillLevel, string>\n}\n\ntype OptionCategory = keyof OptionTranslation\n\n/** The structure containing translations for all supported languages. */\ntype OptionsTranslations = Record<LocaleLanguageOption, OptionTranslation>\n\n/**\n * Retrieves the translated terms for a specific locale language.\n *\n * Includes translations for degrees, languages, fluencies, countries, section\n * titles, skill levels, and other specific terms.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated terms for the specified\n * language.\n */\nexport function getOptionTranslation<K extends OptionCategory>(\n language: LocaleLanguageOption,\n category: K,\n option: keyof OptionTranslation[K]\n): string {\n const optionsTranslations: OptionsTranslations = {\n en: {\n countries: EnglishCountryNames,\n degrees: {\n 'Middle School': 'Middle School',\n 'High School': 'High School',\n Diploma: 'Diploma',\n Associate: 'Associate',\n Bachelor: 'Bachelor',\n Master: 'Master',\n Doctor: 'Doctor',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albanian',\n Amharic: 'Amharic',\n Arabic: 'Arabic',\n Azerbaijani: 'Azerbaijani',\n Belarusian: 'Belarusian',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgarian',\n Burmese: 'Burmese',\n Cantonese: 'Cantonese',\n Catalan: 'Catalan',\n Chinese: 'Chinese',\n Croatian: 'Croatian',\n Czech: 'Czech',\n Danish: 'Danish',\n Dutch: 'Dutch',\n English: 'English',\n Estonian: 'Estonian',\n Farsi: 'Farsi',\n Filipino: 'Filipino',\n Finnish: 'Finnish',\n French: 'French',\n German: 'German',\n Greek: 'Greek',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebrew',\n Hindi: 'Hindi',\n Hungarian: 'Hungarian',\n Icelandic: 'Icelandic',\n Igbo: 'Igbo',\n Indonesian: 'Indonesian',\n Irish: 'Irish',\n Italian: 'Italian',\n Japanese: 'Japanese',\n Javanese: 'Javanese',\n Kazakh: 'Kazakh',\n Khmer: 'Khmer',\n Korean: 'Korean',\n Lahnda: 'Lahnda',\n Latvian: 'Latvian',\n Lithuanian: 'Lithuanian',\n Malay: 'Malay',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Nepali',\n Norwegian: 'Norwegian',\n Oromo: 'Oromo',\n Pashto: 'Pashto',\n Polish: 'Polish',\n Portuguese: 'Portuguese',\n Romanian: 'Romanian',\n Russian: 'Russian',\n Serbian: 'Serbian',\n Shona: 'Shona',\n Sinhala: 'Sinhala',\n Slovak: 'Slovak',\n Slovene: 'Slovene',\n Somali: 'Somali',\n Spanish: 'Spanish',\n Sundanese: 'Sundanese',\n Swahili: 'Swahili',\n Swedish: 'Swedish',\n Tagalog: 'Tagalog',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Thai',\n Turkish: 'Turkish',\n Ukrainian: 'Ukrainian',\n Urdu: 'Urdu',\n Uzbek: 'Uzbek',\n Vietnamese: 'Vietnamese',\n Yoruba: 'Yoruba',\n Zulu: 'Zulu',\n },\n languageFluencies: {\n 'Elementary Proficiency': 'Elementary Proficiency',\n 'Limited Working Proficiency': 'Limited Working Proficiency',\n 'Minimum Professional Proficiency': 'Minimum Professional Proficiency',\n 'Full Professional Proficiency': 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency': 'Native or Bilingual Proficiency',\n },\n sections: {\n awards: 'Awards',\n basics: 'Basics',\n certificates: 'Certificates',\n education: 'Education',\n interests: 'Interests',\n languages: 'Languages',\n location: 'Location',\n profiles: 'Profiles',\n projects: 'Projects',\n publications: 'Publications',\n references: 'References',\n skills: 'Skills',\n volunteer: 'Volunteer',\n work: 'Work',\n },\n skills: {\n Novice: 'Novice',\n Beginner: 'Beginner',\n Intermediate: 'Intermediate',\n Advanced: 'Advanced',\n Expert: 'Expert',\n Master: 'Master',\n },\n },\n 'zh-hans': {\n countries: SimplifiedChineseCountryNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '专科',\n Associate: '副学士',\n Bachelor: '学士',\n Master: '硕士',\n Doctor: '博士',\n },\n languages: {\n Afrikaans: '南非语',\n Albanian: '阿尔巴尼亚语',\n Amharic: '阿姆哈拉语',\n Arabic: '阿拉伯语',\n Azerbaijani: '阿塞拜疆语',\n Belarusian: '白俄罗斯语',\n Bengali: '孟加拉语',\n Bhojpuri: '博杰普尔语',\n Bulgarian: '保加利亚语',\n Burmese: '缅甸语',\n Cantonese: '粤语',\n Catalan: '加泰罗尼亚语',\n Chinese: '中文',\n Croatian: '克罗地亚语',\n Czech: '捷克语',\n Danish: '丹麦语',\n Dutch: '荷兰语',\n English: '英语',\n Estonian: '爱沙尼亚语',\n Farsi: '波斯语',\n Filipino: '菲律宾语',\n Finnish: '芬兰语',\n French: '法语',\n German: '德语',\n Greek: '希腊语',\n Gujarati: '古吉拉特语',\n Hausa: '豪萨语',\n Hebrew: '希伯来语',\n Hindi: '印地语',\n Hungarian: '匈牙利语',\n Icelandic: '冰岛语',\n Igbo: '伊博语',\n Indonesian: '印度尼西亚语',\n Irish: '爱尔兰语',\n Italian: '意大利语',\n Japanese: '日语',\n Javanese: '爪哇语',\n Kazakh: '哈萨克语',\n Khmer: '高棉语',\n Korean: '韩语',\n Lahnda: '拉亨达语',\n Latvian: '拉脱维亚语',\n Lithuanian: '立陶宛语',\n Malay: '马来语',\n Mandarin: '普通话',\n Marathi: '马拉地语',\n Nepali: '尼泊尔语',\n Norwegian: '挪威语',\n Oromo: '奥罗莫语',\n Pashto: '普什图语',\n Polish: '波兰语',\n Portuguese: '葡萄牙语',\n Romanian: '罗马尼亚语',\n Russian: '俄语',\n Serbian: '塞尔维亚语',\n Shona: '绍纳语',\n Sinhala: '僧伽罗语',\n Slovak: '斯洛伐克语',\n Slovene: '斯洛文尼亚语',\n Somali: '索马里语',\n Spanish: '西班牙语',\n Sundanese: '巽他语',\n Swahili: '斯瓦希里语',\n Swedish: '瑞典语',\n Tagalog: '他加禄语',\n Tamil: '泰米尔语',\n Telugu: '泰卢固语',\n Thai: '泰语',\n Turkish: '土耳其语',\n Ukrainian: '乌克兰语',\n Urdu: '乌尔都语',\n Uzbek: '乌兹别克语',\n Vietnamese: '越南语',\n Yoruba: '约鲁巴语',\n Zulu: '祖鲁语',\n },\n languageFluencies: {\n 'Elementary Proficiency': '初级水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低专业水平',\n 'Full Professional Proficiency': '完全专业水平',\n 'Native or Bilingual Proficiency': '母语或双语水平',\n },\n sections: {\n awards: '荣誉',\n basics: '简介',\n certificates: '证书',\n education: '教育背景',\n interests: '兴趣爱好',\n languages: '语言',\n location: '地址',\n profiles: '社交信息',\n projects: '项目',\n publications: '出版刊物',\n references: '引荐',\n skills: '专业技能',\n volunteer: '志愿服务',\n work: '工作经历',\n },\n skills: {\n Novice: '新手',\n Beginner: '初级',\n Intermediate: '中级',\n Advanced: '高级',\n Expert: '专家',\n Master: '大师',\n },\n },\n 'zh-hant-hk': {\n countries: TraditionalChineseCountryHKNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n languageFluencies: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '地址',\n profiles: '社交信息',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n 'zh-hant-tw': {\n countries: TraditionalChineseCountryTWNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n languageFluencies: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '地址',\n profiles: '社交信息',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n es: {\n countries: SpanishCountryNames,\n degrees: {\n 'Middle School': 'Escuela secundaria',\n 'High School': 'Título de secundaria',\n Diploma: 'Diploma',\n Associate: 'Grado de asociado',\n Bachelor: 'Licenciatura',\n Master: 'Maestría',\n Doctor: 'Doctorado',\n },\n languages: {\n Afrikaans: 'Afrikáns',\n Albanian: 'Albanés',\n Amharic: 'Amárico',\n Arabic: 'Árabe',\n Azerbaijani: 'Azerbaiyano',\n Belarusian: 'Bielorruso',\n Bengali: 'Bengalí',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Búlgaro',\n Burmese: 'Birmano',\n Cantonese: 'Cantonés',\n Catalan: 'Catalán',\n Chinese: 'Chino',\n Croatian: 'Croata',\n Czech: 'Checo',\n Danish: 'Danés',\n Dutch: 'Neerlandés',\n English: 'Inglés',\n Estonian: 'Estonio',\n Farsi: 'Persa',\n Filipino: 'Filipino',\n Finnish: 'Finlandés',\n French: 'Francés',\n German: 'Alemán',\n Greek: 'Griego',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebreo',\n Hindi: 'Hindi',\n Hungarian: 'Húngaro',\n Icelandic: 'Islandés',\n Igbo: 'Igbo',\n Indonesian: 'Indonesio',\n Irish: 'Irlandés',\n Italian: 'Italiano',\n Japanese: 'Japonés',\n Javanese: 'Javanés',\n Kazakh: 'Kazajo',\n Khmer: 'Jemer',\n Korean: 'Coreano',\n Lahnda: 'Lahnda',\n Latvian: 'Letón',\n Lithuanian: 'Lituano',\n Malay: 'Malayo',\n Mandarin: 'Mandarín',\n Marathi: 'Marathi',\n Nepali: 'Nepalí',\n Norwegian: 'Noruego',\n Oromo: 'Oromo',\n Pashto: 'Pastún',\n Polish: 'Polaco',\n Portuguese: 'Portugués',\n Romanian: 'Rumano',\n Russian: 'Ruso',\n Serbian: 'Serbio',\n Shona: 'Shona',\n Sinhala: 'Cingalés',\n Slovak: 'Eslovaco',\n Slovene: 'Esloveno',\n Somali: 'Somalí',\n Spanish: 'Español',\n Sundanese: 'Sundanés',\n Swahili: 'Swahili',\n Swedish: 'Sueco',\n Tagalog: 'Tagalo',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Tailandés',\n Turkish: 'Turco',\n Ukrainian: 'Ucraniano',\n Urdu: 'Urdu',\n Uzbek: 'Uzbeko',\n Vietnamese: 'Vietnamita',\n Yoruba: 'Yoruba',\n Zulu: 'Zulú',\n },\n languageFluencies: {\n 'Elementary Proficiency': 'Competencia elemental',\n 'Limited Working Proficiency': 'Competencia limitada de trabajo',\n 'Minimum Professional Proficiency':\n 'Competencia profesional de trabajo',\n 'Full Professional Proficiency': 'Competencia profesional plena',\n 'Native or Bilingual Proficiency': 'Competencia nativa o bilingüe',\n },\n sections: {\n awards: 'Premios',\n basics: 'Información básica',\n certificates: 'Certificados',\n education: 'Educación',\n interests: 'Intereses',\n languages: 'Idiomas',\n location: 'Ubicación',\n profiles: 'Perfiles',\n projects: 'Proyectos',\n publications: 'Publicaciones',\n references: 'Referencias',\n skills: 'Competencias',\n volunteer: 'Voluntariado',\n work: 'Experiencia laboral',\n },\n skills: {\n Novice: 'Novato',\n Beginner: 'Principiante',\n Intermediate: 'Intermedio',\n Advanced: 'Avanzado',\n Expert: 'Experto',\n Master: 'Maestro',\n },\n },\n }\n\n return get(\n optionsTranslations,\n [language, category, option],\n option\n ) as string\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguageOption } from '@/data'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific punctuation types used for formatting within templates. */\nexport const PUNCTUATIONS = ['comma', 'colon', 'separator'] as const\n\n/** The type of punctuation. */\nexport type Punctuation = (typeof PUNCTUATIONS)[number]\n\n/** Specific terms used within the template structure that need translation. */\nexport const TERMS = ['courses', 'keywords', 'score'] as const\n\n/** The type of term. */\nexport type Term = (typeof TERMS)[number]\n\n/** The structure for template-specific translations (punctuations and terms) */\ntype TemplateTranslationValue = {\n /** Translations for punctuation types defined in `Punctuation`. */\n punctuations: Record<Punctuation, string>\n /** Translations for template terms defined in `Term`. */\n terms: Record<Term, string>\n}\n\n/** The overall structure containing template-specific translations for all\n * supported languages. */\ntype TemplateTranslation = Record<\n LocaleLanguageOption,\n TemplateTranslationValue\n>\n\n/**\n * Retrieves template-specific translations (punctuations and terms) for a given\n * locale language.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated punctuations and terms for the\n * specified language.\n */\nexport function getTemplateTranslations(\n language?: LocaleLanguageOption\n): TemplateTranslationValue {\n const templateTranslation: TemplateTranslation = {\n en: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Courses',\n keywords: 'Keywords',\n score: 'Score',\n },\n },\n 'zh-hans': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '课程',\n keywords: '关键字',\n score: '成绩',\n },\n },\n 'zh-hant-hk': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n 'zh-hant-tw': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n es: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Cursos',\n keywords: 'Palabras clave',\n score: 'Puntuación',\n },\n },\n }\n\n return templateTranslation[isEmptyValue(language) ? 'en' : language]\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { capitalize, cloneDeep, isArray, merge } from 'lodash-es'\n\nimport { LatexCodeGenerator, type Parser } from '@/compiler'\nimport { defaultResumeLayout } from '@/data'\nimport { getOptionTranslation, getTemplateTranslations } from '@/translations'\nimport type { ProfileItem, Resume, ResumeContent, SectionID } from '@/types'\nimport {\n escapeLatex,\n getDateRange,\n isEmptyValue,\n localizeDate,\n showIf,\n} from '@/utils'\n\n/**\n * Replaces consecutive blank lines with a single LaTeX comment character (`%`).\n *\n * Useful for preventing LaTeX errors in environments sensitive to blank lines.\n *\n * @param content - The input string content.\n * @returns The processed string with blank lines replaced.\n */\nexport function replaceBlankLinesWithPercent(content: string): string {\n // if content only contains a newline character, we return an empty string\n if (content === '\\n') {\n return ''\n }\n\n return content.replace(/(^[ \\t]*\\n)/gm, '%\\n')\n}\n\n/**\n * Merges the provided resume content with default content values, ensuring\n * all necessary content properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content` in place.\n */\nexport function transformSectionsWithDefaultValues(resume: Resume): Resume {\n const emptyResumeContent: ResumeContent = {\n awards: [],\n basics: {},\n certificates: [],\n education: [],\n interests: [],\n languages: [],\n location: {},\n profiles: [],\n projects: [],\n publications: [],\n references: [],\n skills: [],\n volunteer: [],\n work: [],\n }\n\n return {\n ...resume,\n content: merge(emptyResumeContent, resume.content),\n }\n}\n\n/**\n * Iterates through all resume content sections and applies `escapeLatex` to\n * relevant string fields and array elements using helper functions.\n *\n * @param resume - The resume object to process.\n * @returns The processed resume object.\n * @remarks Modifies the `resume.content` object and its children directly.\n */\nexport function transformResumeValues(resume: Resume): Resume {\n Object.entries(resume.content).forEach(([key, value]) => {\n // only resume.basics and resume.location are objects, others are all arrays\n if (key === 'basics' || key === 'location') {\n transformResumeSectionValues(value)\n } else if (key === 'computed') {\n // `computed` object will be handled separately\n // for now, `transformSocialLinks` will handle it\n return\n } else {\n resume.content[key].forEach((_, index: number) => {\n transformResumeSectionValues(value[index])\n })\n }\n })\n\n return resume\n}\n\n/**\n * Transform all values in `computed` field with `escapeLatex`.\n */\nfunction transformResumeSectionComputedValues(sectionResumeComputed: {\n [key: string]: string\n}): void {\n Object.entries(sectionResumeComputed).forEach(([key, value]) => {\n sectionResumeComputed[key] = escapeLatex(value)\n })\n}\n\n/**\n * Transform all the values in `sectionResumeItem` with `escapeLatex`\n *\n * @param sectionResumeItem - a dictionary object in a resume section, for\n * 'basics` and 'locations', it would be `resume.basics` and `resume.location`\n * respectively, for other sections, it would be `resume.education[0]`,\n * `resume.projects[0]` etc.\n */\n// biome-ignore lint/complexity/noBannedTypes: ignore\nfunction transformResumeSectionValues(sectionResumeItem: Object): void {\n Object.entries(sectionResumeItem).forEach(([key, value]) => {\n if (key === 'summary') {\n // we will handle the `summary` field in a `textNodeToTeX` function\n // separately\n return\n }\n\n if (key === 'computed') {\n // deal with `computed` field separately\n transformResumeSectionComputedValues(value)\n return\n }\n\n if (['courses', 'keywords'].includes(key)) {\n sectionResumeItem[key] = (value as string[]).map((item) => {\n return escapeLatex(item)\n })\n\n return\n }\n\n sectionResumeItem[key] = escapeLatex(value)\n })\n}\n\n/**\n * Transforms the `courses` array in the education section into a single,\n * formatted string stored in `computed.courses`.\n *\n * Uses locale-specific separators and newlines for readability.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationCourses(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n resume.content.education.forEach((item, index: number) => {\n if (!isEmptyValue(item.courses)) {\n resume.content.education[index].computed = {\n ...resume.content.education[index].computed,\n // courses are generally longer than keywords, so we use both separator\n // and newline to separate them to improve readability\n courses: (item.courses as string[]).join(`${separator}\\n`),\n }\n }\n })\n\n return resume\n}\n\n/**\n * Combines `degree`, `area`, and `score` from education items into\n * a formatted string stored in `computed.degreeAreaAndScore`.\n *\n * Uses locale-specific terms and punctuation.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationDegreeAreaAndScore(resume: Resume): Resume {\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n const {\n terms: { score },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n resume.content.education.forEach((item) => {\n const degree = getOptionTranslation(\n resume.layout.locale?.language,\n 'degrees',\n item.degree\n )\n\n item.computed = {\n ...item.computed,\n degreeAreaAndScore: [\n degree,\n item.area,\n showIf(!isEmptyValue(item.score), `${score}${colon}${item.score}`),\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma),\n }\n })\n\n return resume\n}\n\n/**\n * Transforms `keywords` arrays in various sections (interests, languages, etc.)\n * into a single, formatted string stored in `computed.keywords`.\n *\n * Uses locale-specific separators.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`interests`, `languages`,\n * etc.) in place.\n */\nexport function transformKeywords(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n for (const section of [\n 'interests',\n 'languages',\n 'projects',\n 'skills',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { keywords: string[] }, index: number) => {\n if (isArray(item.keywords) && item.keywords.length > 0) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n // keywords are generally shorter than courses, so we only use\n // separator without newlines to separate them\n keywords: item.keywords.join(`${separator}`),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n keywords: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Transforms various date fields (`date`, `releaseDate`, `startDate`,\n * `endDate`) across multiple sections into a localized format (e.g., \"Month\n * Year\") and calculates date ranges.\n *\n * Stores results in the respective `computed` objects.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections in place.\n */\nexport function transformDate(resume: Resume): Resume {\n for (const section of ['awards', 'certificates']) {\n resume.content[section].forEach((item: { date: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n date: localizeDate(item.date, resume.layout.locale?.language),\n }\n })\n }\n\n for (const section of ['publications']) {\n resume.content[section].forEach(\n (item: { releaseDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n releaseDate: localizeDate(\n item.releaseDate,\n resume.layout.locale?.language\n ),\n }\n }\n )\n }\n\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { startDate: string; endDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n startDate: localizeDate(\n item.startDate,\n resume.layout.locale?.language\n ),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: localizeDate(item.endDate, resume.layout.locale?.language),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n dateRange: getDateRange(\n item.startDate,\n item.endDate,\n resume.layout.locale?.language\n ),\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Replaces empty `endDate` values in relevant sections with the string\n * \"Present\".\n *\n * Updates the `computed.endDate` field.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`education`, `projects`,\n * etc.) in place. Should run after `transformDate`.\n */\nexport function transformEndDate(resume: Resume): Resume {\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { endDate: string }, index: number) => {\n if (isEmptyValue(item.endDate)) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: 'Present',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Translates `language` and `fluency` values in the languages section\n * based on the selected locale.\n * Stores results in `computed.language` and `computed.fluency`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.languages` items in place.\n */\nexport function transformLanguage(resume: Resume): Resume {\n resume.content.languages.forEach((item) => {\n if (isEmptyValue(item.language) || isEmptyValue(item.fluency)) {\n return\n }\n\n item.computed = {\n ...item.computed,\n language: getOptionTranslation(\n resume.layout.locale?.language,\n 'languages',\n item.language\n ),\n fluency: getOptionTranslation(\n resume.layout.locale?.language,\n 'languageFluencies',\n item.fluency\n ),\n }\n })\n\n return resume\n}\n\n/**\n * Combines address components (`address`, `city`, `region`, `country`,\n * `postalCode`) into a locale-aware formatted address string stored in\n * `computed.fullAddress`.\n *\n * Also computes intermediate components like `postalCodeAndAddress` and\n * `regionAndCountry`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.location` in place.\n */\nexport function transformLocation(resume: Resume): Resume {\n const {\n punctuations: { comma },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n const country = getOptionTranslation(\n resume.layout.locale?.language,\n 'countries',\n resume.content.location.country\n )\n\n switch (resume.layout.locale?.language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw': {\n // For Chinese and Spanish, the address format is:\n // Country > Region > City > Address\n const postalCodeAndAddress = [\n resume.content.location.address,\n resume.content.location.postalCode,\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const regionAndCountry = [country, resume.content.location.region]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const fullAddress = [\n regionAndCountry,\n resume.content.location.city,\n postalCodeAndAddress,\n ]\n .filter((value) => !isEmptyValue(value))\n // en-dash here in latex\n .join(' -- ')\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n postalCodeAndAddress,\n regionAndCountry,\n fullAddress,\n }\n\n break\n }\n default: {\n // For English, the address format is Country > Region > City > Address\n const postalCodeAndAddress = [resume.content.location.address]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const regionCountryAndPostalCode = [\n resume.content.location.region,\n country,\n resume.content.location.postalCode,\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const fullAddress = [\n resume.content.location.address,\n resume.content.location.city,\n regionCountryAndPostalCode,\n ]\n .filter((value) => !isEmptyValue(value))\n // en-dash here in latex\n .join(' -- ')\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n postalCodeAndAddress,\n regionAndCountry: regionCountryAndPostalCode,\n fullAddress,\n }\n\n break\n }\n }\n\n return resume\n}\n\n/**\n * Transforms the `basics.url` field into a LaTeX `\\href` command with a link\n * icon, stored in `computed.url`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.basics.computed` in place.\n */\nexport function transformBasicsUrl(resume: Resume): Resume {\n // `basics.url` is not a mandatory field, so we have to check if it is empty\n const basicsLink = isEmptyValue(resume.content.basics.url)\n ? ''\n : `{\\\\small \\\\faLink}\\\\ \\\\href{${resume.content.basics.url}}{${resume.content.basics.url}}`\n\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n url: basicsLink,\n }\n\n return resume\n}\n\n/**\n * Transforms profile URLs into LaTeX `\\href` commands with appropriate\n * FontAwesome icons based on the network name.\n *\n * Stores the result in `computed.url` for each profile item.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.profiles` items in place.\n */\nexport function transformProfileUrls(resume: Resume): Resume {\n // In general, to get the fontawesome5 symbol for a given network, we can\n // simply use the following use `capitalise(network)` as the icon name, though\n // there are some exceptions such as WeChat and `Stack Overflow`\n const getFaIcon = (network: string): string => {\n switch (network) {\n case 'Stack Overflow':\n return '\\\\faStackOverflow'\n case 'WeChat':\n return '\\\\faWeixin'\n default:\n return `\\\\fa${capitalize(network)}`\n }\n }\n\n resume.content.profiles.forEach((item: ProfileItem, index: number) => {\n resume.content.profiles[index].computed = {\n ...resume.content.profiles[index].computed,\n url:\n isEmptyValue(item.username) || isEmptyValue(item.network)\n ? ''\n : `{\\\\small ${getFaIcon(item.network)}}\\\\ \\\\href{${item.url}}{@${\n item.username\n }}`,\n }\n })\n\n return resume\n}\n\n/**\n * Translates skill proficiency levels based on the selected locale.\n *\n * Stores the translated string in `computed.level`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.skills` items in place.\n */\nexport function transformSkills(resume: Resume): Resume {\n resume.content.skills.forEach((item) => {\n const level = getOptionTranslation(\n resume.layout.locale?.language,\n 'skills',\n item.level\n )\n\n item.computed = {\n ...item.computed,\n level: showIf(!isEmptyValue(item.level), level),\n }\n })\n\n return resume\n}\n\n/**\n * Collects URLs from `basics` and `profiles` sections, formats them as LaTeX\n * links (requires `transformBasicsUrl` and `transformProfileUrls` to be run\n * first),\n *\n * Join them into a single string stored in `resume.content.computed.urls`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformSocialLinks(resume: Resume): Resume {\n transformBasicsUrl(resume)\n transformProfileUrls(resume)\n\n resume.content.computed = {\n ...resume.content.computed,\n urls: [\n resume.content.basics.computed.url,\n ...resume.content.profiles.map((item) => item.computed.url),\n ]\n // here we filter out empty values is the processed link is still empty\n .filter((link) => !isEmptyValue(link))\n // we use 4 lefet spaces, a dot and 4 right spaces to separate links, just\n // to align with default moderncv style\n .join(' {} {} {} • {} {} {} \\n'),\n }\n\n return resume\n}\n\n/**\n * Translates standard section titles (like \"Education\", \"Work\") based on the\n * selected locale.\n *\n * Stores the translations in `resume.content.computed.sectionNames`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformSectionNames(resume: Resume): Resume {\n resume.content.computed = {\n ...resume.content.computed,\n sectionNames: Object.keys(resume.content).reduce(\n (translations, sectionName) => {\n if (sectionName === 'computed') {\n return translations\n }\n\n translations[sectionName] = getOptionTranslation(\n resume.layout.locale?.language,\n 'sections',\n sectionName as SectionID\n )\n\n return translations\n },\n {}\n ),\n }\n\n return resume\n}\n\n/**\n * Parses the `summary` field in various sections and converts it into LaTeX\n * code using the provided parser and generator.\n *\n * Stores the result in the corresponding `computed.summary` field, replacing blank lines.\n *\n * @param resume - The resume object.\n * @param summaryParser - The parser instance (e.g., `MarkdownParser`)\n * @returns The transformed resume object.\n * @remarks Modifies `computed.summary` within `basics` and items in sections\n * like `education`, `work`, etc.\n */\nexport function transformSummary(\n resume: Resume,\n summaryParser: Parser\n): Resume {\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n summary: replaceBlankLinesWithPercent(\n new LatexCodeGenerator()\n .generate(summaryParser.parse(resume.content.basics.summary))\n .trim()\n ),\n }\n\n for (const section of [\n 'awards',\n 'education',\n 'projects',\n 'publications',\n 'references',\n 'volunteer',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { summary: string }, index: number) => {\n const summary = new LatexCodeGenerator().generate(\n summaryParser.parse(item.summary)\n )\n if (summary) {\n // The reason we need to replace blank lines with percent is that, the\n // argument of `\\cventry` command in LaTeX's moderncv package do not\n // support consecutive blank lines. It will report ugly errors like:\n // `Paragraph ended before \\cventry was complete.`, thus we have to\n // replace all blank lines in `\\cventry`'s argument with a percent sign.\n // Ref:\n // - https://www.reddit.com/r/LaTeX/comments/2szgdi/odd_error_using_extra_line_breaks_in_argument_of/cnudnos/\n //\n // BTW, debugging LaTeX's error with its arcane messages is really a\n // boring, dirty and meaningless job.\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: replaceBlankLinesWithPercent(summary.trim()),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Applies a series of transformations to the main content of the resume.\n *\n * This includes escaping values, formatting lists (courses, keywords),\n * processing dates, translating terms, handling URLs, and parsing summaries.\n *\n * The order of internal transformations is important.\n *\n * @param resume - The resume object to transform.\n * @param summaryParser - The parser for handling summary fields.\n * @returns The transformed resume object.\n * @remarks Modifies the `resume.content` object and its children in place.\n */\nexport function transformResumeContent(\n resume: Resume,\n summaryParser: Parser\n): Resume {\n return [\n // The order of the following functions matters, `transformResumeValues`\n // should be called first to process all leaf values properly with LaTeX\n // special characters escaped,\n transformSectionsWithDefaultValues,\n transformResumeValues,\n transformEducationCourses,\n transformEducationDegreeAreaAndScore,\n transformDate,\n transformEndDate,\n transformKeywords,\n transformLanguage,\n transformLocation,\n transformSkills,\n transformSocialLinks,\n transformSummary,\n transformSectionNames,\n ].reduce(\n (resume, tranformFunc) => tranformFunc(resume, summaryParser),\n resume\n )\n}\n\n/**\n * Merges the provided resume layout configuration with default layout values,\n * ensuring all necessary layout properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.layout` in place.\n */\nexport function transformResumeLayoutWithDefaultValues(resume: Resume): Resume {\n return {\n ...resume,\n layout: merge(cloneDeep(defaultResumeLayout), resume.layout),\n }\n}\n\n/**\n * Adjusts the resume's typography settings, specifically the number style\n * (`Lining` or `OldStyle`), based on the selected locale language.\n *\n * Sets Lining for CJK languages, OldStyle otherwise, if not explicitly defined.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.layout.typography.fontSpec` in place.\n */\nexport function transformResumeLayoutTypography(resume: Resume): Resume {\n if (\n resume.layout.typography.fontSpec?.numbers !== undefined &&\n resume.layout.typography.fontSpec?.numbers !== 'Auto'\n ) {\n return resume\n }\n\n switch (resume.layout.locale?.language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw':\n resume.layout.typography.fontSpec = {\n ...resume.layout.typography.fontSpec,\n numbers: 'Lining',\n }\n break\n default:\n resume.layout.typography.fontSpec = {\n ...resume.layout.typography.fontSpec,\n numbers: 'OldStyle',\n }\n break\n }\n\n return resume\n}\n\n/**\n * Merges the provided resume layout configuration with default layout values,\n * ensuring all necessary layout properties are set.\n *\n * Also applies locale-based typography adjustments via\n * `transformResumeLayoutTypography`.\n *\n * @param resume - The resume object containing the layout to transform.\n * @returns The resume object with its layout transformed.\n * @remarks The `layout` property of the returned resume object is a new object\n * resulting from the merge. Modifies `resume.layout.typography` via helper.\n */\nexport function transformResumeLayout(resume: Resume): Resume {\n return [\n transformResumeLayoutWithDefaultValues,\n transformResumeLayoutTypography,\n ].reduce((resume, transformFunc) => transformFunc(resume), resume)\n}\n\n/**\n * Applies all necessary transformations to a resume object in preparation for\n * rendering.\n *\n * This includes content processing, layout merging/adjustments, and environment\n * setup.\n *\n * The order of transformations is: content, layout, environment.\n *\n * @param resume - The original resume object.\n * @param summaryParser - The parser instance for handling summary fields.\n * @returns A new, transformed resume object ready for rendering.\n * @remarks This function operates on and returns a deep clone of the original\n * resume.\n */\nexport function transformResume(resume: Resume, summaryParser: Parser): Resume {\n return [transformResumeLayout, transformResumeContent].reduce(\n (resume, tranformFunc) => tranformFunc(resume, summaryParser),\n cloneDeep(resume)\n )\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Resume } from '@/types'\n\n/**\n * Abstract class for rendering resumes in TeX format.\n *\n * TeXRenderer provides the base functionality for converting Resume objects\n * into TeX documents. It follows a specific rendering order for resume\n * sections:\n *\n * 1. Core information (basics, location, profiles)\n * 2. Education and career (education, work)\n * 3. Languages and skills\n * 4. Paper works (awards, certificates, publications)\n * 5. Persons and projects (references, projects)\n * 6. Non-essential information (interests, volunteer)\n */\nabstract class Renderer {\n resume: Resume\n\n /**\n * Constructor for the Renderer class.\n *\n * @param resume - The resume to render.\n */\n constructor(resume: Resume) {\n this.resume = resume\n }\n\n /**\n * Render the preamble of the TeX document.\n *\n * @returns {string} The preamble of the TeX document.\n */\n abstract renderPreamble(): string\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n abstract renderBasics(): string\n\n /**\n * Render the summary section of the resume.\n *\n * This method handles rendering the summary text stored in\n * resume.content.basics.summary. The summary is rendered separately from\n * other basic information since it may need to appear in a different location\n * in the output document depending on the template.\n *\n * @returns {string} The rendered summary section\n */\n abstract renderSummary(): string\n\n /**\n * Render the location section of the resume.\n *\n * @returns {string} The rendered location section\n */\n abstract renderLocation(): string\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns {string} The rendered profiles section\n */\n abstract renderProfiles(): string\n\n // education and career\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n abstract renderEducation(): string\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n abstract renderWork(): string\n\n // languages and skills\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n abstract renderLanguages(): string\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n abstract renderSkills(): string\n\n // paper works\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n abstract renderAwards(): string\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n abstract renderCertificates(): string\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n abstract renderPublications(): string\n\n // persons and projects\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n abstract renderReferences(): string\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n abstract renderProjects(): string\n\n // non-essential information\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n abstract renderInterests(): string\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n abstract renderVolunteer(): string\n\n /**\n * Render the resume.\n *\n * @returns {string} The rendered resume\n */\n abstract render(): string\n}\n\nexport { Renderer }\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { getTemplateTranslations } from '@/translations'\nimport type { Resume } from '@/types'\nimport { joinNonEmptyString, showIf } from '@/utils'\n\n/**\n * The options for the document class.\n *\n * For now we only support `moderncv` document class.\n */\nexport const DOCUMENT_CLASS_OPTIONS = ['moderncv'] as const\n\n/** The type of document class. */\nexport type DocumentClass = (typeof DOCUMENT_CLASS_OPTIONS)[number]\n\n/**\n * The style options for the moderncv document class.\n *\n * These styles control the visual appearance and layout of the CV. There're\n * actually 5 styles in moderncv package, but only 3 are supported in this\n * project, `fancy` and `oldstyle` is pretty buggy and not working well.\n *\n * - `banking` - a modern, professional style with a banking/financial aesthetic\n * - `classic` - a traditional CV style with a clean, formal layout\n * - `casual` - a more relaxed style while maintaining professionalism\n *\n * @see {@link https://github.com/yamlresume/community/issues/117}\n */\nexport const MODERNCV_STYLE_OPTIONS = ['banking', 'classic', 'casual'] as const\n\n/** The type of moderncv style. */\nexport type ModerncvStyle = (typeof MODERNCV_STYLE_OPTIONS)[number]\n\n/**\n * Check if the resume is a CJK resume.\n *\n * @param resume - The resume to check.\n * @returns {boolean} True if the resume is a CJK resume, false otherwise.\n */\nfunction isCJKResume(resume: Resume): boolean {\n return ['zh-hans', 'zh-hant-hk', 'zh-hant-tw'].includes(\n resume.layout.locale?.language\n )\n}\n\n/**\n * Check if the resume is a Spanish resume.\n *\n * @param resume - The resume to check.\n * @returns {boolean} True if the resume is a Spanish resume, false otherwise.\n */\nfunction isSpanishResume(resume: Resume): boolean {\n return resume.layout.locale?.language === 'es'\n}\n\n/**\n * Normalize a unit string\n *\n * Convert unit string with format of \"<number> <unit>\" to \"<number><unit>\" by\n * removing spaces, for example: \"10 mm\" -> \"10mm\"\n *\n * @param value The unit string to normalize\n * @returns The normalized string with spaces removed between number and unit\n */\nexport function normalizeUnit(value: string): string {\n return value.replace(/\\s+/g, '')\n}\n\n/**\n * Render the document class configuration for the resume.\n *\n * @param resume - The resume object\n * @param documentClass - The document class\n * @returns The LaTeX code for the document class\n */\nexport function renderDocumentClassConfig(\n resume: Resume,\n documentClass: DocumentClass\n): string {\n const {\n layout: {\n typography: { fontSize },\n },\n } = resume\n\n return `\\\\documentclass[a4paper, serif, ${normalizeUnit(\n fontSize\n )}]{${documentClass}}`\n}\n\n/**\n * Override the moderncv commands for CJK resumes\n *\n * This override is only needed when user adopts moderncv banking template and\n * CJK languages at the same time.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @returns The LaTeX code for the override commands\n *\n * @see {@link https://blog.ppresume.com/posts/multi-languagues-support#colon}\n */\nfunction renderModerncvOverride(resume: Resume, style: ModerncvStyle): string {\n const {\n punctuations: { colon },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n if (!isCJKResume(resume)) {\n return ''\n }\n\n switch (style) {\n case 'banking':\n // only banking style needs to renew these blackbox, magic moderncv\n // command to adapt for CJK colons\n return `% renew moderncv command to adapt for CJK colon\n\\\\renewcommand*{\\\\cvitem}[3][.25em]{%\n \\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}{#3}%\n \\\\par\\\\addvspace{#1}}\n\n\\\\renewcommand*{\\\\cvitemwithcomment}[4][.25em]{%\n \\\\savebox{\\\\cvitemwithcommentmainbox}{\\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}#3}%\n \\\\setlength{\\\\cvitemwithcommentmainlength}{\\\\widthof{\\\\usebox{\\\\cvitemwithcommentmainbox}}}%\n \\\\setlength{\\\\cvitemwithcommentcommentlength}{\\\\maincolumnwidth-\\\\separatorcolumnwidth-\\\\cvitemwithcommentmainlength}%\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentmainlength}\\\\usebox{\\\\cvitemwithcommentmainbox}\\\\end{minipage}%\n \\\\hfill% fill of \\\\separatorcolumnwidth\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentcommentlength}\\\\raggedleft\\\\small\\\\itshape#4\\\\end{minipage}%\n \\\\par\\\\addvspace{#1}}`\n\n case 'casual':\n case 'classic':\n return ''\n }\n}\n\n/**\n * Render the moderncv configuration for the resume.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @returns The LaTeX code for the moderncv configuration\n */\nexport function renderModerncvConfig(\n resume: Resume,\n style: ModerncvStyle\n): string {\n return joinNonEmptyString([\n `%% moderncv\n% style and color\n\\\\moderncvstyle{${style}}\n\\\\moderncvcolor{black}\n\n% needed by moderncv for showing icons\n\\\\usepackage{fontawesome5}`,\n renderModerncvOverride(resume, style),\n ])\n}\n\n/**\n * Render the layout configuration for the resume.\n *\n * @param resume - The resume object\n * @returns The LaTeX code for the layout configuration\n */\nexport function renderLayoutConfig(resume: Resume): string {\n const {\n layout: {\n margins: { top, bottom, left, right },\n page: { showPageNumbers },\n },\n } = resume\n\n const t = normalizeUnit(top)\n const b = normalizeUnit(bottom)\n const l = normalizeUnit(left)\n const r = normalizeUnit(right)\n\n return joinNonEmptyString(\n [\n `%% page layout/margins\n\\\\usepackage[top=${t}, bottom=${b}, left=${l}, right=${r}]{geometry}`,\n showIf(!showPageNumbers, '\\\\nopagenumbers{}'),\n ],\n '\\n'\n )\n}\n\n/**\n * Render the LaTeX packages for CJK support\n *\n * Even for non-CJK resumes, sometimes it may need to show a few CJK characters\n * in the resume, e.g. names. This is why we need to include the CJK support in\n * the preamble by default.\n */\nexport function renderCTeXConfig(_resume: Resume): string {\n return `%% CTeX\n% CJK support, used to show CJK characters in the resume\n%\n% - fontset=none: disable builtin fontset but instead set the CJK font manually\n% - heading=false: disable ctex heading\n% - punct=kaiming: use kaiming punctuations styles for CJK\n% - scheme=plain: use plain scheme, do not override \\`\\\\normalsize\\` font size\n% - space=auto: space settings for CJK characters\n%\n% ref:\n% - http://ctan.mirrorcatalogs.com/language/chinese/ctex/ctex.pdf\n\\\\usepackage[UTF8, fontset=none, heading=false, punct=kaiming, scheme=plain, space=auto]{ctex}\n\n\\\\IfFontExistsTF{Noto Serif CJK SC}{\n \\\\setCJKmainfont{Noto Serif CJK SC}\n}{}\n\\\\IfFontExistsTF{Noto Sans CJK SC}{\n \\\\setCJKsansfont{Noto Sans CJK SC}\n}{}`\n}\n\n/**\n * Render the LaTeX packages for Spanish support\n *\n * @param resume - The resume object\n * @returns The LaTeX code for the Spanish support\n */\nexport function renderSpanishConfig(resume: Resume): string {\n if (!isSpanishResume(resume)) {\n return ''\n }\n\n return `%% Spanish support\n\\\\usepackage[T1]{fontenc}\n% \\`\\\\usepackage[spanish]{babel}\\` has some conflicting issues with moderncv\n% so we have to use enable the following options to make it work\n%\n% ref:\n% - https://tex.stackexchange.com/a/140161/36007\n\\\\usepackage[spanish,es-lcroman]{babel}`\n}\n\n/**\n * Render the LaTeX packages for fontspec support\n *\n * @param resume - The resume object\n * @returns The LaTeX code for the fontspec support\n */\nexport function renderFontspecConfig(resume: Resume): string {\n const {\n layout: {\n typography: {\n fontSpec: { numbers },\n },\n },\n } = resume\n\n const linuxLibertineFont = 'Linux Libertine'\n const linuxLibertineOFont = 'Linux Libertine O'\n\n return `%% fontspec\n\\\\usepackage{fontspec}\n\n\\\\IfFontExistsTF{${linuxLibertineFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(isCJKResume(resume), `ItalicFont=${linuxLibertineFont}`),\n ],\n ', '\n )}]{${linuxLibertineFont}}\n}{}\n\\\\IfFontExistsTF{${linuxLibertineOFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(isCJKResume(resume), `ItalicFont=${linuxLibertineOFont}`),\n ],\n ', '\n )}]{${linuxLibertineOFont}}\n}{}`\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Parser } from '@/compiler'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport type { Resume } from '@/types'\nimport { isEmptyValue, joinNonEmptyString, showIf } from '@/utils'\nimport { Renderer } from './base'\nimport {\n type ModerncvStyle,\n renderCTeXConfig,\n renderDocumentClassConfig,\n renderFontspecConfig,\n renderLayoutConfig,\n renderModerncvConfig,\n renderSpanishConfig,\n} from './preamble'\n\n/**\n * Base class for moderncv renderers.\n */\nclass ModerncvBase extends Renderer {\n style: ModerncvStyle\n\n /**\n * Constructor for the ModerncvBase class.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(resume: Resume, style: ModerncvStyle, summaryParser: Parser) {\n super(transformResume(resume, summaryParser))\n this.style = style\n }\n\n /**\n * Render the preamble for the resume.\n *\n * @returns The LaTeX code for the preamble\n */\n renderPreamble(): string {\n return joinNonEmptyString([\n // document class\n renderDocumentClassConfig(this.resume, 'moderncv'),\n renderModerncvConfig(this.resume, this.style),\n\n // layout\n renderLayoutConfig(this.resume),\n\n // language specific\n renderSpanishConfig(this.resume),\n\n // fontspec\n // note that loading order of fontspec and babel packages matters here\n // babel package should be loaded before fontspec package, otherwise\n // Spanish resumes cannot render correct font styles in my testing,\n // reason still unknown though\n renderFontspecConfig(this.resume),\n\n // CTeX for CJK\n // CTeX needs to load after fontspec because we use `\\IfFontExistsTF` to\n // set the CJK font manually if the required Google Noto font exists\n renderCTeXConfig(this.resume),\n ])\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns The LaTeX code for the basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, phone, email },\n },\n } = this.resume\n\n return joinNonEmptyString(\n [\n // note that we have to show `\\\\name{}{}` here no matter whether name is\n // empty or not, moderncv requires this otherwise if there is no\n // `\\\\name{}{}``, moderncv will throw an error.\n `\\\\name{${showIf(!isEmptyValue(name), name)}}{}`,\n showIf(!isEmptyValue(headline), `\\\\title{${headline}}`),\n showIf(!isEmptyValue(phone), `\\\\phone[mobile]{${phone}}`),\n showIf(!isEmptyValue(email), `\\\\email{${email}}`),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the location section of the resume.\n *\n * @returns The LaTeX code for the location section\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n },\n } = this.resume\n\n return showIf(!isEmptyValue(fullAddress), `\\\\address{${fullAddress}}{}{}`)\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns The LaTeX code for the profiles section\n */\n renderProfiles(): string {\n const {\n content: {\n computed: { urls },\n },\n } = this.resume\n\n return showIf(!isEmptyValue(urls), `\\\\extrainfo{${urls}}`)\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns The LaTeX code for the summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: {\n computed: { summary },\n },\n computed: { sectionNames },\n },\n } = this.resume\n\n return `${showIf(\n !isEmptyValue(summary),\n `\\\\section{${sectionNames.basics}}\n\n\\\\cvline{}{${summary}}`\n )}`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns The LaTeX code for the education section\n */\n renderEducation(): string {\n const {\n content: {\n computed: { sectionNames },\n education,\n },\n layout,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n if (!education.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.education}}\n\n${education\n .map(\n ({\n computed: { startDate, dateRange, degreeAreaAndScore, summary, courses },\n institution,\n url,\n }) => `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${degreeAreaAndScore}}\n {${institution}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(courses),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(courses),\n `\\\\textbf{${terms.courses}}${colon}${courses}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns The LaTeX code for the work section\n */\n renderWork(): string {\n const { content, layout } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n if (!content.work.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.work}}\n\n${content.work\n .map((work) => {\n const {\n computed: { startDate, dateRange, summary, keywords },\n name,\n position,\n url,\n } = work\n\n return `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${position}}\n {${name}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns The LaTeX code for the languages section\n */\n renderLanguages(): string {\n const {\n content: {\n computed: { sectionNames },\n languages,\n },\n layout,\n } = this.resume\n\n if (!languages.length) {\n return ''\n }\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n return `\\\\section{${sectionNames.languages}}\n\n${languages\n .map(\n ({ computed: { language, fluency, keywords } }) =>\n `\\\\cvline{${language}}{${fluency}${showIf(\n !isEmptyValue(keywords),\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns The LaTeX code for the skills section\n */\n renderSkills(): string {\n const {\n content: {\n computed: { sectionNames },\n skills,\n },\n layout,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n if (!skills.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.skills}}\n\n${skills\n .map(\n ({ name, computed: { level, keywords } }) =>\n `\\\\cvline{${name}}{${level}${showIf(\n !isEmptyValue(keywords),\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns The LaTeX code for the awards section\n */\n renderAwards(): string {\n const {\n content: {\n computed: { sectionNames },\n awards,\n },\n } = this.resume\n\n if (!awards.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.awards}}\n\n${awards\n .map(\n ({ computed: { date, summary }, awarder, title }) => `\\\\cventry{${date}}\n {${awarder}}\n {${title}}\n {}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns The LaTeX code for the certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n computed: { sectionNames },\n certificates,\n },\n } = this.resume\n\n if (!certificates.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.certificates}}\n\n${certificates\n .map(\n ({ computed: { date }, issuer, name, url }) => `\\\\cventry{${date}}\n {${issuer}}\n {${name}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns The LaTeX code for the publications section\n */\n renderPublications(): string {\n const {\n content: {\n computed: { sectionNames },\n publications,\n },\n } = this.resume\n\n if (!publications.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.publications}}\n\n${publications\n .map(\n ({\n computed: { releaseDate, summary },\n name,\n publisher,\n url,\n }) => `\\\\cventry{${releaseDate}}\n {${name}}\n {${publisher}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns The LaTeX code for the references section\n */\n renderReferences(): string {\n const {\n content: {\n computed: { sectionNames },\n references,\n },\n } = this.resume\n\n if (!references.length) {\n return ''\n }\n\n switch (this.style) {\n case 'banking':\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{\\\\emaillink[${email}]{${email}}}\n {${relationship}}\n {${name}}\n {${phone}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n\n case 'casual':\n case 'classic':\n // Note that for casual and classic styles, the position of `email` and\n // `name` is reversed with banking style. The first parameter of\n // `\\cventry` will be put on the left side, and generally the `name` can\n // be hyphenated while `email`s are generally longer and cannot be\n // hyphenated. So if email is too long, the visually result would be\n // pretty as it will overlap with the right side text.\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{${name}}\n {${relationship}}\n {\\\\emaillink[${email}]{${email}}}\n {${phone}}\n {}\n {${showIf(!isEmptyValue(summary), summary)}}`\n )\n .join('\\n\\n')}`\n }\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns The LaTeX code for the projects section\n */\n renderProjects(): string {\n const { content } = this.resume\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(this.resume.layout.locale?.language)\n\n if (!content.projects.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.projects}}\n\n${content.projects\n .map(\n ({\n name,\n description,\n url,\n computed: { dateRange, startDate, summary, keywords },\n }) => `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${description}}\n {${name}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns The LaTeX code for the interests section\n */\n renderInterests(): string {\n const { content } = this.resume\n\n if (!content.interests.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.interests}}\n\n${content.interests\n .map(({ name, computed: { keywords } }) => `\\\\cvline{${name}}{${keywords}}`)\n .join('\\n')}`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns The LaTeX code for the volunteer section\n */\n renderVolunteer(): string {\n const { content } = this.resume\n\n if (!content.volunteer.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.volunteer}}\n\n${content.volunteer\n .map(\n ({\n position,\n organization,\n url,\n computed: { startDate, dateRange, summary },\n }) => `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${position}}\n {${organization}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(!isEmptyValue(summary), summary)}}\n `\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the resume.\n *\n * @returns The LaTeX code for the resume\n */\n render(): string {\n return this.generateTeX()\n }\n\n /**\n * Generate the LaTeX code for the resume.\n *\n * @returns The LaTeX code for the resume\n */\n private generateTeX(): string {\n return `${joinNonEmptyString([\n this.renderPreamble(),\n this.renderBasics(),\n this.renderLocation(),\n this.renderProfiles(),\n ])}\n\n\\\\begin{document}\n\n\\\\maketitle\n\n${joinNonEmptyString([\n this.renderSummary(),\n this.renderEducation(),\n this.renderWork(),\n this.renderLanguages(),\n this.renderSkills(),\n this.renderAwards(),\n this.renderCertificates(),\n this.renderPublications(),\n this.renderReferences(),\n this.renderProjects(),\n this.renderInterests(),\n this.renderVolunteer(),\n])}\n\\\\end{document}`\n }\n}\n\n/**\n * Renderer for the banking style of moderncv.\n */\nclass ModerncvBankingRenderer extends ModerncvBase {\n constructor(resume: Resume, summaryParser: Parser) {\n super(resume, 'banking', summaryParser)\n }\n}\n\n/**\n * Renderer for the casual style of moderncv.\n */\nclass ModerncvCasualRenderer extends ModerncvBase {\n constructor(resume: Resume, summaryParser: Parser) {\n super(resume, 'casual', summaryParser)\n }\n}\n\n/**\n * Renderer for the classic style of moderncv.\n */\nclass ModerncvClassicRenderer extends ModerncvBase {\n constructor(resume: Resume, summaryParser: Parser) {\n super(resume, 'classic', summaryParser)\n }\n}\n\nexport {\n ModerncvBase,\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport { MarkdownParser, type Parser } from '@/compiler'\nimport type { Resume } from '@/types'\nimport type { Renderer } from './base'\nimport {\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n} from './moderncv'\n\nconst RESUME_RENDERER_MAP = {\n 'moderncv-banking': ModerncvBankingRenderer,\n 'moderncv-classic': ModerncvClassicRenderer,\n 'moderncv-casual': ModerncvCasualRenderer,\n}\n\n/**\n * Get the appropriate resume renderer based on the provided resume.\n *\n * @param {Resume} resume - The resume object\n * @param {Parser} summaryParser - The parser instance for the summary field.\n * Default to `MarkdownParser` if not provided.\n * @returns {Renderer} The renderer instance for the specified template.\n */\nexport function getResumeRenderer(\n resume: Resume,\n summaryParser: Parser = new MarkdownParser()\n): Renderer {\n const template = resume.layout?.template\n\n // default to use moderncv banking style if template is not specified\n if (!template) {\n return new ModerncvBankingRenderer(resume as Resume, summaryParser)\n }\n\n return new (get(RESUME_RENDERER_MAP, template, ModerncvBankingRenderer))(\n resume as Resume,\n summaryParser\n )\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n Country,\n Degree,\n Language,\n LanguageFluency,\n LocaleLanguageOption,\n SkillLevel,\n TemplateOption,\n} from '@/data'\n\n/**\n * All valid top-level sections in the resume.\n * */\nexport const SECTION_IDS = [\n 'basics',\n 'location',\n 'profiles',\n 'work',\n 'education',\n 'volunteer',\n 'awards',\n 'certificates',\n 'publications',\n 'skills',\n 'languages',\n 'interests',\n 'references',\n 'projects',\n] as const\n\nexport type SectionID = (typeof SECTION_IDS)[number]\n\n/** Categorizes social networks for potential grouping or display purposes. */\nexport type SocialNetworkGroup =\n | 'Chat'\n | 'Design'\n | 'Media'\n | 'Social'\n | 'Technical'\n | 'WWW'\n\n/** Defines supported social media and professional network identifiers.\n *\n * TODO: should we move this to TypeScript enum?\n */\nexport type SocialNetwork =\n | 'Behance'\n | 'Dribbble'\n | 'Facebook'\n | 'GitHub'\n | 'Gitlab'\n | 'Instagram'\n | 'Line'\n | 'LinkedIn'\n | 'Medium'\n | 'Pinterest'\n | 'Reddit'\n | 'Snapchat'\n | 'Stack Overflow'\n | 'Telegram'\n | 'TikTok'\n | 'Twitch'\n | 'Twitter'\n | 'Vimeo'\n | 'Weibo'\n | 'WeChat'\n | 'WhatsApp'\n | 'YouTube'\n | 'Zhihu'\n | ''\n\ntype KeywordsType = string[]\n\n/** Represents a single award item. */\ntype AwardItem = {\n /** The organization or entity that gave the award. */\n awarder?: string\n /** The date the award was received (e.g., \"2020\", \"Oct 2020\"). */\n date?: string\n /** A short description or details about the award (supports rich text). */\n summary?: string\n /** The name or title of the award. */\n title?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed date string. */\n date?: string\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'awards' section of the resume content. */\nexport type Awards = {\n /** An array of award items. */\n awards?: AwardItem[]\n}\n\n/** Represents the basic personal information. */\ntype BasicsItem = {\n /** Email address. */\n email?: string\n /** A brief professional headline or title (e.g., \"Software Engineer\"). */\n headline?: string\n /** Full name. */\n name?: string\n /** Phone number. */\n phone?: string\n /** A professional summary or objective statement (supports rich text). */\n summary?: string\n /** Personal website or portfolio URL. */\n url?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n /** Transformed URL string (e.g., LaTeX href command). */\n url?: string\n }\n}\n\n/** Represents the 'basics' section of the resume content. */\nexport type Basics = {\n /** The basic personal information item. */\n basics?: BasicsItem\n}\n\n/** Represents a single certification item. */\ntype CertificateItem = {\n /** The date the certificate was obtained (e.g., \"2021\", \"Nov 2021\"). */\n date?: string\n /** The organization that issued the certificate. */\n issuer?: string\n /** The name of the certificate. */\n name?: string\n /** URL related to the certificate (e.g., verification link). */\n url?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed date string. */\n date?: string\n }\n}\n\n/** Represents the 'certificates' section of the resume content. */\nexport type Certificates = {\n /** An array of certificate items. */\n certificates?: CertificateItem[]\n}\n\n/** Represents a single education history item. */\ntype EducationItem = {\n /** Field of study (e.g., \"Computer Science\"). */\n area?: string\n /** List of courses taken (can be string array or pre-joined string). */\n courses?: string[] | string\n /** End date of study (e.g., \"2020\", \"May 2020\"). Empty implies \"Present\". */\n endDate?: string\n /** Description of accomplishments or details (supports rich text). */\n summary?: string\n /** Name of the institution. */\n institution?: string\n /** GPA or academic score. */\n score?: string\n /** Start date of study (e.g., \"2016\", \"Sep 2016\"). */\n startDate?: string\n /** The type of degree obtained. */\n // TODO: rename degree to degree\n degree?: Degree\n /** URL related to the institution or degree. */\n url?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed courses string (e.g., comma-separated). */\n courses?: string\n /** Combined string of degree, area, and score. */\n degreeAreaAndScore?: string\n /** Combined string representing the date range. */\n dateRange?: string\n /** Transformed start date string. */\n startDate?: string\n /** Transformed end date string (or \"Present\"). */\n endDate?: string\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'education' section of the resume content. */\nexport type Education = {\n /** An array of education history items. */\n education?: EducationItem[]\n}\n\n/** Represents a single interest item. */\ntype InterestItem = {\n /** Keywords related to the interest. */\n keywords?: KeywordsType\n /** Name of the interest category (e.g., \"Reading\", \"Photography\"). */\n name?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed keywords string (e.g., comma-separated). */\n keywords?: string\n }\n}\n\n/** Represents the 'interests' section of the resume content. */\nexport type Interests = {\n /** An array of interest items. */\n interests?: InterestItem[]\n}\n\n/** Represents a single language proficiency item. */\nexport type LanguageItem = {\n /** The language spoken. */\n language?: Language\n /** The level of proficiency in the language. */\n fluency?: LanguageFluency\n /** Specific keywords related to language skills (e.g., \"Translation\"). */\n keywords?: KeywordsType\n /** Computed values derived during transformation. */\n computed?: {\n /** Translated fluency level string. */\n fluency?: string\n /** Translated language name string. */\n language?: string\n /** Transformed keywords string. */\n keywords?: string\n }\n}\n\n/** Represents the 'languages' section of the resume content. */\nexport type Languages = {\n /** An array of language items. */\n languages?: LanguageItem[]\n}\n\n/** Represents the location information. */\ntype LocationItem = {\n /** Street address. */\n address?: string\n /** City name. */\n city?: string\n /** Country code or name. */\n country?: Country\n /** Postal or ZIP code. */\n postalCode?: string\n /** State, province, or region. */\n region?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Combined string of postal code and address. */\n postalCodeAndAddress?: string\n /** Combined string of region and country. */\n regionAndCountry?: string\n /** Fully formatted address string based on locale. */\n fullAddress?: string\n }\n}\n\n/** Represents the 'location' section of the resume content. */\nexport type Location = {\n /** The location information item. */\n location?: LocationItem\n}\n\n/** Represents a single online profile item (e.g., GitHub, LinkedIn). */\nexport type ProfileItem = {\n /** The name of the social network or platform. */\n network?: SocialNetwork\n /** The URL of the profile. */\n url?: string\n /** The username on the platform. */\n username?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed URL string (e.g., LaTeX href with icon). */\n url?: string\n }\n}\n\n/** Represents the 'profiles' section of the resume content. */\nexport type Profiles = {\n /** An array of online profile items. */\n profiles?: ProfileItem[]\n}\n\n/** Represents a single project item. */\ntype ProjectItem = {\n /** Description of the project. */\n description?: string\n /** End date of the project (e.g., \"2022\", \"Jul 2022\"). */\n endDate?: string\n /** Keywords or technologies used in the project. */\n keywords?: KeywordsType\n /** Name of the project. */\n name?: string\n /** Start date of the project (e.g., \"2021\", \"Jan 2021\"). */\n startDate?: string\n /** Detailed accomplishments for the project (supports rich text). */\n summary?: string\n /** URL related to the project (e.g., repository, live demo). */\n url?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed keywords string. */\n keywords?: string\n /** Combined string representing the date range. */\n dateRange?: string\n /** Transformed start date string. */\n startDate?: string\n /** Transformed end date string (or \"Present\"). */\n endDate?: string\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'projects' section of the resume content. */\nexport type Projects = {\n /** An array of project items. */\n projects?: ProjectItem[]\n}\n\n/** Represents a single publication item. */\ntype PublicationItem = {\n /** Name or title of the publication. */\n name?: string\n /** Publisher of the work. */\n publisher?: string\n /** Date of publication (e.g., \"2023\", \"Mar 2023\"). */\n releaseDate?: string\n /** URL related to the publication (e.g., DOI, link). */\n url?: string\n /** Summary or abstract of the publication (supports rich text). */\n summary?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed release date string. */\n releaseDate?: string\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'publications' section of the resume content. */\nexport type Publications = {\n /** An array of publication items. */\n publications?: PublicationItem[]\n}\n\n/** Represents a single reference item. */\ntype ReferenceItem = {\n /** Email address of the reference. */\n email?: string\n /** Name of the reference. */\n name?: string\n /** Phone number of the reference. */\n phone?: string\n /** Relationship to the reference (e.g., \"Former Manager\"). */\n relationship?: string\n /** A brief note about the reference (supports rich text). */\n summary?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'references' section of the resume content. */\nexport type References = {\n /** An array of reference items. */\n references?: ReferenceItem[]\n}\n\n/** Represents a single skill item. */\ntype SkillItem = {\n /** Specific keywords or technologies related to the skill. */\n keywords?: KeywordsType\n /** Proficiency level in the skill. */\n level?: SkillLevel\n /** Name of the skill. */\n name?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Translated skill level string. */\n level?: string\n /** Transformed keywords string. */\n keywords?: string\n }\n}\n\n/** Represents the 'skills' section of the resume content. */\nexport type Skills = {\n /** An array of skill items. */\n skills?: SkillItem[]\n}\n\n/** Represents a single volunteer experience item. */\ntype VolunteerItem = {\n /** End date of the volunteer work (e.g., \"2020\", \"Dec 2020\"). */\n endDate?: string\n /** Name of the organization. */\n organization?: string\n /** Role or position held. */\n position?: string\n /** Start date of the volunteer work (e.g., \"2019\", \"Jun 2019\"). */\n startDate?: string\n /** Summary of responsibilities or achievements (supports rich text). */\n summary?: string\n /** URL related to the organization or work. */\n url?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Combined string representing the date range. */\n dateRange?: string\n /** Transformed start date string. */\n startDate?: string\n /** Transformed end date string (or \"Present\"). */\n endDate?: string\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'volunteer' section of the resume content. */\nexport type Volunteer = {\n /** An array of volunteer experience items. */\n volunteer?: VolunteerItem[]\n}\n\n/** Represents a single work experience item. */\ntype WorkItem = {\n /** Name of the company or employer. */\n name?: string\n /** End date of employment (e.g., \"2023\", \"Aug 2023\"). */\n endDate?: string\n /** Job title or position held. */\n position?: string\n /** Start date of employment (e.g., \"2021\", \"Apr 2021\"). */\n startDate?: string\n /** Keywords related to the role or technologies used. */\n keywords?: KeywordsType\n /** Summary of responsibilities and accomplishments (supports rich text). */\n summary?: string\n /** URL related to the company or work. */\n url?: string\n /** Computed values derived during transformation. */\n computed?: {\n /** Transformed keywords string. */\n keywords?: string\n /** Combined string representing the date range. */\n dateRange?: string\n /** Transformed start date string. */\n startDate?: string\n /** Transformed end date string (or \"Present\"). */\n endDate?: string\n /** Transformed summary string (e.g., LaTeX code). */\n summary?: string\n }\n}\n\n/** Represents the 'work' section of the resume content. */\nexport type Work = {\n /** An array of work experience items. */\n work?: WorkItem[]\n}\n\n/** Union type representing the structure for any top-level resume section. */\nexport type SectionDefaultValues =\n | Awards\n | Basics\n | Certificates\n | Education\n | Interests\n | Languages\n | Location\n | Profiles\n | Projects\n | Publications\n | References\n | Skills\n | Volunteer\n | Work\n\n/** Type defining the structure for a single default item within each resume\n * section. */\nexport type ResumeItem = {\n award: AwardItem\n basics: BasicsItem\n certificate: CertificateItem\n education: EducationItem\n interest: InterestItem\n language: LanguageItem\n location: LocationItem\n project: ProjectItem\n profile: ProfileItem\n publication: PublicationItem\n reference: ReferenceItem\n skill: SkillItem\n volunteer: VolunteerItem\n work: WorkItem\n}\n\n/** Defines the structure for the entire resume content, including all sections\n * and computed values. */\nexport type ResumeContent = {\n /** Array of award items. */\n awards: AwardItem[]\n /** Basic personal information. */\n basics: BasicsItem\n /** Array of certificate items. */\n certificates: CertificateItem[]\n /** Array of education history items. */\n education: EducationItem[]\n /** Array of interest items. */\n interests: InterestItem[]\n /** Array of language proficiency items. */\n languages: LanguageItem[]\n /** Location information. */\n location: LocationItem\n /** Array of project items. */\n projects: ProjectItem[]\n /** Array of online profile items. */\n profiles: ProfileItem[]\n /** Array of publication items. */\n publications: PublicationItem[]\n /** Array of reference items. */\n references: ReferenceItem[]\n /** Array of skill items. */\n skills: SkillItem[]\n /** Array of volunteer experience items. */\n volunteer: VolunteerItem[]\n /** Array of work experience items. */\n work: WorkItem[]\n /* Computed values derived during transformation, applicable to the entire\n * content. */\n computed?: {\n /** Translated names for each resume section based on locale. */\n sectionNames?: {\n awards?: string\n basics?: string\n certificates?: string\n education?: string\n interests?: string\n languages?: string\n location?: string\n projects?: string\n profiles?: string\n publications?: string\n references?: string\n skills?: string\n volunteer?: string\n work?: string\n }\n /** Combined and formatted string of URLs from basics and profiles. */\n urls?: string\n }\n}\n\n/** Defines the structure for page margin settings. */\ntype ResumeLayoutMargins = {\n /** Top margin value (e.g., \"2.5cm\"). */\n top: string\n /** Bottom margin value (e.g., \"2.5cm\"). */\n bottom: string\n /** Left margin value (e.g., \"1.5cm\"). */\n left: string\n /** Right margin value (e.g., \"1.5cm\"). */\n right: string\n}\n\n/** The options for the font spec numbers style. */\nexport const FONT_SPEC_NUMBERS_STYLE_OPTIONS = [\n 'Lining',\n 'OldStyle',\n 'Auto',\n] as const\n\n/**\n * The type of font spec numbers style.\n *\n * - `Lining` - standard lining figures (default for CJK languages)\n * - `OldStyle` - old style figures with varying heights (default for Latin\n * languages)\n * - `Auto` - an undefined state, allowing the style to be automatically\n * determined based on the selected `LocaleLanguage`\n */\nexport type FontSpecNumbersStyle =\n (typeof FONT_SPEC_NUMBERS_STYLE_OPTIONS)[number]\n\n/** Defines typography settings like font size and number style. */\ntype ResumeLayoutTypography = {\n /** Base font size for the document (e.g., \"10pt\", \"11pt\"). */\n fontSize: string\n /** Font specification details. */\n fontSpec: {\n /** Style for rendering numbers (Lining or OldStyle). */\n numbers: FontSpecNumbersStyle\n }\n}\n\n/** Defines locale settings, primarily the language for translations. */\ntype ResumeLayoutLocale = {\n /** The selected language for the resume content and template terms. */\n language: LocaleLanguageOption\n}\n\n/** Defines page-level settings like page numbering. */\ntype ResumeLayoutPage = {\n /** Whether to display page numbers. */\n showPageNumbers: boolean\n}\n\n/** Defines the selected template identifier. */\ntype ResumeTemplate = TemplateOption\n\n/** Defines the overall layout configuration, including template, margins,\n * typography, locale, and computed environment settings. */\nexport type ResumeLayout = {\n /** The selected template configuration. */\n template: ResumeTemplate\n /** Page margin settings. */\n margins: ResumeLayoutMargins\n /** Typography settings. */\n typography: ResumeLayoutTypography\n /** Localization settings. */\n locale: ResumeLayoutLocale\n /** Page-level settings. */\n page: ResumeLayoutPage\n}\n\n/**\n * Represents the complete resume data structure, including metadata, content,\n * layout configuration, and build information.\n */\nexport type Resume = {\n /** Unique identifier for the resume. */\n id: string\n /** User-defined title for the resume. */\n title: string\n /** URL-friendly identifier for the resume. */\n slug: string\n\n /** Contains all the textual and structured content of the resume sections. */\n content: ResumeContent\n /** Defines the visual appearance, template, and localization settings. */\n layout: ResumeLayout\n /** URL or path to the generated PDF file, if available. */\n pdf: string\n\n /** Timestamp indicating when the resume was created. */\n createdAt: string\n /** Timestamp indicating the last time the resume was updated. */\n updatedAt: string\n /** Timestamp indicating when the resume was published (if applicable). */\n publishedAt: string\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/utils/object.ts","../src/utils/date.ts","../src/utils/tex.ts","../src/utils/string.ts","../src/compiler/codegen/latex.ts","../src/compiler/parser/markdown.ts","../src/errors/error.ts","../src/models/country.ts","../src/models/resume.ts","../src/translations/options.ts","../src/translations/template.ts","../src/preprocess/transform.ts","../src/renderer/base.ts","../src/renderer/preamble.ts","../src/renderer/moderncv.ts","../src/renderer/resume.ts","../src/schema/primitives.ts","../src/schema/utils.ts","../src/schema/content/awards.ts","../src/schema/content/basics.ts","../src/schema/content/certificates.ts","../src/schema/content/education.ts","../src/schema/content/interests.ts","../src/schema/content/languages.ts","../src/schema/content/location.ts","../src/schema/content/profiles.ts","../src/schema/content/projects.ts","../src/schema/content/publications.ts","../src/schema/content/references.ts","../src/schema/content/skills.ts","../src/schema/content/volunteer.ts","../src/schema/content/work.ts","../src/schema/content/content.ts","../src/schema/layout/layout.ts","../src/schema/layout/latex.ts","../src/schema/layout/locale.ts","../src/schema/layout/margins.ts","../src/schema/layout/page.ts","../src/schema/layout/template.ts","../src/schema/layout/typography.ts","../src/schema/resume.ts"],"names":["isEmptyValue","value","removeKeysFromObject","obj","keysToRemove","transform","result","key","isObject","collectAllKeys","keys","visited","item","parseDate","dateStr","date","localizeDate","language","options","getDateRange","startDate","endDate","oneDay","nowInUTCSeconds","epochSecondsToLocaleDateString","epochTime","locale","milliSecondsToSeconds","ms","escapeLatex","rawEscapeLatex","isEmptyString","showIf","predicate","content","joinNonEmptyString","codes","separator","code","toCodeBlock","lang","LatexCodeGenerator","node","nodeToTeX","bulletListNodeToTeX","docNodeToTeX","listItemNodeToTeX","orderedListNodeToTeX","paragraphNodeToTeX","textNodeToTeX","fragmentToTeX","itemContent","escapedText","text","mark","applyMarkToText","fragment","MarkdownParser","input","ast","unified","remarkParse","marks","child","boldMark","processChildrenWithMarks","italicMark","linkMark","children","transformedNodes","ErrorCategory","ErrorType","YAMLResumeError","params","error","message","_","COUNTRY_OPTIONS","EnglishCountryNames","SimplifiedChineseCountryNames","TraditionalChineseCountryHKNames","TraditionalChineseCountryTWNames","SpanishCountryNames","DEGREE_OPTIONS","FLUENCY_OPTIONS","FONT_SIZE_OPTIONS","FONTSPEC_NUMBERS_OPTIONS","LANGUAGE_OPTIONS","LEVEL_OPTIONS","LOCALE_LANGUAGE_OPTIONS","NETWORK_OPTIONS","SECTION_IDS","TEMPLATE_OPTIONS","getTemplateDetail","template","templateDetails","resumeItems","defaultResumeContent","filledResumeContent","defaultTopBottomMargin","defaultLeftRightMargin","marginOptions","getLocaleLanguageDetail","localeLanguage","localeLanguageDetails","defaultResumeLayout","defaultResume","filledResume","getOptionTranslation","category","option","get","PUNCTUATIONS","TERMS","getTemplateTranslations","replaceBlankLinesWithPercent","transformSectionsWithDefaultValues","resume","merge","transformResumeValues","transformResumeSectionValues","index","transformResumeSectionComputedValues","sectionResumeComputed","sectionResumeItem","transformEducationCourses","transformEducationDegreeAreaAndScore","colon","comma","score","degree","transformKeywords","section","isArray","transformDate","transformEndDate","transformLanguage","transformLocation","country","postalCodeAndAddress","regionAndCountry","fullAddress","regionCountryAndPostalCode","transformBasicsUrl","basicsLink","transformProfileUrls","getFaIcon","network","capitalize","transformSkills","level","transformProfileLinks","link","transformSectionNames","translations","sectionName","transformSummary","summaryParser","summary","transformResumeContent","tranformFunc","transformResumeLayoutWithDefaultValues","cloneDeep","transformResumeLayoutLaTeX","transformResumeLayout","transformFunc","transformResume","Renderer","isCJKResume","isSpanishResume","normalizeUnit","renderDocumentClassConfig","documentClass","fontSize","renderModerncvOverride","style","renderModerncvConfig","renderLayoutConfig","top","bottom","left","right","showPageNumbers","t","b","l","r","renderCTeXConfig","_resume","renderSpanishConfig","renderfontspecConfig","numbers","linuxLibertineFont","linuxLibertineOFont","ModerncvBase","name","headline","phone","email","urls","sectionNames","education","layout","terms","dateRange","degreeAreaAndScore","courses","institution","url","work","keywords","position","languages","fluency","skills","awards","awarder","title","certificates","issuer","publications","releaseDate","publisher","references","relationship","description","organization","ModerncvBankingRenderer","ModerncvCasualRenderer","ModerncvClassicRenderer","RESUME_RENDERER_MAP","getResumeRenderer","marginSizeSchemaMessage","MarginSizeSchema","SizedStringSchema","ctx","startCase","optionSchemaMessage","messagePrefix","optionSchema","z","issue","min","max","CountryOptionSchema","DateSchema","DegreeOptionSchema","EmailSchema","FluencyOptionSchema","FontspecNumbersOptionSchema","FontSizeOptionSchema","KeywordsSchema","LanguageOptionSchema","LocaleLanguageOptionSchema","LevelOptionSchema","NameSchema","NetworkOptionSchema","phoneNumberRegex","PhoneSchema","SummarySchema","OrganizationSchema","TemplateOptionSchema","UrlSchema","nullifySchema","schema","nullishMeta","AwarderSchema","TitleSchema","AwardItemSchema","AwardsSchema","HeadlineSchema","BasicsItemSchema","BasicsSchema","IssuerSchema","CertificateItemSchema","CertificatesSchema","AreaSchema","CoursesSchema","InstitutionSchema","ScoreSchema","EducationItemSchema","EducationSchema","InterestNameSchema","InterestItemSchema","InterestsSchema","LanguageItemSchema","LanguagesSchema","CitySchema","AddressSchema","PostalCodeSchema","RegionSchema","LocationItemSchema","LocationSchema","UsernameSchema","ProfileItemSchema","ProfilesSchema","ProjectNameSchema","ProjectDescriptionSchema","ProjectItemSchema","ProjectsSchema","PublicationNameSchema","PublisherSchema","PublicationItemSchema","PublicationsSchema","ReferenceNameSchema","RelationshipSchema","ReferenceItemSchema","ReferencesSchema","SkillNameSchema","SkillItemSchema","SkillsSchema","VolunteerOrganizationSchema","VolunteerPositionSchema","VolunteerItemSchema","VolunteerSchema","CompanyNameSchema","PositionSchema","WorkItemSchema","WorkSchema","ContentSchema","LatexSchema","LocaleSchema","MarginsSchema","ShowPageNumbersSchema","PageSchema","TemplateSchema","TypographySchema","LayoutSchema","ResumeSchema"],"mappings":"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ACA,CAAA,SAAA,CACA,SACA,SACA,CAAA,kCAAA,CACA,wBACA,CAAA,UAAA,CACA,gBACA,QACA,CAAA,gCAAA,CACA,QACA,CAAA,UAAA,CACA,eACA,SACA,CAAA,UAAA,CACA,UACA,CAAA,QAAA,CACA,aACA,gBACA,CAAA,0BAAA,CACA,MACA,CAAA,OAAA,CACA,QACA,kBACA,CAAA,yBAAA,CACA,UACA,CAAA,SAAA,CACA,QACA,cACA,CAAA,YAAA,CACA,6BACA,CAAA,SAAA,CACA,OACA,YACA,CAAA,QAAA,CACA,iBACA,kCACA,CAAA,SAAA,CACA,WACA,UACA,CAAA,oBAAA,CACA,YACA,CAAA,SAAA,CACA,QACA,aACA,CAAA,mBAAA,CACA,SACA,CAAA,SAAA,CACA,WACA,kBACA,CAAA,eAAA,CACA,cACA,CAAA,SAAA,CACA,SACA,eACA,CAAA,kBAAA,CACA,6BACA,CAAA,OAAA,CACA,aACA,SACA,CAAA,SAAA,CACA,OACA,CAAA,WAAA,CACA,SACA,WACA,CAAA,SAAA,CACA,YACA,CAAA,MAAA,CACA,YACA,uBACA,CAAA,QAAA,CACA,eACA,CAAA,QAAA,CACA,QACA,mCACA,CAAA,UAAA,CACA,mBACA,SACA,CAAA,SAAA,CACA,QACA,WACA,CAAA,MAAA,CACA,MACA,CAAA,SAAA,CACA,SACA,OACA,CAAA,SAAA,CACA,OACA,CAAA,QAAA,CACA,SACA,YACA,CAAA,OAAA,CACA,UACA,CAAA,QAAA,CACA,SACA,YACA,CAAA,MAAA,CACA,SACA,SACA,CAAA,SAAA,CACA,UACA,OACA,CAAA,eAAA,CACA,WACA,CAAA,YAAA,CACA,eACA,YACA,CAAA,QAAA,CACA,UACA,CAAA,UAAA,CACA,OACA,OACA,CAAA,eAAA,CACA,kBACA,CAAA,YAAA,CACA,aACA,WACA,CAAA,SAAA,CACA,SACA,YACA,CAAA,SAAA,CACA,SACA,UACA,CAAA,YAAA,CACA,YACA,CAAA,SAAA,CACA,aACA,SACA,CAAA,SAAA,CACA,OACA,CAAA,OAAA,CACA,cACA,eACA,CAAA,a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A,CAAA,UAAA,CACA,OACA,CAAA,UAAA,CACA,UACA,QACA,CAAA,QAAA,CACA,OACA,CAAA,UAAA,CACA,QACA,QACA,CAAA,OAAA,CACA,WACA,CAAA,WAAA,CACA,OACA,YACA,CAAA,OAAA,CACA,SACA,CAAA,UAAA,CACA,WACA,QACA,CAAA,OAAA,CACA,QACA,CAAA,QAAA,CACA,UACA,YACA,CAAA,OAAA,CACA,UACA,CAAA,SAAA,CACA,SACA,WACA,CAAA,OAAA,CACA,QACA,CAAA,QAAA,CACA,aACA,UACA,CAAA,SAAA,CACA,UACA,OACA,CAAA,SAAA,CACA,SACA,SACA,CAAA,QAAA,CACA,SACA,CAAA,WAAA,CACA,UACA,SACA,CAAA,SAAA,CACA,OACA,CAAA,QAAA,CACA,OACA,SACA,CAAA,WAAA,CACA,MACA,CAAA,OAAA,CACA,aACA,QACA,CAAA,MACF,CAOaC,CAAAA,EAAAA,CAAgB,CAC3B,QACA,CAAA,UAAA,CACA,cACA,CAAA,UAAA,CACA,SACA,QACF,CAAA,CAOaC,EAA0B,CAAA,CACrC,KACA,SACA,CAAA,YAAA,CACA,YACA,CAAA,IACF,EAKaC,EAAkB,CAAA,CAC7B,UACA,UACA,CAAA,UAAA,CACA,SACA,QACA,CAAA,WAAA,CACA,MACA,CAAA,UAAA,CACA,SACA,WACA,CAAA,QAAA,CACA,UACA,CAAA,gBAAA,CACA,WACA,QACA,CAAA,QAAA,CACA,SACA,CAAA,OAAA,CACA,QACA,QACA,CAAA,UAAA,CACA,SACA,CAAA,OACF,EAKaC,EAAc,CAAA,CACzB,QACA,CAAA,UAAA,CACA,WACA,MACA,CAAA,WAAA,CACA,WACA,CAAA,QAAA,CACA,eACA,cACA,CAAA,QAAA,CACA,WACA,CAAA,WAAA,CACA,aACA,UACF,CAAA,CAGaC,GAAmB,CAC9B,kBAAA,CACA,kBACA,kBACF,EAEO,SAASC,EAAAA,CAAkBC,EAAoB,CACpD,IAAMC,CAGF,CAAA,CACF,mBAAoB,CAClB,IAAA,CAAM,kBACN,CAAA,WAAA,CAAa,sCACf,CACA,CAAA,iBAAA,CAAmB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","file":"index.js","sourcesContent":["/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isObject, transform } from 'lodash-es'\n\n/**\n * Check if a value is empty\n *\n * Empty values include `undefined`, `null`, empty object and empty string\n *\n * @param value - value to check\n * @returns True if value is empty, false otherwise\n *\n * @see {@link https://stackoverflow.com/a/43233163}\n */\nexport function isEmptyValue(value: undefined | null | object | string) {\n return (\n value === undefined ||\n value === null ||\n (typeof value === 'object' && Object.keys(value).length === 0) ||\n (typeof value === 'string' && value.trim().length === 0)\n )\n}\n\n/**\n * Remove keys from an object by their names\n *\n * @param obj - The object to remove keys from\n * @param keysToRemove - The keys to remove\n * @returns The object with the specified keys removed\n */\nexport function removeKeysFromObject<T extends object>(\n obj: T,\n keysToRemove: (string | number | symbol)[]\n): T {\n return transform(\n obj,\n (result, value: unknown, key: number | string | symbol) => {\n if (keysToRemove.includes(key)) return\n\n result[key] = isObject(value)\n ? removeKeysFromObject(value, keysToRemove)\n : value\n }\n )\n}\n\n/**\n * Tree walker function to collect all possible keys from an object recursively\n *\n * This function traverses an object tree and collects all property keys at any\n * depth. It handles arrays, nested objects, and prevents infinite loops from\n * circular references.\n *\n * @param obj - The object to walk through\n * @param keys - Set to collect all keys (optional, used for recursion)\n * @param visited - Set to track visited objects to prevent circular references\n * (optional, used for recursion)\n * @returns Set containing all keys found in the object tree\n *\n * @example\n * ```typescript\n * const obj = {\n * a: 1,\n * b: {\n * c: 2,\n * d: [{ e: 3 }]\n * }\n * }\n * const keys = collectAllKeys(obj)\n * // keys will contain: Set(['a', 'b', 'c', 'd', 'e'])\n * ```\n */\nexport function collectAllKeys(\n obj: unknown,\n keys: Set<string | number | symbol> = new Set(),\n visited: WeakSet<object> = new WeakSet()\n): Set<string | number | symbol> {\n if (obj === null || obj === undefined) {\n return keys\n }\n\n if (typeof obj === 'object') {\n // Prevent circular references\n if (visited.has(obj as object)) {\n return keys\n }\n visited.add(obj as object)\n\n if (Array.isArray(obj)) {\n // For arrays, collect keys from each element\n obj.forEach((item) => {\n collectAllKeys(item, keys, visited)\n })\n } else {\n // For objects, collect all property keys and recurse into values\n Object.keys(obj).forEach((key) => {\n keys.add(key)\n collectAllKeys((obj as Record<string, unknown>)[key], keys, visited)\n })\n }\n }\n\n return keys\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguage } from '@/models'\nimport { isEmptyValue } from './object'\n\n/**\n * Parse date from a string\n *\n * @param dateStr - date string, `null` or `undefined`\n * @returns Date object if parse success, otherwise `null`\n */\nexport function parseDate(dateStr: string | undefined | null): Date | null {\n if (isEmptyValue(dateStr)) return null\n\n try {\n const date = new Date(dateStr)\n // MDN says that date parsing may return NaN or raise exceptions, ref:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Errors/Invalid_date\n return Number.isNaN(date.getTime()) ? null : date\n } catch (e) {\n return null\n }\n}\n\n/**\n * Localize a date string to a specific language.\n *\n * @param date - The date string to localize.\n * @param language - The language to localize the date string to.\n * @returns The localized date string.\n */\nexport function localizeDate(\n date: string,\n language: LocaleLanguage | string\n): string {\n if (date === '') {\n return ''\n }\n\n // For resumes, we only care about the year and month\n const options: Intl.DateTimeFormatOptions = {\n year: 'numeric',\n month: 'short',\n }\n\n return new Date(date).toLocaleDateString(\n isEmptyValue(language) ? 'en' : language,\n options\n )\n}\n\n/**\n * Get the date range for a given start and end date.\n *\n * @param startDate - The start date.\n * @param endDate - The end date.\n * @param language - The language to localize the date string to.\n * @returns The date range.\n */\nexport function getDateRange(\n startDate: string,\n endDate: string,\n language: LocaleLanguage\n): string {\n if (!startDate) {\n return ''\n }\n\n if (!endDate) {\n switch (language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw':\n return `${localizeDate(startDate, language)}至今`\n case 'es':\n return `${localizeDate(startDate, language)} hasta la fecha`\n default:\n // by default we return English's \"Present\" if language is not supported\n return `${localizeDate(startDate, language)} -- Present`\n }\n }\n\n return `${localizeDate(startDate, language)} -- ${localizeDate(\n endDate,\n language\n )}`\n}\n\n/**\n * The number of seconds in one day\n */\nexport const oneDay = 24 * 60 * 60\n\n/**\n * Get the current time in UTC seconds\n *\n * @returns The current time in UTC seconds\n */\nexport function nowInUTCSeconds(): number {\n return Math.floor(Date.now() / 1000)\n}\n\n/**\n * Generate a local date string without timestamp for a epoch time in seconds\n *\n * @param epochTime - epoch time in seconds\n * @param locale - locale for the date string\n * @returns - a human readable date string\n */\nexport function epochSecondsToLocaleDateString(\n epochTime: number,\n locale = 'en-US'\n) {\n return new Date(epochTime * 1000).toLocaleDateString(locale, {\n day: 'numeric',\n month: 'short',\n year: 'numeric',\n })\n}\n\n/**\n * Convert milliseconds to seconds\n */\nexport function milliSecondsToSeconds(ms: number) {\n return Math.floor(ms / 1000)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport rawEscapeLatex from 'escape-latex'\n\nimport { isEmptyValue } from './object'\n\n/**\n * A wrapper around the escape-latex that handles null and undefined values.\n *\n * @param value - value to be escaped\n * @returns escaped value\n */\nexport function escapeLatex(value: string | null | undefined) {\n if (isEmptyValue(value)) {\n return value\n }\n\n return rawEscapeLatex(value)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { isEmptyValue } from './object'\n\n/**\n * Check if a string is empty or only contains whitespace\n *\n * @param value - string to check\n * @returns True if string is empty or only contains whitespace, false otherwise\n */\nexport function isEmptyString(value: string) {\n return typeof value === 'string' && value.trim().length === 0\n}\n\n/**\n * Show content if predicate is true\n *\n * @param predicate - The predicate to check\n * @param content - The content to show\n * @returns The content if predicate is true, empty string otherwise\n */\nexport function showIf(predicate: boolean, content: string) {\n return predicate ? content : ''\n}\n\n/**\n * Join an array of strings , but only if the string is not empty\n *\n * @param codes - The array of strings to join\n * @param separator - The separator to join the strings with\n * @returns The joined string\n */\nexport function joinNonEmptyString(\n codes: string[],\n separator = '\\n\\n'\n): string {\n return codes.filter((code) => !isEmptyString(code)).join(separator)\n}\n\n/**\n * Convert a string to a code block in markdown format\n *\n * @param code - The string to convert\n * @param lang - The language of the code block\n * @returns The code block\n */\nexport function toCodeBlock(code?: string, lang?: string): string {\n if (isEmptyValue(code)) {\n return ''\n }\n\n return `\\`\\`\\`${lang || ''}\\n${code}\\n\\`\\`\\``\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n BulletListNode,\n DocNode,\n Fragment,\n ListItemNode,\n Mark,\n Node,\n OrderedListNode,\n ParagraphNode,\n TextNode,\n} from '@/compiler/ast'\nimport { escapeLatex } from '@/utils'\nimport type { CodeGenerator } from './interface'\n\n/**\n * Generate LaTeX code from a Node.\n *\n * This class implements the `CodeGenerator` interface and provides a method\n * to convert an AST node into its corresponding LaTeX code.\n *\n * @see {@link CodeGenerator}\n */\nexport class LatexCodeGenerator implements CodeGenerator {\n /**\n * Generate LaTeX code from an AST node.\n *\n * @param node - The AST node to generate LaTeX code from.\n * @returns The generated LaTeX code.\n */\n generate(node: Node): string {\n return nodeToTeX(node)\n }\n}\n\n/**\n * Convert an AST node to its corresponding LaTeX code.\n *\n * @param node - The AST node to convert.\n * @returns The generated LaTeX code.\n */\nexport function nodeToTeX(node: Node): string {\n switch (node.type) {\n case 'bulletList':\n return bulletListNodeToTeX(node)\n case 'doc':\n return docNodeToTeX(node)\n case 'listItem':\n return listItemNodeToTeX(node)\n case 'orderedList':\n return orderedListNodeToTeX(node)\n case 'paragraph':\n return paragraphNodeToTeX(node)\n case 'text':\n return textNodeToTeX(node)\n }\n}\n\n/**\n * Convert a bullet list node to its corresponding LaTeX code.\n *\n * @param node - The bullet list node to convert.\n * @returns The generated LaTeX code.\n */\nfunction bulletListNodeToTeX(node: BulletListNode): string {\n return `\\\\begin{itemize}\\n${fragmentToTeX(node.content)}\\\\end{itemize}\\n`\n}\n\n/**\n * Convert a document node to its corresponding LaTeX code.\n *\n * @param node - The document node to convert.\n * @returns The generated LaTeX code.\n */\nfunction docNodeToTeX(node: DocNode): string {\n return fragmentToTeX(node.content)\n}\n\n/**\n * Convert a list item node to its corresponding LaTeX code.\n *\n * @param node - The list item node to convert.\n * @returns The generated LaTeX code.\n */\nfunction listItemNodeToTeX(node: ListItemNode): string {\n const itemContent = fragmentToTeX(node.content)\n // Here we made some special handling to make the output with more prettier\n if (itemContent.includes('\\n\\n')) {\n return `\\\\item ${itemContent.replace('\\n\\n', '\\n')}`\n }\n return `\\\\item ${itemContent}`\n}\n\n/**\n * Convert an ordered list node to its corresponding LaTeX code.\n *\n * @param node - The ordered list node to convert.\n * @returns The generated LaTeX code.\n */\nfunction orderedListNodeToTeX(node: OrderedListNode): string {\n return `\\\\begin{enumerate}\\n${fragmentToTeX(node.content)}\\\\end{enumerate}\\n`\n}\n\n/**\n * Convert a paragraph node to its corresponding LaTeX code.\n *\n * @param node - The paragraph node to convert.\n * @returns The generated LaTeX code.\n */\nfunction paragraphNodeToTeX(node: ParagraphNode): string {\n if (node.content === undefined || node.content.length === 0) {\n return '\\n'\n }\n\n // We need to output two new lines to make the paragraph a real paagraph in\n // LaTeX. However if the paragraph is empty, we just output one new line,\n // check the `if` above.\n return `${fragmentToTeX(node.content)}\\n\\n`\n}\n\n/**\n * Convert a text node to its corresponding LaTeX code.\n *\n * @param node - The text node to convert.\n * @returns The generated LaTeX code.\n */\nfunction textNodeToTeX(node: TextNode): string {\n const escapedText = escapeLatex(node.text)\n\n if (node.marks === undefined) {\n return escapedText\n }\n\n return node.marks.reduce(\n (text, mark) => applyMarkToText(text, mark),\n escapedText\n )\n}\n\n/**\n * Apply a mark to a text.\n *\n * @param text - The text to apply the mark to.\n * @param mark - The mark to apply.\n */\nfunction applyMarkToText(text: string, mark: Mark) {\n switch (mark.type) {\n case 'bold':\n return `\\\\textbf{${text}}`\n case 'italic':\n return `\\\\textit{${text}}`\n case 'link':\n return `\\\\href{${mark.attrs.href}}{${text}}`\n }\n}\n\n/**\n * Convert a fragment to its corresponding LaTeX code.\n *\n * @param fragment - The fragment to convert.\n * @returns The generated LaTeX code.\n */\nfunction fragmentToTeX(fragment: Fragment): string {\n if (fragment === undefined) {\n return ''\n }\n return fragment.map((node) => nodeToTeX(node)).join('')\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Root, RootContent } from 'mdast'\nimport remarkParse from 'remark-parse'\nimport { unified } from 'unified'\n\nimport type { BoldMark, ItalicMark, LinkMark, Mark, Node } from '@/compiler/ast'\nimport type { Parser } from './interface'\n\n/**\n * Parse markdown to ast node\n *\n * Under the hood this class first parse the markdown to mdast and then\n * transform the mdast to ast node.\n *\n * @see {@link Parser}\n */\nexport class MarkdownParser implements Parser {\n /**\n * Parse markdown to ast node\n *\n * @param input - The markdown input to parse\n * @returns The ast node\n */\n parse(input: string): Node {\n const ast = unified().use(remarkParse).parse(input)\n return transform(ast)\n }\n}\n\n/**\n * Transforms an mdast node (or content) into ast node(s).\n *\n * This is a recursive descent tree walker that traverses the mdast node and\n * transforms it into a ast node representation. It accumulates formatting marks\n * (like bold, italic) as it descends.\n *\n * @param ast - The mdast node (Root or RootContent) to transform.\n * @param marks - The formatting marks accumulated from parent nodes to apply.\n * Defaults to an empty array.\n * @returns The corresponding ast node, an array of ast nodes (for nodes\n * that expand like emphasis/strong), or `null` if the mdast node type isn't\n * handled.\n */\nfunction transform(ast: Root | RootContent, marks: Mark[] = []) {\n switch (ast.type) {\n case 'root':\n return {\n type: 'doc',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'paragraph':\n return {\n type: 'paragraph',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n // Text nodes get all accumulated marks applied\n case 'text':\n return {\n type: 'text',\n text: ast.value,\n ...(marks.length > 0 && {\n marks: marks,\n }),\n }\n\n // For text nodes with marks, we accumulate the mark and pass it down to\n // children\n case 'strong': {\n const boldMark: BoldMark = { type: 'bold' }\n return processChildrenWithMarks(ast.children, [...marks, boldMark])\n }\n\n case 'emphasis': {\n const italicMark: ItalicMark = { type: 'italic' }\n return processChildrenWithMarks(ast.children, [...marks, italicMark])\n }\n\n case 'link': {\n const linkMark: LinkMark = {\n type: 'link',\n attrs: {\n href: ast.url,\n target: null,\n class: null,\n },\n }\n return processChildrenWithMarks(ast.children, [...marks, linkMark])\n }\n\n case 'listItem':\n return {\n type: 'listItem',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'list':\n return {\n type: ast.ordered ? 'orderedList' : 'bulletList',\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n }\n\n return null\n}\n\n/**\n * Process children with accumulated marks\n *\n * This function processes the children of a node with accumulated marks and\n * returns a flat array of transformed nodes.\n *\n * @param children - The children of the node to process.\n * @param marks - The accumulated marks to apply to the node.\n * @returns The transformed ast node if only one results from the children,\n * otherwise an array of the transformed ast nodes.\n */\nfunction processChildrenWithMarks(children: RootContent[], marks: Mark[]) {\n // Transform each child with the accumulated marks\n const transformedNodes = children\n .map((child) => transform(child, marks))\n .filter(Boolean)\n\n // If only one node is returned (common case), return it directly\n if (transformedNodes.length === 1) {\n return transformedNodes[0]\n }\n\n // If multiple nodes (e.g., complex formatting spanning multiple text nodes),\n // return them all to be added to parent's content\n return transformedNodes\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * Error categories using bitwise flags\n *\n * First 3 bits for category, last 5 bits for specific errors, total range:\n * 0-255 (8 bits), that is also the range of errno accepted by `process.exit`\n *\n * For now we have 3 categories of errors:\n *\n * - File related errors\n * - Format parsing errors\n * - LaTeX related errors\n */\nexport const ErrorCategory = {\n FILE: 0x00, // 00000000\n FORMAT: 0x20, // 00100000\n LATEX: 0x40, // 01000000\n} as const\n\n/**\n * Enum of error codes for YAMLResumeError.\n *\n * Error codes are used to identify specific errors and can be used to\n * internationalize error messages.\n */\nexport const ErrorType = {\n // File related errors (0x00 - 0x1F)\n FILE_NOT_FOUND: {\n code: 'FILE_NOT_FOUND',\n errno: ErrorCategory.FILE | 0x01,\n message: 'Resume not found: {path}',\n path: '',\n },\n FILE_READ_ERROR: {\n code: 'FILE_READ_ERROR',\n errno: ErrorCategory.FILE | 0x02,\n message: 'Failed to read resume file: {path}',\n path: '',\n },\n FILE_WRITE_ERROR: {\n code: 'FILE_WRITE_ERROR',\n errno: ErrorCategory.FILE | 0x03,\n message: 'Failed to write file: {path}',\n path: '',\n },\n FILE_CONFLICT: {\n code: 'FILE_CONFLICT',\n errno: ErrorCategory.FILE | 0x04,\n message: joinNonEmptyString(\n [\n 'File already exists: {path}.',\n 'Please choose a different filename or remove the existing file.',\n ],\n ' '\n ),\n path: '',\n },\n INVALID_EXTNAME: {\n code: 'INVALID_EXTNAME',\n errno: ErrorCategory.FILE | 0x05,\n message: joinNonEmptyString(\n [\n 'Invalid file extension: {extname}.',\n 'Supported formats are: yaml, yml, json.',\n ],\n ' '\n ),\n extname: '',\n },\n\n // Format parsing errors (0x20 - 0x3F)\n INVALID_YAML: {\n code: 'INVALID_YAML',\n errno: ErrorCategory.FORMAT | 0x01,\n message: 'Invalid YAML format: {error}',\n error: '',\n },\n INVALID_JSON: {\n code: 'INVALID_JSON',\n errno: ErrorCategory.FORMAT | 0x02,\n message: 'Invalid JSON format: {error}',\n error: '',\n },\n\n // LaTeX related errors (0x40 - 0x5F)\n LATEX_NOT_FOUND: {\n code: 'LATEX_NOT_FOUND',\n errno: ErrorCategory.LATEX | 0x01,\n message:\n 'LaTeX compiler not found. Please install either xelatex or tectonic',\n },\n LATEX_COMPILE_ERROR: {\n code: 'LATEX_COMPILE_ERROR',\n errno: ErrorCategory.LATEX | 0x02,\n message: 'LaTeX compilation failed: {error}',\n error: '',\n },\n} as const\n\n/**\n * Helper functions for working with error numbers\n */\nexport const ErrorUtils = {\n /**\n * Get the category of an error number\n *\n * @param errno - The error number\n * @returns The category name or undefined if not found\n */\n getCategory(errno: number): keyof typeof ErrorCategory | undefined {\n const category = errno & 0x60 // 01100000\n return Object.entries(ErrorCategory).find(\n ([_, value]) => value === category\n )?.[0] as keyof typeof ErrorCategory\n },\n\n /**\n * Get the subcategory (specific error) of an error number\n *\n * @param errno - The error number\n * @returns The subcategory number\n */\n getSubcategory(errno: number): number {\n return errno & 0x1f // 00011111\n },\n\n /**\n * Check if an error number belongs to a specific category\n * @param errno - The error number\n * @param category - The category to check\n * @returns True if the error belongs to the category\n */\n isCategory(errno: number, category: keyof typeof ErrorCategory): boolean {\n return (errno & 0x60) === ErrorCategory[category]\n },\n} as const\n\n/**\n * Type for the error code.\n */\nexport type ErrorCodeType = keyof typeof ErrorType\n\n/**\n * Type for the error message parameters.\n */\nexport type ErrorMessageParams = {\n [K in ErrorCodeType]: {\n [P in keyof (typeof ErrorType)[K] as P extends 'message' | 'code' | 'errno'\n ? never\n : P]: string\n }\n}\n\n/**\n * Custom error class for YAMLResume errors.\n */\nexport class YAMLResumeError<T extends ErrorCodeType> extends Error {\n public errno: number\n\n /**\n * Constructor for YAMLResumeError.\n *\n * @param code - The error code.\n * @param params - The error message parameters.\n */\n constructor(\n public code: T,\n params: ErrorMessageParams[T]\n ) {\n const error = ErrorType[code]\n const template = error.message\n const message = template.replace(\n /\\{(\\w+)\\}/g,\n // Use type assertion for safer access, especially if params can be {}\n (_, key) => (params as Record<string, string>)[key] || ''\n )\n super(message)\n this.name = 'YAMLResumeError'\n this.errno = error.errno // Set errno from the definition\n }\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Country } from '@/models'\n\n/**\n * All possible countries and regions in the world.\n */\nexport const COUNTRY_OPTIONS = [\n 'Afghanistan',\n 'Aland Islands',\n 'Albania',\n 'Algeria',\n 'American Samoa',\n 'Andorra',\n 'Angola',\n 'Anguilla',\n 'Antarctica',\n 'Antigua And Barbuda',\n 'Argentina',\n 'Armenia',\n 'Aruba',\n 'Australia',\n 'Austria',\n 'Azerbaijan',\n 'Bahrain',\n 'Bangladesh',\n 'Barbados',\n 'Belarus',\n 'Belgium',\n 'Belize',\n 'Benin',\n 'Bermuda',\n 'Bhutan',\n 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba',\n 'Bosnia and Herzegovina',\n 'Botswana',\n 'Bouvet Island',\n 'Brazil',\n 'British Indian Ocean Territory',\n 'Brunei',\n 'Bulgaria',\n 'Burkina Faso',\n 'Burundi',\n 'Cambodia',\n 'Cameroon',\n 'Canada',\n 'Cape Verde',\n 'Cayman Islands',\n 'Central African Republic',\n 'Chad',\n 'Chile',\n 'China',\n 'Christmas Island',\n 'Cocos (Keeling) Islands',\n 'Colombia',\n 'Comoros',\n 'Congo',\n 'Cook Islands',\n 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\",\n 'Croatia',\n 'Cuba',\n 'Curaçao',\n 'Cyprus',\n 'Czech Republic',\n 'Democratic Republic of the Congo',\n 'Denmark',\n 'Djibouti',\n 'Dominica',\n 'Dominican Republic',\n 'East Timor',\n 'Ecuador',\n 'Egypt',\n 'El Salvador',\n 'Equatorial Guinea',\n 'Eritrea',\n 'Estonia',\n 'Ethiopia',\n 'Falkland Islands',\n 'Faroe Islands',\n 'Fiji Islands',\n 'Finland',\n 'France',\n 'French Guiana',\n 'French Polynesia',\n 'French Southern Territories',\n 'Gabon',\n 'Gambia The',\n 'Georgia',\n 'Germany',\n 'Ghana',\n 'Gibraltar',\n 'Greece',\n 'Greenland',\n 'Grenada',\n 'Guadeloupe',\n 'Guam',\n 'Guatemala',\n 'Guernsey and Alderney',\n 'Guinea',\n 'Guinea-Bissau',\n 'Guyana',\n 'Haiti',\n 'Heard Island and McDonald Islands',\n 'Honduras',\n 'Hong Kong S.A.R.',\n 'Hungary',\n 'Iceland',\n 'India',\n 'Indonesia',\n 'Iran',\n 'Iraq',\n 'Ireland',\n 'Israel',\n 'Italy',\n 'Jamaica',\n 'Japan',\n 'Jersey',\n 'Jordan',\n 'Kazakhstan',\n 'Kenya',\n 'Kiribati',\n 'Kosovo',\n 'Kuwait',\n 'Kyrgyzstan',\n 'Laos',\n 'Latvia',\n 'Lebanon',\n 'Lesotho',\n 'Liberia',\n 'Libya',\n 'Liechtenstein',\n 'Lithuania',\n 'Luxembourg',\n 'Macau S.A.R.',\n 'Madagascar',\n 'Malawi',\n 'Malaysia',\n 'Maldives',\n 'Mali',\n 'Malta',\n 'Man (Isle of)',\n 'Marshall Islands',\n 'Martinique',\n 'Mauritania',\n 'Mauritius',\n 'Mayotte',\n 'Mexico',\n 'Micronesia',\n 'Moldova',\n 'Monaco',\n 'Mongolia',\n 'Montenegro',\n 'Montserrat',\n 'Morocco',\n 'Mozambique',\n 'Myanmar',\n 'Namibia',\n 'Nauru',\n 'Nepal',\n 'Netherlands',\n 'New Caledonia',\n 'New Zealand',\n 'Nicaragua',\n 'Niger',\n 'Nigeria',\n 'Niue',\n 'Norfolk Island',\n 'North Korea',\n 'North Macedonia',\n 'Northern Mariana Islands',\n 'Norway',\n 'Oman',\n 'Pakistan',\n 'Palau',\n 'Palestinian Territory Occupied',\n 'Panama',\n 'Papua new Guinea',\n 'Paraguay',\n 'Peru',\n 'Philippines',\n 'Pitcairn Island',\n 'Poland',\n 'Portugal',\n 'Puerto Rico',\n 'Qatar',\n 'Reunion',\n 'Romania',\n 'Russia',\n 'Rwanda',\n 'Saint Helena',\n 'Saint Kitts And Nevis',\n 'Saint Lucia',\n 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy',\n 'Saint-Martin (French part)',\n 'Samoa',\n 'San Marino',\n 'Sao Tome and Principe',\n 'Saudi Arabia',\n 'Senegal',\n 'Serbia',\n 'Seychelles',\n 'Sierra Leone',\n 'Singapore',\n 'Sint Maarten (Dutch part)',\n 'Slovakia',\n 'Slovenia',\n 'Solomon Islands',\n 'Somalia',\n 'South Africa',\n 'South Georgia',\n 'South Korea',\n 'South Sudan',\n 'Spain',\n 'Sri Lanka',\n 'Sudan',\n 'Suriname',\n 'Svalbard And Jan Mayen Islands',\n 'Swaziland',\n 'Sweden',\n 'Switzerland',\n 'Syria',\n 'Taiwan',\n 'Tajikistan',\n 'Tanzania',\n 'Thailand',\n 'The Bahamas',\n 'Togo',\n 'Tokelau',\n 'Tonga',\n 'Trinidad And Tobago',\n 'Tunisia',\n 'Turkey',\n 'Turkmenistan',\n 'Turks And Caicos Islands',\n 'Tuvalu',\n 'Uganda',\n 'Ukraine',\n 'United Arab Emirates',\n 'United Kingdom',\n 'United States',\n 'United States Minor Outlying Islands',\n 'Uruguay',\n 'Uzbekistan',\n 'Vanuatu',\n 'Vatican City State (Holy See)',\n 'Venezuela',\n 'Vietnam',\n 'Virgin Islands (British)',\n 'Virgin Islands (US)',\n 'Wallis And Futuna Islands',\n 'Western Sahara',\n 'Yemen',\n 'Zambia',\n 'Zimbabwe',\n] as const\n\n/**\n * Represents all possible countries & regions with their corresponding English\n * names.\n */\nexport const EnglishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afghanistan',\n 'Aland Islands': 'Aland Islands',\n Albania: 'Albania',\n Algeria: 'Algeria',\n 'American Samoa': 'American Samoa',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguilla',\n Antarctica: 'Antarctica',\n 'Antigua And Barbuda': 'Antigua And Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaijan',\n Bahrain: 'Bahrain',\n Bangladesh: 'Bangladesh',\n Barbados: 'Barbados',\n Belarus: 'Belarus',\n Belgium: 'Belgium',\n Belize: 'Belize',\n Benin: 'Benin',\n Bermuda: 'Bermuda',\n Bhutan: 'Bhutan',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire',\n 'Bosnia and Herzegovina': 'Bosnia and Herzegovina',\n Botswana: 'Botswana',\n 'Bouvet Island': 'Bouvet Island',\n Brazil: 'Brazil',\n 'British Indian Ocean Territory': 'British Indian Ocean Territory',\n Brunei: 'Brunei',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Cambodia',\n Cameroon: 'Cameroon',\n Canada: 'Canada',\n 'Cape Verde': 'Cape Verde',\n 'Cayman Islands': 'Cayman Islands',\n 'Central African Republic': 'Central African Republic',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Christmas Island',\n 'Cocos (Keeling) Islands': 'Cocos (Keeling) Islands',\n Colombia: 'Colombia',\n Comoros: 'Comoros',\n Congo: 'Congo',\n 'Cook Islands': 'Cook Islands',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": \"Cote D'Ivoire (Ivory Coast)\",\n Croatia: 'Croatia',\n Cuba: 'Cuba',\n Curaçao: 'Curaçao',\n Cyprus: 'Cyprus',\n 'Czech Republic': 'Czech Republic',\n 'Democratic Republic of the Congo': 'Democratic Republic of the Congo',\n Denmark: 'Denmark',\n Djibouti: 'Djibouti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'Dominican Republic',\n 'East Timor': 'East Timor',\n Ecuador: 'Ecuador',\n Egypt: 'Egypt',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Equatorial Guinea',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Ethiopia',\n 'Falkland Islands': 'Falkland Islands',\n 'Faroe Islands': 'Faroe Islands',\n 'Fiji Islands': 'Fiji Islands',\n Finland: 'Finland',\n France: 'France',\n 'French Guiana': 'French Guiana',\n 'French Polynesia': 'French Polynesia',\n 'French Southern Territories': 'French Southern Territories',\n Gabon: 'Gabon',\n 'Gambia The': 'Gambia The',\n Georgia: 'Georgia',\n Germany: 'Germany',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Greece',\n Greenland: 'Greenland',\n Grenada: 'Grenada',\n Guadeloupe: 'Guadeloupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey and Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bissau',\n Guyana: 'Guyana',\n Haiti: 'Haiti',\n 'Heard Island and McDonald Islands': 'Heard Island and McDonald Islands',\n Honduras: 'Honduras',\n 'Hong Kong S.A.R.': 'Hong Kong S.A.R.',\n Hungary: 'Hungary',\n Iceland: 'Iceland',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Iran',\n Iraq: 'Iraq',\n Ireland: 'Ireland',\n Israel: 'Israel',\n Italy: 'Italy',\n Jamaica: 'Jamaica',\n Japan: 'Japan',\n Jersey: 'Jersey',\n Jordan: 'Jordan',\n Kazakhstan: 'Kazakhstan',\n Kenya: 'Kenya',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kyrgyzstan',\n Laos: 'Laos',\n Latvia: 'Latvia',\n Lebanon: 'Lebanon',\n Lesotho: 'Lesotho',\n Liberia: 'Liberia',\n Libya: 'Libya',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lithuania',\n Luxembourg: 'Luxembourg',\n 'Macau S.A.R.': 'Macau S.A.R.',\n Madagascar: 'Madagascar',\n Malawi: 'Malawi',\n Malaysia: 'Malaysia',\n Maldives: 'Maldives',\n Mali: 'Mali',\n Malta: 'Malta',\n 'Man (Isle of)': 'Man (Isle of)',\n 'Marshall Islands': 'Marshall Islands',\n Martinique: 'Martinique',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauritius',\n Mayotte: 'Mayotte',\n Mexico: 'Mexico',\n Micronesia: 'Micronesia',\n Moldova: 'Moldova',\n Monaco: 'Monaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Morocco',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Netherlands',\n 'New Caledonia': 'New Caledonia',\n 'New Zealand': 'New Zealand',\n Nicaragua: 'Nicaragua',\n Niger: 'Niger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Norfolk Island',\n 'North Korea': 'North Korea',\n 'North Macedonia': 'North Macedonia',\n 'Northern Mariana Islands': 'Northern Mariana Islands',\n Norway: 'Norway',\n Oman: 'Oman',\n Pakistan: 'Pakistan',\n Palau: 'Palau',\n 'Palestinian Territory Occupied': 'Palestinian Territory Occupied',\n Panama: 'Panama',\n 'Papua new Guinea': 'Papua new Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Peru',\n Philippines: 'Philippines',\n 'Pitcairn Island': 'Pitcairn Island',\n Poland: 'Poland',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Qatar',\n Reunion: 'Reunion',\n Romania: 'Romania',\n Russia: 'Russia',\n Rwanda: 'Rwanda',\n 'Saint Helena': 'Saint Helena',\n 'Saint Kitts And Nevis': 'Saint Kitts And Nevis',\n 'Saint Lucia': 'Saint Lucia',\n 'Saint Pierre and Miquelon': 'Saint Pierre and Miquelon',\n 'Saint Vincent And The Grenadines': 'Saint Vincent And The Grenadines',\n 'Saint-Barthelemy': 'Saint-Barthelemy',\n 'Saint-Martin (French part)': 'Saint-Martin (French part)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Sao Tome and Principe',\n 'Saudi Arabia': 'Saudi Arabia',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leone',\n Singapore: 'Singapore',\n 'Sint Maarten (Dutch part)': 'Sint Maarten (Dutch part)',\n Slovakia: 'Slovakia',\n Slovenia: 'Slovenia',\n 'Solomon Islands': 'Solomon Islands',\n Somalia: 'Somalia',\n 'South Africa': 'South Africa',\n 'South Georgia': 'South Georgia',\n 'South Korea': 'South Korea',\n 'South Sudan': 'South Sudan',\n Spain: 'Spain',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudan',\n Suriname: 'Suriname',\n 'Svalbard And Jan Mayen Islands': 'Svalbard And Jan Mayen Islands',\n Swaziland: 'Swaziland',\n Sweden: 'Sweden',\n Switzerland: 'Switzerland',\n Syria: 'Syria',\n Taiwan: 'Taiwan',\n Tajikistan: 'Tajikistan',\n Tanzania: 'Tanzania',\n Thailand: 'Thailand',\n 'The Bahamas': 'The Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad And Tobago',\n Tunisia: 'Tunisia',\n Turkey: 'Turkey',\n Turkmenistan: 'Turkmenistan',\n 'Turks And Caicos Islands': 'Turks And Caicos Islands',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ukraine',\n 'United Arab Emirates': 'United Arab Emirates',\n 'United Kingdom': 'United Kingdom',\n 'United States': 'United States',\n 'United States Minor Outlying Islands':\n 'United States Minor Outlying Islands',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistan',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Vatican City State (Holy See)',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Virgin Islands (British)',\n 'Virgin Islands (US)': 'Virgin Islands (US)',\n 'Wallis And Futuna Islands': 'Wallis And Futuna Islands',\n 'Western Sahara': 'Western Sahara',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabwe',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Simplified Chinese names.\n */\nexport const SimplifiedChineseCountryNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奥兰群岛',\n Albania: '阿尔巴尼亚',\n Algeria: '阿尔及利亚',\n 'American Samoa': '美属萨摩亚',\n Andorra: '安道尔',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南极洲',\n 'Antigua And Barbuda': '安提瓜和巴布达',\n Argentina: '阿根廷',\n Armenia: '亚美尼亚',\n Aruba: '阿鲁巴',\n Australia: '澳大利亚',\n Austria: '奥地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄罗斯',\n Belgium: '比利时',\n Belize: '伯利兹',\n Benin: '贝宁',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利维亚',\n 'Bonaire, Sint Eustatius and Saba': '博内尔岛、圣尤斯特歇斯和萨巴岛',\n 'Bosnia and Herzegovina': '波斯尼亚和黑塞哥维那',\n Botswana: '博茨瓦纳',\n 'Bouvet Island': '布维岛',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英属印度洋领地',\n Brunei: '文莱',\n Bulgaria: '保加利亚',\n 'Burkina Faso': '布基纳法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麦隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '开曼群岛',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中国',\n 'Christmas Island': '圣诞岛',\n 'Cocos (Keeling) Islands': '科科斯(基林)群岛',\n Colombia: '哥伦比亚',\n Comoros: '科摩罗',\n Congo: '刚果',\n 'Cook Islands': '库克群岛',\n 'Costa Rica': '哥斯达黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克罗地亚',\n Cuba: '古巴',\n Curaçao: '库拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '刚果(金)',\n Denmark: '丹麦',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和国',\n 'East Timor': '东帝汶',\n Ecuador: '厄瓜多尔',\n Egypt: '埃及',\n 'El Salvador': '萨尔瓦多',\n 'Equatorial Guinea': '赤道几内亚',\n Eritrea: '厄立特里亚',\n Estonia: '爱沙尼亚',\n Ethiopia: '埃塞俄比亚',\n 'Falkland Islands': '福克兰群岛',\n 'Faroe Islands': '法罗群岛',\n 'Fiji Islands': '斐济',\n Finland: '芬兰',\n France: '法国',\n 'French Guiana': '法属圭亚那',\n 'French Polynesia': '法属波利尼西亚',\n 'French Southern Territories': '法属南部领地',\n Gabon: '加蓬',\n 'Gambia The': '冈比亚',\n Georgia: '格鲁吉亚',\n Germany: '德国',\n Ghana: '加纳',\n Gibraltar: '直布罗陀',\n Greece: '希腊',\n Greenland: '格陵兰岛',\n Grenada: '格林纳达',\n Guadeloupe: '瓜德罗普岛',\n Guam: '关岛',\n Guatemala: '危地马拉',\n 'Guernsey and Alderney': '根西岛',\n Guinea: '几内亚',\n 'Guinea-Bissau': '几内亚比绍',\n Guyana: '圭亚那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐纳岛及麦唐纳岛',\n Honduras: '洪都拉斯',\n 'Hong Kong S.A.R.': '中国香港',\n Hungary: '匈牙利',\n Iceland: '冰岛',\n India: '印度',\n Indonesia: '印度尼西亚',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '爱尔兰',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙买加',\n Japan: '日本',\n Jersey: '泽西岛',\n Jordan: '约旦',\n Kazakhstan: '哈萨克斯坦',\n Kenya: '肯尼亚',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉尔吉斯斯坦',\n Laos: '寮人民民主共和国',\n Latvia: '拉脱维亚',\n Lebanon: '黎巴嫩',\n Lesotho: '莱索托',\n Liberia: '利比里亚',\n Libya: '利比亚',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '卢森堡',\n 'Macau S.A.R.': '中国澳门',\n Madagascar: '马达加斯加',\n Malawi: '马拉维',\n Malaysia: '马来西亚',\n Maldives: '马尔代夫',\n Mali: '马里',\n Malta: '马耳他',\n 'Man (Isle of)': '马恩岛',\n 'Marshall Islands': '马绍尔群岛',\n Martinique: '马提尼克岛',\n Mauritania: '毛里塔尼亚',\n Mauritius: '毛里求斯',\n Mayotte: '马约特',\n Mexico: '墨西哥',\n Micronesia: '密克罗尼西亚',\n Moldova: '摩尔多瓦',\n Monaco: '摩纳哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '缅甸',\n Namibia: '纳米比亚',\n Nauru: '瑙鲁',\n Nepal: '尼泊尔',\n Netherlands: '荷兰',\n 'New Caledonia': '新喀里多尼亚',\n 'New Zealand': '新西兰',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日尔',\n Nigeria: '尼日利亚',\n Niue: '纽埃',\n 'Norfolk Island': '诺福克岛',\n 'North Korea': '朝鲜',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亚纳群岛',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕劳',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿马',\n 'Papua new Guinea': '巴布亚新几内亚',\n Paraguay: '巴拉圭',\n Peru: '秘鲁',\n Philippines: '菲律宾',\n 'Pitcairn Island': '皮特凯恩群岛',\n Poland: '波兰',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔尔',\n Reunion: '留尼汪岛',\n Romania: '罗马尼亚',\n Russia: '俄罗斯联邦',\n Rwanda: '卢旺达',\n 'Saint Helena': '圣赫勒拿',\n 'Saint Kitts And Nevis': '圣基茨和尼维斯',\n 'Saint Lucia': '圣卢西亚',\n 'Saint Pierre and Miquelon': '圣皮埃尔和密克隆',\n 'Saint Vincent And The Grenadines': '圣文森特和格林纳丁斯',\n 'Saint-Barthelemy': '圣巴泰勒米',\n 'Saint-Martin (French part)': '密克罗尼西亞',\n Samoa: '萨摩亚',\n 'San Marino': '圣马力诺',\n 'Sao Tome and Principe': '圣多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞内加尔',\n Serbia: '塞尔维亚',\n Seychelles: '塞舌尔',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '圣马丁岛(荷兰部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亚',\n 'Solomon Islands': '所罗门群岛',\n Somalia: '索马里',\n 'South Africa': '南非',\n 'South Georgia': '南乔治亚',\n 'South Korea': '韩国',\n 'South Sudan': '南苏丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里兰卡',\n Sudan: '苏丹',\n Suriname: '苏里南',\n 'Svalbard And Jan Mayen Islands': '斯瓦尔巴和扬马延群岛',\n Swaziland: '斯威士兰',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '叙利亚',\n Taiwan: '中国台湾',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亚',\n Thailand: '泰国',\n 'The Bahamas': '巴哈马',\n Togo: '多哥',\n Tokelau: '托克劳',\n Tonga: '汤加',\n 'Trinidad And Tobago': '特立尼达和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土库曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凯科斯群岛',\n Tuvalu: '图瓦卢',\n Uganda: '乌干达',\n Ukraine: '乌克兰',\n 'United Arab Emirates': '阿拉伯联合酋长国',\n 'United Kingdom': '英国',\n 'United States': '美国',\n 'United States Minor Outlying Islands': '美国本土外小岛屿',\n Uruguay: '乌拉圭',\n Uzbekistan: '乌兹别克斯坦',\n Vanuatu: '瓦努阿图',\n 'Vatican City State (Holy See)': '梵蒂冈',\n Venezuela: '委内瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '圣文森特和格林纳丁斯',\n 'Virgin Islands (US)': '维尔京群岛(美国)',\n 'Wallis And Futuna Islands': '瓦利斯群岛和富图纳群岛',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也门',\n Zambia: '赞比亚',\n Zimbabwe: '津巴布韦',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese HK names.\n */\nexport const TraditionalChineseCountryHKNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭羣島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安提瓜和巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '阿塞拜疆',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴巴多斯',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '伯利茲',\n Benin: '貝寧',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '博茨瓦納',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '文萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布基納法索',\n Burundi: '布隆迪',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '佛得角',\n 'Cayman Islands': '開曼羣島',\n 'Central African Republic': '中非',\n Chad: '乍得',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)羣島',\n Colombia: '哥倫比亞',\n Comoros: '科摩羅',\n Congo: '剛果',\n 'Cook Islands': '庫克羣島',\n 'Costa Rica': '哥斯達黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '科特迪瓦',\n Croatia: '克羅地亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞浦路斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多米尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多爾',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄立特里亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '埃塞俄比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅羣島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬圭亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加蓬',\n 'Gambia The': '岡比亞',\n Georgia: '格魯吉亞',\n Germany: '德國',\n Ghana: '加納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格林納達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '危地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比紹',\n Guyana: '圭亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '洪都拉斯',\n 'Hong Kong S.A.R.': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '意大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克斯坦',\n Kenya: '肯尼亞',\n Kiribati: '基里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '萊索托',\n Liberia: '利比里亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦士登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n 'Macau S.A.R.': '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾代夫',\n Mali: '馬裏',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '毛里塔尼亞',\n Mauritius: '毛里求斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫桑比克',\n Myanmar: '緬甸',\n Namibia: '納米比亞',\n Nauru: '瑙魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '新西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日爾',\n Nigeria: '尼日利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帕勞',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞新幾內亞',\n Paraguay: '巴拉圭',\n Peru: '祕魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡塔爾',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧旺達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖基茨和尼維斯',\n 'Saint Lucia': '聖盧西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森特和格林納丁斯',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙特阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '塞拉利昂',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛文尼亞',\n 'Solomon Islands': '所羅門羣島',\n Somalia: '索馬里',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '斯威士蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克斯坦',\n Tanzania: '坦桑尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '特立尼達和多巴哥',\n Tunisia: '突尼斯',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼斯坦',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '圖瓦盧',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合酋長國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克斯坦',\n Vanuatu: '瓦努阿圖',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森特和格林納丁斯',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '也門',\n Zambia: '贊比亞',\n Zimbabwe: '津巴布韋',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Traditional Chinese TW names.\n */\nexport const TraditionalChineseCountryTWNames: Record<Country, string> = {\n Afghanistan: '阿富汗',\n 'Aland Islands': '奧蘭群島',\n Albania: '阿爾巴尼亞',\n Algeria: '阿爾及利亞',\n 'American Samoa': '美屬薩摩亞',\n Andorra: '安道爾',\n Angola: '安哥拉',\n Anguilla: '安圭拉',\n Antarctica: '南極洲',\n 'Antigua And Barbuda': '安地卡及巴布達',\n Argentina: '阿根廷',\n Armenia: '亞美尼亞',\n Aruba: '阿魯巴',\n Australia: '澳大利亞',\n Austria: '奧地利',\n Azerbaijan: '亞塞拜然',\n Bahrain: '巴林',\n Bangladesh: '孟加拉',\n Barbados: '巴貝多',\n Belarus: '白俄羅斯',\n Belgium: '比利時',\n Belize: '貝里斯',\n Benin: '貝南',\n Bermuda: '百慕大',\n Bhutan: '不丹',\n Bolivia: '玻利維亞',\n 'Bonaire, Sint Eustatius and Saba': '博內爾島、聖尤斯特歇斯和薩巴島',\n 'Bosnia and Herzegovina': '波斯尼亞和黑塞哥維那',\n Botswana: '波札那',\n 'Bouvet Island': '布維島',\n Brazil: '巴西',\n 'British Indian Ocean Territory': '英屬印度洋領地',\n Brunei: '汶萊',\n Bulgaria: '保加利亞',\n 'Burkina Faso': '布吉納法索',\n Burundi: '蒲隆地',\n Cambodia: '柬埔寨',\n Cameroon: '喀麥隆',\n Canada: '加拿大',\n 'Cape Verde': '維德角',\n 'Cayman Islands': '開曼群島',\n 'Central African Republic': '中非',\n Chad: '查德',\n Chile: '智利',\n China: '中國',\n 'Christmas Island': '聖誕島',\n 'Cocos (Keeling) Islands': '科科斯(基林)群島',\n Colombia: '哥倫比亞',\n Comoros: '葛摩',\n Congo: '剛果',\n 'Cook Islands': '庫克群島',\n 'Costa Rica': '哥斯大黎加',\n \"Cote D'Ivoire (Ivory Coast)\": '象牙海岸',\n Croatia: '克羅埃西亞',\n Cuba: '古巴',\n Curaçao: '庫拉索',\n Cyprus: '塞普勒斯',\n 'Czech Republic': '捷克',\n 'Democratic Republic of the Congo': '剛果(金)',\n Denmark: '丹麥',\n Djibouti: '吉布提',\n Dominica: '多明尼加',\n 'Dominican Republic': '多明尼加共和國',\n 'East Timor': '東帝汶',\n Ecuador: '厄瓜多',\n Egypt: '埃及',\n 'El Salvador': '薩爾瓦多',\n 'Equatorial Guinea': '赤道幾內亞',\n Eritrea: '厄利垂亞',\n Estonia: '愛沙尼亞',\n Ethiopia: '衣索比亞',\n 'Falkland Islands': '福克蘭羣島',\n 'Faroe Islands': '法羅群島',\n 'Fiji Islands': '斐濟',\n Finland: '芬蘭',\n France: '法國',\n 'French Guiana': '法屬蓋亞那',\n 'French Polynesia': '法屬波利尼西亞',\n 'French Southern Territories': '法屬南部領地',\n Gabon: '加彭',\n 'Gambia The': '甘比亞',\n Georgia: '喬治亞',\n Germany: '德國',\n Ghana: '迦納',\n Gibraltar: '直布羅陀',\n Greece: '希臘',\n Greenland: '格陵蘭島',\n Grenada: '格瑞那達',\n Guadeloupe: '瓜德羅普島',\n Guam: '關島',\n Guatemala: '瓜地馬拉',\n 'Guernsey and Alderney': '根西島',\n Guinea: '幾內亞',\n 'Guinea-Bissau': '幾內亞比索',\n Guyana: '蓋亞那',\n Haiti: '海地',\n 'Heard Island and McDonald Islands': '赫德·唐納島及麥唐納島',\n Honduras: '宏都拉斯',\n 'Hong Kong S.A.R.': '中國香港',\n Hungary: '匈牙利',\n Iceland: '冰島',\n India: '印度',\n Indonesia: '印度尼西亞',\n Iran: '伊朗',\n Iraq: '伊拉克',\n Ireland: '愛爾蘭',\n Israel: '以色列',\n Italy: '義大利',\n Jamaica: '牙買加',\n Japan: '日本',\n Jersey: '澤西島',\n Jordan: '約旦',\n Kazakhstan: '哈薩克',\n Kenya: '肯亞',\n Kiribati: '吉里巴斯',\n Kosovo: '科索沃',\n Kuwait: '科威特',\n Kyrgyzstan: '吉爾吉斯斯坦',\n Laos: '寮人民民主共和國',\n Latvia: '拉脫維亞',\n Lebanon: '黎巴嫩',\n Lesotho: '賴索托',\n Liberia: '賴比瑞亞',\n Libya: '利比亞',\n Liechtenstein: '列支敦斯登',\n Lithuania: '立陶宛',\n Luxembourg: '盧森堡',\n 'Macau S.A.R.': '中國澳門',\n Madagascar: '馬達加斯加',\n Malawi: '馬拉維',\n Malaysia: '馬來西亞',\n Maldives: '馬爾地夫',\n Mali: '馬裡',\n Malta: '馬耳他',\n 'Man (Isle of)': '馬恩島',\n 'Marshall Islands': '馬紹爾羣島',\n Martinique: '馬提尼克島',\n Mauritania: '茅利塔尼亞',\n Mauritius: '模里西斯',\n Mayotte: '馬約特',\n Mexico: '墨西哥',\n Micronesia: '密克羅尼西亞',\n Moldova: '摩爾多瓦',\n Monaco: '摩納哥',\n Mongolia: '蒙古',\n Montenegro: '黑山',\n Montserrat: '蒙特塞拉特',\n Morocco: '摩洛哥',\n Mozambique: '莫三比克',\n Myanmar: '緬甸',\n Namibia: '奈米比亞',\n Nauru: '諾魯',\n Nepal: '尼泊爾',\n Netherlands: '荷蘭',\n 'New Caledonia': '新喀里多尼亞',\n 'New Zealand': '紐西蘭',\n Nicaragua: '尼加拉瓜',\n Niger: '尼日',\n Nigeria: '奈及利亞',\n Niue: '紐埃',\n 'Norfolk Island': '諾福克島',\n 'North Korea': '朝鮮',\n 'North Macedonia': '北馬其頓',\n 'Northern Mariana Islands': '北马里亞納羣島',\n Norway: '挪威',\n Oman: '阿曼',\n Pakistan: '巴基斯坦',\n Palau: '帛琉',\n 'Palestinian Territory Occupied': '巴勒斯坦',\n Panama: '巴拿馬',\n 'Papua new Guinea': '巴布亞紐幾內亞',\n Paraguay: '巴拉圭',\n Peru: '秘魯',\n Philippines: '菲律賓',\n 'Pitcairn Island': '皮特凱恩羣島',\n Poland: '波蘭',\n Portugal: '葡萄牙',\n 'Puerto Rico': '波多黎各',\n Qatar: '卡達',\n Reunion: '留尼汪島',\n Romania: '羅馬尼亞',\n Russia: '俄羅斯聯邦',\n Rwanda: '盧安達',\n 'Saint Helena': '聖赫勒拿',\n 'Saint Kitts And Nevis': '聖克里斯多福及尼維斯',\n 'Saint Lucia': '聖露西亞',\n 'Saint Pierre and Miquelon': '聖皮埃爾和密克隆',\n 'Saint Vincent And The Grenadines': '聖文森及格瑞那丁',\n 'Saint-Barthelemy': '聖巴泰勒米',\n 'Saint-Martin (French part)': '密克羅尼西亞',\n Samoa: '薩摩亞',\n 'San Marino': '聖馬力諾',\n 'Sao Tome and Principe': '聖多美和普林西比',\n 'Saudi Arabia': '沙烏地阿拉伯',\n Senegal: '塞內加爾',\n Serbia: '塞爾維亞',\n Seychelles: '塞舌爾',\n 'Sierra Leone': '獅子山',\n Singapore: '新加坡',\n 'Sint Maarten (Dutch part)': '聖馬丁島(荷蘭部分)',\n Slovakia: '斯洛伐克',\n Slovenia: '斯洛維尼亞',\n 'Solomon Islands': '索羅門羣島',\n Somalia: '索馬利亞',\n 'South Africa': '南非',\n 'South Georgia': '南喬治亞',\n 'South Korea': '韓國',\n 'South Sudan': '南蘇丹',\n Spain: '西班牙',\n 'Sri Lanka': '斯里蘭卡',\n Sudan: '蘇丹',\n Suriname: '蘇利南',\n 'Svalbard And Jan Mayen Islands': '斯瓦爾巴和揚馬延羣島',\n Swaziland: '史瓦濟蘭',\n Sweden: '瑞典',\n Switzerland: '瑞士',\n Syria: '敘利亞',\n Taiwan: '中國臺灣',\n Tajikistan: '塔吉克',\n Tanzania: '坦尚尼亞',\n Thailand: '泰國',\n 'The Bahamas': '巴哈馬',\n Togo: '多哥',\n Tokelau: '托克勞',\n Tonga: '湯加',\n 'Trinidad And Tobago': '千里達及托巴哥',\n Tunisia: '突尼西亞',\n Turkey: '土耳其',\n Turkmenistan: '土庫曼',\n 'Turks And Caicos Islands': '特克斯和凱科斯羣島',\n Tuvalu: '吐瓦魯',\n Uganda: '烏干達',\n Ukraine: '烏克蘭',\n 'United Arab Emirates': '阿拉伯聯合大公國',\n 'United Kingdom': '英國',\n 'United States': '美國',\n 'United States Minor Outlying Islands': '美國本土外小島嶼',\n Uruguay: '烏拉圭',\n Uzbekistan: '烏茲別克',\n Vanuatu: '萬那杜',\n 'Vatican City State (Holy See)': '梵蒂岡',\n Venezuela: '委內瑞拉',\n Vietnam: '越南',\n 'Virgin Islands (British)': '聖文森及格瑞那丁',\n 'Virgin Islands (US)': '維爾京羣島(美國)',\n 'Wallis And Futuna Islands': '瓦利斯羣島和富圖納羣島',\n 'Western Sahara': '西撒哈拉',\n Yemen: '葉門',\n Zambia: '尚比亞',\n Zimbabwe: '辛巴威',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Spanish names.\n */\nexport const SpanishCountryNames: Record<Country, string> = {\n Afghanistan: 'Afganistán',\n 'Aland Islands': 'Islas Åland',\n Albania: 'Albania',\n Algeria: 'Argelia',\n 'American Samoa': 'Samoa Americana',\n Andorra: 'Andorra',\n Angola: 'Angola',\n Anguilla: 'Anguila',\n Antarctica: 'Antártida',\n 'Antigua And Barbuda': 'Antigua y Barbuda',\n Argentina: 'Argentina',\n Armenia: 'Armenia',\n Aruba: 'Aruba',\n Australia: 'Australia',\n Austria: 'Austria',\n Azerbaijan: 'Azerbaiyán',\n Bahrain: 'Baréin',\n Bangladesh: 'Bangladés',\n Barbados: 'Barbados',\n Belarus: 'Bielorrusia',\n Belgium: 'Bélgica',\n Belize: 'Belice',\n Benin: 'Benín',\n Bermuda: 'Bermudas',\n Bhutan: 'Bután',\n Bolivia: 'Bolivia',\n 'Bonaire, Sint Eustatius and Saba': 'Bonaire, San Eustaquio y Saba',\n 'Bosnia and Herzegovina': 'Bosnia y Herzegovina',\n Botswana: 'Botsuana',\n 'Bouvet Island': 'Isla Bouvet',\n Brazil: 'Brasil',\n 'British Indian Ocean Territory': 'Territorio Británico del Océano Índico',\n Brunei: 'Brunéi',\n Bulgaria: 'Bulgaria',\n 'Burkina Faso': 'Burkina Faso',\n Burundi: 'Burundi',\n Cambodia: 'Camboya',\n Cameroon: 'Camerún',\n Canada: 'Canadá',\n 'Cape Verde': 'Cabo Verde',\n 'Cayman Islands': 'Islas Caimán',\n 'Central African Republic': 'República Centroafricana',\n Chad: 'Chad',\n Chile: 'Chile',\n China: 'China',\n 'Christmas Island': 'Isla de Navidad',\n 'Cocos (Keeling) Islands': 'Islas Cocos',\n Colombia: 'Colombia',\n Comoros: 'Comoras',\n Congo: 'Congo',\n 'Cook Islands': 'Islas Cook',\n 'Costa Rica': 'Costa Rica',\n \"Cote D'Ivoire (Ivory Coast)\": 'Costa de Marfil',\n Croatia: 'Croacia',\n Cuba: 'Cuba',\n Curaçao: 'Curazao',\n Cyprus: 'Chipre',\n 'Czech Republic': 'República Checa',\n 'Democratic Republic of the Congo': 'República Democrática del Congo',\n Denmark: 'Dinamarca',\n Djibouti: 'Yibuti',\n Dominica: 'Dominica',\n 'Dominican Republic': 'República Dominicana',\n 'East Timor': 'Timor Oriental',\n Ecuador: 'Ecuador',\n Egypt: 'Egipto',\n 'El Salvador': 'El Salvador',\n 'Equatorial Guinea': 'Guinea Ecuatorial',\n Eritrea: 'Eritrea',\n Estonia: 'Estonia',\n Ethiopia: 'Etiopía',\n 'Falkland Islands': 'Islas Malvinas',\n 'Faroe Islands': 'Islas Feroe',\n 'Fiji Islands': 'Fiyi',\n Finland: 'Finlandia',\n France: 'Francia',\n 'French Guiana': 'Guayana Francesa',\n 'French Polynesia': 'Polinesia Francesa',\n 'French Southern Territories': 'Tierras Australes y Antárticas Francesas',\n Gabon: 'Gabón',\n 'Gambia The': 'Gambia',\n Georgia: 'Georgia',\n Germany: 'Alemania',\n Ghana: 'Ghana',\n Gibraltar: 'Gibraltar',\n Greece: 'Grecia',\n Greenland: 'Groenlandia',\n Grenada: 'Granada',\n Guadeloupe: 'Guadalupe',\n Guam: 'Guam',\n Guatemala: 'Guatemala',\n 'Guernsey and Alderney': 'Guernsey y Alderney',\n Guinea: 'Guinea',\n 'Guinea-Bissau': 'Guinea-Bisáu',\n Guyana: 'Guyana',\n Haiti: 'Haití',\n 'Heard Island and McDonald Islands': 'Islas Heard y McDonald',\n Honduras: 'Honduras',\n 'Hong Kong S.A.R.': 'Hong Kong',\n Hungary: 'Hungría',\n Iceland: 'Islandia',\n India: 'India',\n Indonesia: 'Indonesia',\n Iran: 'Irán',\n Iraq: 'Irak',\n Ireland: 'Irlanda',\n Israel: 'Israel',\n Italy: 'Italia',\n Jamaica: 'Jamaica',\n Japan: 'Japón',\n Jersey: 'Jersey',\n Jordan: 'Jordania',\n Kazakhstan: 'Kazajistán',\n Kenya: 'Kenia',\n Kiribati: 'Kiribati',\n Kosovo: 'Kosovo',\n Kuwait: 'Kuwait',\n Kyrgyzstan: 'Kirguistán',\n Laos: 'Laos',\n Latvia: 'Letonia',\n Lebanon: 'Líbano',\n Lesotho: 'Lesoto',\n Liberia: 'Liberia',\n Libya: 'Libia',\n Liechtenstein: 'Liechtenstein',\n Lithuania: 'Lituania',\n Luxembourg: 'Luxemburgo',\n 'Macau S.A.R.': 'Macao',\n Madagascar: 'Madagascar',\n Malawi: 'Malaui',\n Malaysia: 'Malasia',\n Maldives: 'Maldivas',\n Mali: 'Malí',\n Malta: 'Malta',\n 'Man (Isle of)': 'Isla de Man',\n 'Marshall Islands': 'Islas Marshall',\n Martinique: 'Martinica',\n Mauritania: 'Mauritania',\n Mauritius: 'Mauricio',\n Mayotte: 'Mayotte',\n Mexico: 'México',\n Micronesia: 'Micronesia',\n Moldova: 'Moldavia',\n Monaco: 'Mónaco',\n Mongolia: 'Mongolia',\n Montenegro: 'Montenegro',\n Montserrat: 'Montserrat',\n Morocco: 'Marruecos',\n Mozambique: 'Mozambique',\n Myanmar: 'Myanmar',\n Namibia: 'Namibia',\n Nauru: 'Nauru',\n Nepal: 'Nepal',\n Netherlands: 'Países Bajos',\n 'New Caledonia': 'Nueva Caledonia',\n 'New Zealand': 'Nueva Zelanda',\n Nicaragua: 'Nicaragua',\n Niger: 'Níger',\n Nigeria: 'Nigeria',\n Niue: 'Niue',\n 'Norfolk Island': 'Isla Norfolk',\n 'North Korea': 'Corea del Norte',\n 'North Macedonia': 'Macedonia del Norte',\n 'Northern Mariana Islands': 'Islas Marianas del Norte',\n Norway: 'Noruega',\n Oman: 'Omán',\n Pakistan: 'Pakistán',\n Palau: 'Palaos',\n 'Palestinian Territory Occupied': 'Territorio Palestino Ocupado',\n Panama: 'Panamá',\n 'Papua new Guinea': 'Papúa Nueva Guinea',\n Paraguay: 'Paraguay',\n Peru: 'Perú',\n Philippines: 'Filipinas',\n 'Pitcairn Island': 'Islas Pitcairn',\n Poland: 'Polonia',\n Portugal: 'Portugal',\n 'Puerto Rico': 'Puerto Rico',\n Qatar: 'Catar',\n Reunion: 'Reunión',\n Romania: 'Rumania',\n Russia: 'Rusia',\n Rwanda: 'Ruanda',\n 'Saint Helena': 'Santa Elena',\n 'Saint Kitts And Nevis': 'San Cristóbal y Nieves',\n 'Saint Lucia': 'Santa Lucía',\n 'Saint Pierre and Miquelon': 'San Pedro y Miquelón',\n 'Saint Vincent And The Grenadines': 'San Vicente y las Granadinas',\n 'Saint-Barthelemy': 'San Bartolomé',\n 'Saint-Martin (French part)': 'San Martín (parte francesa)',\n Samoa: 'Samoa',\n 'San Marino': 'San Marino',\n 'Sao Tome and Principe': 'Santo Tomé y Príncipe',\n 'Saudi Arabia': 'Arabia Saudita',\n Senegal: 'Senegal',\n Serbia: 'Serbia',\n Seychelles: 'Seychelles',\n 'Sierra Leone': 'Sierra Leona',\n Singapore: 'Singapur',\n 'Sint Maarten (Dutch part)': 'San Martín (parte neerlandesa)',\n Slovakia: 'Eslovaquia',\n Slovenia: 'Eslovenia',\n 'Solomon Islands': 'Islas Salomón',\n Somalia: 'Somalia',\n 'South Africa': 'Sudáfrica',\n 'South Georgia': 'Georgia del Sur',\n 'South Korea': 'Corea del Sur',\n 'South Sudan': 'Sudán del Sur',\n Spain: 'España',\n 'Sri Lanka': 'Sri Lanka',\n Sudan: 'Sudán',\n Suriname: 'Surinam',\n 'Svalbard And Jan Mayen Islands': 'Svalbard y Jan Mayen',\n Swaziland: 'Suazilandia',\n Sweden: 'Suecia',\n Switzerland: 'Suiza',\n Syria: 'Siria',\n Taiwan: 'Taiwán',\n Tajikistan: 'Tayikistán',\n Tanzania: 'Tanzania',\n Thailand: 'Tailandia',\n 'The Bahamas': 'Bahamas',\n Togo: 'Togo',\n Tokelau: 'Tokelau',\n Tonga: 'Tonga',\n 'Trinidad And Tobago': 'Trinidad y Tobago',\n Tunisia: 'Túnez',\n Turkey: 'Turquía',\n Turkmenistan: 'Turkmenistán',\n 'Turks And Caicos Islands': 'Islas Turcas y Caicos',\n Tuvalu: 'Tuvalu',\n Uganda: 'Uganda',\n Ukraine: 'Ucrania',\n 'United Arab Emirates': 'Emiratos Árabes Unidos',\n 'United Kingdom': 'Reino Unido',\n 'United States': 'Estados Unidos',\n 'United States Minor Outlying Islands':\n 'Islas Ultramarinas Menores de Estados Unidos',\n Uruguay: 'Uruguay',\n Uzbekistan: 'Uzbekistán',\n Vanuatu: 'Vanuatu',\n 'Vatican City State (Holy See)': 'Ciudad del Vaticano',\n Venezuela: 'Venezuela',\n Vietnam: 'Vietnam',\n 'Virgin Islands (British)': 'Islas Vírgenes Británicas',\n 'Virgin Islands (US)': 'Islas Vírgenes de los Estados Unidos',\n 'Wallis And Futuna Islands': 'Wallis y Futuna',\n 'Western Sahara': 'Sahara Occidental',\n Yemen: 'Yemen',\n Zambia: 'Zambia',\n Zimbabwe: 'Zimbabue',\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type {\n LocaleLanguage,\n Resume,\n ResumeContent,\n ResumeItem,\n ResumeLayout,\n Template,\n} from '@/models'\n\n/**\n * Defines all possible degrees.\n */\nexport const DEGREE_OPTIONS = [\n 'Middle School',\n 'High School',\n 'Diploma',\n 'Associate',\n 'Bachelor',\n 'Master',\n 'Doctor',\n] as const\n\n/**\n * Defines language fluency levels.\n *\n * Based on the Interagency Language Roundtable (ILR) scale.\n */\nexport const FLUENCY_OPTIONS = [\n 'Elementary Proficiency',\n 'Limited Working Proficiency',\n 'Minimum Professional Proficiency',\n 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency',\n] as const\n\n/** The options for the font size. */\nexport const FONT_SIZE_OPTIONS = ['10pt', '11pt', '12pt'] as const\n\n/** The options for the font spec numbers style. */\nexport const FONTSPEC_NUMBERS_OPTIONS = ['Lining', 'OldStyle', 'Auto'] as const\n\n/**\n * Defines common world languages.\n *\n * This list contains the most used languages in the world.\n *\n * TODO: allow users to add their own languages\n */\nexport const LANGUAGE_OPTIONS = [\n 'Afrikaans',\n 'Albanian',\n 'Amharic',\n 'Arabic',\n 'Azerbaijani',\n 'Belarusian',\n 'Bengali',\n 'Bhojpuri',\n 'Bulgarian',\n 'Burmese',\n 'Cantonese',\n 'Catalan',\n 'Chinese',\n 'Croatian',\n 'Czech',\n 'Danish',\n 'Dutch',\n 'English',\n 'Estonian',\n 'Farsi',\n 'Filipino',\n 'Finnish',\n 'French',\n 'German',\n 'Greek',\n 'Gujarati',\n 'Hausa',\n 'Hebrew',\n 'Hindi',\n 'Hungarian',\n 'Icelandic',\n 'Igbo',\n 'Indonesian',\n 'Irish',\n 'Italian',\n 'Japanese',\n 'Javanese',\n 'Kazakh',\n 'Khmer',\n 'Korean',\n 'Lahnda',\n 'Latvian',\n 'Lithuanian',\n 'Malay',\n 'Mandarin',\n 'Marathi',\n 'Nepali',\n 'Norwegian',\n 'Oromo',\n 'Pashto',\n 'Polish',\n 'Portuguese',\n 'Romanian',\n 'Russian',\n 'Serbian',\n 'Shona',\n 'Sinhala',\n 'Slovak',\n 'Slovene',\n 'Somali',\n 'Spanish',\n 'Sundanese',\n 'Swahili',\n 'Swedish',\n 'Tagalog',\n 'Tamil',\n 'Telugu',\n 'Thai',\n 'Turkish',\n 'Ukrainian',\n 'Urdu',\n 'Uzbek',\n 'Vietnamese',\n 'Yoruba',\n 'Zulu',\n] as const\n\n/**\n * Defines skill proficiency levels.\n *\n * Based on common industry standards for skill assessment.\n */\nexport const LEVEL_OPTIONS = [\n 'Novice',\n 'Beginner',\n 'Intermediate',\n 'Advanced',\n 'Expert',\n 'Master',\n] as const\n\n/**\n * Defines supported languages for UI display and template translation.\n *\n * @see {@link https://en.wikipedia.org/wiki/IETF_language_tag}\n */\nexport const LOCALE_LANGUAGE_OPTIONS = [\n 'en',\n 'zh-hans',\n 'zh-hant-hk',\n 'zh-hant-tw',\n 'es',\n] as const\n\n/**\n * Defines network options.\n */\nexport const NETWORK_OPTIONS = [\n 'Behance',\n 'Dribbble',\n 'Facebook',\n 'GitHub',\n 'Gitlab',\n 'Instagram',\n 'Line',\n 'LinkedIn',\n 'Medium',\n 'Pinterest',\n 'Reddit',\n 'Snapchat',\n 'Stack Overflow',\n 'Telegram',\n 'TikTok',\n 'Twitch',\n 'Twitter',\n 'Vimeo',\n 'Weibo',\n 'WeChat',\n 'WhatsApp',\n 'YouTube',\n 'Zhihu',\n] as const\n\n/**\n * All valid top-level sections in the resume.\n * */\nexport const SECTION_IDS = [\n 'basics',\n 'location',\n 'profiles',\n 'work',\n 'education',\n 'volunteer',\n 'awards',\n 'certificates',\n 'publications',\n 'skills',\n 'languages',\n 'interests',\n 'references',\n 'projects',\n] as const\n\n/** Defines identifiers for the available resume templates. */\nexport const TEMPLATE_OPTIONS = [\n 'moderncv-banking',\n 'moderncv-casual',\n 'moderncv-classic',\n] as const\n\nexport function getTemplateDetail(template: Template) {\n const templateDetails: Record<\n Template,\n { name: string; description: string }\n > = {\n 'moderncv-banking': {\n name: 'ModernCV Banking',\n description: 'ModernCV template with banking style',\n },\n 'moderncv-casual': {\n name: 'ModernCV Casual',\n description: 'ModernCV template with casual style',\n },\n 'moderncv-classic': {\n name: 'ModernCV Classic',\n description: 'ModernCV template with classic style',\n },\n }\n\n if (template in templateDetails) {\n return {\n id: template,\n ...templateDetails[template],\n }\n }\n\n throw new Error(`Invalid template option: ${template}`)\n}\n\n/** Provides default, empty item structures for each resume section type. */\nexport const resumeItems: ResumeItem = {\n award: {\n awarder: '',\n date: '',\n summary: '',\n title: '',\n },\n basics: {\n email: '',\n headline: '',\n name: '',\n phone: '',\n summary: '',\n url: '',\n },\n certificate: {\n date: '',\n issuer: '',\n name: '',\n url: '',\n },\n education: {\n area: '',\n courses: [],\n endDate: '',\n summary: '',\n institution: '',\n score: '',\n startDate: '',\n degree: null,\n url: '',\n },\n interest: {\n keywords: [],\n name: '',\n },\n language: {\n fluency: 'Elementary Proficiency',\n language: 'English',\n keywords: [],\n },\n location: {\n address: '',\n city: '',\n country: null,\n postalCode: '',\n region: '',\n },\n profile: {\n network: 'GitHub',\n url: '',\n username: '',\n },\n project: {\n description: '',\n endDate: '',\n summary: '',\n keywords: [],\n name: '',\n startDate: '',\n url: '',\n },\n publication: {\n name: '',\n publisher: '',\n releaseDate: '',\n summary: '',\n url: '',\n },\n reference: {\n email: '',\n name: '',\n phone: '',\n relationship: '',\n summary: '',\n },\n skill: {\n keywords: [],\n level: null,\n name: '',\n },\n volunteer: {\n endDate: '',\n organization: '',\n position: '',\n startDate: '',\n summary: '',\n url: '',\n },\n work: {\n name: '',\n endDate: '',\n position: '',\n startDate: '',\n keywords: [],\n summary: '',\n url: '',\n },\n}\n\n/**\n * Default content structure for a new resume, containing empty or minimal\n * sections.\n */\nexport const defaultResumeContent: ResumeContent = {\n awards: [],\n basics: resumeItems.basics,\n certificates: [],\n education: [resumeItems.education],\n interests: [],\n languages: [resumeItems.language],\n location: resumeItems.location,\n profiles: [resumeItems.profile],\n projects: [],\n publications: [],\n references: [],\n skills: [resumeItems.skill],\n volunteer: [],\n work: [resumeItems.work],\n}\n\n/**\n * Resume content structure containing one example item for each section.\n *\n * Useful for testing transformations and rendering.\n */\nexport const filledResumeContent: ResumeContent = {\n awards: [resumeItems.award],\n basics: resumeItems.basics,\n certificates: [resumeItems.certificate],\n education: [resumeItems.education],\n interests: [resumeItems.interest],\n languages: [resumeItems.language],\n location: resumeItems.location,\n profiles: [resumeItems.profile],\n projects: [resumeItems.project],\n publications: [resumeItems.publication],\n references: [resumeItems.reference],\n skills: [resumeItems.skill],\n volunteer: [resumeItems.volunteer],\n work: [resumeItems.work],\n}\n\n/** Default top/bottom margin value. */\nconst defaultTopBottomMargin = '2.5 cm'\n/** Default left/right margin value. */\nconst defaultLeftRightMargin = '1.5 cm'\n\n/** Available margin size options for resume layout. */\nexport const marginOptions = [\n defaultLeftRightMargin,\n '1.75 cm',\n '2.0 cm',\n '2.25 cm',\n defaultTopBottomMargin,\n]\n\n/**\n * Get the language code and name of the given locale language.\n *\n * @param localeLanguage The locale language to get the name for.\n * @returns The language code and name of the given locale language.\n */\nexport function getLocaleLanguageDetail(localeLanguage: LocaleLanguage) {\n const localeLanguageDetails: Record<LocaleLanguage, string> = {\n en: 'English',\n 'zh-hans': 'Simplified Chinese',\n 'zh-hant-hk': 'Traditional Chinese (Hong Kong)',\n 'zh-hant-tw': 'Traditional Chinese (Taiwan)',\n es: 'Spanish',\n }\n\n if (localeLanguage in localeLanguageDetails) {\n return {\n localeLanguage,\n name: localeLanguageDetails[localeLanguage],\n }\n }\n\n throw new Error(`Invalid locale language: ${localeLanguage}`)\n}\n\n/** Default layout configuration for a new resume. */\nexport const defaultResumeLayout: ResumeLayout = {\n template: 'moderncv-banking',\n typography: {\n fontSize: FONT_SIZE_OPTIONS[0],\n },\n latex: {\n fontspec: {\n numbers: 'Auto',\n },\n },\n margins: {\n top: defaultTopBottomMargin,\n bottom: defaultTopBottomMargin,\n left: defaultLeftRightMargin,\n right: defaultLeftRightMargin,\n },\n locale: {\n language: 'en',\n },\n page: {\n showPageNumbers: false,\n },\n}\n\n/** Default value when user creates a new `Resume` object. */\nexport const defaultResume: Resume = {\n content: defaultResumeContent,\n layout: defaultResumeLayout,\n}\n\n/**\n * Default value when user wants to use a filled resume.\n *\n * This is useful for testing transformations and rendering.\n */\nexport const filledResume: Resume = {\n content: filledResumeContent,\n layout: defaultResumeLayout,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport type {\n Country,\n Degree,\n Fluency,\n Language,\n Level,\n LocaleLanguage,\n SectionID,\n} from '@/models'\n\nimport {\n EnglishCountryNames,\n SimplifiedChineseCountryNames,\n SpanishCountryNames,\n TraditionalChineseCountryHKNames,\n TraditionalChineseCountryTWNames,\n} from '@/models'\n\n/** Defines the structure for translated terms for a single language. */\ntype OptionTranslation = {\n /** Translations for country names. */\n countries: Record<Country, string>\n /** Translations for degree types. */\n degrees: Record<Degree, string>\n /** Translations for language fluency levels. */\n fluency: Record<Fluency, string>\n /** Translations for language names. */\n languages: Record<Language, string>\n /** Translations for resume section titles. */\n sections: Record<SectionID, string>\n /** Translations for skill proficiency levels. */\n skills: Record<Level, string>\n}\n\ntype OptionCategory = keyof OptionTranslation\n\n/** The structure containing translations for all supported languages. */\ntype OptionsTranslations = Record<LocaleLanguage, OptionTranslation>\n\n/**\n * Retrieves the translated terms for a specific locale language.\n *\n * Includes translations for degrees, languages, fluencies, countries, section\n * titles, levels, and other specific terms.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated terms for the specified\n * language.\n */\nexport function getOptionTranslation<K extends OptionCategory>(\n language: LocaleLanguage,\n category: K,\n option: keyof OptionTranslation[K]\n): string {\n const optionsTranslations: OptionsTranslations = {\n en: {\n countries: EnglishCountryNames,\n degrees: {\n 'Middle School': 'Middle School',\n 'High School': 'High School',\n Diploma: 'Diploma',\n Associate: 'Associate',\n Bachelor: 'Bachelor',\n Master: 'Master',\n Doctor: 'Doctor',\n },\n languages: {\n Afrikaans: 'Afrikaans',\n Albanian: 'Albanian',\n Amharic: 'Amharic',\n Arabic: 'Arabic',\n Azerbaijani: 'Azerbaijani',\n Belarusian: 'Belarusian',\n Bengali: 'Bengali',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Bulgarian',\n Burmese: 'Burmese',\n Cantonese: 'Cantonese',\n Catalan: 'Catalan',\n Chinese: 'Chinese',\n Croatian: 'Croatian',\n Czech: 'Czech',\n Danish: 'Danish',\n Dutch: 'Dutch',\n English: 'English',\n Estonian: 'Estonian',\n Farsi: 'Farsi',\n Filipino: 'Filipino',\n Finnish: 'Finnish',\n French: 'French',\n German: 'German',\n Greek: 'Greek',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebrew',\n Hindi: 'Hindi',\n Hungarian: 'Hungarian',\n Icelandic: 'Icelandic',\n Igbo: 'Igbo',\n Indonesian: 'Indonesian',\n Irish: 'Irish',\n Italian: 'Italian',\n Japanese: 'Japanese',\n Javanese: 'Javanese',\n Kazakh: 'Kazakh',\n Khmer: 'Khmer',\n Korean: 'Korean',\n Lahnda: 'Lahnda',\n Latvian: 'Latvian',\n Lithuanian: 'Lithuanian',\n Malay: 'Malay',\n Mandarin: 'Mandarin',\n Marathi: 'Marathi',\n Nepali: 'Nepali',\n Norwegian: 'Norwegian',\n Oromo: 'Oromo',\n Pashto: 'Pashto',\n Polish: 'Polish',\n Portuguese: 'Portuguese',\n Romanian: 'Romanian',\n Russian: 'Russian',\n Serbian: 'Serbian',\n Shona: 'Shona',\n Sinhala: 'Sinhala',\n Slovak: 'Slovak',\n Slovene: 'Slovene',\n Somali: 'Somali',\n Spanish: 'Spanish',\n Sundanese: 'Sundanese',\n Swahili: 'Swahili',\n Swedish: 'Swedish',\n Tagalog: 'Tagalog',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Thai',\n Turkish: 'Turkish',\n Ukrainian: 'Ukrainian',\n Urdu: 'Urdu',\n Uzbek: 'Uzbek',\n Vietnamese: 'Vietnamese',\n Yoruba: 'Yoruba',\n Zulu: 'Zulu',\n },\n fluency: {\n 'Elementary Proficiency': 'Elementary Proficiency',\n 'Limited Working Proficiency': 'Limited Working Proficiency',\n 'Minimum Professional Proficiency': 'Minimum Professional Proficiency',\n 'Full Professional Proficiency': 'Full Professional Proficiency',\n 'Native or Bilingual Proficiency': 'Native or Bilingual Proficiency',\n },\n sections: {\n awards: 'Awards',\n basics: 'Basics',\n certificates: 'Certificates',\n education: 'Education',\n interests: 'Interests',\n languages: 'Languages',\n location: 'Location',\n profiles: 'Profiles',\n projects: 'Projects',\n publications: 'Publications',\n references: 'References',\n skills: 'Skills',\n volunteer: 'Volunteer',\n work: 'Work',\n },\n skills: {\n Novice: 'Novice',\n Beginner: 'Beginner',\n Intermediate: 'Intermediate',\n Advanced: 'Advanced',\n Expert: 'Expert',\n Master: 'Master',\n },\n },\n 'zh-hans': {\n countries: SimplifiedChineseCountryNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '专科',\n Associate: '副学士',\n Bachelor: '学士',\n Master: '硕士',\n Doctor: '博士',\n },\n languages: {\n Afrikaans: '南非语',\n Albanian: '阿尔巴尼亚语',\n Amharic: '阿姆哈拉语',\n Arabic: '阿拉伯语',\n Azerbaijani: '阿塞拜疆语',\n Belarusian: '白俄罗斯语',\n Bengali: '孟加拉语',\n Bhojpuri: '博杰普尔语',\n Bulgarian: '保加利亚语',\n Burmese: '缅甸语',\n Cantonese: '粤语',\n Catalan: '加泰罗尼亚语',\n Chinese: '中文',\n Croatian: '克罗地亚语',\n Czech: '捷克语',\n Danish: '丹麦语',\n Dutch: '荷兰语',\n English: '英语',\n Estonian: '爱沙尼亚语',\n Farsi: '波斯语',\n Filipino: '菲律宾语',\n Finnish: '芬兰语',\n French: '法语',\n German: '德语',\n Greek: '希腊语',\n Gujarati: '古吉拉特语',\n Hausa: '豪萨语',\n Hebrew: '希伯来语',\n Hindi: '印地语',\n Hungarian: '匈牙利语',\n Icelandic: '冰岛语',\n Igbo: '伊博语',\n Indonesian: '印度尼西亚语',\n Irish: '爱尔兰语',\n Italian: '意大利语',\n Japanese: '日语',\n Javanese: '爪哇语',\n Kazakh: '哈萨克语',\n Khmer: '高棉语',\n Korean: '韩语',\n Lahnda: '拉亨达语',\n Latvian: '拉脱维亚语',\n Lithuanian: '立陶宛语',\n Malay: '马来语',\n Mandarin: '普通话',\n Marathi: '马拉地语',\n Nepali: '尼泊尔语',\n Norwegian: '挪威语',\n Oromo: '奥罗莫语',\n Pashto: '普什图语',\n Polish: '波兰语',\n Portuguese: '葡萄牙语',\n Romanian: '罗马尼亚语',\n Russian: '俄语',\n Serbian: '塞尔维亚语',\n Shona: '绍纳语',\n Sinhala: '僧伽罗语',\n Slovak: '斯洛伐克语',\n Slovene: '斯洛文尼亚语',\n Somali: '索马里语',\n Spanish: '西班牙语',\n Sundanese: '巽他语',\n Swahili: '斯瓦希里语',\n Swedish: '瑞典语',\n Tagalog: '他加禄语',\n Tamil: '泰米尔语',\n Telugu: '泰卢固语',\n Thai: '泰语',\n Turkish: '土耳其语',\n Ukrainian: '乌克兰语',\n Urdu: '乌尔都语',\n Uzbek: '乌兹别克语',\n Vietnamese: '越南语',\n Yoruba: '约鲁巴语',\n Zulu: '祖鲁语',\n },\n fluency: {\n 'Elementary Proficiency': '初级水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低专业水平',\n 'Full Professional Proficiency': '完全专业水平',\n 'Native or Bilingual Proficiency': '母语或双语水平',\n },\n sections: {\n awards: '荣誉',\n basics: '简介',\n certificates: '证书',\n education: '教育背景',\n interests: '兴趣爱好',\n languages: '语言',\n location: '地址',\n profiles: '社交信息',\n projects: '项目',\n publications: '出版刊物',\n references: '引荐',\n skills: '专业技能',\n volunteer: '志愿服务',\n work: '工作经历',\n },\n skills: {\n Novice: '新手',\n Beginner: '初级',\n Intermediate: '中级',\n Advanced: '高级',\n Expert: '专家',\n Master: '大师',\n },\n },\n 'zh-hant-hk': {\n countries: TraditionalChineseCountryHKNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n fluency: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '地址',\n profiles: '社交信息',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n 'zh-hant-tw': {\n countries: TraditionalChineseCountryTWNames,\n degrees: {\n 'Middle School': '初中',\n 'High School': '高中',\n Diploma: '專科',\n Associate: '副學士',\n Bachelor: '學士',\n Master: '碩士',\n Doctor: '博士',\n },\n languages: {\n Afrikaans: '南非語',\n Albanian: '阿爾巴尼亞語',\n Amharic: '阿姆哈拉語',\n Arabic: '阿拉伯語',\n Azerbaijani: '阿塞拜疆語',\n Belarusian: '白俄羅斯語',\n Bengali: '孟加拉語',\n Bhojpuri: '博傑普爾語',\n Bulgarian: '保加利亞語',\n Burmese: '緬甸語',\n Cantonese: '粵語',\n Catalan: '加泰羅尼亞語',\n Chinese: '中文',\n Croatian: '克羅地亞語',\n Czech: '捷克語',\n Danish: '丹麥語',\n Dutch: '荷蘭語',\n English: '英語',\n Estonian: '愛沙尼亞語',\n Farsi: '波斯語',\n Filipino: '菲律賓語',\n Finnish: '芬蘭語',\n French: '法語',\n German: '德語',\n Greek: '希臘語',\n Gujarati: '古吉拉特語',\n Hausa: '豪薩語',\n Hebrew: '希伯來語',\n Hindi: '印地語',\n Hungarian: '匈牙利語',\n Icelandic: '冰島語',\n Igbo: '伊博語',\n Indonesian: '印度尼西亞語',\n Irish: '愛爾蘭語',\n Italian: '意大利語',\n Japanese: '日語',\n Javanese: '爪哇語',\n Kazakh: '哈薩克語',\n Khmer: '高棉語',\n Korean: '韓語',\n Lahnda: '拉亨達語',\n Latvian: '拉脫維亞語',\n Lithuanian: '立陶宛語',\n Malay: '馬來語',\n Mandarin: '普通話',\n Marathi: '馬拉地語',\n Nepali: '尼泊爾語',\n Norwegian: '挪威語',\n Oromo: '奧羅莫語',\n Pashto: '普什圖語',\n Polish: '波蘭語',\n Portuguese: '葡萄牙語',\n Romanian: '羅馬尼亞語',\n Russian: '俄語',\n Serbian: '塞爾維亞語',\n Shona: '紹納語',\n Sinhala: '僧伽羅語',\n Slovak: '斯洛伐克語',\n Slovene: '斯洛維尼亞語',\n Somali: '索馬里語',\n Spanish: '西班牙語',\n Sundanese: '巽他語',\n Swahili: '斯瓦希里語',\n Swedish: '瑞典語',\n Tagalog: '他加祿語',\n Tamil: '泰米爾語',\n Telugu: '泰盧固語',\n Thai: '泰語',\n Turkish: '土耳其語',\n Ukrainian: '烏克蘭語',\n Urdu: '烏爾都語',\n Uzbek: '烏茲別克語',\n Vietnamese: '越南語',\n Yoruba: '約魯巴語',\n Zulu: '祖魯語',\n },\n fluency: {\n 'Elementary Proficiency': '初級水平',\n 'Limited Working Proficiency': '有限工作水平',\n 'Minimum Professional Proficiency': '最低專業水平',\n 'Full Professional Proficiency': '完全專業水平',\n 'Native or Bilingual Proficiency': '母語或雙語水平',\n },\n sections: {\n awards: '榮譽',\n basics: '簡介',\n certificates: '證書',\n education: '教育背景',\n interests: '興趣愛好',\n languages: '語言',\n location: '地址',\n profiles: '社交信息',\n projects: '項目',\n publications: '出版刊物',\n references: '引薦',\n skills: '專業技能',\n volunteer: '志願服務',\n work: '工作經歷',\n },\n skills: {\n Novice: '新手',\n Beginner: '初級',\n Intermediate: '中級',\n Advanced: '高級',\n Expert: '專家',\n Master: '大師',\n },\n },\n es: {\n countries: SpanishCountryNames,\n degrees: {\n 'Middle School': 'Escuela secundaria',\n 'High School': 'Título de secundaria',\n Diploma: 'Diploma',\n Associate: 'Grado de asociado',\n Bachelor: 'Licenciatura',\n Master: 'Maestría',\n Doctor: 'Doctorado',\n },\n languages: {\n Afrikaans: 'Afrikáns',\n Albanian: 'Albanés',\n Amharic: 'Amárico',\n Arabic: 'Árabe',\n Azerbaijani: 'Azerbaiyano',\n Belarusian: 'Bielorruso',\n Bengali: 'Bengalí',\n Bhojpuri: 'Bhojpuri',\n Bulgarian: 'Búlgaro',\n Burmese: 'Birmano',\n Cantonese: 'Cantonés',\n Catalan: 'Catalán',\n Chinese: 'Chino',\n Croatian: 'Croata',\n Czech: 'Checo',\n Danish: 'Danés',\n Dutch: 'Neerlandés',\n English: 'Inglés',\n Estonian: 'Estonio',\n Farsi: 'Persa',\n Filipino: 'Filipino',\n Finnish: 'Finlandés',\n French: 'Francés',\n German: 'Alemán',\n Greek: 'Griego',\n Gujarati: 'Gujarati',\n Hausa: 'Hausa',\n Hebrew: 'Hebreo',\n Hindi: 'Hindi',\n Hungarian: 'Húngaro',\n Icelandic: 'Islandés',\n Igbo: 'Igbo',\n Indonesian: 'Indonesio',\n Irish: 'Irlandés',\n Italian: 'Italiano',\n Japanese: 'Japonés',\n Javanese: 'Javanés',\n Kazakh: 'Kazajo',\n Khmer: 'Jemer',\n Korean: 'Coreano',\n Lahnda: 'Lahnda',\n Latvian: 'Letón',\n Lithuanian: 'Lituano',\n Malay: 'Malayo',\n Mandarin: 'Mandarín',\n Marathi: 'Marathi',\n Nepali: 'Nepalí',\n Norwegian: 'Noruego',\n Oromo: 'Oromo',\n Pashto: 'Pastún',\n Polish: 'Polaco',\n Portuguese: 'Portugués',\n Romanian: 'Rumano',\n Russian: 'Ruso',\n Serbian: 'Serbio',\n Shona: 'Shona',\n Sinhala: 'Cingalés',\n Slovak: 'Eslovaco',\n Slovene: 'Esloveno',\n Somali: 'Somalí',\n Spanish: 'Español',\n Sundanese: 'Sundanés',\n Swahili: 'Swahili',\n Swedish: 'Sueco',\n Tagalog: 'Tagalo',\n Tamil: 'Tamil',\n Telugu: 'Telugu',\n Thai: 'Tailandés',\n Turkish: 'Turco',\n Ukrainian: 'Ucraniano',\n Urdu: 'Urdu',\n Uzbek: 'Uzbeko',\n Vietnamese: 'Vietnamita',\n Yoruba: 'Yoruba',\n Zulu: 'Zulú',\n },\n fluency: {\n 'Elementary Proficiency': 'Competencia elemental',\n 'Limited Working Proficiency': 'Competencia limitada de trabajo',\n 'Minimum Professional Proficiency':\n 'Competencia profesional de trabajo',\n 'Full Professional Proficiency': 'Competencia profesional plena',\n 'Native or Bilingual Proficiency': 'Competencia nativa o bilingüe',\n },\n sections: {\n awards: 'Premios',\n basics: 'Información básica',\n certificates: 'Certificados',\n education: 'Educación',\n interests: 'Intereses',\n languages: 'Idiomas',\n location: 'Ubicación',\n profiles: 'Perfiles',\n projects: 'Proyectos',\n publications: 'Publicaciones',\n references: 'Referencias',\n skills: 'Competencias',\n volunteer: 'Voluntariado',\n work: 'Experiencia laboral',\n },\n skills: {\n Novice: 'Novato',\n Beginner: 'Principiante',\n Intermediate: 'Intermedio',\n Advanced: 'Avanzado',\n Expert: 'Experto',\n Master: 'Maestro',\n },\n },\n }\n\n return get(\n optionsTranslations,\n [language, category, option],\n option\n ) as string\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { LocaleLanguage } from '@/models'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific punctuation types used for formatting within templates. */\nexport const PUNCTUATIONS = ['comma', 'colon', 'separator'] as const\n\n/** The type of punctuation. */\nexport type Punctuation = (typeof PUNCTUATIONS)[number]\n\n/** Specific terms used within the template structure that need translation. */\nexport const TERMS = ['courses', 'keywords', 'score'] as const\n\n/** The type of term. */\nexport type Term = (typeof TERMS)[number]\n\n/** The structure for template-specific translations (punctuations and terms) */\ntype TemplateTranslationValue = {\n /** Translations for punctuation types defined in `Punctuation`. */\n punctuations: Record<Punctuation, string>\n /** Translations for template terms defined in `Term`. */\n terms: Record<Term, string>\n}\n\n/** The overall structure containing template-specific translations for all\n * supported languages. */\ntype TemplateTranslation = Record<LocaleLanguage, TemplateTranslationValue>\n\n/**\n * Retrieves template-specific translations (punctuations and terms) for a given\n * locale language.\n *\n * @param language - The desired locale language. If undefined, defaults to\n * English.\n * @returns An object containing the translated punctuations and terms for the\n * specified language.\n */\nexport function getTemplateTranslations(\n language?: LocaleLanguage\n): TemplateTranslationValue {\n const templateTranslation: TemplateTranslation = {\n en: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Courses',\n keywords: 'Keywords',\n score: 'Score',\n },\n },\n 'zh-hans': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '课程',\n keywords: '关键字',\n score: '成绩',\n },\n },\n 'zh-hant-hk': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n 'zh-hant-tw': {\n punctuations: {\n comma: ',',\n colon: ':',\n separator: '、',\n },\n terms: {\n courses: '課程',\n keywords: '關鍵字',\n score: '成績',\n },\n },\n es: {\n punctuations: {\n comma: ', ',\n colon: ': ',\n separator: ', ',\n },\n terms: {\n courses: 'Cursos',\n keywords: 'Palabras clave',\n score: 'Puntuación',\n },\n },\n }\n\n return templateTranslation[isEmptyValue(language) ? 'en' : language]\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { capitalize, cloneDeep, isArray, merge } from 'lodash-es'\n\nimport { LatexCodeGenerator, type Parser } from '@/compiler'\nimport {\n type ProfileItem,\n type Resume,\n type ResumeContent,\n type SectionID,\n defaultResumeLayout,\n} from '@/models'\nimport { getOptionTranslation, getTemplateTranslations } from '@/translations'\nimport {\n escapeLatex,\n getDateRange,\n isEmptyValue,\n localizeDate,\n showIf,\n} from '@/utils'\n\n/**\n * Replaces consecutive blank lines with a single LaTeX comment character (`%`).\n *\n * Useful for preventing LaTeX errors in environments sensitive to blank lines.\n *\n * @param content - The input string content.\n * @returns The processed string with blank lines replaced.\n */\nexport function replaceBlankLinesWithPercent(content: string): string {\n // if content only contains a newline character, we return an empty string\n if (content === '\\n') {\n return ''\n }\n\n return content.replace(/(^[ \\t]*\\n)/gm, '%\\n')\n}\n\n/**\n * Merges the provided resume content with default content values, ensuring\n * all necessary content properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content` in place.\n */\nexport function transformSectionsWithDefaultValues(resume: Resume): Resume {\n const emptyResumeContent: ResumeContent = {\n awards: [],\n basics: {\n name: '',\n },\n certificates: [],\n education: [],\n interests: [],\n languages: [],\n location: {\n city: '',\n },\n profiles: [],\n projects: [],\n publications: [],\n references: [],\n skills: [],\n volunteer: [],\n work: [],\n }\n\n return {\n ...resume,\n content: merge(emptyResumeContent, resume.content),\n }\n}\n\n/**\n * Iterates through all resume content sections and applies `escapeLatex` to\n * relevant string fields and array elements using helper functions.\n *\n * @param resume - The resume object to process.\n * @returns The processed resume object.\n * @remarks Modifies the `resume.content` object and its children directly.\n */\nexport function transformResumeValues(resume: Resume): Resume {\n Object.entries(resume.content).forEach(([key, value]) => {\n // only resume.basics and resume.location are objects, others are all arrays\n if (key === 'basics' || key === 'location') {\n transformResumeSectionValues(value)\n } else if (key === 'computed') {\n // `computed` object will be handled separately\n // for now, `transformSocialLinks` will handle it\n return\n } else {\n resume.content[key].forEach((_, index: number) => {\n transformResumeSectionValues(value[index])\n })\n }\n })\n\n return resume\n}\n\n/**\n * Transform all values in `computed` field with `escapeLatex`.\n */\nfunction transformResumeSectionComputedValues(sectionResumeComputed: {\n [key: string]: string\n}): void {\n Object.entries(sectionResumeComputed).forEach(([key, value]) => {\n sectionResumeComputed[key] = escapeLatex(value)\n })\n}\n\n/**\n * Transform all the values in `sectionResumeItem` with `escapeLatex`\n *\n * @param sectionResumeItem - a dictionary object in a resume section, for\n * 'basics` and 'locations', it would be `resume.basics` and `resume.location`\n * respectively, for other sections, it would be `resume.education[0]`,\n * `resume.projects[0]` etc.\n */\n// biome-ignore lint/complexity/noBannedTypes: ignore\nfunction transformResumeSectionValues(sectionResumeItem: Object): void {\n Object.entries(sectionResumeItem).forEach(([key, value]) => {\n if (key === 'summary') {\n // we will handle the `summary` field in a `textNodeToTeX` function\n // separately\n return\n }\n\n if (key === 'computed') {\n // deal with `computed` field separately\n transformResumeSectionComputedValues(value)\n return\n }\n\n if (['courses', 'keywords'].includes(key)) {\n sectionResumeItem[key] = (value as string[]).map((item) => {\n return escapeLatex(item)\n })\n\n return\n }\n\n sectionResumeItem[key] = escapeLatex(value)\n })\n}\n\n/**\n * Transforms the `courses` array in the education section into a single,\n * formatted string stored in `computed.courses`.\n *\n * Uses locale-specific separators and newlines for readability.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationCourses(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n resume.content.education.forEach((item, index: number) => {\n if (!isEmptyValue(item.courses)) {\n resume.content.education[index].computed = {\n ...resume.content.education[index].computed,\n // courses are generally longer than keywords, so we use both separator\n // and newline to separate them to improve readability\n courses: (item.courses as string[]).join(`${separator}\\n`),\n }\n }\n })\n\n return resume\n}\n\n/**\n * Combines `degree`, `area`, and `score` from education items into\n * a formatted string stored in `computed.degreeAreaAndScore`.\n *\n * Uses locale-specific terms and punctuation.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.education` items in place.\n */\nexport function transformEducationDegreeAreaAndScore(resume: Resume): Resume {\n const {\n punctuations: { colon, comma },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n const {\n terms: { score },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n resume.content.education.forEach((item) => {\n const degree = getOptionTranslation(\n resume.layout.locale?.language,\n 'degrees',\n item.degree\n )\n\n item.computed = {\n ...item.computed,\n degreeAreaAndScore: [\n degree,\n item.area,\n showIf(!isEmptyValue(item.score), `${score}${colon}${item.score}`),\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma),\n }\n })\n\n return resume\n}\n\n/**\n * Transforms `keywords` arrays in various sections (interests, languages, etc.)\n * into a single, formatted string stored in `computed.keywords`.\n *\n * Uses locale-specific separators.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`interests`, `languages`,\n * etc.) in place.\n */\nexport function transformKeywords(resume: Resume): Resume {\n const {\n punctuations: { separator },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n for (const section of [\n 'interests',\n 'languages',\n 'projects',\n 'skills',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { keywords: string[] }, index: number) => {\n if (isArray(item.keywords) && item.keywords.length > 0) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n // keywords are generally shorter than courses, so we only use\n // separator without newlines to separate them\n keywords: item.keywords.join(`${separator}`),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n keywords: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Transforms various date fields (`date`, `releaseDate`, `startDate`,\n * `endDate`) across multiple sections into a localized format (e.g., \"Month\n * Year\") and calculates date ranges.\n *\n * Stores results in the respective `computed` objects.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections in place.\n */\nexport function transformDate(resume: Resume): Resume {\n for (const section of ['awards', 'certificates']) {\n resume.content[section].forEach((item: { date: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n date: localizeDate(item.date, resume.layout.locale?.language),\n }\n })\n }\n\n for (const section of ['publications']) {\n resume.content[section].forEach(\n (item: { releaseDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n releaseDate: localizeDate(\n item.releaseDate,\n resume.layout.locale?.language\n ),\n }\n }\n )\n }\n\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { startDate: string; endDate: string }, index: number) => {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n startDate: localizeDate(\n item.startDate,\n resume.layout.locale?.language\n ),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: localizeDate(item.endDate, resume.layout.locale?.language),\n }\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n dateRange: getDateRange(\n item.startDate,\n item.endDate,\n resume.layout.locale?.language\n ),\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Replaces empty `endDate` values in relevant sections with the string\n * \"Present\".\n *\n * Updates the `computed.endDate` field.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies items within relevant sections (`education`, `projects`,\n * etc.) in place. Should run after `transformDate`.\n */\nexport function transformEndDate(resume: Resume): Resume {\n for (const section of ['education', 'projects', 'volunteer', 'work']) {\n resume.content[section].forEach(\n (item: { endDate: string }, index: number) => {\n if (isEmptyValue(item.endDate)) {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n endDate: 'Present',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Translates `language` and `fluency` values in the languages section\n * based on the selected locale.\n * Stores results in `computed.language` and `computed.fluency`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.languages` items in place.\n */\nexport function transformLanguage(resume: Resume): Resume {\n resume.content.languages.forEach((item) => {\n if (isEmptyValue(item.language) || isEmptyValue(item.fluency)) {\n return\n }\n\n item.computed = {\n ...item.computed,\n language: getOptionTranslation(\n resume.layout.locale?.language,\n 'languages',\n item.language\n ),\n fluency: getOptionTranslation(\n resume.layout.locale?.language,\n 'fluency',\n item.fluency\n ),\n }\n })\n\n return resume\n}\n\n/**\n * Combines address components (`address`, `city`, `region`, `country`,\n * `postalCode`) into a locale-aware formatted address string stored in\n * `computed.fullAddress`.\n *\n * Also computes intermediate components like `postalCodeAndAddress` and\n * `regionAndCountry`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.location` in place.\n */\nexport function transformLocation(resume: Resume): Resume {\n const {\n punctuations: { comma },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n const country = getOptionTranslation(\n resume.layout.locale?.language,\n 'countries',\n resume.content.location.country\n )\n\n switch (resume.layout.locale?.language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw': {\n // For Chinese and Spanish, the address format is:\n // Country > Region > City > Address\n const postalCodeAndAddress = [\n resume.content.location.address,\n resume.content.location.postalCode,\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const regionAndCountry = [country, resume.content.location.region]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const fullAddress = [\n regionAndCountry,\n resume.content.location.city,\n postalCodeAndAddress,\n ]\n .filter((value) => !isEmptyValue(value))\n // en-dash here in latex\n .join(' -- ')\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n postalCodeAndAddress,\n regionAndCountry,\n fullAddress,\n }\n\n break\n }\n default: {\n // For English, the address format is Country > Region > City > Address\n const postalCodeAndAddress = [resume.content.location.address]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const regionCountryAndPostalCode = [\n resume.content.location.region,\n country,\n resume.content.location.postalCode,\n ]\n .filter((value) => !isEmptyValue(value))\n .join(comma)\n\n const fullAddress = [\n resume.content.location.address,\n resume.content.location.city,\n regionCountryAndPostalCode,\n ]\n .filter((value) => !isEmptyValue(value))\n // en-dash here in latex\n .join(' -- ')\n\n resume.content.location.computed = {\n ...resume.content.location.computed,\n postalCodeAndAddress,\n regionAndCountry: regionCountryAndPostalCode,\n fullAddress,\n }\n\n break\n }\n }\n\n return resume\n}\n\n/**\n * Transforms the `basics.url` field into a LaTeX `\\href` command with a link\n * icon, stored in `computed.url`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.basics.computed` in place.\n */\nexport function transformBasicsUrl(resume: Resume): Resume {\n // `basics.url` is not a mandatory field, so we have to check if it is empty\n const basicsLink = isEmptyValue(resume.content.basics.url)\n ? ''\n : `{\\\\small \\\\faLink}\\\\ \\\\href{${resume.content.basics.url}}{${resume.content.basics.url}}`\n\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n url: basicsLink,\n }\n\n return resume\n}\n\n/**\n * Transforms profile URLs into LaTeX `\\href` commands with appropriate\n * FontAwesome icons based on the network name.\n *\n * Stores the result in `computed.url` for each profile item.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.profiles` items in place.\n */\nexport function transformProfileUrls(resume: Resume): Resume {\n // In general, to get the fontawesome5 symbol for a given network, we can\n // simply use the following use `capitalise(network)` as the icon name, though\n // there are some exceptions such as WeChat and `Stack Overflow`\n const getFaIcon = (network: string): string => {\n switch (network) {\n case 'Stack Overflow':\n return '\\\\faStackOverflow'\n case 'WeChat':\n return '\\\\faWeixin'\n default:\n return `\\\\fa${capitalize(network)}`\n }\n }\n\n resume.content.profiles.forEach((item: ProfileItem, index: number) => {\n resume.content.profiles[index].computed = {\n ...resume.content.profiles[index].computed,\n url:\n isEmptyValue(item.username) || isEmptyValue(item.network)\n ? ''\n : `{\\\\small ${getFaIcon(item.network)}}\\\\ \\\\href{${item.url}}{@${\n item.username\n }}`,\n }\n })\n\n return resume\n}\n\n/**\n * Translates skill proficiency levels based on the selected locale.\n *\n * Stores the translated string in `computed.level`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.skills` items in place.\n */\nexport function transformSkills(resume: Resume): Resume {\n resume.content.skills.forEach((item) => {\n const level = getOptionTranslation(\n resume.layout.locale?.language,\n 'skills',\n item.level\n )\n\n item.computed = {\n ...item.computed,\n level: showIf(!isEmptyValue(item.level), level),\n }\n })\n\n return resume\n}\n\n/**\n * Collects URLs from `basics` and `profiles` sections, formats them as LaTeX\n * links (requires `transformBasicsUrl` and `transformProfileUrls` to be run\n * first),\n *\n * Join them into a single string stored in `resume.content.computed.urls`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformProfileLinks(resume: Resume): Resume {\n transformBasicsUrl(resume)\n transformProfileUrls(resume)\n\n resume.content.computed = {\n ...resume.content.computed,\n urls: [\n resume.content.basics.computed.url,\n ...resume.content.profiles.map((item) => item.computed.url),\n ]\n // here we filter out empty values is the processed link is still empty\n .filter((link) => !isEmptyValue(link))\n // we use 4 lefet spaces, a dot and 4 right spaces to separate links, just\n // to align with default moderncv style\n .join(' {} {} {} • {} {} {} \\n'),\n }\n\n return resume\n}\n\n/**\n * Translates standard section titles (like \"Education\", \"Work\") based on the\n * selected locale.\n *\n * Stores the translations in `resume.content.computed.sectionNames`.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.content.computed`.\n */\nexport function transformSectionNames(resume: Resume): Resume {\n resume.content.computed = {\n ...resume.content.computed,\n sectionNames: Object.keys(resume.content).reduce(\n (translations, sectionName) => {\n if (sectionName === 'computed') {\n return translations\n }\n\n translations[sectionName] = getOptionTranslation(\n resume.layout.locale?.language,\n 'sections',\n sectionName as SectionID\n )\n\n return translations\n },\n {}\n ),\n }\n\n return resume\n}\n\n/**\n * Parses the `summary` field in various sections and converts it into LaTeX\n * code using the provided parser and generator.\n *\n * Stores the result in the corresponding `computed.summary` field, replacing blank lines.\n *\n * @param resume - The resume object.\n * @param summaryParser - The parser instance (e.g., `MarkdownParser`)\n * @returns The transformed resume object.\n * @remarks Modifies `computed.summary` within `basics` and items in sections\n * like `education`, `work`, etc.\n */\nexport function transformSummary(\n resume: Resume,\n summaryParser: Parser\n): Resume {\n resume.content.basics.computed = {\n ...resume.content.basics.computed,\n summary: replaceBlankLinesWithPercent(\n new LatexCodeGenerator()\n .generate(summaryParser.parse(resume.content.basics.summary))\n .trim()\n ),\n }\n\n for (const section of [\n 'awards',\n 'education',\n 'projects',\n 'publications',\n 'references',\n 'volunteer',\n 'work',\n ]) {\n resume.content[section].forEach(\n (item: { summary: string }, index: number) => {\n const summary = new LatexCodeGenerator().generate(\n summaryParser.parse(item.summary)\n )\n if (summary) {\n // The reason we need to replace blank lines with percent is that, the\n // argument of `\\cventry` command in LaTeX's moderncv package do not\n // support consecutive blank lines. It will report ugly errors like:\n // `Paragraph ended before \\cventry was complete.`, thus we have to\n // replace all blank lines in `\\cventry`'s argument with a percent sign.\n // Ref:\n // - https://www.reddit.com/r/LaTeX/comments/2szgdi/odd_error_using_extra_line_breaks_in_argument_of/cnudnos/\n //\n // BTW, debugging LaTeX's error with its arcane messages is really a\n // boring, dirty and meaningless job.\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: replaceBlankLinesWithPercent(summary.trim()),\n }\n } else {\n resume.content[section][index].computed = {\n ...resume.content[section][index].computed,\n summary: '',\n }\n }\n }\n )\n }\n\n return resume\n}\n\n/**\n * Applies a series of transformations to the main content of the resume.\n *\n * This includes escaping values, formatting lists (courses, keywords),\n * processing dates, translating terms, handling URLs, and parsing summaries.\n *\n * The order of internal transformations is important.\n *\n * @param resume - The resume object to transform.\n * @param summaryParser - The parser for handling summary fields.\n * @returns The transformed resume object.\n * @remarks Modifies the `resume.content` object and its children in place.\n */\nexport function transformResumeContent(\n resume: Resume,\n summaryParser: Parser\n): Resume {\n return [\n // The order of the following functions matters, `transformResumeValues`\n // should be called first to process all leaf values properly with LaTeX\n // special characters escaped,\n transformSectionsWithDefaultValues,\n transformResumeValues,\n transformEducationCourses,\n transformEducationDegreeAreaAndScore,\n transformDate,\n transformEndDate,\n transformKeywords,\n transformLanguage,\n transformLocation,\n transformSkills,\n transformProfileLinks,\n transformSummary,\n transformSectionNames,\n ].reduce(\n (resume, tranformFunc) => tranformFunc(resume, summaryParser),\n resume\n )\n}\n\n/**\n * Merges the provided resume layout configuration with default layout values,\n * ensuring all necessary layout properties are set.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.layout` in place.\n */\nexport function transformResumeLayoutWithDefaultValues(resume: Resume): Resume {\n return {\n ...resume,\n layout: merge(cloneDeep(defaultResumeLayout), resume.layout),\n }\n}\n\n/**\n * Adjusts the resume's LaTeX settings, specifically the number style\n * (`Lining` or `OldStyle`), based on the selected locale language.\n *\n * Sets Lining for CJK languages, OldStyle otherwise, if not explicitly defined.\n *\n * @param resume - The resume object.\n * @returns The transformed resume object.\n * @remarks Modifies `resume.layout.latex.fontspec` in place.\n */\nexport function transformResumeLayoutLaTeX(resume: Resume): Resume {\n if (\n resume.layout.latex?.fontspec?.numbers !== undefined &&\n resume.layout.latex?.fontspec?.numbers !== 'Auto'\n ) {\n return resume\n }\n\n switch (resume.layout.locale?.language) {\n case 'zh-hans':\n case 'zh-hant-hk':\n case 'zh-hant-tw':\n resume.layout.latex = {\n ...resume.layout.latex,\n fontspec: {\n ...resume.layout.latex?.fontspec,\n numbers: 'Lining',\n },\n }\n break\n default:\n resume.layout.latex = {\n ...resume.layout.latex,\n fontspec: {\n ...resume.layout.latex?.fontspec,\n numbers: 'OldStyle',\n },\n }\n break\n }\n\n return resume\n}\n\n/**\n * Merges the provided resume layout configuration with default layout values,\n * ensuring all necessary layout properties are set.\n *\n * Also applies locale-based typography adjustments via\n * `transformResumeLayoutLaTeX`.\n *\n * @param resume - The resume object containing the layout to transform.\n * @returns The resume object with its layout transformed.\n * @remarks The `layout` property of the returned resume object is a new object\n * resulting from the merge. Modifies `resume.layout.typography` via helper.\n */\nexport function transformResumeLayout(resume: Resume): Resume {\n return [\n transformResumeLayoutWithDefaultValues,\n transformResumeLayoutLaTeX,\n ].reduce((resume, transformFunc) => transformFunc(resume), resume)\n}\n\n/**\n * Applies all necessary transformations to a resume object in preparation for\n * rendering.\n *\n * This includes content processing, layout merging/adjustments, and environment\n * setup.\n *\n * The order of transformations is: content, layout, environment.\n *\n * @param resume - The original resume object.\n * @param summaryParser - The parser instance for handling summary fields.\n * @returns A new, transformed resume object ready for rendering.\n * @remarks This function operates on and returns a deep clone of the original\n * resume.\n */\nexport function transformResume(resume: Resume, summaryParser: Parser): Resume {\n return [transformResumeLayout, transformResumeContent].reduce(\n (resume, tranformFunc) => tranformFunc(resume, summaryParser),\n cloneDeep(resume)\n )\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Resume } from '@/models'\n\n/**\n * Abstract class for rendering resumes in TeX format.\n *\n * TeXRenderer provides the base functionality for converting Resume objects\n * into TeX documents. It follows a specific rendering order for resume\n * sections:\n *\n * 1. Core information (basics, location, profiles)\n * 2. Education and career (education, work)\n * 3. Languages and skills\n * 4. Paper works (awards, certificates, publications)\n * 5. Persons and projects (references, projects)\n * 6. Non-essential information (interests, volunteer)\n */\nabstract class Renderer {\n resume: Resume\n\n /**\n * Constructor for the Renderer class.\n *\n * @param resume - The resume to render.\n */\n constructor(resume: Resume) {\n this.resume = resume\n }\n\n /**\n * Render the preamble of the TeX document.\n *\n * @returns {string} The preamble of the TeX document.\n */\n abstract renderPreamble(): string\n\n /**\n * Render the basics section of the resume.\n *\n * @returns {string} The rendered basics section\n */\n abstract renderBasics(): string\n\n /**\n * Render the summary section of the resume.\n *\n * This method handles rendering the summary text stored in\n * resume.content.basics.summary. The summary is rendered separately from\n * other basic information since it may need to appear in a different location\n * in the output document depending on the template.\n *\n * @returns {string} The rendered summary section\n */\n abstract renderSummary(): string\n\n /**\n * Render the location section of the resume.\n *\n * @returns {string} The rendered location section\n */\n abstract renderLocation(): string\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns {string} The rendered profiles section\n */\n abstract renderProfiles(): string\n\n // education and career\n /**\n * Render the education section of the resume.\n *\n * @returns {string} The rendered education section\n */\n abstract renderEducation(): string\n\n /**\n * Render the work section of the resume.\n *\n * @returns {string} The rendered work section\n */\n abstract renderWork(): string\n\n // languages and skills\n /**\n * Render the languages section of the resume.\n *\n * @returns {string} The rendered languages section\n */\n abstract renderLanguages(): string\n\n /**\n * Render the skills section of the resume.\n *\n * @returns {string} The rendered skills section\n */\n abstract renderSkills(): string\n\n // paper works\n /**\n * Render the awards section of the resume.\n *\n * @returns {string} The rendered awards section\n */\n abstract renderAwards(): string\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns {string} The rendered certificates section\n */\n abstract renderCertificates(): string\n\n /**\n * Render the publications section of the resume.\n *\n * @returns {string} The rendered publications section\n */\n abstract renderPublications(): string\n\n // persons and projects\n /**\n * Render the references section of the resume.\n *\n * @returns {string} The rendered references section\n */\n abstract renderReferences(): string\n\n /**\n * Render the projects section of the resume.\n *\n * @returns {string} The rendered projects section\n */\n abstract renderProjects(): string\n\n // non-essential information\n /**\n * Render the interests section of the resume.\n *\n * @returns {string} The rendered interests section\n */\n abstract renderInterests(): string\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns {string} The rendered volunteer section\n */\n abstract renderVolunteer(): string\n\n /**\n * Render the resume.\n *\n * @returns {string} The rendered resume\n */\n abstract render(): string\n}\n\nexport { Renderer }\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Resume } from '@/models'\nimport { getTemplateTranslations } from '@/translations'\nimport { joinNonEmptyString, showIf } from '@/utils'\n\n/**\n * The options for the document class.\n *\n * For now we only support `moderncv` document class.\n */\nexport const DOCUMENT_CLASS_OPTIONS = ['moderncv'] as const\n\n/** The type of document class. */\nexport type DocumentClass = (typeof DOCUMENT_CLASS_OPTIONS)[number]\n\n/**\n * The style options for the moderncv document class.\n *\n * These styles control the visual appearance and layout of the CV. There're\n * actually 5 styles in moderncv package, but only 3 are supported in this\n * project, `fancy` and `oldstyle` is pretty buggy and not working well.\n *\n * - `banking` - a modern, professional style with a banking/financial aesthetic\n * - `classic` - a traditional CV style with a clean, formal layout\n * - `casual` - a more relaxed style while maintaining professionalism\n *\n * @see {@link https://github.com/yamlresume/community/issues/117}\n */\nexport const MODERNCV_STYLE_OPTIONS = ['banking', 'classic', 'casual'] as const\n\n/** The type of moderncv style. */\nexport type ModerncvStyle = (typeof MODERNCV_STYLE_OPTIONS)[number]\n\n/**\n * Check if the resume is a CJK resume.\n *\n * @param resume - The resume to check.\n * @returns {boolean} True if the resume is a CJK resume, false otherwise.\n */\nfunction isCJKResume(resume: Resume): boolean {\n return ['zh-hans', 'zh-hant-hk', 'zh-hant-tw'].includes(\n resume.layout.locale?.language\n )\n}\n\n/**\n * Check if the resume is a Spanish resume.\n *\n * @param resume - The resume to check.\n * @returns {boolean} True if the resume is a Spanish resume, false otherwise.\n */\nfunction isSpanishResume(resume: Resume): boolean {\n return resume.layout.locale?.language === 'es'\n}\n\n/**\n * Normalize a unit string\n *\n * Convert unit string with format of \"<number> <unit>\" to \"<number><unit>\" by\n * removing spaces, for example: \"10 mm\" -> \"10mm\"\n *\n * @param value The unit string to normalize\n * @returns The normalized string with spaces removed between number and unit\n */\nexport function normalizeUnit(value: string): string {\n return value.replace(/\\s+/g, '')\n}\n\n/**\n * Render the document class configuration for the resume.\n *\n * @param resume - The resume object\n * @param documentClass - The document class\n * @returns The LaTeX code for the document class\n */\nexport function renderDocumentClassConfig(\n resume: Resume,\n documentClass: DocumentClass\n): string {\n const {\n layout: {\n typography: { fontSize },\n },\n } = resume\n\n return `\\\\documentclass[a4paper, serif, ${normalizeUnit(\n fontSize\n )}]{${documentClass}}`\n}\n\n/**\n * Override the moderncv commands for CJK resumes\n *\n * This override is only needed when user adopts moderncv banking template and\n * CJK languages at the same time.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @returns The LaTeX code for the override commands\n *\n * @see {@link https://blog.ppresume.com/posts/multi-languagues-support#colon}\n */\nfunction renderModerncvOverride(resume: Resume, style: ModerncvStyle): string {\n const {\n punctuations: { colon },\n } = getTemplateTranslations(resume.layout.locale?.language)\n\n if (!isCJKResume(resume)) {\n return ''\n }\n\n switch (style) {\n case 'banking':\n // only banking style needs to renew these blackbox, magic moderncv\n // command to adapt for CJK colons\n return `% renew moderncv command to adapt for CJK colon\n\\\\renewcommand*{\\\\cvitem}[3][.25em]{%\n \\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}{#3}%\n \\\\par\\\\addvspace{#1}}\n\n\\\\renewcommand*{\\\\cvitemwithcomment}[4][.25em]{%\n \\\\savebox{\\\\cvitemwithcommentmainbox}{\\\\ifstrempty{#2}{}{\\\\hintstyle{#2}${colon}}#3}%\n \\\\setlength{\\\\cvitemwithcommentmainlength}{\\\\widthof{\\\\usebox{\\\\cvitemwithcommentmainbox}}}%\n \\\\setlength{\\\\cvitemwithcommentcommentlength}{\\\\maincolumnwidth-\\\\separatorcolumnwidth-\\\\cvitemwithcommentmainlength}%\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentmainlength}\\\\usebox{\\\\cvitemwithcommentmainbox}\\\\end{minipage}%\n \\\\hfill% fill of \\\\separatorcolumnwidth\n \\\\begin{minipage}[t]{\\\\cvitemwithcommentcommentlength}\\\\raggedleft\\\\small\\\\itshape#4\\\\end{minipage}%\n \\\\par\\\\addvspace{#1}}`\n\n case 'casual':\n case 'classic':\n return ''\n }\n}\n\n/**\n * Render the moderncv configuration for the resume.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @returns The LaTeX code for the moderncv configuration\n */\nexport function renderModerncvConfig(\n resume: Resume,\n style: ModerncvStyle\n): string {\n return joinNonEmptyString([\n `%% moderncv\n% style and color\n\\\\moderncvstyle{${style}}\n\\\\moderncvcolor{black}\n\n% needed by moderncv for showing icons\n\\\\usepackage{fontawesome5}`,\n renderModerncvOverride(resume, style),\n ])\n}\n\n/**\n * Render the layout configuration for the resume.\n *\n * @param resume - The resume object\n * @returns The LaTeX code for the layout configuration\n */\nexport function renderLayoutConfig(resume: Resume): string {\n const {\n layout: {\n margins: { top, bottom, left, right },\n page: { showPageNumbers },\n },\n } = resume\n\n const t = normalizeUnit(top)\n const b = normalizeUnit(bottom)\n const l = normalizeUnit(left)\n const r = normalizeUnit(right)\n\n return joinNonEmptyString(\n [\n `%% page layout/margins\n\\\\usepackage[top=${t}, bottom=${b}, left=${l}, right=${r}]{geometry}`,\n showIf(!showPageNumbers, '\\\\nopagenumbers{}'),\n ],\n '\\n'\n )\n}\n\n/**\n * Render the LaTeX packages for CJK support\n *\n * Even for non-CJK resumes, sometimes it may need to show a few CJK characters\n * in the resume, e.g. names. This is why we need to include the CJK support in\n * the preamble by default.\n */\nexport function renderCTeXConfig(_resume: Resume): string {\n return `%% CTeX\n% CJK support, used to show CJK characters in the resume\n%\n% - fontset=none: disable builtin fontset but instead set the CJK font manually\n% - heading=false: disable ctex heading\n% - punct=kaiming: use kaiming punctuations styles for CJK\n% - scheme=plain: use plain scheme, do not override \\`\\\\normalsize\\` font size\n% - space=auto: space settings for CJK characters\n%\n% ref:\n% - http://ctan.mirrorcatalogs.com/language/chinese/ctex/ctex.pdf\n\\\\usepackage[UTF8, fontset=none, heading=false, punct=kaiming, scheme=plain, space=auto]{ctex}\n\n\\\\IfFontExistsTF{Noto Serif CJK SC}{\n \\\\setCJKmainfont{Noto Serif CJK SC}\n}{}\n\\\\IfFontExistsTF{Noto Sans CJK SC}{\n \\\\setCJKsansfont{Noto Sans CJK SC}\n}{}`\n}\n\n/**\n * Render the LaTeX packages for Spanish support\n *\n * @param resume - The resume object\n * @returns The LaTeX code for the Spanish support\n */\nexport function renderSpanishConfig(resume: Resume): string {\n if (!isSpanishResume(resume)) {\n return ''\n }\n\n return `%% Spanish support\n\\\\usepackage[T1]{fontenc}\n% \\`\\\\usepackage[spanish]{babel}\\` has some conflicting issues with moderncv\n% so we have to use enable the following options to make it work\n%\n% ref:\n% - https://tex.stackexchange.com/a/140161/36007\n\\\\usepackage[spanish,es-lcroman]{babel}`\n}\n\n/**\n * Render the LaTeX packages for fontspec support\n *\n * @param resume - The resume object\n * @returns The LaTeX code for the fontspec support\n */\nexport function renderfontspecConfig(resume: Resume): string {\n const {\n layout: {\n latex: {\n fontspec: { numbers },\n },\n },\n } = resume\n\n const linuxLibertineFont = 'Linux Libertine'\n const linuxLibertineOFont = 'Linux Libertine O'\n\n return `%% fontspec\n\\\\usepackage{fontspec}\n\n\\\\IfFontExistsTF{${linuxLibertineFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(isCJKResume(resume), `ItalicFont=${linuxLibertineFont}`),\n ],\n ', '\n )}]{${linuxLibertineFont}}\n}{}\n\\\\IfFontExistsTF{${linuxLibertineOFont}}{\n \\\\setmainfont[${joinNonEmptyString(\n [\n 'Ligatures={TeX, Common}',\n `Numbers=${numbers}`,\n showIf(isCJKResume(resume), `ItalicFont=${linuxLibertineOFont}`),\n ],\n ', '\n )}]{${linuxLibertineOFont}}\n}{}`\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport type { Parser } from '@/compiler'\nimport type { Resume } from '@/models'\nimport { transformResume } from '@/preprocess'\nimport { getTemplateTranslations } from '@/translations'\nimport { isEmptyValue, joinNonEmptyString, showIf } from '@/utils'\nimport { Renderer } from './base'\nimport {\n type ModerncvStyle,\n renderCTeXConfig,\n renderDocumentClassConfig,\n renderLayoutConfig,\n renderModerncvConfig,\n renderSpanishConfig,\n renderfontspecConfig,\n} from './preamble'\n\n/**\n * Base class for moderncv renderers.\n */\nclass ModerncvBase extends Renderer {\n style: ModerncvStyle\n\n /**\n * Constructor for the ModerncvBase class.\n *\n * @param resume - The resume object\n * @param style - The moderncv style\n * @param summaryParser - The summary parser used to parse summary field in\n * various sections.\n */\n constructor(resume: Resume, style: ModerncvStyle, summaryParser: Parser) {\n super(transformResume(resume, summaryParser))\n this.style = style\n }\n\n /**\n * Render the preamble for the resume.\n *\n * @returns The LaTeX code for the preamble\n */\n renderPreamble(): string {\n return joinNonEmptyString([\n // document class\n renderDocumentClassConfig(this.resume, 'moderncv'),\n renderModerncvConfig(this.resume, this.style),\n\n // layout\n renderLayoutConfig(this.resume),\n\n // language specific\n renderSpanishConfig(this.resume),\n\n // fontspec\n // note that loading order of fontspec and babel packages matters here\n // babel package should be loaded before fontspec package, otherwise\n // Spanish resumes cannot render correct font styles in my testing,\n // reason still unknown though\n renderfontspecConfig(this.resume),\n\n // CTeX for CJK\n // CTeX needs to load after fontspec because we use `\\IfFontExistsTF` to\n // set the CJK font manually if the required Google Noto font exists\n renderCTeXConfig(this.resume),\n ])\n }\n\n /**\n * Render the basics section of the resume.\n *\n * @returns The LaTeX code for the basics section\n */\n renderBasics(): string {\n const {\n content: {\n basics: { name, headline, phone, email },\n },\n } = this.resume\n\n return joinNonEmptyString(\n [\n // note that we have to show `\\\\name{}{}` here no matter whether name is\n // empty or not, moderncv requires this otherwise if there is no\n // `\\\\name{}{}``, moderncv will throw an error.\n `\\\\name{${showIf(!isEmptyValue(name), name)}}{}`,\n showIf(!isEmptyValue(headline), `\\\\title{${headline}}`),\n showIf(!isEmptyValue(phone), `\\\\phone[mobile]{${phone}}`),\n showIf(!isEmptyValue(email), `\\\\email{${email}}`),\n ],\n '\\n'\n )\n }\n\n /**\n * Render the location section of the resume.\n *\n * @returns The LaTeX code for the location section\n */\n renderLocation(): string {\n const {\n content: {\n location: {\n computed: { fullAddress },\n },\n },\n } = this.resume\n\n return showIf(!isEmptyValue(fullAddress), `\\\\address{${fullAddress}}{}{}`)\n }\n\n /**\n * Render the profiles section of the resume.\n *\n * @returns The LaTeX code for the profiles section\n */\n renderProfiles(): string {\n const {\n content: {\n computed: { urls },\n },\n } = this.resume\n\n return showIf(!isEmptyValue(urls), `\\\\extrainfo{${urls}}`)\n }\n\n /**\n * Render the summary section of the resume.\n *\n * @returns The LaTeX code for the summary section\n */\n renderSummary(): string {\n const {\n content: {\n basics: {\n computed: { summary },\n },\n computed: { sectionNames },\n },\n } = this.resume\n\n return `${showIf(\n !isEmptyValue(summary),\n `\\\\section{${sectionNames.basics}}\n\n\\\\cvline{}{${summary}}`\n )}`\n }\n\n /**\n * Render the education section of the resume.\n *\n * @returns The LaTeX code for the education section\n */\n renderEducation(): string {\n const {\n content: {\n computed: { sectionNames },\n education,\n },\n layout,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n if (!education.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.education}}\n\n${education\n .map(\n ({\n computed: { startDate, dateRange, degreeAreaAndScore, summary, courses },\n institution,\n url,\n }) => `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${degreeAreaAndScore}}\n {${institution}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(courses),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(courses),\n `\\\\textbf{${terms.courses}}${colon}${courses}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the work section of the resume.\n *\n * @returns The LaTeX code for the work section\n */\n renderWork(): string {\n const { content, layout } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n if (!content.work.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.work}}\n\n${content.work\n .map((work) => {\n const {\n computed: { startDate, dateRange, summary, keywords },\n name,\n position,\n url,\n } = work\n\n return `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${position}}\n {${name}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n })\n .join('\\n\\n')}`\n }\n\n /**\n * Render the languages section of the resume.\n *\n * @returns The LaTeX code for the languages section\n */\n renderLanguages(): string {\n const {\n content: {\n computed: { sectionNames },\n languages,\n },\n layout,\n } = this.resume\n\n if (!languages.length) {\n return ''\n }\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n return `\\\\section{${sectionNames.languages}}\n\n${languages\n .map(\n ({ computed: { language, fluency, keywords } }) =>\n `\\\\cvline{${language}}{${fluency}${showIf(\n !isEmptyValue(keywords),\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the skills section of the resume.\n *\n * @returns The LaTeX code for the skills section\n */\n renderSkills(): string {\n const {\n content: {\n computed: { sectionNames },\n skills,\n },\n layout,\n } = this.resume\n\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(layout.locale?.language)\n\n if (!skills.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.skills}}\n\n${skills\n .map(\n ({ name, computed: { level, keywords } }) =>\n `\\\\cvline{${name}}{${level}${showIf(\n !isEmptyValue(keywords),\n ` \\\\hfill \\\\textbf{${terms.keywords}}${colon}${keywords}`\n )}}`\n )\n .join('\\n')}`\n }\n\n /**\n * Render the awards section of the resume.\n *\n * @returns The LaTeX code for the awards section\n */\n renderAwards(): string {\n const {\n content: {\n computed: { sectionNames },\n awards,\n },\n } = this.resume\n\n if (!awards.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.awards}}\n\n${awards\n .map(\n ({ computed: { date, summary }, awarder, title }) => `\\\\cventry{${date}}\n {${awarder}}\n {${title}}\n {}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the certificates section of the resume.\n *\n * @returns The LaTeX code for the certificates section\n */\n renderCertificates(): string {\n const {\n content: {\n computed: { sectionNames },\n certificates,\n },\n } = this.resume\n\n if (!certificates.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.certificates}}\n\n${certificates\n .map(\n ({ computed: { date }, issuer, name, url }) => `\\\\cventry{${date}}\n {${issuer}}\n {${name}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the publications section of the resume.\n *\n * @returns The LaTeX code for the publications section\n */\n renderPublications(): string {\n const {\n content: {\n computed: { sectionNames },\n publications,\n },\n } = this.resume\n\n if (!publications.length) {\n return ''\n }\n\n return `\\\\section{${sectionNames.publications}}\n\n${publications\n .map(\n ({\n computed: { releaseDate, summary },\n name,\n publisher,\n url,\n }) => `\\\\cventry{${releaseDate}}\n {${name}}\n {${publisher}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the references section of the resume.\n *\n * @returns The LaTeX code for the references section\n */\n renderReferences(): string {\n const {\n content: {\n computed: { sectionNames },\n references,\n },\n } = this.resume\n\n if (!references.length) {\n return ''\n }\n\n switch (this.style) {\n case 'banking':\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{\\\\emaillink[${email}]{${email}}}\n {${relationship}}\n {${name}}\n {${phone}}\n {}\n {${summary}}`\n )\n .join('\\n\\n')}`\n\n case 'casual':\n case 'classic':\n // Note that for casual and classic styles, the position of `email` and\n // `name` is reversed with banking style. The first parameter of\n // `\\cventry` will be put on the left side, and generally the `name` can\n // be hyphenated while `email`s are generally longer and cannot be\n // hyphenated. So if email is too long, the visually result would be\n // pretty as it will overlap with the right side text.\n return `\\\\section{${sectionNames.references}}\n\n${references\n .map(\n ({\n email,\n relationship,\n name,\n phone,\n computed: { summary },\n }) => `\\\\cventry{${name}}\n {${relationship}}\n {\\\\emaillink[${email}]{${email}}}\n {${phone}}\n {}\n {${showIf(!isEmptyValue(summary), summary)}}`\n )\n .join('\\n\\n')}`\n }\n }\n\n /**\n * Render the projects section of the resume.\n *\n * @returns The LaTeX code for the projects section\n */\n renderProjects(): string {\n const { content } = this.resume\n const {\n punctuations: { colon },\n terms,\n } = getTemplateTranslations(this.resume.layout.locale?.language)\n\n if (!content.projects.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.projects}}\n\n${content.projects\n .map(\n ({\n name,\n description,\n url,\n computed: { dateRange, startDate, summary, keywords },\n }) => `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${description}}\n {${name}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyValue(summary) || !isEmptyValue(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(keywords),\n `\\\\textbf{${terms.keywords}}${colon}${keywords}`\n ),\n ],\n '\\n'\n )}`\n )}}`\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the interests section of the resume.\n *\n * @returns The LaTeX code for the interests section\n */\n renderInterests(): string {\n const { content } = this.resume\n\n if (!content.interests.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.interests}}\n\n${content.interests\n .map(({ name, computed: { keywords } }) => `\\\\cvline{${name}}{${keywords}}`)\n .join('\\n')}`\n }\n\n /**\n * Render the volunteer section of the resume.\n *\n * @returns The LaTeX code for the volunteer section\n */\n renderVolunteer(): string {\n const { content } = this.resume\n\n if (!content.volunteer.length) {\n return ''\n }\n\n return `\\\\section{${content.computed.sectionNames.volunteer}}\n\n${content.volunteer\n .map(\n ({\n position,\n organization,\n url,\n computed: { startDate, dateRange, summary },\n }) => `\\\\cventry{${showIf(!isEmptyValue(startDate), dateRange)}}\n {${position}}\n {${organization}}\n {${showIf(!isEmptyValue(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(!isEmptyValue(summary), summary)}}\n `\n )\n .join('\\n\\n')}`\n }\n\n /**\n * Render the resume.\n *\n * @returns The LaTeX code for the resume\n */\n render(): string {\n return this.generateTeX()\n }\n\n /**\n * Generate the LaTeX code for the resume.\n *\n * @returns The LaTeX code for the resume\n */\n private generateTeX(): string {\n return `${joinNonEmptyString([\n this.renderPreamble(),\n this.renderBasics(),\n this.renderLocation(),\n this.renderProfiles(),\n ])}\n\n\\\\begin{document}\n\n\\\\maketitle\n\n${joinNonEmptyString([\n this.renderSummary(),\n this.renderEducation(),\n this.renderWork(),\n this.renderLanguages(),\n this.renderSkills(),\n this.renderAwards(),\n this.renderCertificates(),\n this.renderPublications(),\n this.renderReferences(),\n this.renderProjects(),\n this.renderInterests(),\n this.renderVolunteer(),\n])}\n\\\\end{document}`\n }\n}\n\n/**\n * Renderer for the banking style of moderncv.\n */\nclass ModerncvBankingRenderer extends ModerncvBase {\n constructor(resume: Resume, summaryParser: Parser) {\n super(resume, 'banking', summaryParser)\n }\n}\n\n/**\n * Renderer for the casual style of moderncv.\n */\nclass ModerncvCasualRenderer extends ModerncvBase {\n constructor(resume: Resume, summaryParser: Parser) {\n super(resume, 'casual', summaryParser)\n }\n}\n\n/**\n * Renderer for the classic style of moderncv.\n */\nclass ModerncvClassicRenderer extends ModerncvBase {\n constructor(resume: Resume, summaryParser: Parser) {\n super(resume, 'classic', summaryParser)\n }\n}\n\nexport {\n ModerncvBase,\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { get } from 'lodash-es'\n\nimport { MarkdownParser, type Parser } from '@/compiler'\nimport type { Resume } from '@/models'\nimport type { Renderer } from './base'\nimport {\n ModerncvBankingRenderer,\n ModerncvCasualRenderer,\n ModerncvClassicRenderer,\n} from './moderncv'\n\nconst RESUME_RENDERER_MAP = {\n 'moderncv-banking': ModerncvBankingRenderer,\n 'moderncv-classic': ModerncvClassicRenderer,\n 'moderncv-casual': ModerncvCasualRenderer,\n}\n\n/**\n * Get the appropriate resume renderer based on the provided resume.\n *\n * @param {Resume} resume - The resume object\n * @param {Parser} summaryParser - The parser instance for the summary field.\n * Default to `MarkdownParser` if not provided.\n * @returns {Renderer} The renderer instance for the specified template.\n */\nexport function getResumeRenderer(\n resume: Resume,\n summaryParser: Parser = new MarkdownParser()\n): Renderer {\n const template = resume.layout?.template\n\n // default to use moderncv banking style if template is not specified\n if (!template) {\n return new ModerncvBankingRenderer(resume as Resume, summaryParser)\n }\n\n return new (get(RESUME_RENDERER_MAP, template, ModerncvBankingRenderer))(\n resume as Resume,\n summaryParser\n )\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { startCase } from 'lodash-es'\nimport { z } from 'zod/v4'\n\nimport {\n COUNTRY_OPTIONS,\n DEGREE_OPTIONS,\n FLUENCY_OPTIONS,\n FONTSPEC_NUMBERS_OPTIONS,\n FONT_SIZE_OPTIONS,\n LANGUAGE_OPTIONS,\n LEVEL_OPTIONS,\n LOCALE_LANGUAGE_OPTIONS,\n NETWORK_OPTIONS,\n TEMPLATE_OPTIONS,\n} from '@/models'\nimport { joinNonEmptyString } from '@/utils'\n\ntype Position = 'top' | 'bottom' | 'left' | 'right'\n\n/**\n * Creates an error message for a marginSizeSchema\n *\n * @param options - The options to create a message for.\n * @param messagePrefix - The message prefix to use for the message.\n * @returns A message for an option schema.\n */\nexport function marginSizeSchemaMessage(position: Position) {\n return joinNonEmptyString(\n [\n `invalid ${position} margin size,`,\n `${position} margin must be a positive number followed by`,\n `\"cm\", \"pt\" or \"in\", eg: \"2.5cm\", \"1in\", \"72pt\"`,\n ],\n ' '\n )\n}\n\n/**\n * Creates a zod schema for a margin size.\n *\n * Accepts positive numbers followed by valid units: cm, pt, or in\n * Examples: \"2.5cm\", \"1in\", \"72pt\"\n */\nexport function MarginSizeSchema(position: Position) {\n // We could simply use `z.string()` here with a custom check, but we use\n // `SizedStringSchema` in order to get best JSON Schema capabilities.\n return (\n SizedStringSchema(`${position} margin`, 2, 32)\n // Please note that here we added a custom check, inside which we will\n // override `ctx.issues`, therefore marginSizeSchema will always return one\n // and only one precise issue if the value is not valid.\n .check((ctx) => {\n if (ctx.value.length < 2) {\n ctx.issues = [\n {\n code: 'too_small',\n input: ctx.value,\n minimum: 2,\n message: `${position} margin should be 2 characters or more.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (ctx.value.length > 32) {\n ctx.issues = [\n {\n code: 'too_big',\n input: ctx.value,\n maximum: 32,\n message: `${position} margin should be 32 characters or less.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (!ctx.value.match(/^\\d+(\\.\\d+)?(cm|pt|in)$/)) {\n ctx.issues = [\n {\n code: 'invalid_value',\n input: ctx.value,\n message: marginSizeSchemaMessage(position),\n origin: 'string',\n values: [ctx.value],\n },\n ]\n }\n })\n .meta({\n title: startCase(`${position} margin size`),\n description: joinNonEmptyString(\n [\n 'A positive number followed by valid units: cm, pt, or in.',\n 'Examples: \"2.5cm\", \"1in\", \"72pt\".',\n ],\n ' '\n ),\n examples: ['2.5cm', '1in', '72pt', '0.5cm', '12pt'],\n })\n )\n}\n\n/**\n * A type for all options.\n */\ntype Options =\n | typeof COUNTRY_OPTIONS\n | typeof DEGREE_OPTIONS\n | typeof FONTSPEC_NUMBERS_OPTIONS\n | typeof FONT_SIZE_OPTIONS\n | typeof FLUENCY_OPTIONS\n | typeof LANGUAGE_OPTIONS\n | typeof LOCALE_LANGUAGE_OPTIONS\n | typeof LEVEL_OPTIONS\n | typeof NETWORK_OPTIONS\n | typeof TEMPLATE_OPTIONS\n\n/**\n * Creates an error message for an optionSchema\n *\n * @param options - The options to create a message for.\n * @param messagePrefix - The message prefix to use for the message.\n * @returns A message for an option schema.\n */\nexport function optionSchemaMessage(options: Options, messagePrefix: string) {\n return joinNonEmptyString(\n [\n `${messagePrefix} option is invalid,`,\n 'it must be one of the following:',\n `[${options.map((option) => `\"${option}\"`).join(', ')}]`,\n ],\n ' '\n )\n}\n\n/**\n * Creates a zod schema for an option.\n *\n * @param options - The options to create a schema for.\n * @param messagePrefix - The message to use for the schema.\n * @returns A Zod schema for an option.\n */\nfunction optionSchema(options: Options, messagePrefix: string) {\n return z\n .enum(options, {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: `${messagePrefix} option is required.`,\n }\n }\n\n return {\n message: optionSchemaMessage(options, messagePrefix),\n }\n },\n })\n .meta({\n title: `${startCase(messagePrefix)} Option`,\n description: `A predefined option from the available ${messagePrefix} choices.`,\n })\n}\n\n/**\n * Creates a zod schema for a string with a minimum and maximum length.\n *\n * @param name - The name of the string.\n * @param min - The minimum length of the string.\n * @param max - The maximum length of the string.\n * @returns A Zod schema for a string with a minimum and maximum length.\n */\nexport const SizedStringSchema = (name: string, min: number, max: number) => {\n return z\n .string({ message: `${name} is required.` })\n .min(min, { message: `${name} should be ${min} characters or more.` })\n .max(max, { message: `${name} should be ${max} characters or less.` })\n}\n\n/**\n * A zod schema for a country option.\n */\nexport const CountryOptionSchema = optionSchema(COUNTRY_OPTIONS, 'country')\n\n/**\n * Creates a zod schema for a date string.\n *\n * A valid date string must be able to be parsed by `Date.parse`.\n *\n * @param date - The name of the date.\n * @returns A Zod schema for a date string.\n */\nexport function DateSchema(date: string) {\n return SizedStringSchema(date, 4, 32)\n .check((ctx) => {\n if (ctx.value.length < 4) {\n ctx.issues = [\n {\n code: 'too_small',\n input: ctx.value,\n minimum: 4,\n message: `${date} should be 4 characters or more.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (ctx.value.length > 32) {\n ctx.issues = [\n {\n code: 'too_big',\n input: ctx.value,\n maximum: 32,\n message: `${date} should be 32 characters or less.`,\n origin: 'string',\n },\n ]\n\n return\n }\n\n if (!Date.parse(ctx.value)) {\n ctx.issues = [\n {\n code: 'invalid_value',\n input: ctx.value,\n message: `${date} is invalid.`,\n origin: 'string',\n values: [ctx.value],\n },\n ]\n }\n })\n .meta({\n title: startCase(date),\n description: 'A valid date string that can be parsed by `Date.parse`.',\n examples: [\n '2025-01-01',\n 'Jul 2025',\n 'July 3, 2025',\n '2025-02-02T00:00:03.123Z',\n ],\n })\n}\n\n/**\n * A zod schema for a degree option.\n */\nexport const DegreeOptionSchema = optionSchema(DEGREE_OPTIONS, 'degree')\n\n/**\n * An email schema used by various sections.\n */\nexport const EmailSchema = z.email({ message: 'email is invalid.' }).meta({\n id: 'email',\n title: 'Email',\n description: 'A valid email address.',\n examples: [\n 'hi@ppresume.com',\n 'first.last@company.org',\n 'test+tag@domain.co.uk',\n ],\n})\n\n/**\n * A zod schema for a language fluency option.\n */\nexport const FluencyOptionSchema = optionSchema(FLUENCY_OPTIONS, 'fluency')\n\n/**\n * A zod schema for a font spec numbers style.\n */\nexport const FontspecNumbersOptionSchema = optionSchema(\n FONTSPEC_NUMBERS_OPTIONS,\n 'fontspec numbers'\n)\n\n/**\n * A zod schema for fontSize option in layout.\n */\nexport const FontSizeOptionSchema = optionSchema(FONT_SIZE_OPTIONS, 'font size')\n\n/**\n * A zod schema for a keywords array.\n */\nexport const KeywordsSchema = z\n .array(SizedStringSchema('keyword', 1, 32))\n .meta({\n id: 'keywords',\n title: 'Keywords',\n description: 'An array of keyword, each between 1 and 32 characters.',\n examples: [\n ['Javascript', 'React', 'Typescript'],\n ['Design', 'UI', 'UX'],\n ['Python', 'Data Science'],\n ],\n })\n\n/**\n * A zod schema for a language.\n */\nexport const LanguageOptionSchema = optionSchema(LANGUAGE_OPTIONS, 'language')\n\n/**\n * A zod schema for a locale language option.\n */\nexport const LocaleLanguageOptionSchema = optionSchema(\n LOCALE_LANGUAGE_OPTIONS,\n 'locale language'\n)\n\n/**\n * A zod schema for a level option.\n */\nexport const LevelOptionSchema = optionSchema(LEVEL_OPTIONS, 'level')\n\n/**\n * Creates a zod schema for a name.\n *\n * @param name - The name of the string.\n * @returns A Zod schema for a name string.\n */\nexport const NameSchema = (name: string) =>\n SizedStringSchema(name, 2, 128).meta({\n title: startCase(name),\n description: `A ${name} between 2 and 128 characters.`,\n examples: ['Andy Dufrane', 'Xiao Hanyu', 'Jane Smith', 'Dr. Robert John'],\n })\n\n/**\n * A zod schema for a network.\n */\nexport const NetworkOptionSchema = optionSchema(NETWORK_OPTIONS, 'network')\n\n/**\n * A regex for a phone number.\n */\nconst phoneNumberRegex = /^[+]?[(]?[0-9\\s-]{1,15}[)]?[0-9\\s-]{1,15}$/im\n\n/**\n * A zod schema for a phone number.\n */\nexport const PhoneSchema = z\n .string()\n .regex(phoneNumberRegex, {\n message: 'phone number may be invalid.',\n })\n .meta({\n id: 'phone',\n title: 'Phone',\n description: joinNonEmptyString(\n [\n 'A valid phone number that may include',\n 'country code, parentheses, spaces, and hyphens.',\n ],\n ' '\n ),\n examples: ['555-123-4567', '+44 20 7946 0958', '(555) 123-4567'],\n })\n\n/**\n * A zod schema for a summary.\n */\nexport const SummarySchema = SizedStringSchema('summary', 16, 1024).meta({\n id: 'summary',\n title: 'Summary',\n description: 'A summary text between 16 and 1024 characters.',\n examples: [\n 'Experienced software engineer with 5+ years in full-stack development.',\n joinNonEmptyString(\n [\n 'Creative designer passionate about',\n 'user experience and modern design principles.',\n ],\n ' '\n ),\n joinNonEmptyString(\n [\n 'Dedicated project manager with proven track record of',\n 'delivering complex projects on time and budget.',\n ],\n ' '\n ),\n ],\n})\n\n/**\n * Creates a zod schema for an organization.\n *\n * @param name - The name of the organization.\n * @returns A Zod schema for an organization.\n */\nexport const OrganizationSchema = (name: string) =>\n SizedStringSchema(name, 2, 128).meta({\n title: startCase(name),\n description: 'An organization name between 2 and 128 characters.',\n examples: [\n 'Google Inc.',\n 'Microsoft Corporation',\n 'Startup XYZ',\n 'Non-Profit Organization',\n ],\n })\n\n/**\n * A zod schema for a template option.\n */\nexport const TemplateOptionSchema = optionSchema(TEMPLATE_OPTIONS, 'template')\n\n/**\n * A zod schema for a url.\n */\nexport const UrlSchema = z\n .url({ message: 'URL is invalid.' })\n .max(256, { message: 'URL should be 256 characters or less.' })\n .meta({\n id: 'url',\n title: 'URL',\n description: 'A valid URL with maximum length of 256 characters.',\n examples: [\n 'https://yamlresume.dev',\n 'https://ppresume.com',\n 'https://github.com/yamlresume/yamlresume',\n 'https://linkedin.com/in/xiaohanyu1988',\n 'https://www.example.com',\n ],\n })\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { expect } from 'vitest'\nimport { z } from 'zod/v4'\n\n/**\n * Expects that a zod schema has metadata.\n *\n * @param schema - The zod schema to validate.\n */\nexport function expectSchemaMetadata<T>(schema: z.ZodType<T>) {\n const metadata = schema.meta()\n expect(metadata.title).toBeTypeOf('string')\n expect(metadata.description).toBeTypeOf('string')\n\n // Check if examples exist (some schemas like enums don't have examples)\n if (metadata.examples !== undefined) {\n expect(metadata.examples).toBeTypeOf('object')\n expect(metadata.examples.length).toBeGreaterThan(0)\n }\n}\n\n/**\n * Returns an array of test cases for nullish fields.\n *\n * @param schema - The zod schema to validate.\n * @param baseObject - The base object to use for the test cases.\n * @returns An array of test cases for nullish fields.\n */\nexport function getNullishTestCases(\n schema: z.ZodObject<Record<string, z.ZodTypeAny>>,\n baseObject: Record<string, unknown>\n) {\n const testCases = []\n\n const baseObjectKeys = Object.keys(baseObject)\n\n const nullishFields = Object.keys(schema.shape).filter(\n (field) => !baseObjectKeys.includes(field)\n )\n\n for (const field of nullishFields) {\n testCases.push({\n ...baseObject,\n [field]: null,\n })\n\n testCases.push({\n ...baseObject,\n [field]: undefined,\n })\n }\n\n return testCases\n}\n\n/**\n * Returns a nullish schema with the same metadata as the original schema.\n *\n * Why we need this?\n *\n * By default Zod's `nullish` method will generate a `anyOf` JSON schema, with\n * the second branch being `{ type: null }`, therefore, if users set `null` to a\n * field in the YAML file, when hover over the field in VSCode, there will be no\n * metadata for the field at all.\n *\n * Here we generate a new metadata for the nullish schema, so no matter whether\n * the field is set to `null` or not, the metadata will always be the same.\n *\n * @param schema - The zod schema to make nullish.\n * @returns A nullish schema with the same metadata as the original schema.\n */\nexport function nullifySchema<T>(schema: z.ZodType<T>) {\n const nullishMeta = {\n title: `[optional] ${schema.meta().title}`,\n description: `${schema.meta().description.replace(/\\.$/, '')} or \\`null\\`.`,\n examples: schema.meta().examples,\n }\n\n return schema.meta(nullishMeta).nullish().meta(nullishMeta)\n}\n\n/**\n * Validates that a zod schema returns the expected error when given invalid\n * data.\n *\n * @param schema - The zod schema to validate.\n * @param data - The data to validate.\n * @param error - The expected error.\n */\nexport function validateZodErrors<T>(\n schema: z.ZodType<T>,\n data: T,\n error: object\n) {\n const result = schema.safeParse(data)\n\n expect(result.success).toBe(false)\n expect(z.treeifyError(result.error)).toEqual(error)\n}\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n SummarySchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for the awarder of an award.\n */\nexport const AwarderSchema = OrganizationSchema('awarder').meta({\n title: 'Awarder',\n description: 'The organization or institution that presented the award.',\n examples: ['Academy Awards', 'Tech Conference', 'Microsoft Scholarship'],\n})\n\n/**\n * A zod schema for the title of an award.\n */\nexport const TitleSchema = NameSchema('title').meta({\n title: 'Title',\n description: 'The title of the award.',\n examples: [\"Dean's List\", 'Outstanding Student', 'Best Supporting Engineer'],\n})\n\n/**\n * A zod schema for an award item.\n */\nexport const AwardItemSchema = z.object({\n // required fields\n awarder: AwarderSchema,\n title: TitleSchema,\n\n // optional fields\n date: nullifySchema(DateSchema('date')),\n summary: nullifySchema(SummarySchema),\n})\n\n/**\n * A zod schema for awards.\n */\nexport const AwardsSchema = z.object({\n awards: z\n .array(AwardItemSchema)\n .nullish()\n .meta({\n title: 'Awards',\n description: joinNonEmptyString(\n [\n 'The awards section contains your achievements and recognitions,',\n 'including awards, honors, and special acknowledgments.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n EmailSchema,\n NameSchema,\n PhoneSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a headline.\n */\nexport const HeadlineSchema = SizedStringSchema('headline', 8, 128).meta({\n title: 'Headline',\n description: 'A short and catchy headline for your resume.',\n examples: [\n 'Full-stack software engineer',\n 'Data Scientist with a passion for Machine Learning',\n 'Product Manager driving innovation',\n ],\n})\n\n/**\n * A zod schema for a basics item.\n */\nexport const BasicsItemSchema = z.object(\n {\n // required fields\n name: NameSchema('name').describe('Your personal name.'),\n\n // optional fields\n email: nullifySchema(EmailSchema),\n headline: nullifySchema(HeadlineSchema),\n phone: nullifySchema(PhoneSchema),\n summary: nullifySchema(SummarySchema),\n url: nullifySchema(UrlSchema),\n },\n {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'basics is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n }\n)\n\n/**\n * A zod schema for basics.\n */\nexport const BasicsSchema = z.object({\n basics: BasicsItemSchema.meta({\n title: 'Basics',\n description: joinNonEmptyString(\n [\n 'The basics section contains your personal information,',\n 'such as your name, email, phone number, and a brief summary.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for the issuer of a certificate.\n */\nexport const IssuerSchema = OrganizationSchema('issuer').meta({\n title: 'Issuer',\n description: 'The organization that issued the certificate.',\n examples: ['AWS', 'Microsoft', 'Coursera', 'Google Cloud'],\n})\n\n/**\n * A zod schema for a certificate item.\n */\nexport const CertificateItemSchema = z.object({\n // required fields\n issuer: IssuerSchema,\n name: NameSchema('name').describe('The name of the certificate.'),\n\n // optional fields\n date: nullifySchema(DateSchema('date')),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for certificates.\n */\nexport const CertificatesSchema = z.object({\n certificates: z\n .array(CertificateItemSchema)\n .nullish()\n .meta({\n title: 'Certificates',\n description: joinNonEmptyString(\n [\n 'The certificates section contains your professional certifications,',\n 'including training programs and industry-recognized credentials.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n DegreeOptionSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an area of study.\n */\nexport const AreaSchema = SizedStringSchema('area', 2, 64).meta({\n title: 'Area',\n description: 'Your field of study or major.',\n examples: [\n 'Computer Science',\n 'Business Administration',\n 'Engineering',\n 'Arts',\n ],\n})\n\n/**\n * A zod schema for courses.\n */\nexport const CoursesSchema = z\n .array(SizedStringSchema('courses', 2, 128))\n .meta({\n title: 'Courses',\n description: 'A list of relevant courses you have taken.',\n examples: [\n ['Data Structures', 'Algorithms', 'Database Systems'],\n ['Marketing', 'Finance', 'Operations Management'],\n ['Calculus', 'Physics', 'Chemistry'],\n ],\n })\n\n/**\n * A zod schema for an institution.\n */\nexport const InstitutionSchema = OrganizationSchema('institution').meta({\n title: 'Institution',\n description: 'The institution that awarded the degree.',\n examples: [\n 'University of California, Los Angeles',\n 'Harvard University',\n 'Zhejiang University',\n ],\n})\n\n/**\n * A zod schema for a score.\n */\nexport const ScoreSchema = SizedStringSchema('score', 2, 32).meta({\n title: 'Score',\n description: 'Your GPA, grade, or other academic score.',\n examples: ['3.8', '3.8/4.0', 'A+', '95%', 'First Class Honours'],\n})\n\n/**\n * A zod schema for an education item.\n */\nexport const EducationItemSchema = z.object({\n // required fields\n area: AreaSchema,\n institution: InstitutionSchema,\n degree: DegreeOptionSchema,\n startDate: DateSchema('startDate'),\n\n // optional fields\n courses: nullifySchema(CoursesSchema),\n endDate: nullifySchema(DateSchema('endDate')),\n summary: nullifySchema(SummarySchema),\n score: nullifySchema(ScoreSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for education.\n */\nexport const EducationSchema = z.object({\n education: z\n .array(EducationItemSchema, {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'education is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n })\n .meta({\n title: 'Education',\n description: joinNonEmptyString(\n [\n 'The education section contains your academic background,',\n 'including degrees, institutions, and relevant coursework.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { KeywordsSchema, NameSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for an interest name.\n */\nexport const InterestNameSchema = NameSchema('name').describe(\n 'The name of the interest.'\n)\n\n/**\n * A zod schema for an interest item.\n */\nexport const InterestItemSchema = z.object({\n // required fields\n name: InterestNameSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for interests.\n */\nexport const InterestsSchema = z.object({\n interests: z\n .array(InterestItemSchema)\n .nullish()\n .meta({\n title: 'Interests',\n description: joinNonEmptyString(\n [\n 'The interests section contains your personal interests and hobbies,',\n 'including activities and topics you are passionate about.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n FluencyOptionSchema,\n KeywordsSchema,\n LanguageOptionSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a language item.\n */\nexport const LanguageItemSchema = z.object({\n // required fields\n fluency: FluencyOptionSchema,\n language: LanguageOptionSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for languages.\n */\nexport const LanguagesSchema = z.object({\n languages: z\n .array(LanguageItemSchema)\n .nullish()\n .meta({\n title: 'Languages',\n description: joinNonEmptyString(\n [\n 'The languages section contains your language proficiencies,',\n 'including fluency levels and related skills.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { CountryOptionSchema, SizedStringSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a city.\n */\nexport const CitySchema = SizedStringSchema('city', 2, 64).meta({\n title: 'City',\n description: 'The city where you are located.',\n examples: ['San Francisco', 'New York', 'London', 'Tokyo'],\n})\n\n/**\n * A zod schema for an address.\n */\nexport const AddressSchema = SizedStringSchema('address', 4, 256).meta({\n title: 'Address',\n description: 'Your full address including street, apartment, etc.',\n examples: [\n '123 Main Street, Apt 4B',\n '456 Oak Avenue',\n '789 Pine Road, Suite 100',\n ],\n})\n\n/**\n * A zod schema for a postal code.\n */\nexport const PostalCodeSchema = SizedStringSchema('postalCode', 2, 16).meta({\n title: 'Postal Code',\n description: 'Your postal or ZIP code.',\n examples: ['94102', '10001', 'SW1A 1AA', '100-0001'],\n})\n\n/**\n * A zod schema for a region.\n */\nexport const RegionSchema = SizedStringSchema('region', 2, 64).meta({\n title: 'Region',\n description: 'Your state, province, or region.',\n examples: ['California', 'New York', 'England', 'Tokyo'],\n})\n\n/**\n * A zod schema for a location item.\n */\nexport const LocationItemSchema = z.object({\n // required fields\n city: CitySchema,\n\n // optional fields\n address: nullifySchema(AddressSchema),\n country: nullifySchema(CountryOptionSchema),\n postalCode: nullifySchema(PostalCodeSchema),\n region: nullifySchema(RegionSchema),\n})\n\n/**\n * A zod schema for location.\n */\nexport const LocationSchema = z.object({\n location: LocationItemSchema.nullish().meta({\n title: 'Location',\n description: joinNonEmptyString(\n [\n 'The location section contains your geographical information,',\n 'such as city, address, country, and postal code.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n NetworkOptionSchema,\n SizedStringSchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a username.\n */\nexport const UsernameSchema = SizedStringSchema('username', 2, 64).meta({\n title: 'Username',\n description: 'Your username or handle on the social network.',\n examples: ['john_doe', 'jane.smith', 'dev_engineer', 'designer_123'],\n})\n\n/**\n * A zod schema for a profile item.\n */\nexport const ProfileItemSchema = z.object({\n // required fields\n network: NetworkOptionSchema,\n username: UsernameSchema,\n\n // optional fields\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for profiles.\n */\nexport const ProfilesSchema = z.object({\n profiles: z\n .array(ProfileItemSchema)\n .nullish()\n .meta({\n title: 'Profiles',\n description: joinNonEmptyString(\n [\n 'The profiles section contains your online presence,',\n 'including social media and professional network profiles.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n KeywordsSchema,\n NameSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a project name.\n */\nexport const ProjectNameSchema = NameSchema('name').describe(\n 'The name of the project.'\n)\n\n/**\n * A zod schema for a project description.\n */\nexport const ProjectDescriptionSchema = SizedStringSchema(\n 'description',\n 4,\n 128\n).meta({\n title: 'Description',\n description: 'A detailed description of the project and your role.',\n examples: [\n 'Led development of a full-stack web application',\n 'Designed and implemented REST API endpoints',\n 'Managed team of 5 developers for mobile app development',\n ],\n})\n\n/**\n * A zod schema for a project item.\n */\nexport const ProjectItemSchema = z.object({\n // required fields\n name: ProjectNameSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n description: nullifySchema(ProjectDescriptionSchema),\n endDate: nullifySchema(DateSchema('endDate')),\n keywords: nullifySchema(KeywordsSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for projects.\n */\nexport const ProjectsSchema = z.object({\n projects: z\n .array(ProjectItemSchema)\n .nullish()\n .meta({\n title: 'Projects',\n description: joinNonEmptyString(\n [\n 'The projects section contains your personal and professional projects,',\n 'including technical details, timelines, and outcomes.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n NameSchema,\n OrganizationSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a publication name.\n */\nexport const PublicationNameSchema = NameSchema('name').describe(\n 'The name of the publication.'\n)\n\n/**\n * A zod schema for a publisher.\n */\nexport const PublisherSchema = OrganizationSchema('publisher').meta({\n title: 'Publisher',\n description: 'The organization that published the work.',\n examples: ['ACM', 'IEEE', 'Springer', 'Nature Publishing Group'],\n})\n\n/**\n * A zod schema for a publication item.\n */\nexport const PublicationItemSchema = z.object({\n // required fields\n name: PublicationNameSchema,\n publisher: PublisherSchema,\n\n // optional fields\n releaseDate: nullifySchema(DateSchema('Release date')),\n summary: nullifySchema(SummarySchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for publications.\n */\nexport const PublicationsSchema = z.object({\n publications: z\n .array(PublicationItemSchema)\n .nullish()\n .meta({\n title: 'Publications',\n description: joinNonEmptyString(\n [\n 'The publications section contains your academic and professional publications,',\n 'including papers, articles, and research works.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n EmailSchema,\n NameSchema,\n PhoneSchema,\n SizedStringSchema,\n SummarySchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a reference name.\n */\nexport const ReferenceNameSchema = NameSchema('name').describe(\n 'The name of the reference.'\n)\n\n/**\n * A zod schema for a relationship.\n */\nexport const RelationshipSchema = SizedStringSchema(\n 'relationship',\n 2,\n 128\n).meta({\n title: 'Relationship',\n description: 'Your professional relationship with the reference.',\n examples: ['Former Manager', 'Colleague', 'Professor', 'Client'],\n})\n\n/**\n * A zod schema for a reference item.\n */\nexport const ReferenceItemSchema = z.object({\n // required fields\n name: ReferenceNameSchema,\n summary: SummarySchema,\n\n // optional fields\n email: nullifySchema(EmailSchema),\n phone: nullifySchema(PhoneSchema),\n relationship: nullifySchema(RelationshipSchema),\n})\n\n/**\n * A zod schema for references.\n */\nexport const ReferencesSchema = z.object({\n references: z\n .array(ReferenceItemSchema)\n .nullish()\n .meta({\n title: 'References',\n description: joinNonEmptyString(\n [\n 'The references section contains your professional references,',\n 'including contact information and relationships.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { KeywordsSchema, LevelOptionSchema, NameSchema } from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a skill name.\n */\nexport const SkillNameSchema = NameSchema('name').describe(\n 'The name of the skill.'\n)\n\n/**\n * A zod schema for a skill item.\n */\nexport const SkillItemSchema = z.object({\n // required fields\n level: LevelOptionSchema,\n name: SkillNameSchema,\n\n // optional fields\n keywords: nullifySchema(KeywordsSchema),\n})\n\n/**\n * A zod schema for skills.\n */\nexport const SkillsSchema = z.object({\n skills: z\n .array(SkillItemSchema)\n .nullish()\n .meta({\n title: 'Skills',\n description: joinNonEmptyString(\n [\n 'The skills section contains your technical and professional skills,',\n 'including proficiency levels and related keywords.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a volunteer organization.\n */\nexport const VolunteerOrganizationSchema = OrganizationSchema(\n 'organization'\n).meta({\n title: 'Organization',\n description: 'The organization where you volunteered.',\n examples: [\n 'Red Cross',\n 'Habitat for Humanity',\n 'Local Food Bank',\n 'Animal Shelter',\n ],\n})\n\n/**\n * A zod schema for a volunteer position.\n */\nexport const VolunteerPositionSchema = SizedStringSchema(\n 'position',\n 2,\n 64\n).meta({\n title: 'Position',\n description: 'Your role or position in the volunteer organization.',\n examples: ['Event Coordinator', 'Tutor', 'Fundraiser', 'Board Member'],\n})\n\n/**\n * A zod schema for a volunteer item.\n */\nexport const VolunteerItemSchema = z.object({\n // required fields\n organization: VolunteerOrganizationSchema,\n position: VolunteerPositionSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n endDate: nullifySchema(DateSchema('endDate')),\n url: nullifySchema(UrlSchema),\n})\n/**\n * A zod schema for volunteer.\n */\nexport const VolunteerSchema = z.object({\n volunteer: z\n .array(VolunteerItemSchema)\n .nullish()\n .meta({\n title: 'Volunteer',\n description: joinNonEmptyString(\n [\n 'The volunteer section contains your community service and volunteer work,',\n 'including organizations, roles, and contributions.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport {\n DateSchema,\n KeywordsSchema,\n OrganizationSchema,\n SizedStringSchema,\n SummarySchema,\n UrlSchema,\n} from '../primitives'\nimport { nullifySchema } from '../utils'\n\n/**\n * A zod schema for a company name.\n */\nexport const CompanyNameSchema = OrganizationSchema('name').meta({\n title: 'Name',\n description: 'The name of the company or organization you worked for.',\n examples: ['Google', 'Microsoft', 'Apple', 'Amazon'],\n})\n\n/**\n * A zod schema for a position.\n */\nexport const PositionSchema = SizedStringSchema('position', 2, 64).meta({\n title: 'Position',\n description: 'Your job title or position at the company.',\n examples: [\n 'Software Engineer',\n 'Product Manager',\n 'Data Scientist',\n 'UX Designer',\n ],\n})\n\n/**\n * A zod schema for a work item.\n */\nexport const WorkItemSchema = z.object({\n // required fields\n name: CompanyNameSchema,\n position: PositionSchema,\n startDate: DateSchema('startDate'),\n summary: SummarySchema,\n\n // optional fields\n endDate: nullifySchema(DateSchema('endDate')),\n keywords: nullifySchema(KeywordsSchema),\n url: nullifySchema(UrlSchema),\n})\n\n/**\n * A zod schema for work.\n */\nexport const WorkSchema = z.object({\n work: z\n .array(WorkItemSchema)\n .nullish()\n .meta({\n title: 'Work',\n description: joinNonEmptyString(\n [\n 'The work section contains your professional experience,',\n 'including job titles, companies, and responsibilities.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\nimport { z } from 'zod/v4'\n\nimport { AwardsSchema } from './awards'\nimport { BasicsSchema } from './basics'\nimport { CertificatesSchema } from './certificates'\nimport { EducationSchema } from './education'\nimport { InterestsSchema } from './interests'\nimport { LanguagesSchema } from './languages'\nimport { LocationSchema } from './location'\nimport { ProfilesSchema } from './profiles'\nimport { ProjectsSchema } from './projects'\nimport { PublicationsSchema } from './publications'\nimport { ReferencesSchema } from './references'\nimport { SkillsSchema } from './skills'\nimport { VolunteerSchema } from './volunteer'\nimport { WorkSchema } from './work'\n\n/**\n * A zod schema for a resume, merging all section schemas.\n */\nexport const ContentSchema = z.object({\n content: z.object(\n {\n // required sections\n ...BasicsSchema.shape,\n ...EducationSchema.shape,\n\n // optional sections\n ...AwardsSchema.shape,\n ...CertificatesSchema.shape,\n ...InterestsSchema.shape,\n ...LanguagesSchema.shape,\n ...LocationSchema.shape,\n ...ProfilesSchema.shape,\n ...ProjectsSchema.shape,\n ...PublicationsSchema.shape,\n ...ReferencesSchema.shape,\n ...SkillsSchema.shape,\n ...VolunteerSchema.shape,\n ...WorkSchema.shape,\n },\n {\n error: (issue) => {\n if (issue.input === undefined) {\n return {\n message: 'content is required.',\n }\n }\n\n return {\n message: issue.message,\n }\n },\n }\n ),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { LatexSchema } from './latex'\nimport { LocaleSchema } from './locale'\nimport { MarginsSchema } from './margins'\nimport { PageSchema } from './page'\nimport { TemplateSchema } from './template'\nimport { TypographySchema } from './typography'\n\n/**\n * A zod schema that combines all layout-related configurations.\n *\n * This schema validates the entire layout object by intersecting all individual\n * schemas (template, margins, typography, locale, and page) to ensure a\n * complete and valid layout configuration.\n */\nexport const LayoutSchema = z.object({\n layout: z\n .object({\n ...LatexSchema.shape,\n ...LocaleSchema.shape,\n ...MarginsSchema.shape,\n ...PageSchema.shape,\n ...TemplateSchema.shape,\n ...TypographySchema.shape,\n })\n .nullish()\n .meta({\n title: 'Layout',\n description: joinNonEmptyString(\n [\n 'The layout section contains all layout-related configurations,',\n 'including LaTeX, locale, margins, template, typography, etc.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { FontspecNumbersOptionSchema } from '../primitives'\n\n/**\n * A zod schema for validating LaTeX configuration.\n *\n * Validates LaTeX-specific settings including font specification\n * options like number styling.\n */\nexport const LatexSchema = z.object({\n latex: z\n .object({\n fontspec: z\n .object({\n numbers: FontspecNumbersOptionSchema.nullish(),\n })\n .nullish(),\n })\n .nullish()\n .meta({\n title: 'LaTeX',\n description: joinNonEmptyString(\n [\n 'The LaTeX section contains LaTeX-specific settings,',\n 'including fontspec package configurations.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { LocaleLanguageOptionSchema } from '../primitives'\n\n/**\n * A zod schema for validating locale configuration.\n *\n * Validates that the language field contains a supported locale language\n * option.\n */\nexport const LocaleSchema = z.object({\n locale: z\n .object({\n language: LocaleLanguageOptionSchema.nullish(),\n })\n .nullish()\n .meta({\n title: 'Locale',\n description: joinNonEmptyString(\n [\n 'The locale section contains locale language settings,',\n 'determining the language used for the resume.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { MarginSizeSchema } from '../primitives'\n\n/**\n * A zod schema for validating margin configuration.\n *\n * Validates that all margin fields (top, bottom, left, right) are strings\n * representing valid CSS length values (e.g., \"1cm\", \"10pt\").\n */\nexport const MarginsSchema = z.object({\n margins: z\n .object({\n top: MarginSizeSchema('top').nullish(),\n bottom: MarginSizeSchema('bottom').nullish(),\n left: MarginSizeSchema('left').nullish(),\n right: MarginSizeSchema('right').nullish(),\n })\n .nullish()\n .meta({\n title: 'Margins',\n description: joinNonEmptyString(\n [\n 'The margins section contains page margin settings,',\n 'including top, bottom, left, and right margins.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\n\n/**\n * A zod schema for the show page numbers setting.\n */\nexport const ShowPageNumbersSchema = z.boolean().nullish().meta({\n title: 'Show Page Numbers',\n description: 'Whether to show page numbers on the page.',\n})\n\n/**\n * A zod schema for validating page configuration.\n *\n * Validates page-related settings such as whether to show page numbers.\n */\nexport const PageSchema = z.object({\n page: z\n .object({\n showPageNumbers: ShowPageNumbersSchema,\n })\n .nullish()\n .meta({\n title: 'Page',\n description: joinNonEmptyString(\n [\n 'The page section contains page display settings,',\n 'including whether to show page numbers.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { TemplateOptionSchema } from '../primitives'\n\n/**\n * A zod schema for validating template configuration.\n *\n * Validates that the template field contains a valid template option.\n */\nexport const TemplateSchema = z.object({\n template: TemplateOptionSchema.nullish().meta({\n title: 'Template',\n description: joinNonEmptyString(\n [\n 'The template section contains the resume template selection,',\n 'determining the overall visual style and layout.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { joinNonEmptyString } from '@/utils'\nimport { FontSizeOptionSchema } from '../primitives'\n\n/**\n * A zod schema for typography settings.\n */\nexport const TypographySchema = z.object({\n typography: z\n .object({\n fontSize: FontSizeOptionSchema.nullish(),\n })\n .nullish()\n .meta({\n title: 'Typography',\n description: joinNonEmptyString(\n [\n 'The typography section contains font settings,',\n 'including font size options.',\n ],\n ' '\n ),\n }),\n})\n","/**\n * MIT License\n *\n * Copyright (c) 2023–Present PPResume (https://ppresume.com)\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport { z } from 'zod/v4'\n\nimport { ContentSchema } from './content'\nimport { LayoutSchema } from './layout/layout'\n\n/**\n * A zod schema for a yaml resume.\n */\nexport const ResumeSchema = z\n .object({\n ...ContentSchema.shape,\n ...LayoutSchema.shape,\n })\n .meta({\n $id: 'https://yamlresume.dev/schema.json',\n title: 'YAMLResume Schema',\n description: 'JSON Schema for YAMLResume resume format.',\n version: '0.5.1',\n license: 'MIT',\n keywords: ['Resume', 'CV', 'YAML', 'LaTeX', 'PDF', 'YAMLResume'],\n })\n"]}
|