Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions apps/university-web/next.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,14 @@ const nextConfig = {
typescript: {
ignoreBuildErrors: true,
},
async rewrites() {
return [
{
source: "/university-static/images/language/:path*",
destination: "/images/language/:path*",
},
];
},
...(shouldRunBundleAnalyzer
? {
webpack: (config) => {
Expand Down
52 changes: 36 additions & 16 deletions apps/university-web/src/utils/languageUtils.ts
Original file line number Diff line number Diff line change
@@ -1,27 +1,47 @@
export const DEFAULT_LANGUAGE_TEST_LOGO_SRC = "/images/language/default.png";
const LANGUAGE_TEST_LOGO_BASE_PATH = "/university-static/images/language";

export const DEFAULT_LANGUAGE_TEST_LOGO_SRC = `${LANGUAGE_TEST_LOGO_BASE_PATH}/default.png`;

export const logoMap = {
TOEIC: "/images/language/toeic.png",
TOEFL_IBT: "/images/language/toefl_ibt.png",
TOEFL_ITP: "/images/language/toefl_itp.png",
IELTS: "/images/language/ielts.png",
JLPT: "/images/language/jlpt.png",
NEW_HSK: "/images/language/new_hsk.png",
ETC: "/images/language/etc.png",
DALF: "/images/language/dalf.png",
DELF: "/images/language/delf.jpg",
CEFR: "/images/language/cefr.png",
TCF: "/images/language/tcf.png",
TEF: "/images/language/tef.png",
DUOLINGO: "/images/language/duolingo.svg",
TOEIC: `${LANGUAGE_TEST_LOGO_BASE_PATH}/toeic.png`,
TOEFL_IBT: `${LANGUAGE_TEST_LOGO_BASE_PATH}/toefl_ibt.png`,
TOEFL_ITP: `${LANGUAGE_TEST_LOGO_BASE_PATH}/toefl_itp.png`,
IELTS: `${LANGUAGE_TEST_LOGO_BASE_PATH}/ielts.png`,
JLPT: `${LANGUAGE_TEST_LOGO_BASE_PATH}/jlpt.png`,
NEW_HSK: `${LANGUAGE_TEST_LOGO_BASE_PATH}/new_hsk.png`,
ETC: `${LANGUAGE_TEST_LOGO_BASE_PATH}/etc.png`,
DALF: `${LANGUAGE_TEST_LOGO_BASE_PATH}/dalf.png`,
DELF: `${LANGUAGE_TEST_LOGO_BASE_PATH}/delf.jpg`,
CEFR: `${LANGUAGE_TEST_LOGO_BASE_PATH}/cefr.png`,
TCF: `${LANGUAGE_TEST_LOGO_BASE_PATH}/tcf.png`,
TEF: `${LANGUAGE_TEST_LOGO_BASE_PATH}/tef.png`,
DUOLINGO: `${LANGUAGE_TEST_LOGO_BASE_PATH}/duolingo.svg`,
} as const;

type LanguageTestLogoType = keyof typeof logoMap;

const languageTestLogoAliases: Record<string, LanguageTestLogoType> = {
HSK: "NEW_HSK",
DUOLINGO_ENGLISH_TEST: "DUOLINGO",
};

const normalizeLanguageTestLogoType = (type: string): LanguageTestLogoType | undefined => {
const normalizedType = type
.trim()
.toUpperCase()
.replace(/[./]/g, "")
.replace(/[\s-]+/g, "_");
const logoType = languageTestLogoAliases[normalizedType] ?? normalizedType;

return logoType in logoMap ? (logoType as LanguageTestLogoType) : undefined;
};
Comment on lines +28 to +37

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

1. 구분자 정규화 순서, 한 번만 더 점검해주세요!

./를 먼저 언더스코어 없이 완전히 지워버리고, 그 다음에야 공백·하이픈만 _로 바꾸고 있어요. 이 순서라면:

  • "TOEFL.IBT""TOEFLIBT" (언더스코어 없음)
  • "TOEFL/IBT""TOEFLIBT" (언더스코어 없음)

둘 다 logoMap"TOEFL_IBT" 키와 매칭되지 않아, 정작 존재하는 로고인데도 기본 로고로 폴백돼버려요. PR 목표가 "., /, 공백, 하이픈과 같은 구분자 정규화"인데, ./만 구분자 취급을 못 받고 있는 셈이죠.

한 번에 처리하도록 정규식을 합쳐주시면 의도한 동작을 회복할 수 있어요.

🔧 제안하는 수정
   const normalizedType = type
     .trim()
     .toUpperCase()
-    .replace(/[./]/g, "")
-    .replace(/[\s-]+/g, "_");
+    .replace(/[\s./-]+/g, "_");
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const normalizeLanguageTestLogoType = (type: string): LanguageTestLogoType | undefined => {
const normalizedType = type
.trim()
.toUpperCase()
.replace(/[./]/g, "")
.replace(/[\s-]+/g, "_");
const logoType = languageTestLogoAliases[normalizedType] ?? normalizedType;
return logoType in logoMap ? (logoType as LanguageTestLogoType) : undefined;
};
const normalizeLanguageTestLogoType = (type: string): LanguageTestLogoType | undefined => {
const normalizedType = type
.trim()
.toUpperCase()
.replace(/[\s./-]+/g, "_");
const logoType = languageTestLogoAliases[normalizedType] ?? normalizedType;
return logoType in logoMap ? (logoType as LanguageTestLogoType) : undefined;
};
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/university-web/src/utils/languageUtils.ts` around lines 28 - 37, The
normalization in normalizeLanguageTestLogoType is stripping "." and "/" before
converting separators to underscores, which prevents values like TOEFL.IBT and
TOEFL/IBT from matching the TOEFL_IBT key in logoMap. Update the separator
handling so all delimiters are normalized consistently in one pass, and keep the
alias lookup and logoMap check in normalizeLanguageTestLogoType aligned with the
intended underscore-based keys.


export const getLanguageTestLogo = (type: string): string => {
return type in logoMap ? logoMap[type as LanguageTestLogoType] : DEFAULT_LANGUAGE_TEST_LOGO_SRC;
const logoType = normalizeLanguageTestLogoType(type);

return logoType ? logoMap[logoType] : DEFAULT_LANGUAGE_TEST_LOGO_SRC;
};

export const formatLanguageTestName = (type: string): string => {
return type.replace(/_/g, " ");
return type.trim().replace(/_/g, " ");
};
Loading