@yamlresume/core 0.3.3 → 0.4.0
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 +3 -3
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/country.ts","../src/types/resume.ts","../src/data/resume.ts","../src/utils/object.ts","../src/utils/date.ts","../src/utils/tex.ts","../src/utils/string.ts","../src/compiler/codegen/latex.ts","../src/compiler/parser/tiptap.ts","../src/compiler/parser/markdown.ts","../src/errors/error.ts","../src/translations/terms.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"],"names":["Country","englishCountryNames","simplifiedChineseCountryNames","traditionalChineseCountryHKNames","traditionalChineseCountryTWNames","spanishCountryNames","SECTION_IDS","FontSpecNumbersStyle","emptyParagraph","Degree","degreeOptions","Language","languagesOptions","LanguageFluency","languageFluenciesOptions","SkillLevel","skillLevelOptions","TemplateOption","getTemplateOptionDetail","templateOption","templateOptionName","resumeItems","defaultResumeContent","filledResumeContent","fontSizeOptions","defaultTopBottomMargin","defaultLeftRightMargin","marginOptions","LocaleLanguageOption","getLocaleLanguageOptionDetail","localeLanguage","localeLanguageOptionName","defaultLanguage","defaultResumeLayout","defaultResume","filledResume","isEmptyValue","value","removeKeysFromObject","obj","keysToRemove","transform","result","key","isObject","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","TiptapParser","input","MarkdownParser","ast","unified","remarkParse","marks","child","boldMark","processChildrenWithMarks","italicMark","linkMark","children","transformedNodes","ErrorCategory","ErrorType","YAMLResumeError","params","error","message","_","ResumeTerms","getTermsTranslations","Punctuation","TemplateTerms","getTemplateTranslations","replaceBlankLinesWithPercent","transformSectionsWithDefaultValues","resume","merge","transformResumeValues","transformResumeSectionValues","index","transformResumeSectionComputedValues","sectionResumeComputed","sectionResumeItem","item","transformEducationCourses","Separator","transformEducationDegreeAreaAndScore","Colon","Comma","education","terms","degree","score","transformKeywords","section","isArray","transformDate","transformEndDate","transformLanguage","languages","languageFluencies","transformLocation","location","postalCodeAndAddress","regionAndCountry","fullAddress","regionCountryAndPostalCode","transformBasicsUrl","basicsLink","transformProfileUrls","getFaIcon","network","capitalize","transformSkills","skills","transformSocialLinks","link","transformSectionNames","sections","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","renderSpanishConfig","renderFontspecConfig","numbers","linuxLibertineFont","linuxLibertineOFont","ModerncvBase","name","headline","phone","email","urls","sectionNames","layout","Courses","dateRange","degreeAreaAndScore","courses","institution","url","Keywords","work","keywords","position","fluency","level","awards","awarder","title","certificates","issuer","publications","releaseDate","publisher","references","relationship","description","organization","ModerncvBankingRenderer","ModerncvClassicRenderer","ModerncvCasualRenderer","RESUME_RENDERER_MAP","getResumeRenderer","template","get"],"mappings":"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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\n/**\n * Represents all possible countries & regions.\n */\nexport enum Country {\n Afghanistan = 'Afghanistan',\n AlandIslands = 'Aland Islands',\n Albania = 'Albania',\n Algeria = 'Algeria',\n AmericanSamoa = 'American Samoa',\n Andorra = 'Andorra',\n Angola = 'Angola',\n Anguilla = 'Anguilla',\n Antarctica = 'Antarctica',\n AntiguaAndBarbuda = '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 BonaireSintEustatiusAndSaba = 'Bonaire, Sint Eustatius and Saba',\n BosniaAndHerzegovina = 'Bosnia and Herzegovina',\n Botswana = 'Botswana',\n BouvetIsland = 'Bouvet Island',\n Brazil = 'Brazil',\n BritishIndianOceanTerritory = 'British Indian Ocean Territory',\n Brunei = 'Brunei',\n Bulgaria = 'Bulgaria',\n BurkinaFaso = 'Burkina Faso',\n Burundi = 'Burundi',\n Cambodia = 'Cambodia',\n Cameroon = 'Cameroon',\n Canada = 'Canada',\n CapeVerde = 'Cape Verde',\n CaymanIslands = 'Cayman Islands',\n CentralAfricanRepublic = 'Central African Republic',\n Chad = 'Chad',\n Chile = 'Chile',\n China = 'China',\n ChristmasIsland = 'Christmas Island',\n CocosKeelingIslands = 'Cocos (Keeling) Islands',\n Colombia = 'Colombia',\n Comoros = 'Comoros',\n Congo = 'Congo',\n CookIslands = 'Cook Islands',\n CostaRica = 'Costa Rica',\n CoteDIvoireIvoryCoast = \"Cote D'Ivoire (Ivory Coast)\",\n Croatia = 'Croatia',\n Cuba = 'Cuba',\n Curaçao = 'Curaçao',\n Cyprus = 'Cyprus',\n CzechRepublic = 'Czech Republic',\n DemocraticRepublicoftheCongo = 'Democratic Republic of the Congo',\n Denmark = 'Denmark',\n Djibouti = 'Djibouti',\n Dominica = 'Dominica',\n DominicanRepublic = 'Dominican Republic',\n EastTimor = 'East Timor',\n Ecuador = 'Ecuador',\n Egypt = 'Egypt',\n ElSalvador = 'El Salvador',\n EquatorialGuinea = 'Equatorial Guinea',\n Eritrea = 'Eritrea',\n Estonia = 'Estonia',\n Ethiopia = 'Ethiopia',\n FalklandIslands = 'Falkland Islands',\n FaroeIslands = 'Faroe Islands',\n FijiIslands = 'Fiji Islands',\n Finland = 'Finland',\n France = 'France',\n FrenchGuiana = 'French Guiana',\n FrenchPolynesia = 'French Polynesia',\n FrenchSouthernTerritories = 'French Southern Territories',\n Gabon = 'Gabon',\n GambiaThe = '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 GuernseyAndAlderney = 'Guernsey and Alderney',\n Guinea = 'Guinea',\n GuineaBissau = 'Guinea-Bissau',\n Guyana = 'Guyana',\n Haiti = 'Haiti',\n HeardIslandAndMcDonaldIslands = 'Heard Island and McDonald Islands',\n Honduras = 'Honduras',\n HongKongSAR = '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 MacauSAR = 'Macau S.A.R.',\n Madagascar = 'Madagascar',\n Malawi = 'Malawi',\n Malaysia = 'Malaysia',\n Maldives = 'Maldives',\n Mali = 'Mali',\n Malta = 'Malta',\n ManIsleof = 'Man (Isle of)',\n MarshallIslands = '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 NewCaledonia = 'New Caledonia',\n NewZealand = 'New Zealand',\n Nicaragua = 'Nicaragua',\n Niger = 'Niger',\n Nigeria = 'Nigeria',\n Niue = 'Niue',\n NorfolkIsland = 'Norfolk Island',\n NorthKorea = 'North Korea',\n NorthMacedonia = 'North Macedonia',\n NorthernMarianaIslands = 'Northern Mariana Islands',\n Norway = 'Norway',\n Oman = 'Oman',\n Pakistan = 'Pakistan',\n Palau = 'Palau',\n PalestinianTerritoryOccupied = 'Palestinian Territory Occupied',\n Panama = 'Panama',\n PapuanewGuinea = 'Papua new Guinea',\n Paraguay = 'Paraguay',\n Peru = 'Peru',\n Philippines = 'Philippines',\n PitcairnIsland = 'Pitcairn Island',\n Poland = 'Poland',\n Portugal = 'Portugal',\n PuertoRico = 'Puerto Rico',\n Qatar = 'Qatar',\n Reunion = 'Reunion',\n Romania = 'Romania',\n Russia = 'Russia',\n Rwanda = 'Rwanda',\n SaintHelena = 'Saint Helena',\n SaintKittsAndNevis = 'Saint Kitts And Nevis',\n SaintLucia = 'Saint Lucia',\n SaintPierreAndMiquelon = 'Saint Pierre and Miquelon',\n SaintVincentAndTheGrenadines = 'Saint Vincent And The Grenadines',\n SaintBarthelemy = 'Saint-Barthelemy',\n SaintMartinFrenchpart = 'Saint-Martin (French part)',\n Samoa = 'Samoa',\n SanMarino = 'San Marino',\n SaoTomeAndPrincipe = 'Sao Tome and Principe',\n SaudiArabia = 'Saudi Arabia',\n Senegal = 'Senegal',\n Serbia = 'Serbia',\n Seychelles = 'Seychelles',\n SierraLeone = 'Sierra Leone',\n Singapore = 'Singapore',\n SintMaartenDutchpart = 'Sint Maarten (Dutch part)',\n Slovakia = 'Slovakia',\n Slovenia = 'Slovenia',\n SolomonIslands = 'Solomon Islands',\n Somalia = 'Somalia',\n SouthAfrica = 'South Africa',\n SouthGeorgia = 'South Georgia',\n SouthKorea = 'South Korea',\n SouthSudan = 'South Sudan',\n Spain = 'Spain',\n SriLanka = 'Sri Lanka',\n Sudan = 'Sudan',\n Suriname = 'Suriname',\n SvalbardAndJanMayenIslands = '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 TheBahamas = 'The Bahamas',\n Togo = 'Togo',\n Tokelau = 'Tokelau',\n Tonga = 'Tonga',\n TrinidadAndTobago = 'Trinidad And Tobago',\n Tunisia = 'Tunisia',\n Turkey = 'Turkey',\n Turkmenistan = 'Turkmenistan',\n TurksAndCaicosIslands = 'Turks And Caicos Islands',\n Tuvalu = 'Tuvalu',\n Uganda = 'Uganda',\n Ukraine = 'Ukraine',\n UnitedArabEmirates = 'United Arab Emirates',\n UnitedKingdom = 'United Kingdom',\n UnitedStates = 'United States',\n UnitedStatesMinorOutlyingIslands = 'United States Minor Outlying Islands',\n Uruguay = 'Uruguay',\n Uzbekistan = 'Uzbekistan',\n Vanuatu = 'Vanuatu',\n VaticanCityStateHolySee = 'Vatican City State (Holy See)',\n Venezuela = 'Venezuela',\n Vietnam = 'Vietnam',\n VirginIslandsBritish = 'Virgin Islands (British)',\n VirginIslandsUS = 'Virgin Islands (US)',\n WallisAndFutunaIslands = 'Wallis And Futuna Islands',\n WesternSahara = 'Western Sahara',\n Yemen = 'Yemen',\n Zambia = 'Zambia',\n Zimbabwe = 'Zimbabwe',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding English\n * names.\n */\nexport const englishCountryNames: Record<Country, string> = {\n [Country.Afghanistan]: 'Afghanistan',\n [Country.AlandIslands]: 'Aland Islands',\n [Country.Albania]: 'Albania',\n [Country.Algeria]: 'Algeria',\n [Country.AmericanSamoa]: 'American Samoa',\n [Country.Andorra]: 'Andorra',\n [Country.Angola]: 'Angola',\n [Country.Anguilla]: 'Anguilla',\n [Country.Antarctica]: 'Antarctica',\n [Country.AntiguaAndBarbuda]: 'Antigua And Barbuda',\n [Country.Argentina]: 'Argentina',\n [Country.Armenia]: 'Armenia',\n [Country.Aruba]: 'Aruba',\n [Country.Australia]: 'Australia',\n [Country.Austria]: 'Austria',\n [Country.Azerbaijan]: 'Azerbaijan',\n [Country.Bahrain]: 'Bahrain',\n [Country.Bangladesh]: 'Bangladesh',\n [Country.Barbados]: 'Barbados',\n [Country.Belarus]: 'Belarus',\n [Country.Belgium]: 'Belgium',\n [Country.Belize]: 'Belize',\n [Country.Benin]: 'Benin',\n [Country.Bermuda]: 'Bermuda',\n [Country.Bhutan]: 'Bhutan',\n [Country.Bolivia]: 'Bolivia',\n [Country.BonaireSintEustatiusAndSaba]: 'Bonaire, Sint Eustatius and Saba',\n [Country.BosniaAndHerzegovina]: 'Bosnia and Herzegovina',\n [Country.Botswana]: 'Botswana',\n [Country.BouvetIsland]: 'Bouvet Island',\n [Country.Brazil]: 'Brazil',\n [Country.BritishIndianOceanTerritory]: 'British Indian Ocean Territory',\n [Country.Brunei]: 'Brunei',\n [Country.Bulgaria]: 'Bulgaria',\n [Country.BurkinaFaso]: 'Burkina Faso',\n [Country.Burundi]: 'Burundi',\n [Country.Cambodia]: 'Cambodia',\n [Country.Cameroon]: 'Cameroon',\n [Country.Canada]: 'Canada',\n [Country.CapeVerde]: 'Cape Verde',\n [Country.CaymanIslands]: 'Cayman Islands',\n [Country.CentralAfricanRepublic]: 'Central African Republic',\n [Country.Chad]: 'Chad',\n [Country.Chile]: 'Chile',\n [Country.China]: 'China',\n [Country.ChristmasIsland]: 'Christmas Island',\n [Country.CocosKeelingIslands]: 'Cocos (Keeling) Islands',\n [Country.Colombia]: 'Colombia',\n [Country.Comoros]: 'Comoros',\n [Country.Congo]: 'Congo',\n [Country.CookIslands]: 'Cook Islands',\n [Country.CostaRica]: 'Costa Rica',\n [Country.CoteDIvoireIvoryCoast]: \"Cote D'Ivoire (Ivory Coast)\",\n [Country.Croatia]: 'Croatia',\n [Country.Cuba]: 'Cuba',\n [Country.Curaçao]: 'Curaçao',\n [Country.Cyprus]: 'Cyprus',\n [Country.CzechRepublic]: 'Czech Republic',\n [Country.DemocraticRepublicoftheCongo]: 'Democratic Republic of the Congo',\n [Country.Denmark]: 'Denmark',\n [Country.Djibouti]: 'Djibouti',\n [Country.Dominica]: 'Dominica',\n [Country.DominicanRepublic]: 'Dominican Republic',\n [Country.EastTimor]: 'East Timor',\n [Country.Ecuador]: 'Ecuador',\n [Country.Egypt]: 'Egypt',\n [Country.ElSalvador]: 'El Salvador',\n [Country.EquatorialGuinea]: 'Equatorial Guinea',\n [Country.Eritrea]: 'Eritrea',\n [Country.Estonia]: 'Estonia',\n [Country.Ethiopia]: 'Ethiopia',\n [Country.FalklandIslands]: 'Falkland Islands',\n [Country.FaroeIslands]: 'Faroe Islands',\n [Country.FijiIslands]: 'Fiji Islands',\n [Country.Finland]: 'Finland',\n [Country.France]: 'France',\n [Country.FrenchGuiana]: 'French Guiana',\n [Country.FrenchPolynesia]: 'French Polynesia',\n [Country.FrenchSouthernTerritories]: 'French Southern Territories',\n [Country.Gabon]: 'Gabon',\n [Country.GambiaThe]: 'Gambia The',\n [Country.Georgia]: 'Georgia',\n [Country.Germany]: 'Germany',\n [Country.Ghana]: 'Ghana',\n [Country.Gibraltar]: 'Gibraltar',\n [Country.Greece]: 'Greece',\n [Country.Greenland]: 'Greenland',\n [Country.Grenada]: 'Grenada',\n [Country.Guadeloupe]: 'Guadeloupe',\n [Country.Guam]: 'Guam',\n [Country.Guatemala]: 'Guatemala',\n [Country.GuernseyAndAlderney]: 'Guernsey and Alderney',\n [Country.Guinea]: 'Guinea',\n [Country.GuineaBissau]: 'Guinea-Bissau',\n [Country.Guyana]: 'Guyana',\n [Country.Haiti]: 'Haiti',\n [Country.HeardIslandAndMcDonaldIslands]: 'Heard Island and McDonald Islands',\n [Country.Honduras]: 'Honduras',\n [Country.HongKongSAR]: 'Hong Kong S.A.R.',\n [Country.Hungary]: 'Hungary',\n [Country.Iceland]: 'Iceland',\n [Country.India]: 'India',\n [Country.Indonesia]: 'Indonesia',\n [Country.Iran]: 'Iran',\n [Country.Iraq]: 'Iraq',\n [Country.Ireland]: 'Ireland',\n [Country.Israel]: 'Israel',\n [Country.Italy]: 'Italy',\n [Country.Jamaica]: 'Jamaica',\n [Country.Japan]: 'Japan',\n [Country.Jersey]: 'Jersey',\n [Country.Jordan]: 'Jordan',\n [Country.Kazakhstan]: 'Kazakhstan',\n [Country.Kenya]: 'Kenya',\n [Country.Kiribati]: 'Kiribati',\n [Country.Kosovo]: 'Kosovo',\n [Country.Kuwait]: 'Kuwait',\n [Country.Kyrgyzstan]: 'Kyrgyzstan',\n [Country.Laos]: 'Laos',\n [Country.Latvia]: 'Latvia',\n [Country.Lebanon]: 'Lebanon',\n [Country.Lesotho]: 'Lesotho',\n [Country.Liberia]: 'Liberia',\n [Country.Libya]: 'Libya',\n [Country.Liechtenstein]: 'Liechtenstein',\n [Country.Lithuania]: 'Lithuania',\n [Country.Luxembourg]: 'Luxembourg',\n [Country.MacauSAR]: 'Macau S.A.R.',\n [Country.Madagascar]: 'Madagascar',\n [Country.Malawi]: 'Malawi',\n [Country.Malaysia]: 'Malaysia',\n [Country.Maldives]: 'Maldives',\n [Country.Mali]: 'Mali',\n [Country.Malta]: 'Malta',\n [Country.ManIsleof]: 'Man (Isle of)',\n [Country.MarshallIslands]: 'Marshall Islands',\n [Country.Martinique]: 'Martinique',\n [Country.Mauritania]: 'Mauritania',\n [Country.Mauritius]: 'Mauritius',\n [Country.Mayotte]: 'Mayotte',\n [Country.Mexico]: 'Mexico',\n [Country.Micronesia]: 'Micronesia',\n [Country.Moldova]: 'Moldova',\n [Country.Monaco]: 'Monaco',\n [Country.Mongolia]: 'Mongolia',\n [Country.Montenegro]: 'Montenegro',\n [Country.Montserrat]: 'Montserrat',\n [Country.Morocco]: 'Morocco',\n [Country.Mozambique]: 'Mozambique',\n [Country.Myanmar]: 'Myanmar',\n [Country.Namibia]: 'Namibia',\n [Country.Nauru]: 'Nauru',\n [Country.Nepal]: 'Nepal',\n [Country.Netherlands]: 'Netherlands',\n [Country.NewCaledonia]: 'New Caledonia',\n [Country.NewZealand]: 'New Zealand',\n [Country.Nicaragua]: 'Nicaragua',\n [Country.Niger]: 'Niger',\n [Country.Nigeria]: 'Nigeria',\n [Country.Niue]: 'Niue',\n [Country.NorfolkIsland]: 'Norfolk Island',\n [Country.NorthKorea]: 'North Korea',\n [Country.NorthMacedonia]: 'North Macedonia',\n [Country.NorthernMarianaIslands]: 'Northern Mariana Islands',\n [Country.Norway]: 'Norway',\n [Country.Oman]: 'Oman',\n [Country.Pakistan]: 'Pakistan',\n [Country.Palau]: 'Palau',\n [Country.PalestinianTerritoryOccupied]: 'Palestinian Territory Occupied',\n [Country.Panama]: 'Panama',\n [Country.PapuanewGuinea]: 'Papua new Guinea',\n [Country.Paraguay]: 'Paraguay',\n [Country.Peru]: 'Peru',\n [Country.Philippines]: 'Philippines',\n [Country.PitcairnIsland]: 'Pitcairn Island',\n [Country.Poland]: 'Poland',\n [Country.Portugal]: 'Portugal',\n [Country.PuertoRico]: 'Puerto Rico',\n [Country.Qatar]: 'Qatar',\n [Country.Reunion]: 'Reunion',\n [Country.Romania]: 'Romania',\n [Country.Russia]: 'Russia',\n [Country.Rwanda]: 'Rwanda',\n [Country.SaintHelena]: 'Saint Helena',\n [Country.SaintKittsAndNevis]: 'Saint Kitts And Nevis',\n [Country.SaintLucia]: 'Saint Lucia',\n [Country.SaintPierreAndMiquelon]: 'Saint Pierre and Miquelon',\n [Country.SaintVincentAndTheGrenadines]: 'Saint Vincent And The Grenadines',\n [Country.SaintBarthelemy]: 'Saint-Barthelemy',\n [Country.SaintMartinFrenchpart]: 'Saint-Martin (French part)',\n [Country.Samoa]: 'Samoa',\n [Country.SanMarino]: 'San Marino',\n [Country.SaoTomeAndPrincipe]: 'Sao Tome and Principe',\n [Country.SaudiArabia]: 'Saudi Arabia',\n [Country.Senegal]: 'Senegal',\n [Country.Serbia]: 'Serbia',\n [Country.Seychelles]: 'Seychelles',\n [Country.SierraLeone]: 'Sierra Leone',\n [Country.Singapore]: 'Singapore',\n [Country.SintMaartenDutchpart]: 'Sint Maarten (Dutch part)',\n [Country.Slovakia]: 'Slovakia',\n [Country.Slovenia]: 'Slovenia',\n [Country.SolomonIslands]: 'Solomon Islands',\n [Country.Somalia]: 'Somalia',\n [Country.SouthAfrica]: 'South Africa',\n [Country.SouthGeorgia]: 'South Georgia',\n [Country.SouthKorea]: 'South Korea',\n [Country.SouthSudan]: 'South Sudan',\n [Country.Spain]: 'Spain',\n [Country.SriLanka]: 'Sri Lanka',\n [Country.Sudan]: 'Sudan',\n [Country.Suriname]: 'Suriname',\n [Country.SvalbardAndJanMayenIslands]: 'Svalbard And Jan Mayen Islands',\n [Country.Swaziland]: 'Swaziland',\n [Country.Sweden]: 'Sweden',\n [Country.Switzerland]: 'Switzerland',\n [Country.Syria]: 'Syria',\n [Country.Taiwan]: 'Taiwan',\n [Country.Tajikistan]: 'Tajikistan',\n [Country.Tanzania]: 'Tanzania',\n [Country.Thailand]: 'Thailand',\n [Country.TheBahamas]: 'The Bahamas',\n [Country.Togo]: 'Togo',\n [Country.Tokelau]: 'Tokelau',\n [Country.Tonga]: 'Tonga',\n [Country.TrinidadAndTobago]: 'Trinidad And Tobago',\n [Country.Tunisia]: 'Tunisia',\n [Country.Turkey]: 'Turkey',\n [Country.Turkmenistan]: 'Turkmenistan',\n [Country.TurksAndCaicosIslands]: 'Turks And Caicos Islands',\n [Country.Tuvalu]: 'Tuvalu',\n [Country.Uganda]: 'Uganda',\n [Country.Ukraine]: 'Ukraine',\n [Country.UnitedArabEmirates]: 'United Arab Emirates',\n [Country.UnitedKingdom]: 'United Kingdom',\n [Country.UnitedStates]: 'United States',\n [Country.UnitedStatesMinorOutlyingIslands]:\n 'United States Minor Outlying Islands',\n [Country.Uruguay]: 'Uruguay',\n [Country.Uzbekistan]: 'Uzbekistan',\n [Country.Vanuatu]: 'Vanuatu',\n [Country.VaticanCityStateHolySee]: 'Vatican City State (Holy See)',\n [Country.Venezuela]: 'Venezuela',\n [Country.Vietnam]: 'Vietnam',\n [Country.VirginIslandsBritish]: 'Virgin Islands (British)',\n [Country.VirginIslandsUS]: 'Virgin Islands (US)',\n [Country.WallisAndFutunaIslands]: 'Wallis And Futuna Islands',\n [Country.WesternSahara]: 'Western Sahara',\n [Country.Yemen]: 'Yemen',\n [Country.Zambia]: 'Zambia',\n [Country.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 [Country.Afghanistan]: '阿富汗',\n [Country.AlandIslands]: '奥兰群岛',\n [Country.Albania]: '阿尔巴尼亚',\n [Country.Algeria]: '阿尔及利亚',\n [Country.AmericanSamoa]: '美属萨摩亚',\n [Country.Andorra]: '安道尔',\n [Country.Angola]: '安哥拉',\n [Country.Anguilla]: '安圭拉',\n [Country.Antarctica]: '南极洲',\n [Country.AntiguaAndBarbuda]: '安提瓜和巴布达',\n [Country.Argentina]: '阿根廷',\n [Country.Armenia]: '亚美尼亚',\n [Country.Aruba]: '阿鲁巴',\n [Country.Australia]: '澳大利亚',\n [Country.Austria]: '奥地利',\n [Country.Azerbaijan]: '阿塞拜疆',\n [Country.Bahrain]: '巴林',\n [Country.Bangladesh]: '孟加拉',\n [Country.Barbados]: '巴巴多斯',\n [Country.Belarus]: '白俄罗斯',\n [Country.Belgium]: '比利时',\n [Country.Belize]: '伯利兹',\n [Country.Benin]: '贝宁',\n [Country.Bermuda]: '百慕大',\n [Country.Bhutan]: '不丹',\n [Country.Bolivia]: '玻利维亚',\n [Country.BonaireSintEustatiusAndSaba]: '博内尔岛、圣尤斯特歇斯和萨巴岛',\n [Country.BosniaAndHerzegovina]: '波斯尼亚和黑塞哥维那',\n [Country.Botswana]: '博茨瓦纳',\n [Country.BouvetIsland]: '布维岛',\n [Country.Brazil]: '巴西',\n [Country.BritishIndianOceanTerritory]: '英属印度洋领地',\n [Country.Brunei]: '文莱',\n [Country.Bulgaria]: '保加利亚',\n [Country.BurkinaFaso]: '布基纳法索',\n [Country.Burundi]: '布隆迪',\n [Country.Cambodia]: '柬埔寨',\n [Country.Cameroon]: '喀麦隆',\n [Country.Canada]: '加拿大',\n [Country.CapeVerde]: '佛得角',\n [Country.CaymanIslands]: '开曼群岛',\n [Country.CentralAfricanRepublic]: '中非',\n [Country.Chad]: '乍得',\n [Country.Chile]: '智利',\n [Country.China]: '中国',\n [Country.ChristmasIsland]: '圣诞岛',\n [Country.CocosKeelingIslands]: '科科斯(基林)群岛',\n [Country.Colombia]: '哥伦比亚',\n [Country.Comoros]: '科摩罗',\n [Country.Congo]: '刚果',\n [Country.CookIslands]: '库克群岛',\n [Country.CostaRica]: '哥斯达黎加',\n [Country.CoteDIvoireIvoryCoast]: '科特迪瓦',\n [Country.Croatia]: '克罗地亚',\n [Country.Cuba]: '古巴',\n [Country.Curaçao]: '库拉索',\n [Country.Cyprus]: '塞浦路斯',\n [Country.CzechRepublic]: '捷克',\n [Country.DemocraticRepublicoftheCongo]: '刚果(金)',\n [Country.Denmark]: '丹麦',\n [Country.Djibouti]: '吉布提',\n [Country.Dominica]: '多米尼加',\n [Country.DominicanRepublic]: '多明尼加共和国',\n [Country.EastTimor]: '东帝汶',\n [Country.Ecuador]: '厄瓜多尔',\n [Country.Egypt]: '埃及',\n [Country.ElSalvador]: '萨尔瓦多',\n [Country.EquatorialGuinea]: '赤道几内亚',\n [Country.Eritrea]: '厄立特里亚',\n [Country.Estonia]: '爱沙尼亚',\n [Country.Ethiopia]: '埃塞俄比亚',\n [Country.FalklandIslands]: '福克兰群岛',\n [Country.FaroeIslands]: '法罗群岛',\n [Country.FijiIslands]: '斐济',\n [Country.Finland]: '芬兰',\n [Country.France]: '法国',\n [Country.FrenchGuiana]: '法属圭亚那',\n [Country.FrenchPolynesia]: '法属波利尼西亚',\n [Country.FrenchSouthernTerritories]: '法属南部领地',\n [Country.Gabon]: '加蓬',\n [Country.GambiaThe]: '冈比亚',\n [Country.Georgia]: '格鲁吉亚',\n [Country.Germany]: '德国',\n [Country.Ghana]: '加纳',\n [Country.Gibraltar]: '直布罗陀',\n [Country.Greece]: '希腊',\n [Country.Greenland]: '格陵兰岛',\n [Country.Grenada]: '格林纳达',\n [Country.Guadeloupe]: '瓜德罗普岛',\n [Country.Guam]: '关岛',\n [Country.Guatemala]: '危地马拉',\n [Country.GuernseyAndAlderney]: '根西岛',\n [Country.Guinea]: '几内亚',\n [Country.GuineaBissau]: '几内亚比绍',\n [Country.Guyana]: '圭亚那',\n [Country.Haiti]: '海地',\n [Country.HeardIslandAndMcDonaldIslands]: '赫德·唐纳岛及麦唐纳岛',\n [Country.Honduras]: '洪都拉斯',\n [Country.HongKongSAR]: '中国香港',\n [Country.Hungary]: '匈牙利',\n [Country.Iceland]: '冰岛',\n [Country.India]: '印度',\n [Country.Indonesia]: '印度尼西亚',\n [Country.Iran]: '伊朗',\n [Country.Iraq]: '伊拉克',\n [Country.Ireland]: '爱尔兰',\n [Country.Israel]: '以色列',\n [Country.Italy]: '意大利',\n [Country.Jamaica]: '牙买加',\n [Country.Japan]: '日本',\n [Country.Jersey]: '泽西岛',\n [Country.Jordan]: '约旦',\n [Country.Kazakhstan]: '哈萨克斯坦',\n [Country.Kenya]: '肯尼亚',\n [Country.Kiribati]: '基里巴斯',\n [Country.Kosovo]: '科索沃',\n [Country.Kuwait]: '科威特',\n [Country.Kyrgyzstan]: '吉尔吉斯斯坦',\n [Country.Laos]: '寮人民民主共和国',\n [Country.Latvia]: '拉脱维亚',\n [Country.Lebanon]: '黎巴嫩',\n [Country.Lesotho]: '莱索托',\n [Country.Liberia]: '利比里亚',\n [Country.Libya]: '利比亚',\n [Country.Liechtenstein]: '列支敦士登',\n [Country.Lithuania]: '立陶宛',\n [Country.Luxembourg]: '卢森堡',\n [Country.MacauSAR]: '中国澳门',\n [Country.Madagascar]: '马达加斯加',\n [Country.Malawi]: '马拉维',\n [Country.Malaysia]: '马来西亚',\n [Country.Maldives]: '马尔代夫',\n [Country.Mali]: '马里',\n [Country.Malta]: '马耳他',\n [Country.ManIsleof]: '马恩岛',\n [Country.MarshallIslands]: '马绍尔群岛',\n [Country.Martinique]: '马提尼克岛',\n [Country.Mauritania]: '毛里塔尼亚',\n [Country.Mauritius]: '毛里求斯',\n [Country.Mayotte]: '马约特',\n [Country.Mexico]: '墨西哥',\n [Country.Micronesia]: '密克罗尼西亚',\n [Country.Moldova]: '摩尔多瓦',\n [Country.Monaco]: '摩纳哥',\n [Country.Mongolia]: '蒙古',\n [Country.Montenegro]: '黑山',\n [Country.Montserrat]: '蒙特塞拉特',\n [Country.Morocco]: '摩洛哥',\n [Country.Mozambique]: '莫桑比克',\n [Country.Myanmar]: '缅甸',\n [Country.Namibia]: '纳米比亚',\n [Country.Nauru]: '瑙鲁',\n [Country.Nepal]: '尼泊尔',\n [Country.Netherlands]: '荷兰',\n [Country.NewCaledonia]: '新喀里多尼亚',\n [Country.NewZealand]: '新西兰',\n [Country.Nicaragua]: '尼加拉瓜',\n [Country.Niger]: '尼日尔',\n [Country.Nigeria]: '尼日利亚',\n [Country.Niue]: '纽埃',\n [Country.NorfolkIsland]: '诺福克岛',\n [Country.NorthKorea]: '朝鲜',\n [Country.NorthMacedonia]: '北馬其頓',\n [Country.NorthernMarianaIslands]: '北马里亚纳群岛',\n [Country.Norway]: '挪威',\n [Country.Oman]: '阿曼',\n [Country.Pakistan]: '巴基斯坦',\n [Country.Palau]: '帕劳',\n [Country.PalestinianTerritoryOccupied]: '巴勒斯坦',\n [Country.Panama]: '巴拿马',\n [Country.PapuanewGuinea]: '巴布亚新几内亚',\n [Country.Paraguay]: '巴拉圭',\n [Country.Peru]: '秘鲁',\n [Country.Philippines]: '菲律宾',\n [Country.PitcairnIsland]: '皮特凯恩群岛',\n [Country.Poland]: '波兰',\n [Country.Portugal]: '葡萄牙',\n [Country.PuertoRico]: '波多黎各',\n [Country.Qatar]: '卡塔尔',\n [Country.Reunion]: '留尼汪岛',\n [Country.Romania]: '罗马尼亚',\n [Country.Russia]: '俄罗斯联邦',\n [Country.Rwanda]: '卢旺达',\n [Country.SaintHelena]: '圣赫勒拿',\n [Country.SaintKittsAndNevis]: '圣基茨和尼维斯',\n [Country.SaintLucia]: '圣卢西亚',\n [Country.SaintPierreAndMiquelon]: '圣皮埃尔和密克隆',\n [Country.SaintVincentAndTheGrenadines]: '圣文森特和格林纳丁斯',\n [Country.SaintBarthelemy]: '圣巴泰勒米',\n [Country.SaintMartinFrenchpart]: '密克罗尼西亚',\n [Country.Samoa]: '萨摩亚',\n [Country.SanMarino]: '圣马力诺',\n [Country.SaoTomeAndPrincipe]: '圣多美和普林西比',\n [Country.SaudiArabia]: '沙特阿拉伯',\n [Country.Senegal]: '塞内加尔',\n [Country.Serbia]: '塞尔维亚',\n [Country.Seychelles]: '塞舌尔',\n [Country.SierraLeone]: '塞拉利昂',\n [Country.Singapore]: '新加坡',\n [Country.SintMaartenDutchpart]: '圣马丁岛(荷兰部分)',\n [Country.Slovakia]: '斯洛伐克',\n [Country.Slovenia]: '斯洛文尼亚',\n [Country.SolomonIslands]: '所罗门群岛',\n [Country.Somalia]: '索马里',\n [Country.SouthAfrica]: '南非',\n [Country.SouthGeorgia]: '南乔治亚',\n [Country.SouthKorea]: '韩国',\n [Country.SouthSudan]: '南苏丹',\n [Country.Spain]: '西班牙',\n [Country.SriLanka]: '斯里兰卡',\n [Country.Sudan]: '苏丹',\n [Country.Suriname]: '苏里南',\n [Country.SvalbardAndJanMayenIslands]: '斯瓦尔巴和扬马延群岛',\n [Country.Swaziland]: '斯威士兰',\n [Country.Sweden]: '瑞典',\n [Country.Switzerland]: '瑞士',\n [Country.Syria]: '叙利亚',\n [Country.Taiwan]: '中国台湾',\n [Country.Tajikistan]: '塔吉克斯坦',\n [Country.Tanzania]: '坦桑尼亚',\n [Country.Thailand]: '泰国',\n [Country.TheBahamas]: '巴哈马',\n [Country.Togo]: '多哥',\n [Country.Tokelau]: '托克劳',\n [Country.Tonga]: '汤加',\n [Country.TrinidadAndTobago]: '特立尼达和多巴哥',\n [Country.Tunisia]: '突尼斯',\n [Country.Turkey]: '土耳其',\n [Country.Turkmenistan]: '土库曼斯坦',\n [Country.TurksAndCaicosIslands]: '特克斯和凯科斯群岛',\n [Country.Tuvalu]: '图瓦卢',\n [Country.Uganda]: '乌干达',\n [Country.Ukraine]: '乌克兰',\n [Country.UnitedArabEmirates]: '阿拉伯联合酋长国',\n [Country.UnitedKingdom]: '英国',\n [Country.UnitedStates]: '美国',\n [Country.UnitedStatesMinorOutlyingIslands]: '美国本土外小岛屿',\n [Country.Uruguay]: '乌拉圭',\n [Country.Uzbekistan]: '乌兹别克斯坦',\n [Country.Vanuatu]: '瓦努阿图',\n [Country.VaticanCityStateHolySee]: '梵蒂冈',\n [Country.Venezuela]: '委内瑞拉',\n [Country.Vietnam]: '越南',\n [Country.VirginIslandsBritish]: '圣文森特和格林纳丁斯',\n [Country.VirginIslandsUS]: '维尔京群岛(美国)',\n [Country.WallisAndFutunaIslands]: '瓦利斯群岛和富图纳群岛',\n [Country.WesternSahara]: '西撒哈拉',\n [Country.Yemen]: '也门',\n [Country.Zambia]: '赞比亚',\n [Country.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 [Country.Afghanistan]: '阿富汗',\n [Country.AlandIslands]: '奧蘭羣島',\n [Country.Albania]: '阿爾巴尼亞',\n [Country.Algeria]: '阿爾及利亞',\n [Country.AmericanSamoa]: '美屬薩摩亞',\n [Country.Andorra]: '安道爾',\n [Country.Angola]: '安哥拉',\n [Country.Anguilla]: '安圭拉',\n [Country.Antarctica]: '南極洲',\n [Country.AntiguaAndBarbuda]: '安提瓜和巴布達',\n [Country.Argentina]: '阿根廷',\n [Country.Armenia]: '亞美尼亞',\n [Country.Aruba]: '阿魯巴',\n [Country.Australia]: '澳大利亞',\n [Country.Austria]: '奧地利',\n [Country.Azerbaijan]: '阿塞拜疆',\n [Country.Bahrain]: '巴林',\n [Country.Bangladesh]: '孟加拉',\n [Country.Barbados]: '巴巴多斯',\n [Country.Belarus]: '白俄羅斯',\n [Country.Belgium]: '比利時',\n [Country.Belize]: '伯利茲',\n [Country.Benin]: '貝寧',\n [Country.Bermuda]: '百慕大',\n [Country.Bhutan]: '不丹',\n [Country.Bolivia]: '玻利維亞',\n [Country.BonaireSintEustatiusAndSaba]: '博內爾島、聖尤斯特歇斯和薩巴島',\n [Country.BosniaAndHerzegovina]: '波斯尼亞和黑塞哥維那',\n [Country.Botswana]: '博茨瓦納',\n [Country.BouvetIsland]: '布維島',\n [Country.Brazil]: '巴西',\n [Country.BritishIndianOceanTerritory]: '英屬印度洋領地',\n [Country.Brunei]: '文萊',\n [Country.Bulgaria]: '保加利亞',\n [Country.BurkinaFaso]: '布基納法索',\n [Country.Burundi]: '布隆迪',\n [Country.Cambodia]: '柬埔寨',\n [Country.Cameroon]: '喀麥隆',\n [Country.Canada]: '加拿大',\n [Country.CapeVerde]: '佛得角',\n [Country.CaymanIslands]: '開曼羣島',\n [Country.CentralAfricanRepublic]: '中非',\n [Country.Chad]: '乍得',\n [Country.Chile]: '智利',\n [Country.China]: '中國',\n [Country.ChristmasIsland]: '聖誕島',\n [Country.CocosKeelingIslands]: '科科斯(基林)羣島',\n [Country.Colombia]: '哥倫比亞',\n [Country.Comoros]: '科摩羅',\n [Country.Congo]: '剛果',\n [Country.CookIslands]: '庫克羣島',\n [Country.CostaRica]: '哥斯達黎加',\n [Country.CoteDIvoireIvoryCoast]: '科特迪瓦',\n [Country.Croatia]: '克羅地亞',\n [Country.Cuba]: '古巴',\n [Country.Curaçao]: '庫拉索',\n [Country.Cyprus]: '塞浦路斯',\n [Country.CzechRepublic]: '捷克',\n [Country.DemocraticRepublicoftheCongo]: '剛果(金)',\n [Country.Denmark]: '丹麥',\n [Country.Djibouti]: '吉布提',\n [Country.Dominica]: '多米尼加',\n [Country.DominicanRepublic]: '多明尼加共和國',\n [Country.EastTimor]: '東帝汶',\n [Country.Ecuador]: '厄瓜多爾',\n [Country.Egypt]: '埃及',\n [Country.ElSalvador]: '薩爾瓦多',\n [Country.EquatorialGuinea]: '赤道幾內亞',\n [Country.Eritrea]: '厄立特里亞',\n [Country.Estonia]: '愛沙尼亞',\n [Country.Ethiopia]: '埃塞俄比亞',\n [Country.FalklandIslands]: '福克蘭羣島',\n [Country.FaroeIslands]: '法羅羣島',\n [Country.FijiIslands]: '斐濟',\n [Country.Finland]: '芬蘭',\n [Country.France]: '法國',\n [Country.FrenchGuiana]: '法屬圭亞那',\n [Country.FrenchPolynesia]: '法屬波利尼西亞',\n [Country.FrenchSouthernTerritories]: '法屬南部領地',\n [Country.Gabon]: '加蓬',\n [Country.GambiaThe]: '岡比亞',\n [Country.Georgia]: '格魯吉亞',\n [Country.Germany]: '德國',\n [Country.Ghana]: '加納',\n [Country.Gibraltar]: '直布羅陀',\n [Country.Greece]: '希臘',\n [Country.Greenland]: '格陵蘭島',\n [Country.Grenada]: '格林納達',\n [Country.Guadeloupe]: '瓜德羅普島',\n [Country.Guam]: '關島',\n [Country.Guatemala]: '危地馬拉',\n [Country.GuernseyAndAlderney]: '根西島',\n [Country.Guinea]: '幾內亞',\n [Country.GuineaBissau]: '幾內亞比紹',\n [Country.Guyana]: '圭亞那',\n [Country.Haiti]: '海地',\n [Country.HeardIslandAndMcDonaldIslands]: '赫德·唐納島及麥唐納島',\n [Country.Honduras]: '洪都拉斯',\n [Country.HongKongSAR]: '中國香港',\n [Country.Hungary]: '匈牙利',\n [Country.Iceland]: '冰島',\n [Country.India]: '印度',\n [Country.Indonesia]: '印度尼西亞',\n [Country.Iran]: '伊朗',\n [Country.Iraq]: '伊拉克',\n [Country.Ireland]: '愛爾蘭',\n [Country.Israel]: '以色列',\n [Country.Italy]: '意大利',\n [Country.Jamaica]: '牙買加',\n [Country.Japan]: '日本',\n [Country.Jersey]: '澤西島',\n [Country.Jordan]: '約旦',\n [Country.Kazakhstan]: '哈薩克斯坦',\n [Country.Kenya]: '肯尼亞',\n [Country.Kiribati]: '基里巴斯',\n [Country.Kosovo]: '科索沃',\n [Country.Kuwait]: '科威特',\n [Country.Kyrgyzstan]: '吉爾吉斯斯坦',\n [Country.Laos]: '寮人民民主共和國',\n [Country.Latvia]: '拉脫維亞',\n [Country.Lebanon]: '黎巴嫩',\n [Country.Lesotho]: '萊索托',\n [Country.Liberia]: '利比里亞',\n [Country.Libya]: '利比亞',\n [Country.Liechtenstein]: '列支敦士登',\n [Country.Lithuania]: '立陶宛',\n [Country.Luxembourg]: '盧森堡',\n [Country.MacauSAR]: '中國澳門',\n [Country.Madagascar]: '馬達加斯加',\n [Country.Malawi]: '馬拉維',\n [Country.Malaysia]: '馬來西亞',\n [Country.Maldives]: '馬爾代夫',\n [Country.Mali]: '馬裏',\n [Country.Malta]: '馬耳他',\n [Country.ManIsleof]: '馬恩島',\n [Country.MarshallIslands]: '馬紹爾羣島',\n [Country.Martinique]: '馬提尼克島',\n [Country.Mauritania]: '毛里塔尼亞',\n [Country.Mauritius]: '毛里求斯',\n [Country.Mayotte]: '馬約特',\n [Country.Mexico]: '墨西哥',\n [Country.Micronesia]: '密克羅尼西亞',\n [Country.Moldova]: '摩爾多瓦',\n [Country.Monaco]: '摩納哥',\n [Country.Mongolia]: '蒙古',\n [Country.Montenegro]: '黑山',\n [Country.Montserrat]: '蒙特塞拉特',\n [Country.Morocco]: '摩洛哥',\n [Country.Mozambique]: '莫桑比克',\n [Country.Myanmar]: '緬甸',\n [Country.Namibia]: '納米比亞',\n [Country.Nauru]: '瑙魯',\n [Country.Nepal]: '尼泊爾',\n [Country.Netherlands]: '荷蘭',\n [Country.NewCaledonia]: '新喀里多尼亞',\n [Country.NewZealand]: '新西蘭',\n [Country.Nicaragua]: '尼加拉瓜',\n [Country.Niger]: '尼日爾',\n [Country.Nigeria]: '尼日利亞',\n [Country.Niue]: '紐埃',\n [Country.NorfolkIsland]: '諾福克島',\n [Country.NorthKorea]: '朝鮮',\n [Country.NorthMacedonia]: '北馬其頓',\n [Country.NorthernMarianaIslands]: '北马里亞納羣島',\n [Country.Norway]: '挪威',\n [Country.Oman]: '阿曼',\n [Country.Pakistan]: '巴基斯坦',\n [Country.Palau]: '帕勞',\n [Country.PalestinianTerritoryOccupied]: '巴勒斯坦',\n [Country.Panama]: '巴拿馬',\n [Country.PapuanewGuinea]: '巴布亞新幾內亞',\n [Country.Paraguay]: '巴拉圭',\n [Country.Peru]: '祕魯',\n [Country.Philippines]: '菲律賓',\n [Country.PitcairnIsland]: '皮特凱恩羣島',\n [Country.Poland]: '波蘭',\n [Country.Portugal]: '葡萄牙',\n [Country.PuertoRico]: '波多黎各',\n [Country.Qatar]: '卡塔爾',\n [Country.Reunion]: '留尼汪島',\n [Country.Romania]: '羅馬尼亞',\n [Country.Russia]: '俄羅斯聯邦',\n [Country.Rwanda]: '盧旺達',\n [Country.SaintHelena]: '聖赫勒拿',\n [Country.SaintKittsAndNevis]: '聖基茨和尼維斯',\n [Country.SaintLucia]: '聖盧西亞',\n [Country.SaintPierreAndMiquelon]: '聖皮埃爾和密克隆',\n [Country.SaintVincentAndTheGrenadines]: '聖文森特和格林納丁斯',\n [Country.SaintBarthelemy]: '聖巴泰勒米',\n [Country.SaintMartinFrenchpart]: '密克羅尼西亞',\n [Country.Samoa]: '薩摩亞',\n [Country.SanMarino]: '聖馬力諾',\n [Country.SaoTomeAndPrincipe]: '聖多美和普林西比',\n [Country.SaudiArabia]: '沙特阿拉伯',\n [Country.Senegal]: '塞內加爾',\n [Country.Serbia]: '塞爾維亞',\n [Country.Seychelles]: '塞舌爾',\n [Country.SierraLeone]: '塞拉利昂',\n [Country.Singapore]: '新加坡',\n [Country.SintMaartenDutchpart]: '聖馬丁島(荷蘭部分)',\n [Country.Slovakia]: '斯洛伐克',\n [Country.Slovenia]: '斯洛文尼亞',\n [Country.SolomonIslands]: '所羅門羣島',\n [Country.Somalia]: '索馬里',\n [Country.SouthAfrica]: '南非',\n [Country.SouthGeorgia]: '南喬治亞',\n [Country.SouthKorea]: '韓國',\n [Country.SouthSudan]: '南蘇丹',\n [Country.Spain]: '西班牙',\n [Country.SriLanka]: '斯里蘭卡',\n [Country.Sudan]: '蘇丹',\n [Country.Suriname]: '蘇里南',\n [Country.SvalbardAndJanMayenIslands]: '斯瓦爾巴和揚馬延羣島',\n [Country.Swaziland]: '斯威士蘭',\n [Country.Sweden]: '瑞典',\n [Country.Switzerland]: '瑞士',\n [Country.Syria]: '敘利亞',\n [Country.Taiwan]: '中國臺灣',\n [Country.Tajikistan]: '塔吉克斯坦',\n [Country.Tanzania]: '坦桑尼亞',\n [Country.Thailand]: '泰國',\n [Country.TheBahamas]: '巴哈馬',\n [Country.Togo]: '多哥',\n [Country.Tokelau]: '托克勞',\n [Country.Tonga]: '湯加',\n [Country.TrinidadAndTobago]: '特立尼達和多巴哥',\n [Country.Tunisia]: '突尼斯',\n [Country.Turkey]: '土耳其',\n [Country.Turkmenistan]: '土庫曼斯坦',\n [Country.TurksAndCaicosIslands]: '特克斯和凱科斯羣島',\n [Country.Tuvalu]: '圖瓦盧',\n [Country.Uganda]: '烏干達',\n [Country.Ukraine]: '烏克蘭',\n [Country.UnitedArabEmirates]: '阿拉伯聯合酋長國',\n [Country.UnitedKingdom]: '英國',\n [Country.UnitedStates]: '美國',\n [Country.UnitedStatesMinorOutlyingIslands]: '美國本土外小島嶼',\n [Country.Uruguay]: '烏拉圭',\n [Country.Uzbekistan]: '烏茲別克斯坦',\n [Country.Vanuatu]: '瓦努阿圖',\n [Country.VaticanCityStateHolySee]: '梵蒂岡',\n [Country.Venezuela]: '委內瑞拉',\n [Country.Vietnam]: '越南',\n [Country.VirginIslandsBritish]: '聖文森特和格林納丁斯',\n [Country.VirginIslandsUS]: '維爾京羣島(美國)',\n [Country.WallisAndFutunaIslands]: '瓦利斯羣島和富圖納羣島',\n [Country.WesternSahara]: '西撒哈拉',\n [Country.Yemen]: '也門',\n [Country.Zambia]: '贊比亞',\n [Country.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 [Country.Afghanistan]: '阿富汗',\n [Country.AlandIslands]: '奧蘭群島',\n [Country.Albania]: '阿爾巴尼亞',\n [Country.Algeria]: '阿爾及利亞',\n [Country.AmericanSamoa]: '美屬薩摩亞',\n [Country.Andorra]: '安道爾',\n [Country.Angola]: '安哥拉',\n [Country.Anguilla]: '安圭拉',\n [Country.Antarctica]: '南極洲',\n [Country.AntiguaAndBarbuda]: '安地卡及巴布達',\n [Country.Argentina]: '阿根廷',\n [Country.Armenia]: '亞美尼亞',\n [Country.Aruba]: '阿魯巴',\n [Country.Australia]: '澳大利亞',\n [Country.Austria]: '奧地利',\n [Country.Azerbaijan]: '亞塞拜然',\n [Country.Bahrain]: '巴林',\n [Country.Bangladesh]: '孟加拉',\n [Country.Barbados]: '巴貝多',\n [Country.Belarus]: '白俄羅斯',\n [Country.Belgium]: '比利時',\n [Country.Belize]: '貝里斯',\n [Country.Benin]: '貝南',\n [Country.Bermuda]: '百慕大',\n [Country.Bhutan]: '不丹',\n [Country.Bolivia]: '玻利維亞',\n [Country.BonaireSintEustatiusAndSaba]: '博內爾島、聖尤斯特歇斯和薩巴島',\n [Country.BosniaAndHerzegovina]: '波斯尼亞和黑塞哥維那',\n [Country.Botswana]: '波札那',\n [Country.BouvetIsland]: '布維島',\n [Country.Brazil]: '巴西',\n [Country.BritishIndianOceanTerritory]: '英屬印度洋領地',\n [Country.Brunei]: '汶萊',\n [Country.Bulgaria]: '保加利亞',\n [Country.BurkinaFaso]: '布吉納法索',\n [Country.Burundi]: '蒲隆地',\n [Country.Cambodia]: '柬埔寨',\n [Country.Cameroon]: '喀麥隆',\n [Country.Canada]: '加拿大',\n [Country.CapeVerde]: '維德角',\n [Country.CaymanIslands]: '開曼群島',\n [Country.CentralAfricanRepublic]: '中非',\n [Country.Chad]: '查德',\n [Country.Chile]: '智利',\n [Country.China]: '中國',\n [Country.ChristmasIsland]: '聖誕島',\n [Country.CocosKeelingIslands]: '科科斯(基林)群島',\n [Country.Colombia]: '哥倫比亞',\n [Country.Comoros]: '葛摩',\n [Country.Congo]: '剛果',\n [Country.CookIslands]: '庫克群島',\n [Country.CostaRica]: '哥斯大黎加',\n [Country.CoteDIvoireIvoryCoast]: '象牙海岸',\n [Country.Croatia]: '克羅埃西亞',\n [Country.Cuba]: '古巴',\n [Country.Curaçao]: '庫拉索',\n [Country.Cyprus]: '塞普勒斯',\n [Country.CzechRepublic]: '捷克',\n [Country.DemocraticRepublicoftheCongo]: '剛果(金)',\n [Country.Denmark]: '丹麥',\n [Country.Djibouti]: '吉布提',\n [Country.Dominica]: '多明尼加',\n [Country.DominicanRepublic]: '多明尼加共和國',\n [Country.EastTimor]: '東帝汶',\n [Country.Ecuador]: '厄瓜多',\n [Country.Egypt]: '埃及',\n [Country.ElSalvador]: '薩爾瓦多',\n [Country.EquatorialGuinea]: '赤道幾內亞',\n [Country.Eritrea]: '厄利垂亞',\n [Country.Estonia]: '愛沙尼亞',\n [Country.Ethiopia]: '衣索比亞',\n [Country.FalklandIslands]: '福克蘭群島',\n [Country.FaroeIslands]: '法羅群島',\n [Country.FijiIslands]: '斐濟',\n [Country.Finland]: '芬蘭',\n [Country.France]: '法國',\n [Country.FrenchGuiana]: '法屬蓋亞那',\n [Country.FrenchPolynesia]: '法屬波利尼西亞',\n [Country.FrenchSouthernTerritories]: '法屬南部領地',\n [Country.Gabon]: '加彭',\n [Country.GambiaThe]: '甘比亞',\n [Country.Georgia]: '喬治亞',\n [Country.Germany]: '德國',\n [Country.Ghana]: '迦納',\n [Country.Gibraltar]: '直布羅陀',\n [Country.Greece]: '希臘',\n [Country.Greenland]: '格陵蘭島',\n [Country.Grenada]: '格瑞那達',\n [Country.Guadeloupe]: '瓜德羅普島',\n [Country.Guam]: '關島',\n [Country.Guatemala]: '瓜地馬拉',\n [Country.GuernseyAndAlderney]: '根西島',\n [Country.Guinea]: '幾內亞',\n [Country.GuineaBissau]: '幾內亞比索',\n [Country.Guyana]: '蓋亞那',\n [Country.Haiti]: '海地',\n [Country.HeardIslandAndMcDonaldIslands]: '赫德·唐納島及麥唐納島',\n [Country.Honduras]: '宏都拉斯',\n [Country.HongKongSAR]: '中國香港',\n [Country.Hungary]: '匈牙利',\n [Country.Iceland]: '冰島',\n [Country.India]: '印度',\n [Country.Indonesia]: '印度尼西亞',\n [Country.Iran]: '伊朗',\n [Country.Iraq]: '伊拉克',\n [Country.Ireland]: '愛爾蘭',\n [Country.Israel]: '以色列',\n [Country.Italy]: '義大利',\n [Country.Jamaica]: '牙買加',\n [Country.Japan]: '日本',\n [Country.Jersey]: '澤西島',\n [Country.Jordan]: '約旦',\n [Country.Kazakhstan]: '哈薩克',\n [Country.Kenya]: '肯亞',\n [Country.Kiribati]: '吉里巴斯',\n [Country.Kosovo]: '科索沃',\n [Country.Kuwait]: '科威特',\n [Country.Kyrgyzstan]: '吉爾吉斯斯坦',\n [Country.Laos]: '寮人民民主共和國',\n [Country.Latvia]: '拉脫維亞',\n [Country.Lebanon]: '黎巴嫩',\n [Country.Lesotho]: '賴索托',\n [Country.Liberia]: '賴比瑞亞',\n [Country.Libya]: '利比亞',\n [Country.Liechtenstein]: '列支敦斯登',\n [Country.Lithuania]: '立陶宛',\n [Country.Luxembourg]: '盧森堡',\n [Country.MacauSAR]: '中國澳門',\n [Country.Madagascar]: '馬達加斯加',\n [Country.Malawi]: '馬拉維',\n [Country.Malaysia]: '馬來西亞',\n [Country.Maldives]: '馬爾地夫',\n [Country.Mali]: '馬裡',\n [Country.Malta]: '馬耳他',\n [Country.ManIsleof]: '馬恩島',\n [Country.MarshallIslands]: '馬紹爾群島',\n [Country.Martinique]: '馬提尼克島',\n [Country.Mauritania]: '茅利塔尼亞',\n [Country.Mauritius]: '模里西斯',\n [Country.Mayotte]: '馬約特',\n [Country.Mexico]: '墨西哥',\n [Country.Micronesia]: '密克羅尼西亞',\n [Country.Moldova]: '摩爾多瓦',\n [Country.Monaco]: '摩納哥',\n [Country.Mongolia]: '蒙古',\n [Country.Montenegro]: '黑山',\n [Country.Montserrat]: '蒙特塞拉特',\n [Country.Morocco]: '摩洛哥',\n [Country.Mozambique]: '莫三比克',\n [Country.Myanmar]: '緬甸',\n [Country.Namibia]: '奈米比亞',\n [Country.Nauru]: '諾魯',\n [Country.Nepal]: '尼泊爾',\n [Country.Netherlands]: '荷蘭',\n [Country.NewCaledonia]: '新喀里多尼亞',\n [Country.NewZealand]: '紐西蘭',\n [Country.Nicaragua]: '尼加拉瓜',\n [Country.Niger]: '尼日',\n [Country.Nigeria]: '奈及利亞',\n [Country.Niue]: '紐埃',\n [Country.NorfolkIsland]: '諾福克島',\n [Country.NorthKorea]: '朝鮮',\n [Country.NorthMacedonia]: '北馬其頓',\n [Country.NorthernMarianaIslands]: '北马里亞納群島',\n [Country.Norway]: '挪威',\n [Country.Oman]: '阿曼',\n [Country.Pakistan]: '巴基斯坦',\n [Country.Palau]: '帛琉',\n [Country.PalestinianTerritoryOccupied]: '巴勒斯坦',\n [Country.Panama]: '巴拿馬',\n [Country.PapuanewGuinea]: '巴布亞紐幾內亞',\n [Country.Paraguay]: '巴拉圭',\n [Country.Peru]: '秘魯',\n [Country.Philippines]: '菲律賓',\n [Country.PitcairnIsland]: '皮特凱恩群島',\n [Country.Poland]: '波蘭',\n [Country.Portugal]: '葡萄牙',\n [Country.PuertoRico]: '波多黎各',\n [Country.Qatar]: '卡達',\n [Country.Reunion]: '留尼汪島',\n [Country.Romania]: '羅馬尼亞',\n [Country.Russia]: '俄羅斯聯邦',\n [Country.Rwanda]: '盧安達',\n [Country.SaintHelena]: '聖赫勒拿',\n [Country.SaintKittsAndNevis]: '聖克里斯多福及尼維斯',\n [Country.SaintLucia]: '聖露西亞',\n [Country.SaintPierreAndMiquelon]: '聖皮埃爾和密克隆',\n [Country.SaintVincentAndTheGrenadines]: '聖文森及格瑞那丁',\n [Country.SaintBarthelemy]: '聖巴泰勒米',\n [Country.SaintMartinFrenchpart]: '密克羅尼西亞',\n [Country.Samoa]: '薩摩亞',\n [Country.SanMarino]: '聖馬利諾',\n [Country.SaoTomeAndPrincipe]: '聖多美和普林西比',\n [Country.SaudiArabia]: '沙烏地阿拉伯',\n [Country.Senegal]: '塞內加爾',\n [Country.Serbia]: '塞爾維亞',\n [Country.Seychelles]: '塞席爾',\n [Country.SierraLeone]: '獅子山',\n [Country.Singapore]: '新加坡',\n [Country.SintMaartenDutchpart]: '聖馬丁島(荷蘭部分)',\n [Country.Slovakia]: '斯洛伐克',\n [Country.Slovenia]: '斯洛維尼亞',\n [Country.SolomonIslands]: '索羅門群島',\n [Country.Somalia]: '索馬利亞',\n [Country.SouthAfrica]: '南非',\n [Country.SouthGeorgia]: '南喬治亞',\n [Country.SouthKorea]: '韓國',\n [Country.SouthSudan]: '南蘇丹',\n [Country.Spain]: '西班牙',\n [Country.SriLanka]: '斯里蘭卡',\n [Country.Sudan]: '蘇丹',\n [Country.Suriname]: '蘇利南',\n [Country.SvalbardAndJanMayenIslands]: '斯瓦爾巴和揚馬延群島',\n [Country.Swaziland]: '史瓦濟蘭',\n [Country.Sweden]: '瑞典',\n [Country.Switzerland]: '瑞士',\n [Country.Syria]: '敘利亞',\n [Country.Taiwan]: '中國臺灣',\n [Country.Tajikistan]: '塔吉克',\n [Country.Tanzania]: '坦尚尼亞',\n [Country.Thailand]: '泰國',\n [Country.TheBahamas]: '巴哈馬',\n [Country.Togo]: '多哥',\n [Country.Tokelau]: '托克勞',\n [Country.Tonga]: '湯加',\n [Country.TrinidadAndTobago]: '千里達及托巴哥',\n [Country.Tunisia]: '突尼西亞',\n [Country.Turkey]: '土耳其',\n [Country.Turkmenistan]: '土庫曼',\n [Country.TurksAndCaicosIslands]: '特克斯和凱科斯群島',\n [Country.Tuvalu]: '吐瓦魯',\n [Country.Uganda]: '烏干達',\n [Country.Ukraine]: '烏克蘭',\n [Country.UnitedArabEmirates]: '阿拉伯聯合大公國',\n [Country.UnitedKingdom]: '英國',\n [Country.UnitedStates]: '美國',\n [Country.UnitedStatesMinorOutlyingIslands]: '美國本土外小島嶼',\n [Country.Uruguay]: '烏拉圭',\n [Country.Uzbekistan]: '烏茲別克',\n [Country.Vanuatu]: '萬那杜',\n [Country.VaticanCityStateHolySee]: '梵蒂岡',\n [Country.Venezuela]: '委內瑞拉',\n [Country.Vietnam]: '越南',\n [Country.VirginIslandsBritish]: '聖文森及格瑞那丁',\n [Country.VirginIslandsUS]: '維爾京群島(美國)',\n [Country.WallisAndFutunaIslands]: '瓦利斯群島和富圖納群島',\n [Country.WesternSahara]: '西撒哈拉',\n [Country.Yemen]: '葉門',\n [Country.Zambia]: '尚比亞',\n [Country.Zimbabwe]: '辛巴威',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Spanish names.\n */\nexport const spanishCountryNames: Record<Country, string> = {\n [Country.Afghanistan]: 'Afganistán',\n [Country.AlandIslands]: 'Islas Åland',\n [Country.Albania]: 'Albania',\n [Country.Algeria]: 'Argelia',\n [Country.AmericanSamoa]: 'Samoa Americana',\n [Country.Andorra]: 'Andorra',\n [Country.Angola]: 'Angola',\n [Country.Anguilla]: 'Anguila',\n [Country.Antarctica]: 'Antártida',\n [Country.AntiguaAndBarbuda]: 'Antigua y Barbuda',\n [Country.Argentina]: 'Argentina',\n [Country.Armenia]: 'Armenia',\n [Country.Aruba]: 'Aruba',\n [Country.Australia]: 'Australia',\n [Country.Austria]: 'Austria',\n [Country.Azerbaijan]: 'Azerbaiyán',\n [Country.Bahrain]: 'Baréin',\n [Country.Bangladesh]: 'Bangladés',\n [Country.Barbados]: 'Barbados',\n [Country.Belarus]: 'Bielorrusia',\n [Country.Belgium]: 'Bélgica',\n [Country.Belize]: 'Belice',\n [Country.Benin]: 'Benín',\n [Country.Bermuda]: 'Bermudas',\n [Country.Bhutan]: 'Bután',\n [Country.Bolivia]: 'Bolivia',\n [Country.BonaireSintEustatiusAndSaba]: 'Bonaire, San Eustaquio y Saba',\n [Country.BosniaAndHerzegovina]: 'Bosnia y Herzegovina',\n [Country.Botswana]: 'Botsuana',\n [Country.BouvetIsland]: 'Isla Bouvet',\n [Country.Brazil]: 'Brasil',\n [Country.BritishIndianOceanTerritory]:\n 'Territorio Británico del Océano Índico',\n [Country.Brunei]: 'Brunéi',\n [Country.Bulgaria]: 'Bulgaria',\n [Country.BurkinaFaso]: 'Burkina Faso',\n [Country.Burundi]: 'Burundi',\n [Country.Cambodia]: 'Camboya',\n [Country.Cameroon]: 'Camerún',\n [Country.Canada]: 'Canadá',\n [Country.CapeVerde]: 'Cabo Verde',\n [Country.CaymanIslands]: 'Islas Caimán',\n [Country.CentralAfricanRepublic]: 'República Centroafricana',\n [Country.Chad]: 'Chad',\n [Country.Chile]: 'Chile',\n [Country.China]: 'China',\n [Country.ChristmasIsland]: 'Isla de Navidad',\n [Country.CocosKeelingIslands]: 'Islas Cocos',\n [Country.Colombia]: 'Colombia',\n [Country.Comoros]: 'Comoras',\n [Country.Congo]: 'Congo',\n [Country.CookIslands]: 'Islas Cook',\n [Country.CostaRica]: 'Costa Rica',\n [Country.CoteDIvoireIvoryCoast]: 'Costa de Marfil',\n [Country.Croatia]: 'Croacia',\n [Country.Cuba]: 'Cuba',\n [Country.Curaçao]: 'Curazao',\n [Country.Cyprus]: 'Chipre',\n [Country.CzechRepublic]: 'República Checa',\n [Country.DemocraticRepublicoftheCongo]: 'República Democrática del Congo',\n [Country.Denmark]: 'Dinamarca',\n [Country.Djibouti]: 'Yibuti',\n [Country.Dominica]: 'Dominica',\n [Country.DominicanRepublic]: 'República Dominicana',\n [Country.EastTimor]: 'Timor Oriental',\n [Country.Ecuador]: 'Ecuador',\n [Country.Egypt]: 'Egipto',\n [Country.ElSalvador]: 'El Salvador',\n [Country.EquatorialGuinea]: 'Guinea Ecuatorial',\n [Country.Eritrea]: 'Eritrea',\n [Country.Estonia]: 'Estonia',\n [Country.Ethiopia]: 'Etiopía',\n [Country.FalklandIslands]: 'Islas Malvinas',\n [Country.FaroeIslands]: 'Islas Feroe',\n [Country.FijiIslands]: 'Fiyi',\n [Country.Finland]: 'Finlandia',\n [Country.France]: 'Francia',\n [Country.FrenchGuiana]: 'Guayana Francesa',\n [Country.FrenchPolynesia]: 'Polinesia Francesa',\n [Country.FrenchSouthernTerritories]:\n 'Tierras Australes y Antárticas Francesas',\n [Country.Gabon]: 'Gabón',\n [Country.GambiaThe]: 'Gambia',\n [Country.Georgia]: 'Georgia',\n [Country.Germany]: 'Alemania',\n [Country.Ghana]: 'Ghana',\n [Country.Gibraltar]: 'Gibraltar',\n [Country.Greece]: 'Grecia',\n [Country.Greenland]: 'Groenlandia',\n [Country.Grenada]: 'Granada',\n [Country.Guadeloupe]: 'Guadalupe',\n [Country.Guam]: 'Guam',\n [Country.Guatemala]: 'Guatemala',\n [Country.GuernseyAndAlderney]: 'Guernsey y Alderney',\n [Country.Guinea]: 'Guinea',\n [Country.GuineaBissau]: 'Guinea-Bisáu',\n [Country.Guyana]: 'Guyana',\n [Country.Haiti]: 'Haití',\n [Country.HeardIslandAndMcDonaldIslands]: 'Islas Heard y McDonald',\n [Country.Honduras]: 'Honduras',\n [Country.HongKongSAR]: 'Hong Kong',\n [Country.Hungary]: 'Hungría',\n [Country.Iceland]: 'Islandia',\n [Country.India]: 'India',\n [Country.Indonesia]: 'Indonesia',\n [Country.Iran]: 'Irán',\n [Country.Iraq]: 'Irak',\n [Country.Ireland]: 'Irlanda',\n [Country.Israel]: 'Israel',\n [Country.Italy]: 'Italia',\n [Country.Jamaica]: 'Jamaica',\n [Country.Japan]: 'Japón',\n [Country.Jersey]: 'Jersey',\n [Country.Jordan]: 'Jordania',\n [Country.Kazakhstan]: 'Kazajistán',\n [Country.Kenya]: 'Kenia',\n [Country.Kiribati]: 'Kiribati',\n [Country.Kosovo]: 'Kosovo',\n [Country.Kuwait]: 'Kuwait',\n [Country.Kyrgyzstan]: 'Kirguistán',\n [Country.Laos]: 'Laos',\n [Country.Latvia]: 'Letonia',\n [Country.Lebanon]: 'Líbano',\n [Country.Lesotho]: 'Lesoto',\n [Country.Liberia]: 'Liberia',\n [Country.Libya]: 'Libia',\n [Country.Liechtenstein]: 'Liechtenstein',\n [Country.Lithuania]: 'Lituania',\n [Country.Luxembourg]: 'Luxemburgo',\n [Country.MacauSAR]: 'Macao',\n [Country.Madagascar]: 'Madagascar',\n [Country.Malawi]: 'Malaui',\n [Country.Malaysia]: 'Malasia',\n [Country.Maldives]: 'Maldivas',\n [Country.Mali]: 'Malí',\n [Country.Malta]: 'Malta',\n [Country.ManIsleof]: 'Isla de Man',\n [Country.MarshallIslands]: 'Islas Marshall',\n [Country.Martinique]: 'Martinica',\n [Country.Mauritania]: 'Mauritania',\n [Country.Mauritius]: 'Mauricio',\n [Country.Mayotte]: 'Mayotte',\n [Country.Mexico]: 'México',\n [Country.Micronesia]: 'Micronesia',\n [Country.Moldova]: 'Moldavia',\n [Country.Monaco]: 'Mónaco',\n [Country.Mongolia]: 'Mongolia',\n [Country.Montenegro]: 'Montenegro',\n [Country.Montserrat]: 'Montserrat',\n [Country.Morocco]: 'Marruecos',\n [Country.Mozambique]: 'Mozambique',\n [Country.Myanmar]: 'Myanmar',\n [Country.Namibia]: 'Namibia',\n [Country.Nauru]: 'Nauru',\n [Country.Nepal]: 'Nepal',\n [Country.Netherlands]: 'Países Bajos',\n [Country.NewCaledonia]: 'Nueva Caledonia',\n [Country.NewZealand]: 'Nueva Zelanda',\n [Country.Nicaragua]: 'Nicaragua',\n [Country.Niger]: 'Níger',\n [Country.Nigeria]: 'Nigeria',\n [Country.Niue]: 'Niue',\n [Country.NorfolkIsland]: 'Isla Norfolk',\n [Country.NorthKorea]: 'Corea del Norte',\n [Country.NorthMacedonia]: 'Macedonia del Norte',\n [Country.NorthernMarianaIslands]: 'Islas Marianas del Norte',\n [Country.Norway]: 'Noruega',\n [Country.Oman]: 'Omán',\n [Country.Pakistan]: 'Pakistán',\n [Country.Palau]: 'Palaos',\n [Country.PalestinianTerritoryOccupied]: 'Territorio Palestino Ocupado',\n [Country.Panama]: 'Panamá',\n [Country.PapuanewGuinea]: 'Papúa Nueva Guinea',\n [Country.Paraguay]: 'Paraguay',\n [Country.Peru]: 'Perú',\n [Country.Philippines]: 'Filipinas',\n [Country.PitcairnIsland]: 'Islas Pitcairn',\n [Country.Poland]: 'Polonia',\n [Country.Portugal]: 'Portugal',\n [Country.PuertoRico]: 'Puerto Rico',\n [Country.Qatar]: 'Catar',\n [Country.Reunion]: 'Reunión',\n [Country.Romania]: 'Rumania',\n [Country.Russia]: 'Rusia',\n [Country.Rwanda]: 'Ruanda',\n [Country.SaintHelena]: 'Santa Elena',\n [Country.SaintKittsAndNevis]: 'San Cristóbal y Nieves',\n [Country.SaintLucia]: 'Santa Lucía',\n [Country.SaintPierreAndMiquelon]: 'San Pedro y Miquelón',\n [Country.SaintVincentAndTheGrenadines]: 'San Vicente y las Granadinas',\n [Country.SaintBarthelemy]: 'San Bartolomé',\n [Country.SaintMartinFrenchpart]: 'San Martín (parte francesa)',\n [Country.Samoa]: 'Samoa',\n [Country.SanMarino]: 'San Marino',\n [Country.SaoTomeAndPrincipe]: 'Santo Tomé y Príncipe',\n [Country.SaudiArabia]: 'Arabia Saudita',\n [Country.Senegal]: 'Senegal',\n [Country.Serbia]: 'Serbia',\n [Country.Seychelles]: 'Seychelles',\n [Country.SierraLeone]: 'Sierra Leona',\n [Country.Singapore]: 'Singapur',\n [Country.SintMaartenDutchpart]: 'San Martín (parte neerlandesa)',\n [Country.Slovakia]: 'Eslovaquia',\n [Country.Slovenia]: 'Eslovenia',\n [Country.SolomonIslands]: 'Islas Salomón',\n [Country.Somalia]: 'Somalia',\n [Country.SouthAfrica]: 'Sudáfrica',\n [Country.SouthGeorgia]: 'Georgia del Sur',\n [Country.SouthKorea]: 'Corea del Sur',\n [Country.SouthSudan]: 'Sudán del Sur',\n [Country.Spain]: 'España',\n [Country.SriLanka]: 'Sri Lanka',\n [Country.Sudan]: 'Sudán',\n [Country.Suriname]: 'Surinam',\n [Country.SvalbardAndJanMayenIslands]: 'Svalbard y Jan Mayen',\n [Country.Swaziland]: 'Suazilandia',\n [Country.Sweden]: 'Suecia',\n [Country.Switzerland]: 'Suiza',\n [Country.Syria]: 'Siria',\n [Country.Taiwan]: 'Taiwán',\n [Country.Tajikistan]: 'Tayikistán',\n [Country.Tanzania]: 'Tanzania',\n [Country.Thailand]: 'Tailandia',\n [Country.TheBahamas]: 'Bahamas',\n [Country.Togo]: 'Togo',\n [Country.Tokelau]: 'Tokelau',\n [Country.Tonga]: 'Tonga',\n [Country.TrinidadAndTobago]: 'Trinidad y Tobago',\n [Country.Tunisia]: 'Túnez',\n [Country.Turkey]: 'Turquía',\n [Country.Turkmenistan]: 'Turkmenistán',\n [Country.TurksAndCaicosIslands]: 'Islas Turcas y Caicos',\n [Country.Tuvalu]: 'Tuvalu',\n [Country.Uganda]: 'Uganda',\n [Country.Ukraine]: 'Ucrania',\n [Country.UnitedArabEmirates]: 'Emiratos Árabes Unidos',\n [Country.UnitedKingdom]: 'Reino Unido',\n [Country.UnitedStates]: 'Estados Unidos',\n [Country.UnitedStatesMinorOutlyingIslands]:\n 'Islas Ultramarinas Menores de Estados Unidos',\n [Country.Uruguay]: 'Uruguay',\n [Country.Uzbekistan]: 'Uzbekistán',\n [Country.Vanuatu]: 'Vanuatu',\n [Country.VaticanCityStateHolySee]: 'Ciudad del Vaticano',\n [Country.Venezuela]: 'Venezuela',\n [Country.Vietnam]: 'Vietnam',\n [Country.VirginIslandsBritish]: 'Islas Vírgenes Británicas',\n [Country.VirginIslandsUS]: 'Islas Vírgenes de los Estados Unidos',\n [Country.WallisAndFutunaIslands]: 'Wallis y Futuna',\n [Country.WesternSahara]: 'Sahara Occidental',\n [Country.Yemen]: 'Yemen',\n [Country.Zambia]: 'Zambia',\n [Country.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 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/** Defines the available styles for rendering numbers in the font spec. */\nexport enum FontSpecNumbersStyle {\n /** Standard lining figures (default for CJK languages). */\n Lining = 'Lining',\n /** Old-style figures with varying heights (default for Latin languages). */\n OldStyle = 'OldStyle',\n /**\n * Represents an undefined state, allowing the style to be automatically\n * determined based on the selected `LocaleLanguage`.\n */\n Auto = 'Auto',\n}\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","/**\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 {\n FontSpecNumbersStyle,\n type Resume,\n type ResumeContent,\n type ResumeItem,\n type ResumeLayout,\n} from '@/types'\n\n/** Represents a Tiptap editor JSON string for a single empty paragraph. */\nexport const emptyParagraph = '{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\"}]}'\n\n/** Defines standard academic degree types. */\nexport enum Degree {\n MiddleSchool = 'Middle School',\n HighSchool = 'High School',\n Diploma = 'Diploma',\n Associate = 'Associate',\n Bachelor = 'Bachelor',\n Master = 'Master',\n Doctor = 'Doctor',\n}\n\n/** An array containing all possible values from the `Degree` enum. */\nexport const degreeOptions = Object.values(Degree)\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 enum Language {\n Arabic = 'Arabic',\n Bengali = 'Bengali',\n Bhojpuri = 'Bhojpuri',\n Cantonese = 'Cantonese',\n Chinese = 'Chinese',\n Dutch = 'Dutch',\n English = 'English',\n French = 'French',\n German = 'German',\n Gujarati = 'Gujarati',\n Hausa = 'Hausa',\n Hindi = 'Hindi',\n Indonesian = 'Indonesian',\n Italian = 'Italian',\n Japanese = 'Japanese',\n Javanese = 'Javanese',\n Korean = 'Korean',\n Marathi = 'Marathi',\n Mandarin = 'Mandarin',\n Portuguese = 'Portuguese',\n Russian = 'Russian',\n Spanish = 'Spanish',\n Tamil = 'Tamil',\n Turkish = 'Turkish',\n Urdu = 'Urdu',\n Vietnamese = 'Vietnamese',\n}\n\n/** An array containing all possible values from the `Language` enum. */\nexport const languagesOptions = Object.values(Language)\n\n/** Defines levels of language proficiency.\n *\n * This list of options is coming from LinkedIn.\n */\nexport enum LanguageFluency {\n ElementaryProficiency = 'Elementary Proficiency',\n LimitedWorkingProficiency = 'Limited Working Proficiency',\n MinimumProfessionalProficiency = 'Minimum Professional Proficiency',\n FullProfessionalProficiency = 'Full Professional Proficiency',\n NativeOrBilingualProficiency = 'Native or Bilingual Proficiency',\n}\n\n/** An array containing all possible values from the `LanguageFluency` enum. */\nexport const languageFluenciesOptions = Object.values(LanguageFluency)\n\n/** Defines levels of skill proficiency. */\nexport enum SkillLevel {\n Novice = 'Novice',\n Beginner = 'Beginner',\n Intermediate = 'Intermediate',\n Advanced = 'Advanced',\n Expert = 'Expert',\n Master = 'Master',\n}\n\n/** An array containing all possible values from the `SkillLevel` enum. */\nexport const skillLevelOptions = Object.values(SkillLevel)\n\n/** Defines identifiers for the available resume templates. */\nexport enum TemplateOption {\n ModerncvBanking = 'moderncv-banking',\n ModerncvCasual = 'moderncv-casual',\n ModerncvClassic = 'moderncv-classic',\n}\n\nexport function getTemplateOptionDetail(templateOption: TemplateOption) {\n const templateOptionName: Record<\n TemplateOption,\n { name: string; description: string }\n > = {\n [TemplateOption.ModerncvBanking]: {\n name: 'ModernCV Banking',\n description: 'ModernCV template with banking style',\n },\n [TemplateOption.ModerncvCasual]: {\n name: 'ModernCV Casual',\n description: 'ModernCV template with casual style',\n },\n [TemplateOption.ModerncvClassic]: {\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: emptyParagraph,\n title: '',\n },\n basics: {\n email: '',\n headline: '',\n name: '',\n phone: '',\n summary: emptyParagraph,\n url: '',\n },\n certificate: {\n date: '',\n issuer: '',\n name: '',\n url: '',\n },\n education: {\n area: '',\n courses: [],\n endDate: '',\n summary: emptyParagraph,\n institution: '',\n score: '',\n startDate: '',\n degree: null,\n url: '',\n },\n interest: {\n keywords: [],\n name: '',\n },\n language: {\n fluency: LanguageFluency.ElementaryProficiency,\n language: 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: emptyParagraph,\n keywords: [],\n name: '',\n startDate: '',\n url: '',\n },\n publication: {\n name: '',\n publisher: '',\n releaseDate: '',\n summary: emptyParagraph,\n url: '',\n },\n reference: {\n email: '',\n name: '',\n phone: '',\n relationship: '',\n summary: emptyParagraph,\n },\n skill: {\n keywords: [],\n level: null,\n name: '',\n },\n volunteer: {\n endDate: '',\n organization: '',\n position: '',\n startDate: '',\n summary: emptyParagraph,\n url: '',\n },\n work: {\n name: '',\n endDate: '',\n position: '',\n startDate: '',\n keywords: [],\n summary: emptyParagraph,\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 enum LocaleLanguageOption {\n English = 'en',\n SimplifiedChinese = 'zh-Hans',\n TraditionalChineseHK = 'zh-Hans-HK',\n TraditionalChineseTW = 'zh-Hans-TW',\n Spanish = 'es',\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 getLocaleLanguageOptionDetail(\n localeLanguage: LocaleLanguageOption\n) {\n const localeLanguageOptionName: Record<LocaleLanguageOption, string> = {\n [LocaleLanguageOption.English]: 'English',\n [LocaleLanguageOption.SimplifiedChinese]: 'Simplified Chinese',\n [LocaleLanguageOption.TraditionalChineseHK]:\n 'Traditional Chinese (Hong Kong)',\n [LocaleLanguageOption.TraditionalChineseTW]: 'Traditional Chinese (Taiwan)',\n [LocaleLanguageOption.Spanish]: '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.English\n\n/** Default layout configuration for a new resume. */\nexport const defaultResumeLayout: ResumeLayout = {\n template: TemplateOption.ModerncvBanking,\n typography: {\n fontSize: fontSizeOptions[0],\n fontSpec: {\n numbers: FontSpecNumbersStyle.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 { isArray, 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 * 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 { 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) ? LocaleLanguageOption.English : 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 | string\n): string {\n if (!startDate) {\n return ''\n }\n\n if (!endDate) {\n switch (language) {\n case LocaleLanguageOption.SimplifiedChinese:\n case LocaleLanguageOption.TraditionalChineseHK:\n case LocaleLanguageOption.TraditionalChineseTW:\n return `${localizeDate(startDate, language)}至今`\n case LocaleLanguageOption.Spanish:\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 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 {\n type BulletListNode,\n type DocNode,\n type Fragment,\n type ListItemNode,\n type Mark,\n MarkType,\n type Node,\n NodeType,\n type OrderedListNode,\n type ParagraphNode,\n type 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 NodeType.bulletList:\n return bulletListNodeToTeX(node)\n case NodeType.doc:\n return docNodeToTeX(node)\n case NodeType.listItem:\n return listItemNodeToTeX(node)\n case NodeType.orderedList:\n return orderedListNodeToTeX(node)\n case NodeType.paragraph:\n return paragraphNodeToTeX(node)\n case NodeType.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 MarkType.bold:\n return `\\\\textbf{${text}}`\n case MarkType.italic:\n return `\\\\textit{${text}}`\n case MarkType.underline:\n return `\\\\underline{${text}}`\n case MarkType.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 { DocNode } from '@/compiler'\nimport type { Parser } from './interface'\n\n/**\n * This parser is used to parse the tiptap JSON format to the AST.\n *\n * Under the hood the implementation is pretty naive, it just parses the JSON\n * string to a DocNode because we use tiptap editor in frontend, so it is\n * guaranteed that the JSON stored by tiptap editor is valid as a tiptap\n * document.\n *\n * @see https://tiptap.dev/docs/editor/core-concepts/schema#parse\n */\nexport class TiptapParser implements Parser {\n /**\n * Parse a tiptap JSON string into an AST node.\n *\n * @param input - The tiptap JSON string to parse.\n * @returns The parsed AST node.\n */\n parse(input: string): DocNode {\n return JSON.parse(input) as DocNode\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 { Root, RootContent } from 'mdast'\nimport remarkParse from 'remark-parse'\nimport { unified } from 'unified'\n\nimport {\n type BoldMark,\n type ItalicMark,\n type LinkMark,\n type Mark,\n MarkType,\n NodeType,\n type Node as TiptapNode,\n} from '@/compiler/ast'\nimport type { Parser } from './interface'\n\n/**\n * Parse markdown to tiptap nodes\n *\n * Under the hood this class first parse the markdown to mdast and then\n * transform the mdast to tiptap nodes.\n *\n * @see {@link Parser}\n */\nexport class MarkdownParser implements Parser {\n /**\n * Parse markdown to tiptap nodes\n *\n * @param input - The markdown input to parse\n * @returns The tiptap node\n */\n parse(input: string): TiptapNode {\n const ast = unified().use(remarkParse).parse(input)\n return transform(ast)\n }\n}\n\n/**\n * Transforms an mdast node (or content) into Tiptap node(s).\n *\n * This is a recursive descent tree walker that traverses the mdast node and\n * transforms it into a Tiptap 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 Tiptap node, an array of Tiptap 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: NodeType.doc,\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'paragraph':\n return {\n type: NodeType.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: NodeType.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: MarkType.bold }\n return processChildrenWithMarks(ast.children, [...marks, boldMark])\n }\n\n case 'emphasis': {\n const italicMark: ItalicMark = { type: MarkType.italic }\n return processChildrenWithMarks(ast.children, [...marks, italicMark])\n }\n\n case 'link': {\n const linkMark: LinkMark = {\n type: MarkType.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: NodeType.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 ? NodeType.orderedList : NodeType.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 Tiptap node if only one results from the children,\n * otherwise an array of the transformed Tiptap 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 {\n type Country,\n Degree,\n Language,\n LanguageFluency,\n LocaleLanguageOption,\n SkillLevel,\n englishCountryNames,\n simplifiedChineseCountryNames,\n spanishCountryNames,\n traditionalChineseCountryHKNames,\n traditionalChineseCountryTWNames,\n} from '@/data'\nimport type { SectionID } from '@/types'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific terms used within resume sections that require translation. */\nexport enum ResumeTerms {\n /** The term for academic score or GPA. */\n Score = 'Score',\n}\n\n/** Defines the structure for translated terms for a single language. */\ntype TermsTranslationValue = {\n /** Translations for degree types. */\n education: 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 location: 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 /** Translations for specific resume terms defined in `ResumeTerms`. */\n terms: Record<ResumeTerms, string>\n}\n\n/** The structure containing translations for all supported languages. */\ntype TermsTranslation = Record<LocaleLanguageOption, TermsTranslationValue>\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 getTermsTranslations(\n language?: LocaleLanguageOption\n): TermsTranslationValue {\n const termsTranslations: TermsTranslation = {\n [LocaleLanguageOption.English]: {\n education: {\n [Degree.MiddleSchool]: 'Middle School',\n [Degree.HighSchool]: 'High School',\n [Degree.Diploma]: 'Diploma',\n [Degree.Associate]: 'Associate',\n [Degree.Bachelor]: 'Bachelor',\n [Degree.Master]: 'Master',\n [Degree.Doctor]: 'Doctor',\n },\n languages: {\n [Language.Arabic]: 'Arabic',\n [Language.Bengali]: 'Bengali',\n [Language.Bhojpuri]: 'Bhojpuri',\n [Language.Cantonese]: 'Cantonese',\n [Language.Chinese]: 'Chinese',\n [Language.Dutch]: 'Dutch',\n [Language.English]: 'English',\n [Language.French]: 'French',\n [Language.German]: 'German',\n [Language.Gujarati]: 'Gujarati',\n [Language.Hausa]: 'Hausa',\n [Language.Hindi]: 'Hindi',\n [Language.Indonesian]: 'Indonesian',\n [Language.Italian]: 'Italian',\n [Language.Japanese]: 'Japanese',\n [Language.Javanese]: 'Javanese',\n [Language.Korean]: 'Korean',\n [Language.Marathi]: 'Marathi',\n [Language.Mandarin]: 'Mandarin',\n [Language.Portuguese]: 'Portuguese',\n [Language.Russian]: 'Russian',\n [Language.Spanish]: 'Spanish',\n [Language.Tamil]: 'Tamil',\n [Language.Turkish]: 'Turkish',\n [Language.Urdu]: 'Urdu',\n [Language.Vietnamese]: 'Vietnamese',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: 'Elementary Proficiency',\n [LanguageFluency.LimitedWorkingProficiency]:\n 'Limited Working Proficiency',\n [LanguageFluency.MinimumProfessionalProficiency]:\n 'Minimum Professional Proficiency',\n [LanguageFluency.FullProfessionalProficiency]:\n 'Full Professional Proficiency',\n [LanguageFluency.NativeOrBilingualProficiency]:\n 'Native or Bilingual Proficiency',\n },\n location: englishCountryNames,\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 [SkillLevel.Novice]: 'Novice',\n [SkillLevel.Beginner]: 'Beginner',\n [SkillLevel.Intermediate]: 'Intermediate',\n [SkillLevel.Advanced]: 'Advanced',\n [SkillLevel.Expert]: 'Expert',\n [SkillLevel.Master]: 'Master',\n },\n terms: {\n [ResumeTerms.Score]: 'Score',\n },\n },\n [LocaleLanguageOption.SimplifiedChinese]: {\n education: {\n [Degree.MiddleSchool]: '初中',\n [Degree.HighSchool]: '高中',\n [Degree.Diploma]: '专科',\n [Degree.Associate]: '副学士',\n [Degree.Bachelor]: '学士',\n [Degree.Master]: '硕士',\n [Degree.Doctor]: '博士',\n },\n languages: {\n [Language.Arabic]: '阿拉伯语',\n [Language.Bengali]: '孟加拉语',\n [Language.Bhojpuri]: '博杰普尔语',\n [Language.Cantonese]: '粤语',\n [Language.Chinese]: '中文',\n [Language.Dutch]: '荷兰语',\n [Language.English]: '英语',\n [Language.French]: '法语',\n [Language.German]: '德语',\n [Language.Gujarati]: '古吉拉特语',\n [Language.Hausa]: '豪萨语',\n [Language.Hindi]: '印地语',\n [Language.Indonesian]: '印度尼西亚语',\n [Language.Italian]: '意大利语',\n [Language.Japanese]: '日语',\n [Language.Javanese]: '爪哇语',\n [Language.Korean]: '韩语',\n [Language.Marathi]: '马拉地语',\n [Language.Mandarin]: '普通话',\n [Language.Portuguese]: '葡萄牙语',\n [Language.Russian]: '俄语',\n [Language.Spanish]: '西班牙语',\n [Language.Tamil]: '泰米尔语',\n [Language.Turkish]: '土耳其语',\n [Language.Urdu]: '乌尔都语',\n [Language.Vietnamese]: '越南语',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: '初级水平',\n [LanguageFluency.LimitedWorkingProficiency]: '有限工作水平',\n [LanguageFluency.MinimumProfessionalProficiency]: '最低专业水平',\n [LanguageFluency.FullProfessionalProficiency]: '完全专业水平',\n [LanguageFluency.NativeOrBilingualProficiency]: '母语或双语水平',\n },\n location: simplifiedChineseCountryNames,\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 [SkillLevel.Novice]: '新手',\n [SkillLevel.Beginner]: '初级',\n [SkillLevel.Intermediate]: '中级',\n [SkillLevel.Advanced]: '高级',\n [SkillLevel.Expert]: '专家',\n [SkillLevel.Master]: '大师',\n },\n terms: {\n [ResumeTerms.Score]: '成绩',\n },\n },\n [LocaleLanguageOption.TraditionalChineseHK]: {\n education: {\n [Degree.MiddleSchool]: '初中',\n [Degree.HighSchool]: '高中',\n [Degree.Diploma]: '專科',\n [Degree.Associate]: '副學士',\n [Degree.Bachelor]: '學士',\n [Degree.Master]: '碩士',\n [Degree.Doctor]: '博士',\n },\n languages: {\n [Language.Arabic]: '阿拉伯語',\n [Language.Bengali]: '孟加拉語',\n [Language.Bhojpuri]: '博傑普爾語',\n [Language.Cantonese]: '粵語',\n [Language.Chinese]: '中文',\n [Language.Dutch]: '荷蘭語',\n [Language.English]: '英語',\n [Language.French]: '法語',\n [Language.German]: '德語',\n [Language.Gujarati]: '古吉拉特語',\n [Language.Hausa]: '豪薩語',\n [Language.Hindi]: '印地語',\n [Language.Indonesian]: '印度尼西亞語',\n [Language.Italian]: '意大利語',\n [Language.Japanese]: '日語',\n [Language.Javanese]: '爪哇語',\n [Language.Korean]: '韓語',\n [Language.Marathi]: '馬拉地語',\n [Language.Mandarin]: '普通話',\n [Language.Portuguese]: '葡萄牙語',\n [Language.Russian]: '俄語',\n [Language.Spanish]: '西班牙語',\n [Language.Tamil]: '泰米爾語',\n [Language.Turkish]: '土耳其語',\n [Language.Urdu]: '烏爾都語',\n [Language.Vietnamese]: '越南語',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: '初級水平',\n [LanguageFluency.LimitedWorkingProficiency]: '有限工作水平',\n [LanguageFluency.MinimumProfessionalProficiency]: '最低專業水平',\n [LanguageFluency.FullProfessionalProficiency]: '完全專業水平',\n [LanguageFluency.NativeOrBilingualProficiency]: '母語或雙語水平',\n },\n location: traditionalChineseCountryHKNames,\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 [SkillLevel.Novice]: '新手',\n [SkillLevel.Beginner]: '初級',\n [SkillLevel.Intermediate]: '中級',\n [SkillLevel.Advanced]: '高級',\n [SkillLevel.Expert]: '專家',\n [SkillLevel.Master]: '大師',\n },\n terms: {\n [ResumeTerms.Score]: '成績',\n },\n },\n [LocaleLanguageOption.TraditionalChineseTW]: {\n education: {\n [Degree.MiddleSchool]: '初中',\n [Degree.HighSchool]: '高中',\n [Degree.Diploma]: '專科',\n [Degree.Associate]: '副學士',\n [Degree.Bachelor]: '學士',\n [Degree.Master]: '碩士',\n [Degree.Doctor]: '博士',\n },\n languages: {\n [Language.Arabic]: '阿拉伯語',\n [Language.Bengali]: '孟加拉語',\n [Language.Bhojpuri]: '博傑普爾語',\n [Language.Cantonese]: '粵語',\n [Language.Chinese]: '中文',\n [Language.Dutch]: '荷蘭語',\n [Language.English]: '英語',\n [Language.French]: '法語',\n [Language.German]: '德語',\n [Language.Gujarati]: '古吉拉特語',\n [Language.Hausa]: '豪薩語',\n [Language.Hindi]: '印地語',\n [Language.Indonesian]: '印度尼西亞語',\n [Language.Italian]: '意大利語',\n [Language.Japanese]: '日語',\n [Language.Javanese]: '爪哇語',\n [Language.Korean]: '韓語',\n [Language.Marathi]: '馬拉地語',\n [Language.Mandarin]: '普通話',\n [Language.Portuguese]: '葡萄牙語',\n [Language.Russian]: '俄語',\n [Language.Spanish]: '西班牙語',\n [Language.Tamil]: '泰米爾語',\n [Language.Turkish]: '土耳其語',\n [Language.Urdu]: '烏爾都語',\n [Language.Vietnamese]: '越南語',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: '初級水平',\n [LanguageFluency.LimitedWorkingProficiency]: '有限工作水平',\n [LanguageFluency.MinimumProfessionalProficiency]: '最低專業水平',\n [LanguageFluency.FullProfessionalProficiency]: '完全專業水平',\n [LanguageFluency.NativeOrBilingualProficiency]: '母語或雙語水平',\n },\n location: traditionalChineseCountryTWNames,\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 [SkillLevel.Novice]: '新手',\n [SkillLevel.Beginner]: '初級',\n [SkillLevel.Intermediate]: '中級',\n [SkillLevel.Advanced]: '高級',\n [SkillLevel.Expert]: '專家',\n [SkillLevel.Master]: '大師',\n },\n terms: {\n [ResumeTerms.Score]: '成績',\n },\n },\n [LocaleLanguageOption.Spanish]: {\n education: {\n [Degree.MiddleSchool]: 'Escuela secundaria',\n [Degree.HighSchool]: 'Título de secundaria',\n [Degree.Diploma]: 'Diploma',\n [Degree.Associate]: 'Grado de asociado',\n [Degree.Bachelor]: 'Licenciatura',\n [Degree.Master]: 'Maestría',\n [Degree.Doctor]: 'Doctorado',\n },\n languages: {\n [Language.Arabic]: 'Árabe',\n [Language.Bengali]: 'Bengalí',\n [Language.Bhojpuri]: 'Bhojpuri',\n [Language.Cantonese]: 'Cantonés',\n [Language.Chinese]: 'Chino',\n [Language.Dutch]: 'Neerlandés',\n [Language.English]: 'Inglés',\n [Language.French]: 'Francés',\n [Language.German]: 'Alemán',\n [Language.Gujarati]: 'Gujarati',\n [Language.Hausa]: 'Hausa',\n [Language.Hindi]: 'Hindi',\n [Language.Indonesian]: 'Indonesio',\n [Language.Italian]: 'Italiano',\n [Language.Japanese]: 'Japonés',\n [Language.Javanese]: 'Javanés',\n [Language.Korean]: 'Coreano',\n [Language.Marathi]: 'Marathi',\n [Language.Mandarin]: 'Mandarin',\n [Language.Portuguese]: 'Portugués',\n [Language.Russian]: 'Ruso',\n [Language.Spanish]: 'Español',\n [Language.Tamil]: 'Tamil',\n [Language.Turkish]: 'Turco',\n [Language.Urdu]: 'Urdu',\n [Language.Vietnamese]: 'Vietnamita',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: 'Competencia elemental',\n [LanguageFluency.LimitedWorkingProficiency]:\n 'Competencia limitada de trabajo',\n [LanguageFluency.MinimumProfessionalProficiency]:\n 'Competencia profesional de trabajo',\n [LanguageFluency.FullProfessionalProficiency]:\n 'Competencia profesional plena',\n [LanguageFluency.NativeOrBilingualProficiency]:\n 'Competencia nativa o bilingüe',\n },\n location: spanishCountryNames,\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 [SkillLevel.Novice]: 'Novato',\n [SkillLevel.Beginner]: 'Principiante',\n [SkillLevel.Intermediate]: 'Intermedio',\n [SkillLevel.Advanced]: 'Avanzado',\n [SkillLevel.Expert]: 'Experto',\n [SkillLevel.Master]: 'Maestro',\n },\n terms: {\n [ResumeTerms.Score]: 'Puntuación',\n },\n },\n }\n\n return termsTranslations[\n isEmptyValue(language) ? LocaleLanguageOption.English : language\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 { LocaleLanguageOption } from '@/data'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific punctuation types used for formatting within templates. */\nexport enum Punctuation {\n /** Standard comma, often used between items in a sentence. */\n Comma = 'Comma',\n /** Standard colon, often used before lists or details. */\n Colon = 'Colon',\n /** Separator used specifically for lists of items (e.g., keywords, courses),\n * which might differ from a standard comma in some languages. */\n Separator = 'Separator',\n}\n\n/** Specific terms used within the template structure that need translation. */\nexport enum TemplateTerms {\n /** The heading or label for a list of courses. */\n Courses = 'Courses',\n /** The heading or label for a list of keywords. */\n Keywords = 'Keywords',\n}\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 `TemplateTerms`. */\n terms: Record<TemplateTerms, 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 [LocaleLanguageOption.English]: {\n punctuations: {\n [Punctuation.Comma]: ', ',\n [Punctuation.Colon]: ': ',\n [Punctuation.Separator]: ', ',\n },\n terms: {\n [TemplateTerms.Courses]: 'Courses',\n [TemplateTerms.Keywords]: 'Keywords',\n },\n },\n [LocaleLanguageOption.SimplifiedChinese]: {\n punctuations: {\n [Punctuation.Comma]: ',',\n [Punctuation.Colon]: ':',\n [Punctuation.Separator]: '、',\n },\n terms: {\n [TemplateTerms.Courses]: '课程',\n [TemplateTerms.Keywords]: '关键字',\n },\n },\n [LocaleLanguageOption.TraditionalChineseHK]: {\n punctuations: {\n [Punctuation.Comma]: ',',\n [Punctuation.Colon]: ':',\n [Punctuation.Separator]: '、',\n },\n terms: {\n [TemplateTerms.Courses]: '課程',\n [TemplateTerms.Keywords]: '關鍵字',\n },\n },\n [LocaleLanguageOption.TraditionalChineseTW]: {\n punctuations: {\n [Punctuation.Comma]: ',',\n [Punctuation.Colon]: ':',\n [Punctuation.Separator]: '、',\n },\n terms: {\n [TemplateTerms.Courses]: '課程',\n [TemplateTerms.Keywords]: '關鍵字',\n },\n },\n [LocaleLanguageOption.Spanish]: {\n punctuations: {\n [Punctuation.Comma]: ', ',\n [Punctuation.Colon]: ': ',\n [Punctuation.Separator]: ', ',\n },\n terms: {\n [TemplateTerms.Courses]: 'Cursos',\n [TemplateTerms.Keywords]: 'Palabras clave',\n },\n },\n }\n\n return templateTranslation[\n isEmptyValue(language) ? LocaleLanguageOption.English : language\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 { capitalize, cloneDeep, isArray, merge } from 'lodash-es'\n\nimport { LatexCodeGenerator, type Parser } from '@/compiler'\nimport { LocaleLanguageOption, defaultResumeLayout } from '@/data'\nimport {\n ResumeTerms,\n getTemplateTranslations,\n getTermsTranslations,\n} from '@/translations'\nimport {\n FontSpecNumbersStyle,\n type ProfileItem,\n type Resume,\n type ResumeContent,\n} 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 from\n // `tiptap.ts` 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 { education, terms } = getTermsTranslations(\n resume.layout.locale?.language\n )\n\n resume.content.education.forEach((item) => {\n const degree = showIf(!isEmptyValue(item.degree), education[item.degree])\n const score = terms[ResumeTerms.Score]\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 const { languages, languageFluencies } = getTermsTranslations(\n resume.layout.locale?.language\n )\n\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: languages[item.language],\n fluency: languageFluencies[item.fluency],\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 { location } = getTermsTranslations(resume.layout.locale?.language)\n\n switch (resume.layout.locale?.language) {\n case LocaleLanguageOption.SimplifiedChinese:\n case LocaleLanguageOption.TraditionalChineseHK:\n case LocaleLanguageOption.TraditionalChineseTW: {\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 = [\n location[resume.content.location.country],\n resume.content.location.region,\n ]\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 location[resume.content.location.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 const { skills } = getTermsTranslations(resume.layout.locale?.language)\n resume.content.skills.forEach((item) => {\n item.computed = {\n ...item.computed,\n level: showIf(!isEmptyValue(item.level), skills[item.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 const { sections } = getTermsTranslations(resume.layout.locale?.language)\n\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] = sections[sectionName]\n\n return translations\n },\n {}\n ),\n }\n\n return resume\n}\n\n/**\n * Parses the `summary` field (assumed to be Tiptap JSON or Markdown, based on\n * the parser) in various sections and converts it into LaTeX code using the\n * 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` or\n * `TiptapParser`).\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 !== FontSpecNumbersStyle.Auto\n ) {\n return resume\n }\n\n switch (resume.layout.locale?.language) {\n case LocaleLanguageOption.SimplifiedChinese:\n case LocaleLanguageOption.TraditionalChineseHK:\n case LocaleLanguageOption.TraditionalChineseTW:\n resume.layout.typography.fontSpec = {\n ...resume.layout.typography.fontSpec,\n numbers: FontSpecNumbersStyle.Lining,\n }\n break\n default:\n resume.layout.typography.fontSpec = {\n ...resume.layout.typography.fontSpec,\n numbers: FontSpecNumbersStyle.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 { LocaleLanguageOption } from '@/data'\nimport { getTemplateTranslations } from '@/translations'\nimport type { Resume } from '@/types'\nimport { joinNonEmptyString, showIf } from '@/utils'\n\nexport enum DocumentClass {\n Moderncv = 'moderncv',\n}\n\n/**\n * Enum representing 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 * @property {string} Banking - A modern, professional style with a\n * banking/financial aesthetic\n * @property {string} Classic - A traditional CV style with a clean, formal\n * layout\n * @property {string} Casual - A more relaxed style while maintaining\n * professionalism\n *\n * @see {@link https://github.com/yamlresume/community/issues/117}\n */\nexport enum ModerncvStyle {\n Banking = 'banking',\n Classic = 'classic',\n Casual = 'casual',\n}\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 [\n LocaleLanguageOption.SimplifiedChinese,\n LocaleLanguageOption.TraditionalChineseHK,\n LocaleLanguageOption.TraditionalChineseTW,\n ].includes(resume.layout.locale?.language)\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 === LocaleLanguageOption.Spanish\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 ModerncvStyle.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 ModerncvStyle.Classic:\n case ModerncvStyle.Casual:\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 {\n isEmptyString,\n isEmptyValue,\n joinNonEmptyString,\n showIf,\n} from '@/utils'\nimport { Renderer } from './base'\nimport {\n DocumentClass,\n 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, DocumentClass.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(!isEmptyString(name), name)}}{}`,\n showIf(!isEmptyString(headline), `\\\\title{${headline}}`),\n showIf(!isEmptyString(phone), `\\\\phone[mobile]{${phone}}`),\n showIf(!isEmptyString(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(!isEmptyString(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(!isEmptyString(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: { Courses },\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(!isEmptyString(startDate), dateRange)}}\n {${degreeAreaAndScore}}\n {${institution}}\n {${showIf(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyString(summary) || !isEmptyValue(courses),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(courses),\n `\\\\textbf{${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: { Keywords },\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(!isEmptyString(startDate), dateRange)}}\n {${position}}\n {${name}}\n {${showIf(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyString(summary) || !isEmptyString(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyString(keywords),\n `\\\\textbf{${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 terms: { Keywords },\n punctuations: { Colon },\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 !isEmptyString(keywords),\n ` \\\\hfill \\\\textbf{${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 terms: { Keywords },\n punctuations: { Colon },\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 !isEmptyString(keywords),\n ` \\\\hfill \\\\textbf{${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(!isEmptyString(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(!isEmptyString(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 ModerncvStyle.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 ModerncvStyle.Casual:\n case ModerncvStyle.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(!isEmptyString(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 terms: { Keywords },\n punctuations: { Colon },\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(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyString(summary) || !isEmptyString(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyString(keywords),\n `\\\\textbf{${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(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(!isEmptyString(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, ModerncvStyle.Banking, 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, ModerncvStyle.Classic, 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, ModerncvStyle.Casual, summaryParser)\n }\n}\n\nexport {\n ModerncvBase,\n ModerncvBankingRenderer,\n ModerncvClassicRenderer,\n ModerncvCasualRenderer,\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 { Parser } from '@/compiler'\nimport { TemplateOption } from '@/data'\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 [TemplateOption.ModerncvBanking]: ModerncvBankingRenderer,\n [TemplateOption.ModerncvClassic]: ModerncvClassicRenderer,\n [TemplateOption.ModerncvCasual]: ModerncvCasualRenderer,\n}\n\n/**\n * Get the appropriate resume renderer based on the provided resume.\n *\n * @param {Resume} resume - The resume object\n * @returns {Renderer} The renderer instance for the specified template.\n */\nexport function getResumeRenderer(\n resume: Resume,\n summaryParser: Parser\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/country.ts","../src/types/resume.ts","../src/data/resume.ts","../src/utils/object.ts","../src/utils/date.ts","../src/utils/tex.ts","../src/utils/string.ts","../src/compiler/codegen/latex.ts","../src/compiler/parser/tiptap.ts","../src/compiler/parser/markdown.ts","../src/errors/error.ts","../src/translations/terms.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"],"names":["Country","englishCountryNames","simplifiedChineseCountryNames","traditionalChineseCountryHKNames","traditionalChineseCountryTWNames","spanishCountryNames","SECTION_IDS","FontSpecNumbersStyle","emptyParagraph","Degree","degreeOptions","Language","languagesOptions","LanguageFluency","languageFluenciesOptions","SkillLevel","skillLevelOptions","TemplateOption","getTemplateOptionDetail","templateOption","templateOptionName","resumeItems","defaultResumeContent","filledResumeContent","fontSizeOptions","defaultTopBottomMargin","defaultLeftRightMargin","marginOptions","LocaleLanguageOption","getLocaleLanguageOptionDetail","localeLanguage","localeLanguageOptionName","defaultLanguage","defaultResumeLayout","defaultResume","filledResume","isEmptyValue","value","removeKeysFromObject","obj","keysToRemove","transform","result","key","isObject","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","TiptapParser","input","MarkdownParser","ast","unified","remarkParse","marks","child","boldMark","processChildrenWithMarks","italicMark","linkMark","children","transformedNodes","ErrorCategory","ErrorType","YAMLResumeError","params","error","message","_","ResumeTerms","getTermsTranslations","Punctuation","TemplateTerms","getTemplateTranslations","replaceBlankLinesWithPercent","transformSectionsWithDefaultValues","resume","merge","transformResumeValues","transformResumeSectionValues","index","transformResumeSectionComputedValues","sectionResumeComputed","sectionResumeItem","item","transformEducationCourses","Separator","transformEducationDegreeAreaAndScore","Colon","Comma","education","terms","degree","score","transformKeywords","section","isArray","transformDate","transformEndDate","transformLanguage","languages","languageFluencies","transformLocation","location","postalCodeAndAddress","regionAndCountry","fullAddress","regionCountryAndPostalCode","transformBasicsUrl","basicsLink","transformProfileUrls","getFaIcon","network","capitalize","transformSkills","skills","transformSocialLinks","link","transformSectionNames","sections","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","renderSpanishConfig","renderFontspecConfig","numbers","linuxLibertineFont","linuxLibertineOFont","ModerncvBase","name","headline","phone","email","urls","sectionNames","layout","Courses","dateRange","degreeAreaAndScore","courses","institution","url","Keywords","work","keywords","position","fluency","level","awards","awarder","title","certificates","issuer","publications","releaseDate","publisher","references","relationship","description","organization","ModerncvBankingRenderer","ModerncvClassicRenderer","ModerncvCasualRenderer","RESUME_RENDERER_MAP","getResumeRenderer","template","get"],"mappings":"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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\n/**\n * Represents all possible countries & regions.\n */\nexport enum Country {\n Afghanistan = 'Afghanistan',\n AlandIslands = 'Aland Islands',\n Albania = 'Albania',\n Algeria = 'Algeria',\n AmericanSamoa = 'American Samoa',\n Andorra = 'Andorra',\n Angola = 'Angola',\n Anguilla = 'Anguilla',\n Antarctica = 'Antarctica',\n AntiguaAndBarbuda = '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 BonaireSintEustatiusAndSaba = 'Bonaire, Sint Eustatius and Saba',\n BosniaAndHerzegovina = 'Bosnia and Herzegovina',\n Botswana = 'Botswana',\n BouvetIsland = 'Bouvet Island',\n Brazil = 'Brazil',\n BritishIndianOceanTerritory = 'British Indian Ocean Territory',\n Brunei = 'Brunei',\n Bulgaria = 'Bulgaria',\n BurkinaFaso = 'Burkina Faso',\n Burundi = 'Burundi',\n Cambodia = 'Cambodia',\n Cameroon = 'Cameroon',\n Canada = 'Canada',\n CapeVerde = 'Cape Verde',\n CaymanIslands = 'Cayman Islands',\n CentralAfricanRepublic = 'Central African Republic',\n Chad = 'Chad',\n Chile = 'Chile',\n China = 'China',\n ChristmasIsland = 'Christmas Island',\n CocosKeelingIslands = 'Cocos (Keeling) Islands',\n Colombia = 'Colombia',\n Comoros = 'Comoros',\n Congo = 'Congo',\n CookIslands = 'Cook Islands',\n CostaRica = 'Costa Rica',\n CoteDIvoireIvoryCoast = \"Cote D'Ivoire (Ivory Coast)\",\n Croatia = 'Croatia',\n Cuba = 'Cuba',\n Curaçao = 'Curaçao',\n Cyprus = 'Cyprus',\n CzechRepublic = 'Czech Republic',\n DemocraticRepublicoftheCongo = 'Democratic Republic of the Congo',\n Denmark = 'Denmark',\n Djibouti = 'Djibouti',\n Dominica = 'Dominica',\n DominicanRepublic = 'Dominican Republic',\n EastTimor = 'East Timor',\n Ecuador = 'Ecuador',\n Egypt = 'Egypt',\n ElSalvador = 'El Salvador',\n EquatorialGuinea = 'Equatorial Guinea',\n Eritrea = 'Eritrea',\n Estonia = 'Estonia',\n Ethiopia = 'Ethiopia',\n FalklandIslands = 'Falkland Islands',\n FaroeIslands = 'Faroe Islands',\n FijiIslands = 'Fiji Islands',\n Finland = 'Finland',\n France = 'France',\n FrenchGuiana = 'French Guiana',\n FrenchPolynesia = 'French Polynesia',\n FrenchSouthernTerritories = 'French Southern Territories',\n Gabon = 'Gabon',\n GambiaThe = '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 GuernseyAndAlderney = 'Guernsey and Alderney',\n Guinea = 'Guinea',\n GuineaBissau = 'Guinea-Bissau',\n Guyana = 'Guyana',\n Haiti = 'Haiti',\n HeardIslandAndMcDonaldIslands = 'Heard Island and McDonald Islands',\n Honduras = 'Honduras',\n HongKongSAR = '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 MacauSAR = 'Macau S.A.R.',\n Madagascar = 'Madagascar',\n Malawi = 'Malawi',\n Malaysia = 'Malaysia',\n Maldives = 'Maldives',\n Mali = 'Mali',\n Malta = 'Malta',\n ManIsleof = 'Man (Isle of)',\n MarshallIslands = '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 NewCaledonia = 'New Caledonia',\n NewZealand = 'New Zealand',\n Nicaragua = 'Nicaragua',\n Niger = 'Niger',\n Nigeria = 'Nigeria',\n Niue = 'Niue',\n NorfolkIsland = 'Norfolk Island',\n NorthKorea = 'North Korea',\n NorthMacedonia = 'North Macedonia',\n NorthernMarianaIslands = 'Northern Mariana Islands',\n Norway = 'Norway',\n Oman = 'Oman',\n Pakistan = 'Pakistan',\n Palau = 'Palau',\n PalestinianTerritoryOccupied = 'Palestinian Territory Occupied',\n Panama = 'Panama',\n PapuanewGuinea = 'Papua new Guinea',\n Paraguay = 'Paraguay',\n Peru = 'Peru',\n Philippines = 'Philippines',\n PitcairnIsland = 'Pitcairn Island',\n Poland = 'Poland',\n Portugal = 'Portugal',\n PuertoRico = 'Puerto Rico',\n Qatar = 'Qatar',\n Reunion = 'Reunion',\n Romania = 'Romania',\n Russia = 'Russia',\n Rwanda = 'Rwanda',\n SaintHelena = 'Saint Helena',\n SaintKittsAndNevis = 'Saint Kitts And Nevis',\n SaintLucia = 'Saint Lucia',\n SaintPierreAndMiquelon = 'Saint Pierre and Miquelon',\n SaintVincentAndTheGrenadines = 'Saint Vincent And The Grenadines',\n SaintBarthelemy = 'Saint-Barthelemy',\n SaintMartinFrenchpart = 'Saint-Martin (French part)',\n Samoa = 'Samoa',\n SanMarino = 'San Marino',\n SaoTomeAndPrincipe = 'Sao Tome and Principe',\n SaudiArabia = 'Saudi Arabia',\n Senegal = 'Senegal',\n Serbia = 'Serbia',\n Seychelles = 'Seychelles',\n SierraLeone = 'Sierra Leone',\n Singapore = 'Singapore',\n SintMaartenDutchpart = 'Sint Maarten (Dutch part)',\n Slovakia = 'Slovakia',\n Slovenia = 'Slovenia',\n SolomonIslands = 'Solomon Islands',\n Somalia = 'Somalia',\n SouthAfrica = 'South Africa',\n SouthGeorgia = 'South Georgia',\n SouthKorea = 'South Korea',\n SouthSudan = 'South Sudan',\n Spain = 'Spain',\n SriLanka = 'Sri Lanka',\n Sudan = 'Sudan',\n Suriname = 'Suriname',\n SvalbardAndJanMayenIslands = '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 TheBahamas = 'The Bahamas',\n Togo = 'Togo',\n Tokelau = 'Tokelau',\n Tonga = 'Tonga',\n TrinidadAndTobago = 'Trinidad And Tobago',\n Tunisia = 'Tunisia',\n Turkey = 'Turkey',\n Turkmenistan = 'Turkmenistan',\n TurksAndCaicosIslands = 'Turks And Caicos Islands',\n Tuvalu = 'Tuvalu',\n Uganda = 'Uganda',\n Ukraine = 'Ukraine',\n UnitedArabEmirates = 'United Arab Emirates',\n UnitedKingdom = 'United Kingdom',\n UnitedStates = 'United States',\n UnitedStatesMinorOutlyingIslands = 'United States Minor Outlying Islands',\n Uruguay = 'Uruguay',\n Uzbekistan = 'Uzbekistan',\n Vanuatu = 'Vanuatu',\n VaticanCityStateHolySee = 'Vatican City State (Holy See)',\n Venezuela = 'Venezuela',\n Vietnam = 'Vietnam',\n VirginIslandsBritish = 'Virgin Islands (British)',\n VirginIslandsUS = 'Virgin Islands (US)',\n WallisAndFutunaIslands = 'Wallis And Futuna Islands',\n WesternSahara = 'Western Sahara',\n Yemen = 'Yemen',\n Zambia = 'Zambia',\n Zimbabwe = 'Zimbabwe',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding English\n * names.\n */\nexport const englishCountryNames: Record<Country, string> = {\n [Country.Afghanistan]: 'Afghanistan',\n [Country.AlandIslands]: 'Aland Islands',\n [Country.Albania]: 'Albania',\n [Country.Algeria]: 'Algeria',\n [Country.AmericanSamoa]: 'American Samoa',\n [Country.Andorra]: 'Andorra',\n [Country.Angola]: 'Angola',\n [Country.Anguilla]: 'Anguilla',\n [Country.Antarctica]: 'Antarctica',\n [Country.AntiguaAndBarbuda]: 'Antigua And Barbuda',\n [Country.Argentina]: 'Argentina',\n [Country.Armenia]: 'Armenia',\n [Country.Aruba]: 'Aruba',\n [Country.Australia]: 'Australia',\n [Country.Austria]: 'Austria',\n [Country.Azerbaijan]: 'Azerbaijan',\n [Country.Bahrain]: 'Bahrain',\n [Country.Bangladesh]: 'Bangladesh',\n [Country.Barbados]: 'Barbados',\n [Country.Belarus]: 'Belarus',\n [Country.Belgium]: 'Belgium',\n [Country.Belize]: 'Belize',\n [Country.Benin]: 'Benin',\n [Country.Bermuda]: 'Bermuda',\n [Country.Bhutan]: 'Bhutan',\n [Country.Bolivia]: 'Bolivia',\n [Country.BonaireSintEustatiusAndSaba]: 'Bonaire, Sint Eustatius and Saba',\n [Country.BosniaAndHerzegovina]: 'Bosnia and Herzegovina',\n [Country.Botswana]: 'Botswana',\n [Country.BouvetIsland]: 'Bouvet Island',\n [Country.Brazil]: 'Brazil',\n [Country.BritishIndianOceanTerritory]: 'British Indian Ocean Territory',\n [Country.Brunei]: 'Brunei',\n [Country.Bulgaria]: 'Bulgaria',\n [Country.BurkinaFaso]: 'Burkina Faso',\n [Country.Burundi]: 'Burundi',\n [Country.Cambodia]: 'Cambodia',\n [Country.Cameroon]: 'Cameroon',\n [Country.Canada]: 'Canada',\n [Country.CapeVerde]: 'Cape Verde',\n [Country.CaymanIslands]: 'Cayman Islands',\n [Country.CentralAfricanRepublic]: 'Central African Republic',\n [Country.Chad]: 'Chad',\n [Country.Chile]: 'Chile',\n [Country.China]: 'China',\n [Country.ChristmasIsland]: 'Christmas Island',\n [Country.CocosKeelingIslands]: 'Cocos (Keeling) Islands',\n [Country.Colombia]: 'Colombia',\n [Country.Comoros]: 'Comoros',\n [Country.Congo]: 'Congo',\n [Country.CookIslands]: 'Cook Islands',\n [Country.CostaRica]: 'Costa Rica',\n [Country.CoteDIvoireIvoryCoast]: \"Cote D'Ivoire (Ivory Coast)\",\n [Country.Croatia]: 'Croatia',\n [Country.Cuba]: 'Cuba',\n [Country.Curaçao]: 'Curaçao',\n [Country.Cyprus]: 'Cyprus',\n [Country.CzechRepublic]: 'Czech Republic',\n [Country.DemocraticRepublicoftheCongo]: 'Democratic Republic of the Congo',\n [Country.Denmark]: 'Denmark',\n [Country.Djibouti]: 'Djibouti',\n [Country.Dominica]: 'Dominica',\n [Country.DominicanRepublic]: 'Dominican Republic',\n [Country.EastTimor]: 'East Timor',\n [Country.Ecuador]: 'Ecuador',\n [Country.Egypt]: 'Egypt',\n [Country.ElSalvador]: 'El Salvador',\n [Country.EquatorialGuinea]: 'Equatorial Guinea',\n [Country.Eritrea]: 'Eritrea',\n [Country.Estonia]: 'Estonia',\n [Country.Ethiopia]: 'Ethiopia',\n [Country.FalklandIslands]: 'Falkland Islands',\n [Country.FaroeIslands]: 'Faroe Islands',\n [Country.FijiIslands]: 'Fiji Islands',\n [Country.Finland]: 'Finland',\n [Country.France]: 'France',\n [Country.FrenchGuiana]: 'French Guiana',\n [Country.FrenchPolynesia]: 'French Polynesia',\n [Country.FrenchSouthernTerritories]: 'French Southern Territories',\n [Country.Gabon]: 'Gabon',\n [Country.GambiaThe]: 'Gambia The',\n [Country.Georgia]: 'Georgia',\n [Country.Germany]: 'Germany',\n [Country.Ghana]: 'Ghana',\n [Country.Gibraltar]: 'Gibraltar',\n [Country.Greece]: 'Greece',\n [Country.Greenland]: 'Greenland',\n [Country.Grenada]: 'Grenada',\n [Country.Guadeloupe]: 'Guadeloupe',\n [Country.Guam]: 'Guam',\n [Country.Guatemala]: 'Guatemala',\n [Country.GuernseyAndAlderney]: 'Guernsey and Alderney',\n [Country.Guinea]: 'Guinea',\n [Country.GuineaBissau]: 'Guinea-Bissau',\n [Country.Guyana]: 'Guyana',\n [Country.Haiti]: 'Haiti',\n [Country.HeardIslandAndMcDonaldIslands]: 'Heard Island and McDonald Islands',\n [Country.Honduras]: 'Honduras',\n [Country.HongKongSAR]: 'Hong Kong S.A.R.',\n [Country.Hungary]: 'Hungary',\n [Country.Iceland]: 'Iceland',\n [Country.India]: 'India',\n [Country.Indonesia]: 'Indonesia',\n [Country.Iran]: 'Iran',\n [Country.Iraq]: 'Iraq',\n [Country.Ireland]: 'Ireland',\n [Country.Israel]: 'Israel',\n [Country.Italy]: 'Italy',\n [Country.Jamaica]: 'Jamaica',\n [Country.Japan]: 'Japan',\n [Country.Jersey]: 'Jersey',\n [Country.Jordan]: 'Jordan',\n [Country.Kazakhstan]: 'Kazakhstan',\n [Country.Kenya]: 'Kenya',\n [Country.Kiribati]: 'Kiribati',\n [Country.Kosovo]: 'Kosovo',\n [Country.Kuwait]: 'Kuwait',\n [Country.Kyrgyzstan]: 'Kyrgyzstan',\n [Country.Laos]: 'Laos',\n [Country.Latvia]: 'Latvia',\n [Country.Lebanon]: 'Lebanon',\n [Country.Lesotho]: 'Lesotho',\n [Country.Liberia]: 'Liberia',\n [Country.Libya]: 'Libya',\n [Country.Liechtenstein]: 'Liechtenstein',\n [Country.Lithuania]: 'Lithuania',\n [Country.Luxembourg]: 'Luxembourg',\n [Country.MacauSAR]: 'Macau S.A.R.',\n [Country.Madagascar]: 'Madagascar',\n [Country.Malawi]: 'Malawi',\n [Country.Malaysia]: 'Malaysia',\n [Country.Maldives]: 'Maldives',\n [Country.Mali]: 'Mali',\n [Country.Malta]: 'Malta',\n [Country.ManIsleof]: 'Man (Isle of)',\n [Country.MarshallIslands]: 'Marshall Islands',\n [Country.Martinique]: 'Martinique',\n [Country.Mauritania]: 'Mauritania',\n [Country.Mauritius]: 'Mauritius',\n [Country.Mayotte]: 'Mayotte',\n [Country.Mexico]: 'Mexico',\n [Country.Micronesia]: 'Micronesia',\n [Country.Moldova]: 'Moldova',\n [Country.Monaco]: 'Monaco',\n [Country.Mongolia]: 'Mongolia',\n [Country.Montenegro]: 'Montenegro',\n [Country.Montserrat]: 'Montserrat',\n [Country.Morocco]: 'Morocco',\n [Country.Mozambique]: 'Mozambique',\n [Country.Myanmar]: 'Myanmar',\n [Country.Namibia]: 'Namibia',\n [Country.Nauru]: 'Nauru',\n [Country.Nepal]: 'Nepal',\n [Country.Netherlands]: 'Netherlands',\n [Country.NewCaledonia]: 'New Caledonia',\n [Country.NewZealand]: 'New Zealand',\n [Country.Nicaragua]: 'Nicaragua',\n [Country.Niger]: 'Niger',\n [Country.Nigeria]: 'Nigeria',\n [Country.Niue]: 'Niue',\n [Country.NorfolkIsland]: 'Norfolk Island',\n [Country.NorthKorea]: 'North Korea',\n [Country.NorthMacedonia]: 'North Macedonia',\n [Country.NorthernMarianaIslands]: 'Northern Mariana Islands',\n [Country.Norway]: 'Norway',\n [Country.Oman]: 'Oman',\n [Country.Pakistan]: 'Pakistan',\n [Country.Palau]: 'Palau',\n [Country.PalestinianTerritoryOccupied]: 'Palestinian Territory Occupied',\n [Country.Panama]: 'Panama',\n [Country.PapuanewGuinea]: 'Papua new Guinea',\n [Country.Paraguay]: 'Paraguay',\n [Country.Peru]: 'Peru',\n [Country.Philippines]: 'Philippines',\n [Country.PitcairnIsland]: 'Pitcairn Island',\n [Country.Poland]: 'Poland',\n [Country.Portugal]: 'Portugal',\n [Country.PuertoRico]: 'Puerto Rico',\n [Country.Qatar]: 'Qatar',\n [Country.Reunion]: 'Reunion',\n [Country.Romania]: 'Romania',\n [Country.Russia]: 'Russia',\n [Country.Rwanda]: 'Rwanda',\n [Country.SaintHelena]: 'Saint Helena',\n [Country.SaintKittsAndNevis]: 'Saint Kitts And Nevis',\n [Country.SaintLucia]: 'Saint Lucia',\n [Country.SaintPierreAndMiquelon]: 'Saint Pierre and Miquelon',\n [Country.SaintVincentAndTheGrenadines]: 'Saint Vincent And The Grenadines',\n [Country.SaintBarthelemy]: 'Saint-Barthelemy',\n [Country.SaintMartinFrenchpart]: 'Saint-Martin (French part)',\n [Country.Samoa]: 'Samoa',\n [Country.SanMarino]: 'San Marino',\n [Country.SaoTomeAndPrincipe]: 'Sao Tome and Principe',\n [Country.SaudiArabia]: 'Saudi Arabia',\n [Country.Senegal]: 'Senegal',\n [Country.Serbia]: 'Serbia',\n [Country.Seychelles]: 'Seychelles',\n [Country.SierraLeone]: 'Sierra Leone',\n [Country.Singapore]: 'Singapore',\n [Country.SintMaartenDutchpart]: 'Sint Maarten (Dutch part)',\n [Country.Slovakia]: 'Slovakia',\n [Country.Slovenia]: 'Slovenia',\n [Country.SolomonIslands]: 'Solomon Islands',\n [Country.Somalia]: 'Somalia',\n [Country.SouthAfrica]: 'South Africa',\n [Country.SouthGeorgia]: 'South Georgia',\n [Country.SouthKorea]: 'South Korea',\n [Country.SouthSudan]: 'South Sudan',\n [Country.Spain]: 'Spain',\n [Country.SriLanka]: 'Sri Lanka',\n [Country.Sudan]: 'Sudan',\n [Country.Suriname]: 'Suriname',\n [Country.SvalbardAndJanMayenIslands]: 'Svalbard And Jan Mayen Islands',\n [Country.Swaziland]: 'Swaziland',\n [Country.Sweden]: 'Sweden',\n [Country.Switzerland]: 'Switzerland',\n [Country.Syria]: 'Syria',\n [Country.Taiwan]: 'Taiwan',\n [Country.Tajikistan]: 'Tajikistan',\n [Country.Tanzania]: 'Tanzania',\n [Country.Thailand]: 'Thailand',\n [Country.TheBahamas]: 'The Bahamas',\n [Country.Togo]: 'Togo',\n [Country.Tokelau]: 'Tokelau',\n [Country.Tonga]: 'Tonga',\n [Country.TrinidadAndTobago]: 'Trinidad And Tobago',\n [Country.Tunisia]: 'Tunisia',\n [Country.Turkey]: 'Turkey',\n [Country.Turkmenistan]: 'Turkmenistan',\n [Country.TurksAndCaicosIslands]: 'Turks And Caicos Islands',\n [Country.Tuvalu]: 'Tuvalu',\n [Country.Uganda]: 'Uganda',\n [Country.Ukraine]: 'Ukraine',\n [Country.UnitedArabEmirates]: 'United Arab Emirates',\n [Country.UnitedKingdom]: 'United Kingdom',\n [Country.UnitedStates]: 'United States',\n [Country.UnitedStatesMinorOutlyingIslands]:\n 'United States Minor Outlying Islands',\n [Country.Uruguay]: 'Uruguay',\n [Country.Uzbekistan]: 'Uzbekistan',\n [Country.Vanuatu]: 'Vanuatu',\n [Country.VaticanCityStateHolySee]: 'Vatican City State (Holy See)',\n [Country.Venezuela]: 'Venezuela',\n [Country.Vietnam]: 'Vietnam',\n [Country.VirginIslandsBritish]: 'Virgin Islands (British)',\n [Country.VirginIslandsUS]: 'Virgin Islands (US)',\n [Country.WallisAndFutunaIslands]: 'Wallis And Futuna Islands',\n [Country.WesternSahara]: 'Western Sahara',\n [Country.Yemen]: 'Yemen',\n [Country.Zambia]: 'Zambia',\n [Country.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 [Country.Afghanistan]: '阿富汗',\n [Country.AlandIslands]: '奥兰群岛',\n [Country.Albania]: '阿尔巴尼亚',\n [Country.Algeria]: '阿尔及利亚',\n [Country.AmericanSamoa]: '美属萨摩亚',\n [Country.Andorra]: '安道尔',\n [Country.Angola]: '安哥拉',\n [Country.Anguilla]: '安圭拉',\n [Country.Antarctica]: '南极洲',\n [Country.AntiguaAndBarbuda]: '安提瓜和巴布达',\n [Country.Argentina]: '阿根廷',\n [Country.Armenia]: '亚美尼亚',\n [Country.Aruba]: '阿鲁巴',\n [Country.Australia]: '澳大利亚',\n [Country.Austria]: '奥地利',\n [Country.Azerbaijan]: '阿塞拜疆',\n [Country.Bahrain]: '巴林',\n [Country.Bangladesh]: '孟加拉',\n [Country.Barbados]: '巴巴多斯',\n [Country.Belarus]: '白俄罗斯',\n [Country.Belgium]: '比利时',\n [Country.Belize]: '伯利兹',\n [Country.Benin]: '贝宁',\n [Country.Bermuda]: '百慕大',\n [Country.Bhutan]: '不丹',\n [Country.Bolivia]: '玻利维亚',\n [Country.BonaireSintEustatiusAndSaba]: '博内尔岛、圣尤斯特歇斯和萨巴岛',\n [Country.BosniaAndHerzegovina]: '波斯尼亚和黑塞哥维那',\n [Country.Botswana]: '博茨瓦纳',\n [Country.BouvetIsland]: '布维岛',\n [Country.Brazil]: '巴西',\n [Country.BritishIndianOceanTerritory]: '英属印度洋领地',\n [Country.Brunei]: '文莱',\n [Country.Bulgaria]: '保加利亚',\n [Country.BurkinaFaso]: '布基纳法索',\n [Country.Burundi]: '布隆迪',\n [Country.Cambodia]: '柬埔寨',\n [Country.Cameroon]: '喀麦隆',\n [Country.Canada]: '加拿大',\n [Country.CapeVerde]: '佛得角',\n [Country.CaymanIslands]: '开曼群岛',\n [Country.CentralAfricanRepublic]: '中非',\n [Country.Chad]: '乍得',\n [Country.Chile]: '智利',\n [Country.China]: '中国',\n [Country.ChristmasIsland]: '圣诞岛',\n [Country.CocosKeelingIslands]: '科科斯(基林)群岛',\n [Country.Colombia]: '哥伦比亚',\n [Country.Comoros]: '科摩罗',\n [Country.Congo]: '刚果',\n [Country.CookIslands]: '库克群岛',\n [Country.CostaRica]: '哥斯达黎加',\n [Country.CoteDIvoireIvoryCoast]: '科特迪瓦',\n [Country.Croatia]: '克罗地亚',\n [Country.Cuba]: '古巴',\n [Country.Curaçao]: '库拉索',\n [Country.Cyprus]: '塞浦路斯',\n [Country.CzechRepublic]: '捷克',\n [Country.DemocraticRepublicoftheCongo]: '刚果(金)',\n [Country.Denmark]: '丹麦',\n [Country.Djibouti]: '吉布提',\n [Country.Dominica]: '多米尼加',\n [Country.DominicanRepublic]: '多明尼加共和国',\n [Country.EastTimor]: '东帝汶',\n [Country.Ecuador]: '厄瓜多尔',\n [Country.Egypt]: '埃及',\n [Country.ElSalvador]: '萨尔瓦多',\n [Country.EquatorialGuinea]: '赤道几内亚',\n [Country.Eritrea]: '厄立特里亚',\n [Country.Estonia]: '爱沙尼亚',\n [Country.Ethiopia]: '埃塞俄比亚',\n [Country.FalklandIslands]: '福克兰群岛',\n [Country.FaroeIslands]: '法罗群岛',\n [Country.FijiIslands]: '斐济',\n [Country.Finland]: '芬兰',\n [Country.France]: '法国',\n [Country.FrenchGuiana]: '法属圭亚那',\n [Country.FrenchPolynesia]: '法属波利尼西亚',\n [Country.FrenchSouthernTerritories]: '法属南部领地',\n [Country.Gabon]: '加蓬',\n [Country.GambiaThe]: '冈比亚',\n [Country.Georgia]: '格鲁吉亚',\n [Country.Germany]: '德国',\n [Country.Ghana]: '加纳',\n [Country.Gibraltar]: '直布罗陀',\n [Country.Greece]: '希腊',\n [Country.Greenland]: '格陵兰岛',\n [Country.Grenada]: '格林纳达',\n [Country.Guadeloupe]: '瓜德罗普岛',\n [Country.Guam]: '关岛',\n [Country.Guatemala]: '危地马拉',\n [Country.GuernseyAndAlderney]: '根西岛',\n [Country.Guinea]: '几内亚',\n [Country.GuineaBissau]: '几内亚比绍',\n [Country.Guyana]: '圭亚那',\n [Country.Haiti]: '海地',\n [Country.HeardIslandAndMcDonaldIslands]: '赫德·唐纳岛及麦唐纳岛',\n [Country.Honduras]: '洪都拉斯',\n [Country.HongKongSAR]: '中国香港',\n [Country.Hungary]: '匈牙利',\n [Country.Iceland]: '冰岛',\n [Country.India]: '印度',\n [Country.Indonesia]: '印度尼西亚',\n [Country.Iran]: '伊朗',\n [Country.Iraq]: '伊拉克',\n [Country.Ireland]: '爱尔兰',\n [Country.Israel]: '以色列',\n [Country.Italy]: '意大利',\n [Country.Jamaica]: '牙买加',\n [Country.Japan]: '日本',\n [Country.Jersey]: '泽西岛',\n [Country.Jordan]: '约旦',\n [Country.Kazakhstan]: '哈萨克斯坦',\n [Country.Kenya]: '肯尼亚',\n [Country.Kiribati]: '基里巴斯',\n [Country.Kosovo]: '科索沃',\n [Country.Kuwait]: '科威特',\n [Country.Kyrgyzstan]: '吉尔吉斯斯坦',\n [Country.Laos]: '寮人民民主共和国',\n [Country.Latvia]: '拉脱维亚',\n [Country.Lebanon]: '黎巴嫩',\n [Country.Lesotho]: '莱索托',\n [Country.Liberia]: '利比里亚',\n [Country.Libya]: '利比亚',\n [Country.Liechtenstein]: '列支敦士登',\n [Country.Lithuania]: '立陶宛',\n [Country.Luxembourg]: '卢森堡',\n [Country.MacauSAR]: '中国澳门',\n [Country.Madagascar]: '马达加斯加',\n [Country.Malawi]: '马拉维',\n [Country.Malaysia]: '马来西亚',\n [Country.Maldives]: '马尔代夫',\n [Country.Mali]: '马里',\n [Country.Malta]: '马耳他',\n [Country.ManIsleof]: '马恩岛',\n [Country.MarshallIslands]: '马绍尔群岛',\n [Country.Martinique]: '马提尼克岛',\n [Country.Mauritania]: '毛里塔尼亚',\n [Country.Mauritius]: '毛里求斯',\n [Country.Mayotte]: '马约特',\n [Country.Mexico]: '墨西哥',\n [Country.Micronesia]: '密克罗尼西亚',\n [Country.Moldova]: '摩尔多瓦',\n [Country.Monaco]: '摩纳哥',\n [Country.Mongolia]: '蒙古',\n [Country.Montenegro]: '黑山',\n [Country.Montserrat]: '蒙特塞拉特',\n [Country.Morocco]: '摩洛哥',\n [Country.Mozambique]: '莫桑比克',\n [Country.Myanmar]: '缅甸',\n [Country.Namibia]: '纳米比亚',\n [Country.Nauru]: '瑙鲁',\n [Country.Nepal]: '尼泊尔',\n [Country.Netherlands]: '荷兰',\n [Country.NewCaledonia]: '新喀里多尼亚',\n [Country.NewZealand]: '新西兰',\n [Country.Nicaragua]: '尼加拉瓜',\n [Country.Niger]: '尼日尔',\n [Country.Nigeria]: '尼日利亚',\n [Country.Niue]: '纽埃',\n [Country.NorfolkIsland]: '诺福克岛',\n [Country.NorthKorea]: '朝鲜',\n [Country.NorthMacedonia]: '北馬其頓',\n [Country.NorthernMarianaIslands]: '北马里亚纳群岛',\n [Country.Norway]: '挪威',\n [Country.Oman]: '阿曼',\n [Country.Pakistan]: '巴基斯坦',\n [Country.Palau]: '帕劳',\n [Country.PalestinianTerritoryOccupied]: '巴勒斯坦',\n [Country.Panama]: '巴拿马',\n [Country.PapuanewGuinea]: '巴布亚新几内亚',\n [Country.Paraguay]: '巴拉圭',\n [Country.Peru]: '秘鲁',\n [Country.Philippines]: '菲律宾',\n [Country.PitcairnIsland]: '皮特凯恩群岛',\n [Country.Poland]: '波兰',\n [Country.Portugal]: '葡萄牙',\n [Country.PuertoRico]: '波多黎各',\n [Country.Qatar]: '卡塔尔',\n [Country.Reunion]: '留尼汪岛',\n [Country.Romania]: '罗马尼亚',\n [Country.Russia]: '俄罗斯联邦',\n [Country.Rwanda]: '卢旺达',\n [Country.SaintHelena]: '圣赫勒拿',\n [Country.SaintKittsAndNevis]: '圣基茨和尼维斯',\n [Country.SaintLucia]: '圣卢西亚',\n [Country.SaintPierreAndMiquelon]: '圣皮埃尔和密克隆',\n [Country.SaintVincentAndTheGrenadines]: '圣文森特和格林纳丁斯',\n [Country.SaintBarthelemy]: '圣巴泰勒米',\n [Country.SaintMartinFrenchpart]: '密克罗尼西亚',\n [Country.Samoa]: '萨摩亚',\n [Country.SanMarino]: '圣马力诺',\n [Country.SaoTomeAndPrincipe]: '圣多美和普林西比',\n [Country.SaudiArabia]: '沙特阿拉伯',\n [Country.Senegal]: '塞内加尔',\n [Country.Serbia]: '塞尔维亚',\n [Country.Seychelles]: '塞舌尔',\n [Country.SierraLeone]: '塞拉利昂',\n [Country.Singapore]: '新加坡',\n [Country.SintMaartenDutchpart]: '圣马丁岛(荷兰部分)',\n [Country.Slovakia]: '斯洛伐克',\n [Country.Slovenia]: '斯洛文尼亚',\n [Country.SolomonIslands]: '所罗门群岛',\n [Country.Somalia]: '索马里',\n [Country.SouthAfrica]: '南非',\n [Country.SouthGeorgia]: '南乔治亚',\n [Country.SouthKorea]: '韩国',\n [Country.SouthSudan]: '南苏丹',\n [Country.Spain]: '西班牙',\n [Country.SriLanka]: '斯里兰卡',\n [Country.Sudan]: '苏丹',\n [Country.Suriname]: '苏里南',\n [Country.SvalbardAndJanMayenIslands]: '斯瓦尔巴和扬马延群岛',\n [Country.Swaziland]: '斯威士兰',\n [Country.Sweden]: '瑞典',\n [Country.Switzerland]: '瑞士',\n [Country.Syria]: '叙利亚',\n [Country.Taiwan]: '中国台湾',\n [Country.Tajikistan]: '塔吉克斯坦',\n [Country.Tanzania]: '坦桑尼亚',\n [Country.Thailand]: '泰国',\n [Country.TheBahamas]: '巴哈马',\n [Country.Togo]: '多哥',\n [Country.Tokelau]: '托克劳',\n [Country.Tonga]: '汤加',\n [Country.TrinidadAndTobago]: '特立尼达和多巴哥',\n [Country.Tunisia]: '突尼斯',\n [Country.Turkey]: '土耳其',\n [Country.Turkmenistan]: '土库曼斯坦',\n [Country.TurksAndCaicosIslands]: '特克斯和凯科斯群岛',\n [Country.Tuvalu]: '图瓦卢',\n [Country.Uganda]: '乌干达',\n [Country.Ukraine]: '乌克兰',\n [Country.UnitedArabEmirates]: '阿拉伯联合酋长国',\n [Country.UnitedKingdom]: '英国',\n [Country.UnitedStates]: '美国',\n [Country.UnitedStatesMinorOutlyingIslands]: '美国本土外小岛屿',\n [Country.Uruguay]: '乌拉圭',\n [Country.Uzbekistan]: '乌兹别克斯坦',\n [Country.Vanuatu]: '瓦努阿图',\n [Country.VaticanCityStateHolySee]: '梵蒂冈',\n [Country.Venezuela]: '委内瑞拉',\n [Country.Vietnam]: '越南',\n [Country.VirginIslandsBritish]: '圣文森特和格林纳丁斯',\n [Country.VirginIslandsUS]: '维尔京群岛(美国)',\n [Country.WallisAndFutunaIslands]: '瓦利斯群岛和富图纳群岛',\n [Country.WesternSahara]: '西撒哈拉',\n [Country.Yemen]: '也门',\n [Country.Zambia]: '赞比亚',\n [Country.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 [Country.Afghanistan]: '阿富汗',\n [Country.AlandIslands]: '奧蘭羣島',\n [Country.Albania]: '阿爾巴尼亞',\n [Country.Algeria]: '阿爾及利亞',\n [Country.AmericanSamoa]: '美屬薩摩亞',\n [Country.Andorra]: '安道爾',\n [Country.Angola]: '安哥拉',\n [Country.Anguilla]: '安圭拉',\n [Country.Antarctica]: '南極洲',\n [Country.AntiguaAndBarbuda]: '安提瓜和巴布達',\n [Country.Argentina]: '阿根廷',\n [Country.Armenia]: '亞美尼亞',\n [Country.Aruba]: '阿魯巴',\n [Country.Australia]: '澳大利亞',\n [Country.Austria]: '奧地利',\n [Country.Azerbaijan]: '阿塞拜疆',\n [Country.Bahrain]: '巴林',\n [Country.Bangladesh]: '孟加拉',\n [Country.Barbados]: '巴巴多斯',\n [Country.Belarus]: '白俄羅斯',\n [Country.Belgium]: '比利時',\n [Country.Belize]: '伯利茲',\n [Country.Benin]: '貝寧',\n [Country.Bermuda]: '百慕大',\n [Country.Bhutan]: '不丹',\n [Country.Bolivia]: '玻利維亞',\n [Country.BonaireSintEustatiusAndSaba]: '博內爾島、聖尤斯特歇斯和薩巴島',\n [Country.BosniaAndHerzegovina]: '波斯尼亞和黑塞哥維那',\n [Country.Botswana]: '博茨瓦納',\n [Country.BouvetIsland]: '布維島',\n [Country.Brazil]: '巴西',\n [Country.BritishIndianOceanTerritory]: '英屬印度洋領地',\n [Country.Brunei]: '文萊',\n [Country.Bulgaria]: '保加利亞',\n [Country.BurkinaFaso]: '布基納法索',\n [Country.Burundi]: '布隆迪',\n [Country.Cambodia]: '柬埔寨',\n [Country.Cameroon]: '喀麥隆',\n [Country.Canada]: '加拿大',\n [Country.CapeVerde]: '佛得角',\n [Country.CaymanIslands]: '開曼羣島',\n [Country.CentralAfricanRepublic]: '中非',\n [Country.Chad]: '乍得',\n [Country.Chile]: '智利',\n [Country.China]: '中國',\n [Country.ChristmasIsland]: '聖誕島',\n [Country.CocosKeelingIslands]: '科科斯(基林)羣島',\n [Country.Colombia]: '哥倫比亞',\n [Country.Comoros]: '科摩羅',\n [Country.Congo]: '剛果',\n [Country.CookIslands]: '庫克羣島',\n [Country.CostaRica]: '哥斯達黎加',\n [Country.CoteDIvoireIvoryCoast]: '科特迪瓦',\n [Country.Croatia]: '克羅地亞',\n [Country.Cuba]: '古巴',\n [Country.Curaçao]: '庫拉索',\n [Country.Cyprus]: '塞浦路斯',\n [Country.CzechRepublic]: '捷克',\n [Country.DemocraticRepublicoftheCongo]: '剛果(金)',\n [Country.Denmark]: '丹麥',\n [Country.Djibouti]: '吉布提',\n [Country.Dominica]: '多米尼加',\n [Country.DominicanRepublic]: '多明尼加共和國',\n [Country.EastTimor]: '東帝汶',\n [Country.Ecuador]: '厄瓜多爾',\n [Country.Egypt]: '埃及',\n [Country.ElSalvador]: '薩爾瓦多',\n [Country.EquatorialGuinea]: '赤道幾內亞',\n [Country.Eritrea]: '厄立特里亞',\n [Country.Estonia]: '愛沙尼亞',\n [Country.Ethiopia]: '埃塞俄比亞',\n [Country.FalklandIslands]: '福克蘭羣島',\n [Country.FaroeIslands]: '法羅羣島',\n [Country.FijiIslands]: '斐濟',\n [Country.Finland]: '芬蘭',\n [Country.France]: '法國',\n [Country.FrenchGuiana]: '法屬圭亞那',\n [Country.FrenchPolynesia]: '法屬波利尼西亞',\n [Country.FrenchSouthernTerritories]: '法屬南部領地',\n [Country.Gabon]: '加蓬',\n [Country.GambiaThe]: '岡比亞',\n [Country.Georgia]: '格魯吉亞',\n [Country.Germany]: '德國',\n [Country.Ghana]: '加納',\n [Country.Gibraltar]: '直布羅陀',\n [Country.Greece]: '希臘',\n [Country.Greenland]: '格陵蘭島',\n [Country.Grenada]: '格林納達',\n [Country.Guadeloupe]: '瓜德羅普島',\n [Country.Guam]: '關島',\n [Country.Guatemala]: '危地馬拉',\n [Country.GuernseyAndAlderney]: '根西島',\n [Country.Guinea]: '幾內亞',\n [Country.GuineaBissau]: '幾內亞比紹',\n [Country.Guyana]: '圭亞那',\n [Country.Haiti]: '海地',\n [Country.HeardIslandAndMcDonaldIslands]: '赫德·唐納島及麥唐納島',\n [Country.Honduras]: '洪都拉斯',\n [Country.HongKongSAR]: '中國香港',\n [Country.Hungary]: '匈牙利',\n [Country.Iceland]: '冰島',\n [Country.India]: '印度',\n [Country.Indonesia]: '印度尼西亞',\n [Country.Iran]: '伊朗',\n [Country.Iraq]: '伊拉克',\n [Country.Ireland]: '愛爾蘭',\n [Country.Israel]: '以色列',\n [Country.Italy]: '意大利',\n [Country.Jamaica]: '牙買加',\n [Country.Japan]: '日本',\n [Country.Jersey]: '澤西島',\n [Country.Jordan]: '約旦',\n [Country.Kazakhstan]: '哈薩克斯坦',\n [Country.Kenya]: '肯尼亞',\n [Country.Kiribati]: '基里巴斯',\n [Country.Kosovo]: '科索沃',\n [Country.Kuwait]: '科威特',\n [Country.Kyrgyzstan]: '吉爾吉斯斯坦',\n [Country.Laos]: '寮人民民主共和國',\n [Country.Latvia]: '拉脫維亞',\n [Country.Lebanon]: '黎巴嫩',\n [Country.Lesotho]: '萊索托',\n [Country.Liberia]: '利比里亞',\n [Country.Libya]: '利比亞',\n [Country.Liechtenstein]: '列支敦士登',\n [Country.Lithuania]: '立陶宛',\n [Country.Luxembourg]: '盧森堡',\n [Country.MacauSAR]: '中國澳門',\n [Country.Madagascar]: '馬達加斯加',\n [Country.Malawi]: '馬拉維',\n [Country.Malaysia]: '馬來西亞',\n [Country.Maldives]: '馬爾代夫',\n [Country.Mali]: '馬裏',\n [Country.Malta]: '馬耳他',\n [Country.ManIsleof]: '馬恩島',\n [Country.MarshallIslands]: '馬紹爾羣島',\n [Country.Martinique]: '馬提尼克島',\n [Country.Mauritania]: '毛里塔尼亞',\n [Country.Mauritius]: '毛里求斯',\n [Country.Mayotte]: '馬約特',\n [Country.Mexico]: '墨西哥',\n [Country.Micronesia]: '密克羅尼西亞',\n [Country.Moldova]: '摩爾多瓦',\n [Country.Monaco]: '摩納哥',\n [Country.Mongolia]: '蒙古',\n [Country.Montenegro]: '黑山',\n [Country.Montserrat]: '蒙特塞拉特',\n [Country.Morocco]: '摩洛哥',\n [Country.Mozambique]: '莫桑比克',\n [Country.Myanmar]: '緬甸',\n [Country.Namibia]: '納米比亞',\n [Country.Nauru]: '瑙魯',\n [Country.Nepal]: '尼泊爾',\n [Country.Netherlands]: '荷蘭',\n [Country.NewCaledonia]: '新喀里多尼亞',\n [Country.NewZealand]: '新西蘭',\n [Country.Nicaragua]: '尼加拉瓜',\n [Country.Niger]: '尼日爾',\n [Country.Nigeria]: '尼日利亞',\n [Country.Niue]: '紐埃',\n [Country.NorfolkIsland]: '諾福克島',\n [Country.NorthKorea]: '朝鮮',\n [Country.NorthMacedonia]: '北馬其頓',\n [Country.NorthernMarianaIslands]: '北马里亞納羣島',\n [Country.Norway]: '挪威',\n [Country.Oman]: '阿曼',\n [Country.Pakistan]: '巴基斯坦',\n [Country.Palau]: '帕勞',\n [Country.PalestinianTerritoryOccupied]: '巴勒斯坦',\n [Country.Panama]: '巴拿馬',\n [Country.PapuanewGuinea]: '巴布亞新幾內亞',\n [Country.Paraguay]: '巴拉圭',\n [Country.Peru]: '祕魯',\n [Country.Philippines]: '菲律賓',\n [Country.PitcairnIsland]: '皮特凱恩羣島',\n [Country.Poland]: '波蘭',\n [Country.Portugal]: '葡萄牙',\n [Country.PuertoRico]: '波多黎各',\n [Country.Qatar]: '卡塔爾',\n [Country.Reunion]: '留尼汪島',\n [Country.Romania]: '羅馬尼亞',\n [Country.Russia]: '俄羅斯聯邦',\n [Country.Rwanda]: '盧旺達',\n [Country.SaintHelena]: '聖赫勒拿',\n [Country.SaintKittsAndNevis]: '聖基茨和尼維斯',\n [Country.SaintLucia]: '聖盧西亞',\n [Country.SaintPierreAndMiquelon]: '聖皮埃爾和密克隆',\n [Country.SaintVincentAndTheGrenadines]: '聖文森特和格林納丁斯',\n [Country.SaintBarthelemy]: '聖巴泰勒米',\n [Country.SaintMartinFrenchpart]: '密克羅尼西亞',\n [Country.Samoa]: '薩摩亞',\n [Country.SanMarino]: '聖馬力諾',\n [Country.SaoTomeAndPrincipe]: '聖多美和普林西比',\n [Country.SaudiArabia]: '沙特阿拉伯',\n [Country.Senegal]: '塞內加爾',\n [Country.Serbia]: '塞爾維亞',\n [Country.Seychelles]: '塞舌爾',\n [Country.SierraLeone]: '塞拉利昂',\n [Country.Singapore]: '新加坡',\n [Country.SintMaartenDutchpart]: '聖馬丁島(荷蘭部分)',\n [Country.Slovakia]: '斯洛伐克',\n [Country.Slovenia]: '斯洛文尼亞',\n [Country.SolomonIslands]: '所羅門羣島',\n [Country.Somalia]: '索馬里',\n [Country.SouthAfrica]: '南非',\n [Country.SouthGeorgia]: '南喬治亞',\n [Country.SouthKorea]: '韓國',\n [Country.SouthSudan]: '南蘇丹',\n [Country.Spain]: '西班牙',\n [Country.SriLanka]: '斯里蘭卡',\n [Country.Sudan]: '蘇丹',\n [Country.Suriname]: '蘇里南',\n [Country.SvalbardAndJanMayenIslands]: '斯瓦爾巴和揚馬延羣島',\n [Country.Swaziland]: '斯威士蘭',\n [Country.Sweden]: '瑞典',\n [Country.Switzerland]: '瑞士',\n [Country.Syria]: '敘利亞',\n [Country.Taiwan]: '中國臺灣',\n [Country.Tajikistan]: '塔吉克斯坦',\n [Country.Tanzania]: '坦桑尼亞',\n [Country.Thailand]: '泰國',\n [Country.TheBahamas]: '巴哈馬',\n [Country.Togo]: '多哥',\n [Country.Tokelau]: '托克勞',\n [Country.Tonga]: '湯加',\n [Country.TrinidadAndTobago]: '特立尼達和多巴哥',\n [Country.Tunisia]: '突尼斯',\n [Country.Turkey]: '土耳其',\n [Country.Turkmenistan]: '土庫曼斯坦',\n [Country.TurksAndCaicosIslands]: '特克斯和凱科斯羣島',\n [Country.Tuvalu]: '圖瓦盧',\n [Country.Uganda]: '烏干達',\n [Country.Ukraine]: '烏克蘭',\n [Country.UnitedArabEmirates]: '阿拉伯聯合酋長國',\n [Country.UnitedKingdom]: '英國',\n [Country.UnitedStates]: '美國',\n [Country.UnitedStatesMinorOutlyingIslands]: '美國本土外小島嶼',\n [Country.Uruguay]: '烏拉圭',\n [Country.Uzbekistan]: '烏茲別克斯坦',\n [Country.Vanuatu]: '瓦努阿圖',\n [Country.VaticanCityStateHolySee]: '梵蒂岡',\n [Country.Venezuela]: '委內瑞拉',\n [Country.Vietnam]: '越南',\n [Country.VirginIslandsBritish]: '聖文森特和格林納丁斯',\n [Country.VirginIslandsUS]: '維爾京羣島(美國)',\n [Country.WallisAndFutunaIslands]: '瓦利斯羣島和富圖納羣島',\n [Country.WesternSahara]: '西撒哈拉',\n [Country.Yemen]: '也門',\n [Country.Zambia]: '贊比亞',\n [Country.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 [Country.Afghanistan]: '阿富汗',\n [Country.AlandIslands]: '奧蘭群島',\n [Country.Albania]: '阿爾巴尼亞',\n [Country.Algeria]: '阿爾及利亞',\n [Country.AmericanSamoa]: '美屬薩摩亞',\n [Country.Andorra]: '安道爾',\n [Country.Angola]: '安哥拉',\n [Country.Anguilla]: '安圭拉',\n [Country.Antarctica]: '南極洲',\n [Country.AntiguaAndBarbuda]: '安地卡及巴布達',\n [Country.Argentina]: '阿根廷',\n [Country.Armenia]: '亞美尼亞',\n [Country.Aruba]: '阿魯巴',\n [Country.Australia]: '澳大利亞',\n [Country.Austria]: '奧地利',\n [Country.Azerbaijan]: '亞塞拜然',\n [Country.Bahrain]: '巴林',\n [Country.Bangladesh]: '孟加拉',\n [Country.Barbados]: '巴貝多',\n [Country.Belarus]: '白俄羅斯',\n [Country.Belgium]: '比利時',\n [Country.Belize]: '貝里斯',\n [Country.Benin]: '貝南',\n [Country.Bermuda]: '百慕大',\n [Country.Bhutan]: '不丹',\n [Country.Bolivia]: '玻利維亞',\n [Country.BonaireSintEustatiusAndSaba]: '博內爾島、聖尤斯特歇斯和薩巴島',\n [Country.BosniaAndHerzegovina]: '波斯尼亞和黑塞哥維那',\n [Country.Botswana]: '波札那',\n [Country.BouvetIsland]: '布維島',\n [Country.Brazil]: '巴西',\n [Country.BritishIndianOceanTerritory]: '英屬印度洋領地',\n [Country.Brunei]: '汶萊',\n [Country.Bulgaria]: '保加利亞',\n [Country.BurkinaFaso]: '布吉納法索',\n [Country.Burundi]: '蒲隆地',\n [Country.Cambodia]: '柬埔寨',\n [Country.Cameroon]: '喀麥隆',\n [Country.Canada]: '加拿大',\n [Country.CapeVerde]: '維德角',\n [Country.CaymanIslands]: '開曼群島',\n [Country.CentralAfricanRepublic]: '中非',\n [Country.Chad]: '查德',\n [Country.Chile]: '智利',\n [Country.China]: '中國',\n [Country.ChristmasIsland]: '聖誕島',\n [Country.CocosKeelingIslands]: '科科斯(基林)群島',\n [Country.Colombia]: '哥倫比亞',\n [Country.Comoros]: '葛摩',\n [Country.Congo]: '剛果',\n [Country.CookIslands]: '庫克群島',\n [Country.CostaRica]: '哥斯大黎加',\n [Country.CoteDIvoireIvoryCoast]: '象牙海岸',\n [Country.Croatia]: '克羅埃西亞',\n [Country.Cuba]: '古巴',\n [Country.Curaçao]: '庫拉索',\n [Country.Cyprus]: '塞普勒斯',\n [Country.CzechRepublic]: '捷克',\n [Country.DemocraticRepublicoftheCongo]: '剛果(金)',\n [Country.Denmark]: '丹麥',\n [Country.Djibouti]: '吉布提',\n [Country.Dominica]: '多明尼加',\n [Country.DominicanRepublic]: '多明尼加共和國',\n [Country.EastTimor]: '東帝汶',\n [Country.Ecuador]: '厄瓜多',\n [Country.Egypt]: '埃及',\n [Country.ElSalvador]: '薩爾瓦多',\n [Country.EquatorialGuinea]: '赤道幾內亞',\n [Country.Eritrea]: '厄利垂亞',\n [Country.Estonia]: '愛沙尼亞',\n [Country.Ethiopia]: '衣索比亞',\n [Country.FalklandIslands]: '福克蘭群島',\n [Country.FaroeIslands]: '法羅群島',\n [Country.FijiIslands]: '斐濟',\n [Country.Finland]: '芬蘭',\n [Country.France]: '法國',\n [Country.FrenchGuiana]: '法屬蓋亞那',\n [Country.FrenchPolynesia]: '法屬波利尼西亞',\n [Country.FrenchSouthernTerritories]: '法屬南部領地',\n [Country.Gabon]: '加彭',\n [Country.GambiaThe]: '甘比亞',\n [Country.Georgia]: '喬治亞',\n [Country.Germany]: '德國',\n [Country.Ghana]: '迦納',\n [Country.Gibraltar]: '直布羅陀',\n [Country.Greece]: '希臘',\n [Country.Greenland]: '格陵蘭島',\n [Country.Grenada]: '格瑞那達',\n [Country.Guadeloupe]: '瓜德羅普島',\n [Country.Guam]: '關島',\n [Country.Guatemala]: '瓜地馬拉',\n [Country.GuernseyAndAlderney]: '根西島',\n [Country.Guinea]: '幾內亞',\n [Country.GuineaBissau]: '幾內亞比索',\n [Country.Guyana]: '蓋亞那',\n [Country.Haiti]: '海地',\n [Country.HeardIslandAndMcDonaldIslands]: '赫德·唐納島及麥唐納島',\n [Country.Honduras]: '宏都拉斯',\n [Country.HongKongSAR]: '中國香港',\n [Country.Hungary]: '匈牙利',\n [Country.Iceland]: '冰島',\n [Country.India]: '印度',\n [Country.Indonesia]: '印度尼西亞',\n [Country.Iran]: '伊朗',\n [Country.Iraq]: '伊拉克',\n [Country.Ireland]: '愛爾蘭',\n [Country.Israel]: '以色列',\n [Country.Italy]: '義大利',\n [Country.Jamaica]: '牙買加',\n [Country.Japan]: '日本',\n [Country.Jersey]: '澤西島',\n [Country.Jordan]: '約旦',\n [Country.Kazakhstan]: '哈薩克',\n [Country.Kenya]: '肯亞',\n [Country.Kiribati]: '吉里巴斯',\n [Country.Kosovo]: '科索沃',\n [Country.Kuwait]: '科威特',\n [Country.Kyrgyzstan]: '吉爾吉斯斯坦',\n [Country.Laos]: '寮人民民主共和國',\n [Country.Latvia]: '拉脫維亞',\n [Country.Lebanon]: '黎巴嫩',\n [Country.Lesotho]: '賴索托',\n [Country.Liberia]: '賴比瑞亞',\n [Country.Libya]: '利比亞',\n [Country.Liechtenstein]: '列支敦斯登',\n [Country.Lithuania]: '立陶宛',\n [Country.Luxembourg]: '盧森堡',\n [Country.MacauSAR]: '中國澳門',\n [Country.Madagascar]: '馬達加斯加',\n [Country.Malawi]: '馬拉維',\n [Country.Malaysia]: '馬來西亞',\n [Country.Maldives]: '馬爾地夫',\n [Country.Mali]: '馬裡',\n [Country.Malta]: '馬耳他',\n [Country.ManIsleof]: '馬恩島',\n [Country.MarshallIslands]: '馬紹爾群島',\n [Country.Martinique]: '馬提尼克島',\n [Country.Mauritania]: '茅利塔尼亞',\n [Country.Mauritius]: '模里西斯',\n [Country.Mayotte]: '馬約特',\n [Country.Mexico]: '墨西哥',\n [Country.Micronesia]: '密克羅尼西亞',\n [Country.Moldova]: '摩爾多瓦',\n [Country.Monaco]: '摩納哥',\n [Country.Mongolia]: '蒙古',\n [Country.Montenegro]: '黑山',\n [Country.Montserrat]: '蒙特塞拉特',\n [Country.Morocco]: '摩洛哥',\n [Country.Mozambique]: '莫三比克',\n [Country.Myanmar]: '緬甸',\n [Country.Namibia]: '奈米比亞',\n [Country.Nauru]: '諾魯',\n [Country.Nepal]: '尼泊爾',\n [Country.Netherlands]: '荷蘭',\n [Country.NewCaledonia]: '新喀里多尼亞',\n [Country.NewZealand]: '紐西蘭',\n [Country.Nicaragua]: '尼加拉瓜',\n [Country.Niger]: '尼日',\n [Country.Nigeria]: '奈及利亞',\n [Country.Niue]: '紐埃',\n [Country.NorfolkIsland]: '諾福克島',\n [Country.NorthKorea]: '朝鮮',\n [Country.NorthMacedonia]: '北馬其頓',\n [Country.NorthernMarianaIslands]: '北马里亞納群島',\n [Country.Norway]: '挪威',\n [Country.Oman]: '阿曼',\n [Country.Pakistan]: '巴基斯坦',\n [Country.Palau]: '帛琉',\n [Country.PalestinianTerritoryOccupied]: '巴勒斯坦',\n [Country.Panama]: '巴拿馬',\n [Country.PapuanewGuinea]: '巴布亞紐幾內亞',\n [Country.Paraguay]: '巴拉圭',\n [Country.Peru]: '秘魯',\n [Country.Philippines]: '菲律賓',\n [Country.PitcairnIsland]: '皮特凱恩群島',\n [Country.Poland]: '波蘭',\n [Country.Portugal]: '葡萄牙',\n [Country.PuertoRico]: '波多黎各',\n [Country.Qatar]: '卡達',\n [Country.Reunion]: '留尼汪島',\n [Country.Romania]: '羅馬尼亞',\n [Country.Russia]: '俄羅斯聯邦',\n [Country.Rwanda]: '盧安達',\n [Country.SaintHelena]: '聖赫勒拿',\n [Country.SaintKittsAndNevis]: '聖克里斯多福及尼維斯',\n [Country.SaintLucia]: '聖露西亞',\n [Country.SaintPierreAndMiquelon]: '聖皮埃爾和密克隆',\n [Country.SaintVincentAndTheGrenadines]: '聖文森及格瑞那丁',\n [Country.SaintBarthelemy]: '聖巴泰勒米',\n [Country.SaintMartinFrenchpart]: '密克羅尼西亞',\n [Country.Samoa]: '薩摩亞',\n [Country.SanMarino]: '聖馬利諾',\n [Country.SaoTomeAndPrincipe]: '聖多美和普林西比',\n [Country.SaudiArabia]: '沙烏地阿拉伯',\n [Country.Senegal]: '塞內加爾',\n [Country.Serbia]: '塞爾維亞',\n [Country.Seychelles]: '塞席爾',\n [Country.SierraLeone]: '獅子山',\n [Country.Singapore]: '新加坡',\n [Country.SintMaartenDutchpart]: '聖馬丁島(荷蘭部分)',\n [Country.Slovakia]: '斯洛伐克',\n [Country.Slovenia]: '斯洛維尼亞',\n [Country.SolomonIslands]: '索羅門群島',\n [Country.Somalia]: '索馬利亞',\n [Country.SouthAfrica]: '南非',\n [Country.SouthGeorgia]: '南喬治亞',\n [Country.SouthKorea]: '韓國',\n [Country.SouthSudan]: '南蘇丹',\n [Country.Spain]: '西班牙',\n [Country.SriLanka]: '斯里蘭卡',\n [Country.Sudan]: '蘇丹',\n [Country.Suriname]: '蘇利南',\n [Country.SvalbardAndJanMayenIslands]: '斯瓦爾巴和揚馬延群島',\n [Country.Swaziland]: '史瓦濟蘭',\n [Country.Sweden]: '瑞典',\n [Country.Switzerland]: '瑞士',\n [Country.Syria]: '敘利亞',\n [Country.Taiwan]: '中國臺灣',\n [Country.Tajikistan]: '塔吉克',\n [Country.Tanzania]: '坦尚尼亞',\n [Country.Thailand]: '泰國',\n [Country.TheBahamas]: '巴哈馬',\n [Country.Togo]: '多哥',\n [Country.Tokelau]: '托克勞',\n [Country.Tonga]: '湯加',\n [Country.TrinidadAndTobago]: '千里達及托巴哥',\n [Country.Tunisia]: '突尼西亞',\n [Country.Turkey]: '土耳其',\n [Country.Turkmenistan]: '土庫曼',\n [Country.TurksAndCaicosIslands]: '特克斯和凱科斯群島',\n [Country.Tuvalu]: '吐瓦魯',\n [Country.Uganda]: '烏干達',\n [Country.Ukraine]: '烏克蘭',\n [Country.UnitedArabEmirates]: '阿拉伯聯合大公國',\n [Country.UnitedKingdom]: '英國',\n [Country.UnitedStates]: '美國',\n [Country.UnitedStatesMinorOutlyingIslands]: '美國本土外小島嶼',\n [Country.Uruguay]: '烏拉圭',\n [Country.Uzbekistan]: '烏茲別克',\n [Country.Vanuatu]: '萬那杜',\n [Country.VaticanCityStateHolySee]: '梵蒂岡',\n [Country.Venezuela]: '委內瑞拉',\n [Country.Vietnam]: '越南',\n [Country.VirginIslandsBritish]: '聖文森及格瑞那丁',\n [Country.VirginIslandsUS]: '維爾京群島(美國)',\n [Country.WallisAndFutunaIslands]: '瓦利斯群島和富圖納群島',\n [Country.WesternSahara]: '西撒哈拉',\n [Country.Yemen]: '葉門',\n [Country.Zambia]: '尚比亞',\n [Country.Zimbabwe]: '辛巴威',\n}\n\n/**\n * Represents all possible countries & regions with their corresponding\n * Spanish names.\n */\nexport const spanishCountryNames: Record<Country, string> = {\n [Country.Afghanistan]: 'Afganistán',\n [Country.AlandIslands]: 'Islas Åland',\n [Country.Albania]: 'Albania',\n [Country.Algeria]: 'Argelia',\n [Country.AmericanSamoa]: 'Samoa Americana',\n [Country.Andorra]: 'Andorra',\n [Country.Angola]: 'Angola',\n [Country.Anguilla]: 'Anguila',\n [Country.Antarctica]: 'Antártida',\n [Country.AntiguaAndBarbuda]: 'Antigua y Barbuda',\n [Country.Argentina]: 'Argentina',\n [Country.Armenia]: 'Armenia',\n [Country.Aruba]: 'Aruba',\n [Country.Australia]: 'Australia',\n [Country.Austria]: 'Austria',\n [Country.Azerbaijan]: 'Azerbaiyán',\n [Country.Bahrain]: 'Baréin',\n [Country.Bangladesh]: 'Bangladés',\n [Country.Barbados]: 'Barbados',\n [Country.Belarus]: 'Bielorrusia',\n [Country.Belgium]: 'Bélgica',\n [Country.Belize]: 'Belice',\n [Country.Benin]: 'Benín',\n [Country.Bermuda]: 'Bermudas',\n [Country.Bhutan]: 'Bután',\n [Country.Bolivia]: 'Bolivia',\n [Country.BonaireSintEustatiusAndSaba]: 'Bonaire, San Eustaquio y Saba',\n [Country.BosniaAndHerzegovina]: 'Bosnia y Herzegovina',\n [Country.Botswana]: 'Botsuana',\n [Country.BouvetIsland]: 'Isla Bouvet',\n [Country.Brazil]: 'Brasil',\n [Country.BritishIndianOceanTerritory]:\n 'Territorio Británico del Océano Índico',\n [Country.Brunei]: 'Brunéi',\n [Country.Bulgaria]: 'Bulgaria',\n [Country.BurkinaFaso]: 'Burkina Faso',\n [Country.Burundi]: 'Burundi',\n [Country.Cambodia]: 'Camboya',\n [Country.Cameroon]: 'Camerún',\n [Country.Canada]: 'Canadá',\n [Country.CapeVerde]: 'Cabo Verde',\n [Country.CaymanIslands]: 'Islas Caimán',\n [Country.CentralAfricanRepublic]: 'República Centroafricana',\n [Country.Chad]: 'Chad',\n [Country.Chile]: 'Chile',\n [Country.China]: 'China',\n [Country.ChristmasIsland]: 'Isla de Navidad',\n [Country.CocosKeelingIslands]: 'Islas Cocos',\n [Country.Colombia]: 'Colombia',\n [Country.Comoros]: 'Comoras',\n [Country.Congo]: 'Congo',\n [Country.CookIslands]: 'Islas Cook',\n [Country.CostaRica]: 'Costa Rica',\n [Country.CoteDIvoireIvoryCoast]: 'Costa de Marfil',\n [Country.Croatia]: 'Croacia',\n [Country.Cuba]: 'Cuba',\n [Country.Curaçao]: 'Curazao',\n [Country.Cyprus]: 'Chipre',\n [Country.CzechRepublic]: 'República Checa',\n [Country.DemocraticRepublicoftheCongo]: 'República Democrática del Congo',\n [Country.Denmark]: 'Dinamarca',\n [Country.Djibouti]: 'Yibuti',\n [Country.Dominica]: 'Dominica',\n [Country.DominicanRepublic]: 'República Dominicana',\n [Country.EastTimor]: 'Timor Oriental',\n [Country.Ecuador]: 'Ecuador',\n [Country.Egypt]: 'Egipto',\n [Country.ElSalvador]: 'El Salvador',\n [Country.EquatorialGuinea]: 'Guinea Ecuatorial',\n [Country.Eritrea]: 'Eritrea',\n [Country.Estonia]: 'Estonia',\n [Country.Ethiopia]: 'Etiopía',\n [Country.FalklandIslands]: 'Islas Malvinas',\n [Country.FaroeIslands]: 'Islas Feroe',\n [Country.FijiIslands]: 'Fiyi',\n [Country.Finland]: 'Finlandia',\n [Country.France]: 'Francia',\n [Country.FrenchGuiana]: 'Guayana Francesa',\n [Country.FrenchPolynesia]: 'Polinesia Francesa',\n [Country.FrenchSouthernTerritories]:\n 'Tierras Australes y Antárticas Francesas',\n [Country.Gabon]: 'Gabón',\n [Country.GambiaThe]: 'Gambia',\n [Country.Georgia]: 'Georgia',\n [Country.Germany]: 'Alemania',\n [Country.Ghana]: 'Ghana',\n [Country.Gibraltar]: 'Gibraltar',\n [Country.Greece]: 'Grecia',\n [Country.Greenland]: 'Groenlandia',\n [Country.Grenada]: 'Granada',\n [Country.Guadeloupe]: 'Guadalupe',\n [Country.Guam]: 'Guam',\n [Country.Guatemala]: 'Guatemala',\n [Country.GuernseyAndAlderney]: 'Guernsey y Alderney',\n [Country.Guinea]: 'Guinea',\n [Country.GuineaBissau]: 'Guinea-Bisáu',\n [Country.Guyana]: 'Guyana',\n [Country.Haiti]: 'Haití',\n [Country.HeardIslandAndMcDonaldIslands]: 'Islas Heard y McDonald',\n [Country.Honduras]: 'Honduras',\n [Country.HongKongSAR]: 'Hong Kong',\n [Country.Hungary]: 'Hungría',\n [Country.Iceland]: 'Islandia',\n [Country.India]: 'India',\n [Country.Indonesia]: 'Indonesia',\n [Country.Iran]: 'Irán',\n [Country.Iraq]: 'Irak',\n [Country.Ireland]: 'Irlanda',\n [Country.Israel]: 'Israel',\n [Country.Italy]: 'Italia',\n [Country.Jamaica]: 'Jamaica',\n [Country.Japan]: 'Japón',\n [Country.Jersey]: 'Jersey',\n [Country.Jordan]: 'Jordania',\n [Country.Kazakhstan]: 'Kazajistán',\n [Country.Kenya]: 'Kenia',\n [Country.Kiribati]: 'Kiribati',\n [Country.Kosovo]: 'Kosovo',\n [Country.Kuwait]: 'Kuwait',\n [Country.Kyrgyzstan]: 'Kirguistán',\n [Country.Laos]: 'Laos',\n [Country.Latvia]: 'Letonia',\n [Country.Lebanon]: 'Líbano',\n [Country.Lesotho]: 'Lesoto',\n [Country.Liberia]: 'Liberia',\n [Country.Libya]: 'Libia',\n [Country.Liechtenstein]: 'Liechtenstein',\n [Country.Lithuania]: 'Lituania',\n [Country.Luxembourg]: 'Luxemburgo',\n [Country.MacauSAR]: 'Macao',\n [Country.Madagascar]: 'Madagascar',\n [Country.Malawi]: 'Malaui',\n [Country.Malaysia]: 'Malasia',\n [Country.Maldives]: 'Maldivas',\n [Country.Mali]: 'Malí',\n [Country.Malta]: 'Malta',\n [Country.ManIsleof]: 'Isla de Man',\n [Country.MarshallIslands]: 'Islas Marshall',\n [Country.Martinique]: 'Martinica',\n [Country.Mauritania]: 'Mauritania',\n [Country.Mauritius]: 'Mauricio',\n [Country.Mayotte]: 'Mayotte',\n [Country.Mexico]: 'México',\n [Country.Micronesia]: 'Micronesia',\n [Country.Moldova]: 'Moldavia',\n [Country.Monaco]: 'Mónaco',\n [Country.Mongolia]: 'Mongolia',\n [Country.Montenegro]: 'Montenegro',\n [Country.Montserrat]: 'Montserrat',\n [Country.Morocco]: 'Marruecos',\n [Country.Mozambique]: 'Mozambique',\n [Country.Myanmar]: 'Myanmar',\n [Country.Namibia]: 'Namibia',\n [Country.Nauru]: 'Nauru',\n [Country.Nepal]: 'Nepal',\n [Country.Netherlands]: 'Países Bajos',\n [Country.NewCaledonia]: 'Nueva Caledonia',\n [Country.NewZealand]: 'Nueva Zelanda',\n [Country.Nicaragua]: 'Nicaragua',\n [Country.Niger]: 'Níger',\n [Country.Nigeria]: 'Nigeria',\n [Country.Niue]: 'Niue',\n [Country.NorfolkIsland]: 'Isla Norfolk',\n [Country.NorthKorea]: 'Corea del Norte',\n [Country.NorthMacedonia]: 'Macedonia del Norte',\n [Country.NorthernMarianaIslands]: 'Islas Marianas del Norte',\n [Country.Norway]: 'Noruega',\n [Country.Oman]: 'Omán',\n [Country.Pakistan]: 'Pakistán',\n [Country.Palau]: 'Palaos',\n [Country.PalestinianTerritoryOccupied]: 'Territorio Palestino Ocupado',\n [Country.Panama]: 'Panamá',\n [Country.PapuanewGuinea]: 'Papúa Nueva Guinea',\n [Country.Paraguay]: 'Paraguay',\n [Country.Peru]: 'Perú',\n [Country.Philippines]: 'Filipinas',\n [Country.PitcairnIsland]: 'Islas Pitcairn',\n [Country.Poland]: 'Polonia',\n [Country.Portugal]: 'Portugal',\n [Country.PuertoRico]: 'Puerto Rico',\n [Country.Qatar]: 'Catar',\n [Country.Reunion]: 'Reunión',\n [Country.Romania]: 'Rumania',\n [Country.Russia]: 'Rusia',\n [Country.Rwanda]: 'Ruanda',\n [Country.SaintHelena]: 'Santa Elena',\n [Country.SaintKittsAndNevis]: 'San Cristóbal y Nieves',\n [Country.SaintLucia]: 'Santa Lucía',\n [Country.SaintPierreAndMiquelon]: 'San Pedro y Miquelón',\n [Country.SaintVincentAndTheGrenadines]: 'San Vicente y las Granadinas',\n [Country.SaintBarthelemy]: 'San Bartolomé',\n [Country.SaintMartinFrenchpart]: 'San Martín (parte francesa)',\n [Country.Samoa]: 'Samoa',\n [Country.SanMarino]: 'San Marino',\n [Country.SaoTomeAndPrincipe]: 'Santo Tomé y Príncipe',\n [Country.SaudiArabia]: 'Arabia Saudita',\n [Country.Senegal]: 'Senegal',\n [Country.Serbia]: 'Serbia',\n [Country.Seychelles]: 'Seychelles',\n [Country.SierraLeone]: 'Sierra Leona',\n [Country.Singapore]: 'Singapur',\n [Country.SintMaartenDutchpart]: 'San Martín (parte neerlandesa)',\n [Country.Slovakia]: 'Eslovaquia',\n [Country.Slovenia]: 'Eslovenia',\n [Country.SolomonIslands]: 'Islas Salomón',\n [Country.Somalia]: 'Somalia',\n [Country.SouthAfrica]: 'Sudáfrica',\n [Country.SouthGeorgia]: 'Georgia del Sur',\n [Country.SouthKorea]: 'Corea del Sur',\n [Country.SouthSudan]: 'Sudán del Sur',\n [Country.Spain]: 'España',\n [Country.SriLanka]: 'Sri Lanka',\n [Country.Sudan]: 'Sudán',\n [Country.Suriname]: 'Surinam',\n [Country.SvalbardAndJanMayenIslands]: 'Svalbard y Jan Mayen',\n [Country.Swaziland]: 'Suazilandia',\n [Country.Sweden]: 'Suecia',\n [Country.Switzerland]: 'Suiza',\n [Country.Syria]: 'Siria',\n [Country.Taiwan]: 'Taiwán',\n [Country.Tajikistan]: 'Tayikistán',\n [Country.Tanzania]: 'Tanzania',\n [Country.Thailand]: 'Tailandia',\n [Country.TheBahamas]: 'Bahamas',\n [Country.Togo]: 'Togo',\n [Country.Tokelau]: 'Tokelau',\n [Country.Tonga]: 'Tonga',\n [Country.TrinidadAndTobago]: 'Trinidad y Tobago',\n [Country.Tunisia]: 'Túnez',\n [Country.Turkey]: 'Turquía',\n [Country.Turkmenistan]: 'Turkmenistán',\n [Country.TurksAndCaicosIslands]: 'Islas Turcas y Caicos',\n [Country.Tuvalu]: 'Tuvalu',\n [Country.Uganda]: 'Uganda',\n [Country.Ukraine]: 'Ucrania',\n [Country.UnitedArabEmirates]: 'Emiratos Árabes Unidos',\n [Country.UnitedKingdom]: 'Reino Unido',\n [Country.UnitedStates]: 'Estados Unidos',\n [Country.UnitedStatesMinorOutlyingIslands]:\n 'Islas Ultramarinas Menores de Estados Unidos',\n [Country.Uruguay]: 'Uruguay',\n [Country.Uzbekistan]: 'Uzbekistán',\n [Country.Vanuatu]: 'Vanuatu',\n [Country.VaticanCityStateHolySee]: 'Ciudad del Vaticano',\n [Country.Venezuela]: 'Venezuela',\n [Country.Vietnam]: 'Vietnam',\n [Country.VirginIslandsBritish]: 'Islas Vírgenes Británicas',\n [Country.VirginIslandsUS]: 'Islas Vírgenes de los Estados Unidos',\n [Country.WallisAndFutunaIslands]: 'Wallis y Futuna',\n [Country.WesternSahara]: 'Sahara Occidental',\n [Country.Yemen]: 'Yemen',\n [Country.Zambia]: 'Zambia',\n [Country.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 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/** Defines the available styles for rendering numbers in the font spec. */\nexport enum FontSpecNumbersStyle {\n /** Standard lining figures (default for CJK languages). */\n Lining = 'Lining',\n /** Old-style figures with varying heights (default for Latin languages). */\n OldStyle = 'OldStyle',\n /**\n * Represents an undefined state, allowing the style to be automatically\n * determined based on the selected `LocaleLanguage`.\n */\n Auto = 'Auto',\n}\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","/**\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 {\n FontSpecNumbersStyle,\n type Resume,\n type ResumeContent,\n type ResumeItem,\n type ResumeLayout,\n} from '@/types'\n\n/** Represents a Tiptap editor JSON string for a single empty paragraph. */\nexport const emptyParagraph = '{\"type\":\"doc\",\"content\":[{\"type\":\"paragraph\"}]}'\n\n/** Defines standard academic degree types. */\nexport enum Degree {\n MiddleSchool = 'Middle School',\n HighSchool = 'High School',\n Diploma = 'Diploma',\n Associate = 'Associate',\n Bachelor = 'Bachelor',\n Master = 'Master',\n Doctor = 'Doctor',\n}\n\n/** An array containing all possible values from the `Degree` enum. */\nexport const degreeOptions = Object.values(Degree)\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 enum Language {\n Arabic = 'Arabic',\n Bengali = 'Bengali',\n Bhojpuri = 'Bhojpuri',\n Cantonese = 'Cantonese',\n Chinese = 'Chinese',\n Dutch = 'Dutch',\n English = 'English',\n French = 'French',\n German = 'German',\n Gujarati = 'Gujarati',\n Hausa = 'Hausa',\n Hindi = 'Hindi',\n Indonesian = 'Indonesian',\n Italian = 'Italian',\n Japanese = 'Japanese',\n Javanese = 'Javanese',\n Korean = 'Korean',\n Marathi = 'Marathi',\n Mandarin = 'Mandarin',\n Portuguese = 'Portuguese',\n Russian = 'Russian',\n Spanish = 'Spanish',\n Tamil = 'Tamil',\n Turkish = 'Turkish',\n Urdu = 'Urdu',\n Vietnamese = 'Vietnamese',\n}\n\n/** An array containing all possible values from the `Language` enum. */\nexport const languagesOptions = Object.values(Language)\n\n/** Defines levels of language proficiency.\n *\n * This list of options is coming from LinkedIn.\n */\nexport enum LanguageFluency {\n ElementaryProficiency = 'Elementary Proficiency',\n LimitedWorkingProficiency = 'Limited Working Proficiency',\n MinimumProfessionalProficiency = 'Minimum Professional Proficiency',\n FullProfessionalProficiency = 'Full Professional Proficiency',\n NativeOrBilingualProficiency = 'Native or Bilingual Proficiency',\n}\n\n/** An array containing all possible values from the `LanguageFluency` enum. */\nexport const languageFluenciesOptions = Object.values(LanguageFluency)\n\n/** Defines levels of skill proficiency. */\nexport enum SkillLevel {\n Novice = 'Novice',\n Beginner = 'Beginner',\n Intermediate = 'Intermediate',\n Advanced = 'Advanced',\n Expert = 'Expert',\n Master = 'Master',\n}\n\n/** An array containing all possible values from the `SkillLevel` enum. */\nexport const skillLevelOptions = Object.values(SkillLevel)\n\n/** Defines identifiers for the available resume templates. */\nexport enum TemplateOption {\n ModerncvBanking = 'moderncv-banking',\n ModerncvCasual = 'moderncv-casual',\n ModerncvClassic = 'moderncv-classic',\n}\n\nexport function getTemplateOptionDetail(templateOption: TemplateOption) {\n const templateOptionName: Record<\n TemplateOption,\n { name: string; description: string }\n > = {\n [TemplateOption.ModerncvBanking]: {\n name: 'ModernCV Banking',\n description: 'ModernCV template with banking style',\n },\n [TemplateOption.ModerncvCasual]: {\n name: 'ModernCV Casual',\n description: 'ModernCV template with casual style',\n },\n [TemplateOption.ModerncvClassic]: {\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: emptyParagraph,\n title: '',\n },\n basics: {\n email: '',\n headline: '',\n name: '',\n phone: '',\n summary: emptyParagraph,\n url: '',\n },\n certificate: {\n date: '',\n issuer: '',\n name: '',\n url: '',\n },\n education: {\n area: '',\n courses: [],\n endDate: '',\n summary: emptyParagraph,\n institution: '',\n score: '',\n startDate: '',\n degree: null,\n url: '',\n },\n interest: {\n keywords: [],\n name: '',\n },\n language: {\n fluency: LanguageFluency.ElementaryProficiency,\n language: 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: emptyParagraph,\n keywords: [],\n name: '',\n startDate: '',\n url: '',\n },\n publication: {\n name: '',\n publisher: '',\n releaseDate: '',\n summary: emptyParagraph,\n url: '',\n },\n reference: {\n email: '',\n name: '',\n phone: '',\n relationship: '',\n summary: emptyParagraph,\n },\n skill: {\n keywords: [],\n level: null,\n name: '',\n },\n volunteer: {\n endDate: '',\n organization: '',\n position: '',\n startDate: '',\n summary: emptyParagraph,\n url: '',\n },\n work: {\n name: '',\n endDate: '',\n position: '',\n startDate: '',\n keywords: [],\n summary: emptyParagraph,\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 enum LocaleLanguageOption {\n English = 'en',\n SimplifiedChinese = 'zh-hans',\n TraditionalChineseHK = 'zh-hant-hk',\n TraditionalChineseTW = 'zh-hant-tw',\n Spanish = 'es',\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 getLocaleLanguageOptionDetail(\n localeLanguage: LocaleLanguageOption\n) {\n const localeLanguageOptionName: Record<LocaleLanguageOption, string> = {\n [LocaleLanguageOption.English]: 'English',\n [LocaleLanguageOption.SimplifiedChinese]: 'Simplified Chinese',\n [LocaleLanguageOption.TraditionalChineseHK]:\n 'Traditional Chinese (Hong Kong)',\n [LocaleLanguageOption.TraditionalChineseTW]: 'Traditional Chinese (Taiwan)',\n [LocaleLanguageOption.Spanish]: '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.English\n\n/** Default layout configuration for a new resume. */\nexport const defaultResumeLayout: ResumeLayout = {\n template: TemplateOption.ModerncvBanking,\n typography: {\n fontSize: fontSizeOptions[0],\n fontSpec: {\n numbers: FontSpecNumbersStyle.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 { isArray, 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 * 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 { 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) ? LocaleLanguageOption.English : 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 | string\n): string {\n if (!startDate) {\n return ''\n }\n\n if (!endDate) {\n switch (language) {\n case LocaleLanguageOption.SimplifiedChinese:\n case LocaleLanguageOption.TraditionalChineseHK:\n case LocaleLanguageOption.TraditionalChineseTW:\n return `${localizeDate(startDate, language)}至今`\n case LocaleLanguageOption.Spanish:\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 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 {\n type BulletListNode,\n type DocNode,\n type Fragment,\n type ListItemNode,\n type Mark,\n MarkType,\n type Node,\n NodeType,\n type OrderedListNode,\n type ParagraphNode,\n type 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 NodeType.bulletList:\n return bulletListNodeToTeX(node)\n case NodeType.doc:\n return docNodeToTeX(node)\n case NodeType.listItem:\n return listItemNodeToTeX(node)\n case NodeType.orderedList:\n return orderedListNodeToTeX(node)\n case NodeType.paragraph:\n return paragraphNodeToTeX(node)\n case NodeType.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 MarkType.bold:\n return `\\\\textbf{${text}}`\n case MarkType.italic:\n return `\\\\textit{${text}}`\n case MarkType.underline:\n return `\\\\underline{${text}}`\n case MarkType.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 { DocNode } from '@/compiler'\nimport type { Parser } from './interface'\n\n/**\n * This parser is used to parse the tiptap JSON format to the AST.\n *\n * Under the hood the implementation is pretty naive, it just parses the JSON\n * string to a DocNode because we use tiptap editor in frontend, so it is\n * guaranteed that the JSON stored by tiptap editor is valid as a tiptap\n * document.\n *\n * @see https://tiptap.dev/docs/editor/core-concepts/schema#parse\n */\nexport class TiptapParser implements Parser {\n /**\n * Parse a tiptap JSON string into an AST node.\n *\n * @param input - The tiptap JSON string to parse.\n * @returns The parsed AST node.\n */\n parse(input: string): DocNode {\n return JSON.parse(input) as DocNode\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 { Root, RootContent } from 'mdast'\nimport remarkParse from 'remark-parse'\nimport { unified } from 'unified'\n\nimport {\n type BoldMark,\n type ItalicMark,\n type LinkMark,\n type Mark,\n MarkType,\n NodeType,\n type Node as TiptapNode,\n} from '@/compiler/ast'\nimport type { Parser } from './interface'\n\n/**\n * Parse markdown to tiptap nodes\n *\n * Under the hood this class first parse the markdown to mdast and then\n * transform the mdast to tiptap nodes.\n *\n * @see {@link Parser}\n */\nexport class MarkdownParser implements Parser {\n /**\n * Parse markdown to tiptap nodes\n *\n * @param input - The markdown input to parse\n * @returns The tiptap node\n */\n parse(input: string): TiptapNode {\n const ast = unified().use(remarkParse).parse(input)\n return transform(ast)\n }\n}\n\n/**\n * Transforms an mdast node (or content) into Tiptap node(s).\n *\n * This is a recursive descent tree walker that traverses the mdast node and\n * transforms it into a Tiptap 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 Tiptap node, an array of Tiptap 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: NodeType.doc,\n content: ast.children\n .flatMap((child) => transform(child, marks))\n .filter(Boolean),\n }\n\n case 'paragraph':\n return {\n type: NodeType.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: NodeType.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: MarkType.bold }\n return processChildrenWithMarks(ast.children, [...marks, boldMark])\n }\n\n case 'emphasis': {\n const italicMark: ItalicMark = { type: MarkType.italic }\n return processChildrenWithMarks(ast.children, [...marks, italicMark])\n }\n\n case 'link': {\n const linkMark: LinkMark = {\n type: MarkType.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: NodeType.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 ? NodeType.orderedList : NodeType.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 Tiptap node if only one results from the children,\n * otherwise an array of the transformed Tiptap 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 {\n type Country,\n Degree,\n Language,\n LanguageFluency,\n LocaleLanguageOption,\n SkillLevel,\n englishCountryNames,\n simplifiedChineseCountryNames,\n spanishCountryNames,\n traditionalChineseCountryHKNames,\n traditionalChineseCountryTWNames,\n} from '@/data'\nimport type { SectionID } from '@/types'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific terms used within resume sections that require translation. */\nexport enum ResumeTerms {\n /** The term for academic score or GPA. */\n Score = 'Score',\n}\n\n/** Defines the structure for translated terms for a single language. */\ntype TermsTranslationValue = {\n /** Translations for degree types. */\n education: 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 location: 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 /** Translations for specific resume terms defined in `ResumeTerms`. */\n terms: Record<ResumeTerms, string>\n}\n\n/** The structure containing translations for all supported languages. */\ntype TermsTranslation = Record<LocaleLanguageOption, TermsTranslationValue>\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 getTermsTranslations(\n language?: LocaleLanguageOption\n): TermsTranslationValue {\n const termsTranslations: TermsTranslation = {\n [LocaleLanguageOption.English]: {\n education: {\n [Degree.MiddleSchool]: 'Middle School',\n [Degree.HighSchool]: 'High School',\n [Degree.Diploma]: 'Diploma',\n [Degree.Associate]: 'Associate',\n [Degree.Bachelor]: 'Bachelor',\n [Degree.Master]: 'Master',\n [Degree.Doctor]: 'Doctor',\n },\n languages: {\n [Language.Arabic]: 'Arabic',\n [Language.Bengali]: 'Bengali',\n [Language.Bhojpuri]: 'Bhojpuri',\n [Language.Cantonese]: 'Cantonese',\n [Language.Chinese]: 'Chinese',\n [Language.Dutch]: 'Dutch',\n [Language.English]: 'English',\n [Language.French]: 'French',\n [Language.German]: 'German',\n [Language.Gujarati]: 'Gujarati',\n [Language.Hausa]: 'Hausa',\n [Language.Hindi]: 'Hindi',\n [Language.Indonesian]: 'Indonesian',\n [Language.Italian]: 'Italian',\n [Language.Japanese]: 'Japanese',\n [Language.Javanese]: 'Javanese',\n [Language.Korean]: 'Korean',\n [Language.Marathi]: 'Marathi',\n [Language.Mandarin]: 'Mandarin',\n [Language.Portuguese]: 'Portuguese',\n [Language.Russian]: 'Russian',\n [Language.Spanish]: 'Spanish',\n [Language.Tamil]: 'Tamil',\n [Language.Turkish]: 'Turkish',\n [Language.Urdu]: 'Urdu',\n [Language.Vietnamese]: 'Vietnamese',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: 'Elementary Proficiency',\n [LanguageFluency.LimitedWorkingProficiency]:\n 'Limited Working Proficiency',\n [LanguageFluency.MinimumProfessionalProficiency]:\n 'Minimum Professional Proficiency',\n [LanguageFluency.FullProfessionalProficiency]:\n 'Full Professional Proficiency',\n [LanguageFluency.NativeOrBilingualProficiency]:\n 'Native or Bilingual Proficiency',\n },\n location: englishCountryNames,\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 [SkillLevel.Novice]: 'Novice',\n [SkillLevel.Beginner]: 'Beginner',\n [SkillLevel.Intermediate]: 'Intermediate',\n [SkillLevel.Advanced]: 'Advanced',\n [SkillLevel.Expert]: 'Expert',\n [SkillLevel.Master]: 'Master',\n },\n terms: {\n [ResumeTerms.Score]: 'Score',\n },\n },\n [LocaleLanguageOption.SimplifiedChinese]: {\n education: {\n [Degree.MiddleSchool]: '初中',\n [Degree.HighSchool]: '高中',\n [Degree.Diploma]: '专科',\n [Degree.Associate]: '副学士',\n [Degree.Bachelor]: '学士',\n [Degree.Master]: '硕士',\n [Degree.Doctor]: '博士',\n },\n languages: {\n [Language.Arabic]: '阿拉伯语',\n [Language.Bengali]: '孟加拉语',\n [Language.Bhojpuri]: '博杰普尔语',\n [Language.Cantonese]: '粤语',\n [Language.Chinese]: '中文',\n [Language.Dutch]: '荷兰语',\n [Language.English]: '英语',\n [Language.French]: '法语',\n [Language.German]: '德语',\n [Language.Gujarati]: '古吉拉特语',\n [Language.Hausa]: '豪萨语',\n [Language.Hindi]: '印地语',\n [Language.Indonesian]: '印度尼西亚语',\n [Language.Italian]: '意大利语',\n [Language.Japanese]: '日语',\n [Language.Javanese]: '爪哇语',\n [Language.Korean]: '韩语',\n [Language.Marathi]: '马拉地语',\n [Language.Mandarin]: '普通话',\n [Language.Portuguese]: '葡萄牙语',\n [Language.Russian]: '俄语',\n [Language.Spanish]: '西班牙语',\n [Language.Tamil]: '泰米尔语',\n [Language.Turkish]: '土耳其语',\n [Language.Urdu]: '乌尔都语',\n [Language.Vietnamese]: '越南语',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: '初级水平',\n [LanguageFluency.LimitedWorkingProficiency]: '有限工作水平',\n [LanguageFluency.MinimumProfessionalProficiency]: '最低专业水平',\n [LanguageFluency.FullProfessionalProficiency]: '完全专业水平',\n [LanguageFluency.NativeOrBilingualProficiency]: '母语或双语水平',\n },\n location: simplifiedChineseCountryNames,\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 [SkillLevel.Novice]: '新手',\n [SkillLevel.Beginner]: '初级',\n [SkillLevel.Intermediate]: '中级',\n [SkillLevel.Advanced]: '高级',\n [SkillLevel.Expert]: '专家',\n [SkillLevel.Master]: '大师',\n },\n terms: {\n [ResumeTerms.Score]: '成绩',\n },\n },\n [LocaleLanguageOption.TraditionalChineseHK]: {\n education: {\n [Degree.MiddleSchool]: '初中',\n [Degree.HighSchool]: '高中',\n [Degree.Diploma]: '專科',\n [Degree.Associate]: '副學士',\n [Degree.Bachelor]: '學士',\n [Degree.Master]: '碩士',\n [Degree.Doctor]: '博士',\n },\n languages: {\n [Language.Arabic]: '阿拉伯語',\n [Language.Bengali]: '孟加拉語',\n [Language.Bhojpuri]: '博傑普爾語',\n [Language.Cantonese]: '粵語',\n [Language.Chinese]: '中文',\n [Language.Dutch]: '荷蘭語',\n [Language.English]: '英語',\n [Language.French]: '法語',\n [Language.German]: '德語',\n [Language.Gujarati]: '古吉拉特語',\n [Language.Hausa]: '豪薩語',\n [Language.Hindi]: '印地語',\n [Language.Indonesian]: '印度尼西亞語',\n [Language.Italian]: '意大利語',\n [Language.Japanese]: '日語',\n [Language.Javanese]: '爪哇語',\n [Language.Korean]: '韓語',\n [Language.Marathi]: '馬拉地語',\n [Language.Mandarin]: '普通話',\n [Language.Portuguese]: '葡萄牙語',\n [Language.Russian]: '俄語',\n [Language.Spanish]: '西班牙語',\n [Language.Tamil]: '泰米爾語',\n [Language.Turkish]: '土耳其語',\n [Language.Urdu]: '烏爾都語',\n [Language.Vietnamese]: '越南語',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: '初級水平',\n [LanguageFluency.LimitedWorkingProficiency]: '有限工作水平',\n [LanguageFluency.MinimumProfessionalProficiency]: '最低專業水平',\n [LanguageFluency.FullProfessionalProficiency]: '完全專業水平',\n [LanguageFluency.NativeOrBilingualProficiency]: '母語或雙語水平',\n },\n location: traditionalChineseCountryHKNames,\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 [SkillLevel.Novice]: '新手',\n [SkillLevel.Beginner]: '初級',\n [SkillLevel.Intermediate]: '中級',\n [SkillLevel.Advanced]: '高級',\n [SkillLevel.Expert]: '專家',\n [SkillLevel.Master]: '大師',\n },\n terms: {\n [ResumeTerms.Score]: '成績',\n },\n },\n [LocaleLanguageOption.TraditionalChineseTW]: {\n education: {\n [Degree.MiddleSchool]: '初中',\n [Degree.HighSchool]: '高中',\n [Degree.Diploma]: '專科',\n [Degree.Associate]: '副學士',\n [Degree.Bachelor]: '學士',\n [Degree.Master]: '碩士',\n [Degree.Doctor]: '博士',\n },\n languages: {\n [Language.Arabic]: '阿拉伯語',\n [Language.Bengali]: '孟加拉語',\n [Language.Bhojpuri]: '博傑普爾語',\n [Language.Cantonese]: '粵語',\n [Language.Chinese]: '中文',\n [Language.Dutch]: '荷蘭語',\n [Language.English]: '英語',\n [Language.French]: '法語',\n [Language.German]: '德語',\n [Language.Gujarati]: '古吉拉特語',\n [Language.Hausa]: '豪薩語',\n [Language.Hindi]: '印地語',\n [Language.Indonesian]: '印度尼西亞語',\n [Language.Italian]: '意大利語',\n [Language.Japanese]: '日語',\n [Language.Javanese]: '爪哇語',\n [Language.Korean]: '韓語',\n [Language.Marathi]: '馬拉地語',\n [Language.Mandarin]: '普通話',\n [Language.Portuguese]: '葡萄牙語',\n [Language.Russian]: '俄語',\n [Language.Spanish]: '西班牙語',\n [Language.Tamil]: '泰米爾語',\n [Language.Turkish]: '土耳其語',\n [Language.Urdu]: '烏爾都語',\n [Language.Vietnamese]: '越南語',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: '初級水平',\n [LanguageFluency.LimitedWorkingProficiency]: '有限工作水平',\n [LanguageFluency.MinimumProfessionalProficiency]: '最低專業水平',\n [LanguageFluency.FullProfessionalProficiency]: '完全專業水平',\n [LanguageFluency.NativeOrBilingualProficiency]: '母語或雙語水平',\n },\n location: traditionalChineseCountryTWNames,\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 [SkillLevel.Novice]: '新手',\n [SkillLevel.Beginner]: '初級',\n [SkillLevel.Intermediate]: '中級',\n [SkillLevel.Advanced]: '高級',\n [SkillLevel.Expert]: '專家',\n [SkillLevel.Master]: '大師',\n },\n terms: {\n [ResumeTerms.Score]: '成績',\n },\n },\n [LocaleLanguageOption.Spanish]: {\n education: {\n [Degree.MiddleSchool]: 'Escuela secundaria',\n [Degree.HighSchool]: 'Título de secundaria',\n [Degree.Diploma]: 'Diploma',\n [Degree.Associate]: 'Grado de asociado',\n [Degree.Bachelor]: 'Licenciatura',\n [Degree.Master]: 'Maestría',\n [Degree.Doctor]: 'Doctorado',\n },\n languages: {\n [Language.Arabic]: 'Árabe',\n [Language.Bengali]: 'Bengalí',\n [Language.Bhojpuri]: 'Bhojpuri',\n [Language.Cantonese]: 'Cantonés',\n [Language.Chinese]: 'Chino',\n [Language.Dutch]: 'Neerlandés',\n [Language.English]: 'Inglés',\n [Language.French]: 'Francés',\n [Language.German]: 'Alemán',\n [Language.Gujarati]: 'Gujarati',\n [Language.Hausa]: 'Hausa',\n [Language.Hindi]: 'Hindi',\n [Language.Indonesian]: 'Indonesio',\n [Language.Italian]: 'Italiano',\n [Language.Japanese]: 'Japonés',\n [Language.Javanese]: 'Javanés',\n [Language.Korean]: 'Coreano',\n [Language.Marathi]: 'Marathi',\n [Language.Mandarin]: 'Mandarin',\n [Language.Portuguese]: 'Portugués',\n [Language.Russian]: 'Ruso',\n [Language.Spanish]: 'Español',\n [Language.Tamil]: 'Tamil',\n [Language.Turkish]: 'Turco',\n [Language.Urdu]: 'Urdu',\n [Language.Vietnamese]: 'Vietnamita',\n },\n languageFluencies: {\n [LanguageFluency.ElementaryProficiency]: 'Competencia elemental',\n [LanguageFluency.LimitedWorkingProficiency]:\n 'Competencia limitada de trabajo',\n [LanguageFluency.MinimumProfessionalProficiency]:\n 'Competencia profesional de trabajo',\n [LanguageFluency.FullProfessionalProficiency]:\n 'Competencia profesional plena',\n [LanguageFluency.NativeOrBilingualProficiency]:\n 'Competencia nativa o bilingüe',\n },\n location: spanishCountryNames,\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 [SkillLevel.Novice]: 'Novato',\n [SkillLevel.Beginner]: 'Principiante',\n [SkillLevel.Intermediate]: 'Intermedio',\n [SkillLevel.Advanced]: 'Avanzado',\n [SkillLevel.Expert]: 'Experto',\n [SkillLevel.Master]: 'Maestro',\n },\n terms: {\n [ResumeTerms.Score]: 'Puntuación',\n },\n },\n }\n\n return termsTranslations[\n isEmptyValue(language) ? LocaleLanguageOption.English : language\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 { LocaleLanguageOption } from '@/data'\nimport { isEmptyValue } from '@/utils'\n\n/** Specific punctuation types used for formatting within templates. */\nexport enum Punctuation {\n /** Standard comma, often used between items in a sentence. */\n Comma = 'Comma',\n /** Standard colon, often used before lists or details. */\n Colon = 'Colon',\n /** Separator used specifically for lists of items (e.g., keywords, courses),\n * which might differ from a standard comma in some languages. */\n Separator = 'Separator',\n}\n\n/** Specific terms used within the template structure that need translation. */\nexport enum TemplateTerms {\n /** The heading or label for a list of courses. */\n Courses = 'Courses',\n /** The heading or label for a list of keywords. */\n Keywords = 'Keywords',\n}\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 `TemplateTerms`. */\n terms: Record<TemplateTerms, 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 [LocaleLanguageOption.English]: {\n punctuations: {\n [Punctuation.Comma]: ', ',\n [Punctuation.Colon]: ': ',\n [Punctuation.Separator]: ', ',\n },\n terms: {\n [TemplateTerms.Courses]: 'Courses',\n [TemplateTerms.Keywords]: 'Keywords',\n },\n },\n [LocaleLanguageOption.SimplifiedChinese]: {\n punctuations: {\n [Punctuation.Comma]: ',',\n [Punctuation.Colon]: ':',\n [Punctuation.Separator]: '、',\n },\n terms: {\n [TemplateTerms.Courses]: '课程',\n [TemplateTerms.Keywords]: '关键字',\n },\n },\n [LocaleLanguageOption.TraditionalChineseHK]: {\n punctuations: {\n [Punctuation.Comma]: ',',\n [Punctuation.Colon]: ':',\n [Punctuation.Separator]: '、',\n },\n terms: {\n [TemplateTerms.Courses]: '課程',\n [TemplateTerms.Keywords]: '關鍵字',\n },\n },\n [LocaleLanguageOption.TraditionalChineseTW]: {\n punctuations: {\n [Punctuation.Comma]: ',',\n [Punctuation.Colon]: ':',\n [Punctuation.Separator]: '、',\n },\n terms: {\n [TemplateTerms.Courses]: '課程',\n [TemplateTerms.Keywords]: '關鍵字',\n },\n },\n [LocaleLanguageOption.Spanish]: {\n punctuations: {\n [Punctuation.Comma]: ', ',\n [Punctuation.Colon]: ': ',\n [Punctuation.Separator]: ', ',\n },\n terms: {\n [TemplateTerms.Courses]: 'Cursos',\n [TemplateTerms.Keywords]: 'Palabras clave',\n },\n },\n }\n\n return templateTranslation[\n isEmptyValue(language) ? LocaleLanguageOption.English : language\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 { capitalize, cloneDeep, isArray, merge } from 'lodash-es'\n\nimport { LatexCodeGenerator, type Parser } from '@/compiler'\nimport { LocaleLanguageOption, defaultResumeLayout } from '@/data'\nimport {\n ResumeTerms,\n getTemplateTranslations,\n getTermsTranslations,\n} from '@/translations'\nimport {\n FontSpecNumbersStyle,\n type ProfileItem,\n type Resume,\n type ResumeContent,\n} 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 from\n // `tiptap.ts` 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 { education, terms } = getTermsTranslations(\n resume.layout.locale?.language\n )\n\n resume.content.education.forEach((item) => {\n const degree = showIf(!isEmptyValue(item.degree), education[item.degree])\n const score = terms[ResumeTerms.Score]\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 const { languages, languageFluencies } = getTermsTranslations(\n resume.layout.locale?.language\n )\n\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: languages[item.language],\n fluency: languageFluencies[item.fluency],\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 { location } = getTermsTranslations(resume.layout.locale?.language)\n\n switch (resume.layout.locale?.language) {\n case LocaleLanguageOption.SimplifiedChinese:\n case LocaleLanguageOption.TraditionalChineseHK:\n case LocaleLanguageOption.TraditionalChineseTW: {\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 = [\n location[resume.content.location.country],\n resume.content.location.region,\n ]\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 location[resume.content.location.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 const { skills } = getTermsTranslations(resume.layout.locale?.language)\n resume.content.skills.forEach((item) => {\n item.computed = {\n ...item.computed,\n level: showIf(!isEmptyValue(item.level), skills[item.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 const { sections } = getTermsTranslations(resume.layout.locale?.language)\n\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] = sections[sectionName]\n\n return translations\n },\n {}\n ),\n }\n\n return resume\n}\n\n/**\n * Parses the `summary` field (assumed to be Tiptap JSON or Markdown, based on\n * the parser) in various sections and converts it into LaTeX code using the\n * 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` or\n * `TiptapParser`).\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 !== FontSpecNumbersStyle.Auto\n ) {\n return resume\n }\n\n switch (resume.layout.locale?.language) {\n case LocaleLanguageOption.SimplifiedChinese:\n case LocaleLanguageOption.TraditionalChineseHK:\n case LocaleLanguageOption.TraditionalChineseTW:\n resume.layout.typography.fontSpec = {\n ...resume.layout.typography.fontSpec,\n numbers: FontSpecNumbersStyle.Lining,\n }\n break\n default:\n resume.layout.typography.fontSpec = {\n ...resume.layout.typography.fontSpec,\n numbers: FontSpecNumbersStyle.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 { LocaleLanguageOption } from '@/data'\nimport { getTemplateTranslations } from '@/translations'\nimport type { Resume } from '@/types'\nimport { joinNonEmptyString, showIf } from '@/utils'\n\nexport enum DocumentClass {\n Moderncv = 'moderncv',\n}\n\n/**\n * Enum representing 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 * @property {string} Banking - A modern, professional style with a\n * banking/financial aesthetic\n * @property {string} Classic - A traditional CV style with a clean, formal\n * layout\n * @property {string} Casual - A more relaxed style while maintaining\n * professionalism\n *\n * @see {@link https://github.com/yamlresume/community/issues/117}\n */\nexport enum ModerncvStyle {\n Banking = 'banking',\n Classic = 'classic',\n Casual = 'casual',\n}\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 [\n LocaleLanguageOption.SimplifiedChinese,\n LocaleLanguageOption.TraditionalChineseHK,\n LocaleLanguageOption.TraditionalChineseTW,\n ].includes(resume.layout.locale?.language)\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 === LocaleLanguageOption.Spanish\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 ModerncvStyle.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 ModerncvStyle.Classic:\n case ModerncvStyle.Casual:\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 {\n isEmptyString,\n isEmptyValue,\n joinNonEmptyString,\n showIf,\n} from '@/utils'\nimport { Renderer } from './base'\nimport {\n DocumentClass,\n 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, DocumentClass.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(!isEmptyString(name), name)}}{}`,\n showIf(!isEmptyString(headline), `\\\\title{${headline}}`),\n showIf(!isEmptyString(phone), `\\\\phone[mobile]{${phone}}`),\n showIf(!isEmptyString(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(!isEmptyString(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(!isEmptyString(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: { Courses },\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(!isEmptyString(startDate), dateRange)}}\n {${degreeAreaAndScore}}\n {${institution}}\n {${showIf(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyString(summary) || !isEmptyValue(courses),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyValue(courses),\n `\\\\textbf{${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: { Keywords },\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(!isEmptyString(startDate), dateRange)}}\n {${position}}\n {${name}}\n {${showIf(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyString(summary) || !isEmptyString(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyString(keywords),\n `\\\\textbf{${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 terms: { Keywords },\n punctuations: { Colon },\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 !isEmptyString(keywords),\n ` \\\\hfill \\\\textbf{${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 terms: { Keywords },\n punctuations: { Colon },\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 !isEmptyString(keywords),\n ` \\\\hfill \\\\textbf{${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(!isEmptyString(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(!isEmptyString(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 ModerncvStyle.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 ModerncvStyle.Casual:\n case ModerncvStyle.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(!isEmptyString(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 terms: { Keywords },\n punctuations: { Colon },\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(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(\n !isEmptyString(summary) || !isEmptyString(keywords),\n `${joinNonEmptyString(\n [\n summary,\n showIf(\n !isEmptyString(keywords),\n `\\\\textbf{${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(!isEmptyString(url), `\\\\href{${url}}{${url}}`)}}\n {}\n {${showIf(!isEmptyString(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, ModerncvStyle.Banking, 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, ModerncvStyle.Classic, 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, ModerncvStyle.Casual, summaryParser)\n }\n}\n\nexport {\n ModerncvBase,\n ModerncvBankingRenderer,\n ModerncvClassicRenderer,\n ModerncvCasualRenderer,\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 { Parser } from '@/compiler'\nimport { TemplateOption } from '@/data'\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 [TemplateOption.ModerncvBanking]: ModerncvBankingRenderer,\n [TemplateOption.ModerncvClassic]: ModerncvClassicRenderer,\n [TemplateOption.ModerncvCasual]: ModerncvCasualRenderer,\n}\n\n/**\n * Get the appropriate resume renderer based on the provided resume.\n *\n * @param {Resume} resume - The resume object\n * @returns {Renderer} The renderer instance for the specified template.\n */\nexport function getResumeRenderer(\n resume: Resume,\n summaryParser: Parser\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"]}
|