sales-frontend-utils 0.0.11 → 0.0.12

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.cjs CHANGED
@@ -379,8 +379,40 @@ var _MessageEventManager = class _MessageEventManager {
379
379
  __publicField(_MessageEventManager, "instance");
380
380
  var MessageEventManager = _MessageEventManager;
381
381
 
382
+ // src/utils/canvas-utils.ts
383
+ var convertTextToImg = ({
384
+ targetStr,
385
+ canvasWidth,
386
+ canvasHeight,
387
+ backgroundColor,
388
+ fontColor,
389
+ fontSize,
390
+ fontWeight
391
+ }) => {
392
+ const canvas = document.createElement("canvas");
393
+ const ctx = canvas.getContext("2d");
394
+ if (!ctx) {
395
+ throw new Error("Canvas context\uB97C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
396
+ }
397
+ const defaultHeight = 150;
398
+ const calculatedWidth = targetStr.length * 70;
399
+ canvas.width = canvasWidth ?? calculatedWidth;
400
+ canvas.height = canvasHeight ?? defaultHeight;
401
+ if (backgroundColor) {
402
+ ctx.fillStyle = backgroundColor;
403
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
404
+ }
405
+ ctx.fillStyle = fontColor ?? "black";
406
+ ctx.font = `${fontSize ?? 75}px ${fontWeight ?? "bold"}`;
407
+ ctx.textAlign = "center";
408
+ ctx.textBaseline = "middle";
409
+ ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);
410
+ return canvas.toDataURL();
411
+ };
412
+
382
413
  exports.MessageEventManager = MessageEventManager;
383
414
  exports.checkUserAgentDspApp = checkUserAgentDspApp;
415
+ exports.convertTextToImg = convertTextToImg;
384
416
  exports.debounce = debounce;
385
417
  exports.getApiHostNameFromEnvironment = getApiHostNameFromEnvironment;
386
418
  exports.getBrowserName = getBrowserName;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/timing-utils.ts","../src/utils/environment-utils.ts","../src/utils/user-agent-utils.ts","../src/utils/event-handler-utils.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 쓰로틀\n * @param func\n * @param delay\n * @returns\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n // 마지막 호출로부터 delay 시간이 지났으면 즉시 실행\n lastCall = now;\n func(...args);\n } else if (!timeout) {\n // 대기 중인 타이머가 없으면 새로운 타이머 설정\n timeout = setTimeout(\n () => {\n lastCall = Date.now();\n func(...args);\n timeout = null;\n },\n delay - (now - lastCall)\n );\n }\n };\n}\n\n/**\n * 디바운스\n * @param func\n * @param delay\n * @returns\n */\nexport function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n timeout = null;\n }, delay);\n };\n}\n","/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost:')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://nxl-dsp-dev.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://nxl-dsp-stg.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://nxl-dsp.hanwhalife.com';\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://dev-dsp-static.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://stg-dsp-static.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://dsp-static.hanwhalife.com';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n","import { ExecutionEnvironment, OSName, BrowserName } from '../types/common.types';\n\nimport { isClient } from './environment-utils';\n/**\n * 한화생명 영업지원 웹 실행 환경 탐지\n * @returns\n */\nexport const getDspExecutionEnvironment = (): ExecutionEnvironment => {\n if (!isClient()) {\n return 'unknown';\n }\n\n if (window.n2Bridge) {\n return 'android-webview';\n }\n\n if (window.webkit) {\n return 'ios-webview';\n }\n\n if (window.self !== window.top) {\n return 'iframe';\n }\n\n return 'web';\n};\n\n/**\n * UserAgent에 SspApp 이 있는지 검사\n * 있으면, DSP 앱\n * @param userAgent\n * @returns\n */\nexport const checkUserAgentDspApp = (userAgent: string) => {\n return userAgent.toLowerCase().includes('sspapp');\n};\n\n/**\n * 한화생명 영업지원 웹뷰 환경 여부 판단\n * @returns 웹뷰(Android/iOS) 환경이면 true, 아니면 false\n */\nexport const isDspApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) && (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * FP 플래너 웹뷰 환경 여부 판단\n * @returns\n */\nexport const isFpPlannerApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) === false &&\n (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * 영업 포털 환경 여부 판단\n * @returns\n */\nexport const isSalesPortal = () => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return environment === 'iframe';\n};\n\n/**\n * 태블릿 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isTablet = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 태블릿\n ua.includes('ipad') ||\n // Android 태블릿 (Mobile 키워드 없음)\n (ua.includes('android') && !ua.includes('mobile')) ||\n // 명시적 태블릿 키워드\n ua.includes('tablet') ||\n // Amazon 태블릿\n ua.includes('kindle') ||\n ua.includes('silk') ||\n /kf[a-z]{2}wi|kftt/.test(ua) ||\n // BlackBerry 태블릿\n ua.includes('playbook') ||\n // 삼성 갤럭시 탭 (개선된 정규식)\n /gt-p\\d{4}|sm-[tp]\\d{3}/.test(ua) ||\n // 구글 넥서스/픽셀 태블릿\n /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) ||\n // 기타 브랜드 태블릿\n /xoom|transformer|mediapad|mipad|tab\\s/.test(ua) ||\n // Windows 태블릿 (개선된 조건)\n (ua.includes('windows') && (ua.includes('touch') || ua.includes('tablet'))) ||\n ua.includes('surface')\n );\n};\n\n/**\n * 스마트폰 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPhone = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 모바일\n ua.includes('iphone') ||\n ua.includes('ipod') ||\n // Android 스마트폰 (Mobile 키워드 있음)\n (ua.includes('android') && ua.includes('mobile')) ||\n // BlackBerry\n ua.includes('blackberry') ||\n ua.includes('bb10') ||\n // Windows Mobile\n ua.includes('windows phone') ||\n ua.includes('windows mobile') ||\n ua.includes('iemobile') ||\n // Opera Mobile\n ua.includes('opera mini') ||\n ua.includes('opera mobi') ||\n // 기타 모바일 브라우저\n (ua.includes('mobile') &&\n (ua.includes('firefox') || ua.includes('chrome') || ua.includes('safari') || ua.includes('edge'))) ||\n // 모바일 키워드 (태블릿 제외)\n (ua.includes('mobile') && !ua.includes('tablet')) ||\n // 삼성 갤럭시 폰 (개선)\n /sm-[a-z]\\d{3}[a-z]?|gt-[a-z]\\d{4}/.test(ua) ||\n // LG, HTC 폰\n /lg-[a-z]\\d{3,4}|htc[_\\s]/.test(ua) ||\n // 화웨이/샤오미 등 (개선)\n /huawei|honor|redmi|mi[\\s\\d]|oneplus|oppo|vivo/.test(ua)\n );\n};\n\n/**\n * 데스크톱 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPc = (userAgent: string) => {\n const ua = userAgent.toLowerCase();\n\n return !isPhone(ua) && !isTablet(ua);\n};\n\n/**\n * UserAgent에서 기기 타입 구분\n * @param userAgent\n * @returns\n */\nexport const getFormFactorFromUserAgent = (userAgent: string) => {\n if (!userAgent) {\n return 'pc';\n }\n\n const ua = userAgent.toLowerCase();\n\n if (isTablet(ua)) {\n return 'tablet';\n }\n\n if (isPhone(ua)) {\n return 'phone';\n }\n\n return 'pc';\n};\n\n/**\n * UserAgent에서 운영체제 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 운영체제 이름\n */\nexport const getOSName = (userAgent: string): OSName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 체크 (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(ua)) {\n return 'ios';\n }\n\n // Android 체크\n if (ua.includes('android')) {\n return 'android';\n }\n\n // Windows 체크\n if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) {\n return 'windows';\n }\n\n // macOS 체크 (Mac OS X, macOS)\n if (ua.includes('mac os x') || ua.includes('macos') || ua.includes('macintosh')) {\n return 'mac';\n }\n\n // Linux 체크 (Android 제외)\n if (ua.includes('linux') && !ua.includes('android')) {\n return 'linux';\n }\n\n return 'unknown';\n};\n\n/**\n * 현재 브라우저의 운영체제 이름을 가져오기\n * @returns 현재 환경의 운영체제 이름\n */\nexport const getCurrentOSName = (): OSName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSName(navigator.userAgent);\n};\n\n/**\n * UserAgent에서 OS 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns OS 버전 문자열\n */\nexport const getOSVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 버전 (iPhone OS 15_0, iPad OS 15_0)\n const iosMatch = ua.match(/os (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (iosMatch && iosMatch.length >= 3) {\n const major = iosMatch[1];\n const minor = iosMatch[2];\n const patch = iosMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n // Android 버전\n const androidMatch = ua.match(/android (\\d+(?:\\.\\d+)*)/);\n if (androidMatch && androidMatch[1]) {\n return androidMatch[1];\n }\n\n // Windows 버전\n const windowsMatch = ua.match(/windows nt (\\d+\\.\\d+)/);\n if (windowsMatch && windowsMatch[1]) {\n const version = windowsMatch[1];\n // Windows NT 버전을 실제 Windows 버전으로 매핑\n const windowsVersionMap: Record<string, string> = {\n '10.0': '10/11',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.1': 'XP'\n };\n\n return windowsVersionMap[version] || version;\n }\n\n // macOS 버전\n const macMatch = ua.match(/mac os x (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (macMatch && macMatch.length >= 3) {\n const major = macMatch[1];\n const minor = macMatch[2];\n const patch = macMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 이름\n */\nexport const getBrowserName = (userAgent: string): BrowserName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium 기반) - Chrome보다 먼저 체크해야 함\n if (ua.includes('edg/') || ua.includes('edge/')) {\n return 'edge';\n }\n\n // Samsung Internet\n if (ua.includes('samsungbrowser')) {\n return 'samsung';\n }\n\n // Opera - Chrome보다 먼저 체크해야 함\n if (ua.includes('opr/') || ua.includes('opera')) {\n return 'opera';\n }\n\n // Chrome (Chromium 기반 브라우저들보다 늦게 체크)\n if (ua.includes('chrome') && !ua.includes('edg')) {\n return 'chrome';\n }\n\n // Firefox\n if (ua.includes('firefox')) {\n return 'firefox';\n }\n\n // Safari (Chrome와 구분하기 위해 webkit 체크)\n if (ua.includes('safari') && !ua.includes('chrome')) {\n return 'safari';\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 버전\n */\nexport const getBrowserVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium)\n const edgMatch = ua.match(/edg\\/(\\d+(?:\\.\\d+)*)/);\n if (edgMatch && edgMatch[1]) {\n return edgMatch[1];\n }\n\n // Samsung Internet\n const samsungMatch = ua.match(/samsungbrowser\\/(\\d+(?:\\.\\d+)*)/);\n if (samsungMatch && samsungMatch[1]) {\n return samsungMatch[1];\n }\n\n // Opera\n const operaMatch = ua.match(/(?:opr|opera)\\/(\\d+(?:\\.\\d+)*)/);\n if (operaMatch && operaMatch[1]) {\n return operaMatch[1];\n }\n\n // Chrome\n const chromeMatch = ua.match(/chrome\\/(\\d+(?:\\.\\d+)*)/);\n if (chromeMatch && chromeMatch[1] && !ua.includes('edg')) {\n return chromeMatch[1];\n }\n\n // Firefox\n const firefoxMatch = ua.match(/firefox\\/(\\d+(?:\\.\\d+)*)/);\n if (firefoxMatch && firefoxMatch[1]) {\n return firefoxMatch[1];\n }\n\n // Safari\n const safariMatch = ua.match(/version\\/(\\d+(?:\\.\\d+)*)/);\n if (safariMatch && safariMatch[1] && ua.includes('safari') && !ua.includes('chrome')) {\n return safariMatch[1];\n }\n\n return 'unknown';\n};\n/**\n * 현재 브라우저의 OS 버전을 가져오기\n * @returns 현재 환경의 OS 버전\n */\nexport const getCurrentOSVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSVersion(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 이름을 가져오기\n * @returns 현재 환경의 브라우저 이름\n */\nexport const getCurrentBrowserName = (): BrowserName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserName(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 버전을 가져오기\n * @returns 현재 환경의 브라우저 버전\n */\nexport const getCurrentBrowserVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserVersion(navigator.userAgent);\n};\n","/**\n * Message 이벤트 헨들러를 관리하는 클래스입니다. (싱글턴)\n * 모든 message 핸들러는 여기를 통해 등록해야합니다.\n * window.addEventListener('message') 의 중복을 방지하기 위함입니다.\n */\nexport class MessageEventManager {\n private static instance: MessageEventManager;\n private handlers = new Map<string, (event: MessageEvent) => void>();\n\n static getInstance(): MessageEventManager {\n if (!MessageEventManager.instance) {\n MessageEventManager.instance = new MessageEventManager();\n }\n\n return MessageEventManager.instance;\n }\n\n private constructor() {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n *\n * @param event\n */\n private handleMessage(event: MessageEvent): void {\n // 모든 등록된 핸들러 실행\n for (const [key, handler] of this.handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Message handler ${key} error:`, error);\n }\n }\n }\n\n /**\n * 이벤트 헨들러 함수를 등록합니다.\n * @param key\n * @param handler\n */\n registerHandler(key: string, handler: (event: MessageEvent) => void): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * 이벤트 핸들러 함수를 삭제합니다.\n * @param key\n */\n unregisterHandler(key: string): void {\n this.handlers.delete(key);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/timing-utils.ts","../src/utils/environment-utils.ts","../src/utils/user-agent-utils.ts","../src/utils/event-handler-utils.ts","../src/utils/canvas-utils.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * 쓰로틀\n * @param func\n * @param delay\n * @returns\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n // 마지막 호출로부터 delay 시간이 지났으면 즉시 실행\n lastCall = now;\n func(...args);\n } else if (!timeout) {\n // 대기 중인 타이머가 없으면 새로운 타이머 설정\n timeout = setTimeout(\n () => {\n lastCall = Date.now();\n func(...args);\n timeout = null;\n },\n delay - (now - lastCall)\n );\n }\n };\n}\n\n/**\n * 디바운스\n * @param func\n * @param delay\n * @returns\n */\nexport function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n timeout = null;\n }, delay);\n };\n}\n","/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost:')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://nxl-dsp-dev.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://nxl-dsp-stg.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://nxl-dsp.hanwhalife.com';\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://dev-dsp-static.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://stg-dsp-static.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://dsp-static.hanwhalife.com';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n","import { ExecutionEnvironment, OSName, BrowserName } from '../types/common.types';\n\nimport { isClient } from './environment-utils';\n/**\n * 한화생명 영업지원 웹 실행 환경 탐지\n * @returns\n */\nexport const getDspExecutionEnvironment = (): ExecutionEnvironment => {\n if (!isClient()) {\n return 'unknown';\n }\n\n if (window.n2Bridge) {\n return 'android-webview';\n }\n\n if (window.webkit) {\n return 'ios-webview';\n }\n\n if (window.self !== window.top) {\n return 'iframe';\n }\n\n return 'web';\n};\n\n/**\n * UserAgent에 SspApp 이 있는지 검사\n * 있으면, DSP 앱\n * @param userAgent\n * @returns\n */\nexport const checkUserAgentDspApp = (userAgent: string) => {\n return userAgent.toLowerCase().includes('sspapp');\n};\n\n/**\n * 한화생명 영업지원 웹뷰 환경 여부 판단\n * @returns 웹뷰(Android/iOS) 환경이면 true, 아니면 false\n */\nexport const isDspApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) && (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * FP 플래너 웹뷰 환경 여부 판단\n * @returns\n */\nexport const isFpPlannerApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) === false &&\n (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * 영업 포털 환경 여부 판단\n * @returns\n */\nexport const isSalesPortal = () => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return environment === 'iframe';\n};\n\n/**\n * 태블릿 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isTablet = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 태블릿\n ua.includes('ipad') ||\n // Android 태블릿 (Mobile 키워드 없음)\n (ua.includes('android') && !ua.includes('mobile')) ||\n // 명시적 태블릿 키워드\n ua.includes('tablet') ||\n // Amazon 태블릿\n ua.includes('kindle') ||\n ua.includes('silk') ||\n /kf[a-z]{2}wi|kftt/.test(ua) ||\n // BlackBerry 태블릿\n ua.includes('playbook') ||\n // 삼성 갤럭시 탭 (개선된 정규식)\n /gt-p\\d{4}|sm-[tp]\\d{3}/.test(ua) ||\n // 구글 넥서스/픽셀 태블릿\n /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) ||\n // 기타 브랜드 태블릿\n /xoom|transformer|mediapad|mipad|tab\\s/.test(ua) ||\n // Windows 태블릿 (개선된 조건)\n (ua.includes('windows') && (ua.includes('touch') || ua.includes('tablet'))) ||\n ua.includes('surface')\n );\n};\n\n/**\n * 스마트폰 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPhone = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 모바일\n ua.includes('iphone') ||\n ua.includes('ipod') ||\n // Android 스마트폰 (Mobile 키워드 있음)\n (ua.includes('android') && ua.includes('mobile')) ||\n // BlackBerry\n ua.includes('blackberry') ||\n ua.includes('bb10') ||\n // Windows Mobile\n ua.includes('windows phone') ||\n ua.includes('windows mobile') ||\n ua.includes('iemobile') ||\n // Opera Mobile\n ua.includes('opera mini') ||\n ua.includes('opera mobi') ||\n // 기타 모바일 브라우저\n (ua.includes('mobile') &&\n (ua.includes('firefox') || ua.includes('chrome') || ua.includes('safari') || ua.includes('edge'))) ||\n // 모바일 키워드 (태블릿 제외)\n (ua.includes('mobile') && !ua.includes('tablet')) ||\n // 삼성 갤럭시 폰 (개선)\n /sm-[a-z]\\d{3}[a-z]?|gt-[a-z]\\d{4}/.test(ua) ||\n // LG, HTC 폰\n /lg-[a-z]\\d{3,4}|htc[_\\s]/.test(ua) ||\n // 화웨이/샤오미 등 (개선)\n /huawei|honor|redmi|mi[\\s\\d]|oneplus|oppo|vivo/.test(ua)\n );\n};\n\n/**\n * 데스크톱 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPc = (userAgent: string) => {\n const ua = userAgent.toLowerCase();\n\n return !isPhone(ua) && !isTablet(ua);\n};\n\n/**\n * UserAgent에서 기기 타입 구분\n * @param userAgent\n * @returns\n */\nexport const getFormFactorFromUserAgent = (userAgent: string) => {\n if (!userAgent) {\n return 'pc';\n }\n\n const ua = userAgent.toLowerCase();\n\n if (isTablet(ua)) {\n return 'tablet';\n }\n\n if (isPhone(ua)) {\n return 'phone';\n }\n\n return 'pc';\n};\n\n/**\n * UserAgent에서 운영체제 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 운영체제 이름\n */\nexport const getOSName = (userAgent: string): OSName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 체크 (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(ua)) {\n return 'ios';\n }\n\n // Android 체크\n if (ua.includes('android')) {\n return 'android';\n }\n\n // Windows 체크\n if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) {\n return 'windows';\n }\n\n // macOS 체크 (Mac OS X, macOS)\n if (ua.includes('mac os x') || ua.includes('macos') || ua.includes('macintosh')) {\n return 'mac';\n }\n\n // Linux 체크 (Android 제외)\n if (ua.includes('linux') && !ua.includes('android')) {\n return 'linux';\n }\n\n return 'unknown';\n};\n\n/**\n * 현재 브라우저의 운영체제 이름을 가져오기\n * @returns 현재 환경의 운영체제 이름\n */\nexport const getCurrentOSName = (): OSName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSName(navigator.userAgent);\n};\n\n/**\n * UserAgent에서 OS 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns OS 버전 문자열\n */\nexport const getOSVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 버전 (iPhone OS 15_0, iPad OS 15_0)\n const iosMatch = ua.match(/os (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (iosMatch && iosMatch.length >= 3) {\n const major = iosMatch[1];\n const minor = iosMatch[2];\n const patch = iosMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n // Android 버전\n const androidMatch = ua.match(/android (\\d+(?:\\.\\d+)*)/);\n if (androidMatch && androidMatch[1]) {\n return androidMatch[1];\n }\n\n // Windows 버전\n const windowsMatch = ua.match(/windows nt (\\d+\\.\\d+)/);\n if (windowsMatch && windowsMatch[1]) {\n const version = windowsMatch[1];\n // Windows NT 버전을 실제 Windows 버전으로 매핑\n const windowsVersionMap: Record<string, string> = {\n '10.0': '10/11',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.1': 'XP'\n };\n\n return windowsVersionMap[version] || version;\n }\n\n // macOS 버전\n const macMatch = ua.match(/mac os x (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (macMatch && macMatch.length >= 3) {\n const major = macMatch[1];\n const minor = macMatch[2];\n const patch = macMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 이름\n */\nexport const getBrowserName = (userAgent: string): BrowserName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium 기반) - Chrome보다 먼저 체크해야 함\n if (ua.includes('edg/') || ua.includes('edge/')) {\n return 'edge';\n }\n\n // Samsung Internet\n if (ua.includes('samsungbrowser')) {\n return 'samsung';\n }\n\n // Opera - Chrome보다 먼저 체크해야 함\n if (ua.includes('opr/') || ua.includes('opera')) {\n return 'opera';\n }\n\n // Chrome (Chromium 기반 브라우저들보다 늦게 체크)\n if (ua.includes('chrome') && !ua.includes('edg')) {\n return 'chrome';\n }\n\n // Firefox\n if (ua.includes('firefox')) {\n return 'firefox';\n }\n\n // Safari (Chrome와 구분하기 위해 webkit 체크)\n if (ua.includes('safari') && !ua.includes('chrome')) {\n return 'safari';\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 버전\n */\nexport const getBrowserVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium)\n const edgMatch = ua.match(/edg\\/(\\d+(?:\\.\\d+)*)/);\n if (edgMatch && edgMatch[1]) {\n return edgMatch[1];\n }\n\n // Samsung Internet\n const samsungMatch = ua.match(/samsungbrowser\\/(\\d+(?:\\.\\d+)*)/);\n if (samsungMatch && samsungMatch[1]) {\n return samsungMatch[1];\n }\n\n // Opera\n const operaMatch = ua.match(/(?:opr|opera)\\/(\\d+(?:\\.\\d+)*)/);\n if (operaMatch && operaMatch[1]) {\n return operaMatch[1];\n }\n\n // Chrome\n const chromeMatch = ua.match(/chrome\\/(\\d+(?:\\.\\d+)*)/);\n if (chromeMatch && chromeMatch[1] && !ua.includes('edg')) {\n return chromeMatch[1];\n }\n\n // Firefox\n const firefoxMatch = ua.match(/firefox\\/(\\d+(?:\\.\\d+)*)/);\n if (firefoxMatch && firefoxMatch[1]) {\n return firefoxMatch[1];\n }\n\n // Safari\n const safariMatch = ua.match(/version\\/(\\d+(?:\\.\\d+)*)/);\n if (safariMatch && safariMatch[1] && ua.includes('safari') && !ua.includes('chrome')) {\n return safariMatch[1];\n }\n\n return 'unknown';\n};\n/**\n * 현재 브라우저의 OS 버전을 가져오기\n * @returns 현재 환경의 OS 버전\n */\nexport const getCurrentOSVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSVersion(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 이름을 가져오기\n * @returns 현재 환경의 브라우저 이름\n */\nexport const getCurrentBrowserName = (): BrowserName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserName(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 버전을 가져오기\n * @returns 현재 환경의 브라우저 버전\n */\nexport const getCurrentBrowserVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserVersion(navigator.userAgent);\n};\n","/**\n * Message 이벤트 헨들러를 관리하는 클래스입니다. (싱글턴)\n * 모든 message 핸들러는 여기를 통해 등록해야합니다.\n * window.addEventListener('message') 의 중복을 방지하기 위함입니다.\n */\nexport class MessageEventManager {\n private static instance: MessageEventManager;\n private handlers = new Map<string, (event: MessageEvent) => void>();\n\n static getInstance(): MessageEventManager {\n if (!MessageEventManager.instance) {\n MessageEventManager.instance = new MessageEventManager();\n }\n\n return MessageEventManager.instance;\n }\n\n private constructor() {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n *\n * @param event\n */\n private handleMessage(event: MessageEvent): void {\n // 모든 등록된 핸들러 실행\n for (const [key, handler] of this.handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Message handler ${key} error:`, error);\n }\n }\n }\n\n /**\n * 이벤트 헨들러 함수를 등록합니다.\n * @param key\n * @param handler\n */\n registerHandler(key: string, handler: (event: MessageEvent) => void): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * 이벤트 핸들러 함수를 삭제합니다.\n * @param key\n */\n unregisterHandler(key: string): void {\n this.handlers.delete(key);\n }\n}\n","interface ConvertTextToImgParams {\n /** 이미지로 변환할 문자열 */\n targetStr: string;\n /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */\n canvasWidth?: number;\n /** 캔버스 높이 (지정하지 않으면 기본값 150px) */\n canvasHeight?: number;\n /** 배경색 (지정하지 않으면 투명) */\n backgroundColor?: string;\n /** 폰트 크기 (지정하지 않으면 기본값 75px) */\n fontSize?: number;\n /** 폰트 색상 (지정하지 않으면 기본값 검정색) */\n fontColor?: string;\n /** 폰트 두께 (지정하지 않으면 기본값 bold) */\n fontWeight?: string;\n}\n\n/**\n * 텍스트를 이미지(Base64)로 변환하는 함수\n * @param params - 변환에 필요한 파라미터 객체\n * @returns Base64로 인코딩된 이미지 데이터 URL\n */\nexport const convertTextToImg = ({\n targetStr,\n canvasWidth,\n canvasHeight,\n backgroundColor,\n fontColor,\n fontSize,\n fontWeight\n}: ConvertTextToImgParams): string => {\n // 1. 메모리에 캔버스 요소 생성\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n // 캔버스 컨텍스트를 가져올 수 없는 경우 에러 처리\n throw new Error('Canvas context를 가져올 수 없습니다.');\n }\n\n // 2. 캔버스 크기 설정\n const defaultHeight = 150;\n const calculatedWidth = targetStr.length * 70; // 글자 수 기반 너비 계산\n\n canvas.width = canvasWidth ?? calculatedWidth;\n canvas.height = canvasHeight ?? defaultHeight;\n\n // 3. 배경색 처리\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 4. 텍스트 그리기\n ctx.fillStyle = fontColor ?? 'black';\n ctx.font = `${fontSize ?? 75}px ${fontWeight ?? 'bold'}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle'; // 텍스트를 수직 중앙에 더 잘 맞추기 위해 추가\n\n // 텍스트를 캔버스 중앙에 그립니다.\n ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);\n\n // 5. Base64 이미지 데이터로 변환하여 반환\n return canvas.toDataURL(); // 기본적으로 'image/png'\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -202,4 +202,27 @@ declare class MessageEventManager {
202
202
  unregisterHandler(key: string): void;
203
203
  }
204
204
 
205
- export { type BrowserName, type ExecutionEnvironment, MessageEventManager, type OSName, checkUserAgentDspApp, debounce, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, throttle };
205
+ interface ConvertTextToImgParams {
206
+ /** 이미지로 변환할 문자열 */
207
+ targetStr: string;
208
+ /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */
209
+ canvasWidth?: number;
210
+ /** 캔버스 높이 (지정하지 않으면 기본값 150px) */
211
+ canvasHeight?: number;
212
+ /** 배경색 (지정하지 않으면 투명) */
213
+ backgroundColor?: string;
214
+ /** 폰트 크기 (지정하지 않으면 기본값 75px) */
215
+ fontSize?: number;
216
+ /** 폰트 색상 (지정하지 않으면 기본값 검정색) */
217
+ fontColor?: string;
218
+ /** 폰트 두께 (지정하지 않으면 기본값 bold) */
219
+ fontWeight?: string;
220
+ }
221
+ /**
222
+ * 텍스트를 이미지(Base64)로 변환하는 함수
223
+ * @param params - 변환에 필요한 파라미터 객체
224
+ * @returns Base64로 인코딩된 이미지 데이터 URL
225
+ */
226
+ declare const convertTextToImg: ({ targetStr, canvasWidth, canvasHeight, backgroundColor, fontColor, fontSize, fontWeight }: ConvertTextToImgParams) => string;
227
+
228
+ export { type BrowserName, type ExecutionEnvironment, MessageEventManager, type OSName, checkUserAgentDspApp, convertTextToImg, debounce, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, throttle };
package/dist/index.d.ts CHANGED
@@ -202,4 +202,27 @@ declare class MessageEventManager {
202
202
  unregisterHandler(key: string): void;
203
203
  }
204
204
 
205
- export { type BrowserName, type ExecutionEnvironment, MessageEventManager, type OSName, checkUserAgentDspApp, debounce, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, throttle };
205
+ interface ConvertTextToImgParams {
206
+ /** 이미지로 변환할 문자열 */
207
+ targetStr: string;
208
+ /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */
209
+ canvasWidth?: number;
210
+ /** 캔버스 높이 (지정하지 않으면 기본값 150px) */
211
+ canvasHeight?: number;
212
+ /** 배경색 (지정하지 않으면 투명) */
213
+ backgroundColor?: string;
214
+ /** 폰트 크기 (지정하지 않으면 기본값 75px) */
215
+ fontSize?: number;
216
+ /** 폰트 색상 (지정하지 않으면 기본값 검정색) */
217
+ fontColor?: string;
218
+ /** 폰트 두께 (지정하지 않으면 기본값 bold) */
219
+ fontWeight?: string;
220
+ }
221
+ /**
222
+ * 텍스트를 이미지(Base64)로 변환하는 함수
223
+ * @param params - 변환에 필요한 파라미터 객체
224
+ * @returns Base64로 인코딩된 이미지 데이터 URL
225
+ */
226
+ declare const convertTextToImg: ({ targetStr, canvasWidth, canvasHeight, backgroundColor, fontColor, fontSize, fontWeight }: ConvertTextToImgParams) => string;
227
+
228
+ export { type BrowserName, type ExecutionEnvironment, MessageEventManager, type OSName, checkUserAgentDspApp, convertTextToImg, debounce, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, throttle };
package/dist/index.js CHANGED
@@ -377,6 +377,37 @@ var _MessageEventManager = class _MessageEventManager {
377
377
  __publicField(_MessageEventManager, "instance");
378
378
  var MessageEventManager = _MessageEventManager;
379
379
 
380
- export { MessageEventManager, checkUserAgentDspApp, debounce, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, throttle };
380
+ // src/utils/canvas-utils.ts
381
+ var convertTextToImg = ({
382
+ targetStr,
383
+ canvasWidth,
384
+ canvasHeight,
385
+ backgroundColor,
386
+ fontColor,
387
+ fontSize,
388
+ fontWeight
389
+ }) => {
390
+ const canvas = document.createElement("canvas");
391
+ const ctx = canvas.getContext("2d");
392
+ if (!ctx) {
393
+ throw new Error("Canvas context\uB97C \uAC00\uC838\uC62C \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.");
394
+ }
395
+ const defaultHeight = 150;
396
+ const calculatedWidth = targetStr.length * 70;
397
+ canvas.width = canvasWidth ?? calculatedWidth;
398
+ canvas.height = canvasHeight ?? defaultHeight;
399
+ if (backgroundColor) {
400
+ ctx.fillStyle = backgroundColor;
401
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
402
+ }
403
+ ctx.fillStyle = fontColor ?? "black";
404
+ ctx.font = `${fontSize ?? 75}px ${fontWeight ?? "bold"}`;
405
+ ctx.textAlign = "center";
406
+ ctx.textBaseline = "middle";
407
+ ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);
408
+ return canvas.toDataURL();
409
+ };
410
+
411
+ export { MessageEventManager, checkUserAgentDspApp, convertTextToImg, debounce, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, throttle };
381
412
  //# sourceMappingURL=index.js.map
382
413
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/timing-utils.ts","../src/utils/environment-utils.ts","../src/utils/user-agent-utils.ts","../src/utils/event-handler-utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 쓰로틀\n * @param func\n * @param delay\n * @returns\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n // 마지막 호출로부터 delay 시간이 지났으면 즉시 실행\n lastCall = now;\n func(...args);\n } else if (!timeout) {\n // 대기 중인 타이머가 없으면 새로운 타이머 설정\n timeout = setTimeout(\n () => {\n lastCall = Date.now();\n func(...args);\n timeout = null;\n },\n delay - (now - lastCall)\n );\n }\n };\n}\n\n/**\n * 디바운스\n * @param func\n * @param delay\n * @returns\n */\nexport function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n timeout = null;\n }, delay);\n };\n}\n","/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost:')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://nxl-dsp-dev.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://nxl-dsp-stg.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://nxl-dsp.hanwhalife.com';\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://dev-dsp-static.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://stg-dsp-static.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://dsp-static.hanwhalife.com';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n","import { ExecutionEnvironment, OSName, BrowserName } from '../types/common.types';\n\nimport { isClient } from './environment-utils';\n/**\n * 한화생명 영업지원 웹 실행 환경 탐지\n * @returns\n */\nexport const getDspExecutionEnvironment = (): ExecutionEnvironment => {\n if (!isClient()) {\n return 'unknown';\n }\n\n if (window.n2Bridge) {\n return 'android-webview';\n }\n\n if (window.webkit) {\n return 'ios-webview';\n }\n\n if (window.self !== window.top) {\n return 'iframe';\n }\n\n return 'web';\n};\n\n/**\n * UserAgent에 SspApp 이 있는지 검사\n * 있으면, DSP 앱\n * @param userAgent\n * @returns\n */\nexport const checkUserAgentDspApp = (userAgent: string) => {\n return userAgent.toLowerCase().includes('sspapp');\n};\n\n/**\n * 한화생명 영업지원 웹뷰 환경 여부 판단\n * @returns 웹뷰(Android/iOS) 환경이면 true, 아니면 false\n */\nexport const isDspApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) && (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * FP 플래너 웹뷰 환경 여부 판단\n * @returns\n */\nexport const isFpPlannerApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) === false &&\n (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * 영업 포털 환경 여부 판단\n * @returns\n */\nexport const isSalesPortal = () => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return environment === 'iframe';\n};\n\n/**\n * 태블릿 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isTablet = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 태블릿\n ua.includes('ipad') ||\n // Android 태블릿 (Mobile 키워드 없음)\n (ua.includes('android') && !ua.includes('mobile')) ||\n // 명시적 태블릿 키워드\n ua.includes('tablet') ||\n // Amazon 태블릿\n ua.includes('kindle') ||\n ua.includes('silk') ||\n /kf[a-z]{2}wi|kftt/.test(ua) ||\n // BlackBerry 태블릿\n ua.includes('playbook') ||\n // 삼성 갤럭시 탭 (개선된 정규식)\n /gt-p\\d{4}|sm-[tp]\\d{3}/.test(ua) ||\n // 구글 넥서스/픽셀 태블릿\n /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) ||\n // 기타 브랜드 태블릿\n /xoom|transformer|mediapad|mipad|tab\\s/.test(ua) ||\n // Windows 태블릿 (개선된 조건)\n (ua.includes('windows') && (ua.includes('touch') || ua.includes('tablet'))) ||\n ua.includes('surface')\n );\n};\n\n/**\n * 스마트폰 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPhone = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 모바일\n ua.includes('iphone') ||\n ua.includes('ipod') ||\n // Android 스마트폰 (Mobile 키워드 있음)\n (ua.includes('android') && ua.includes('mobile')) ||\n // BlackBerry\n ua.includes('blackberry') ||\n ua.includes('bb10') ||\n // Windows Mobile\n ua.includes('windows phone') ||\n ua.includes('windows mobile') ||\n ua.includes('iemobile') ||\n // Opera Mobile\n ua.includes('opera mini') ||\n ua.includes('opera mobi') ||\n // 기타 모바일 브라우저\n (ua.includes('mobile') &&\n (ua.includes('firefox') || ua.includes('chrome') || ua.includes('safari') || ua.includes('edge'))) ||\n // 모바일 키워드 (태블릿 제외)\n (ua.includes('mobile') && !ua.includes('tablet')) ||\n // 삼성 갤럭시 폰 (개선)\n /sm-[a-z]\\d{3}[a-z]?|gt-[a-z]\\d{4}/.test(ua) ||\n // LG, HTC 폰\n /lg-[a-z]\\d{3,4}|htc[_\\s]/.test(ua) ||\n // 화웨이/샤오미 등 (개선)\n /huawei|honor|redmi|mi[\\s\\d]|oneplus|oppo|vivo/.test(ua)\n );\n};\n\n/**\n * 데스크톱 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPc = (userAgent: string) => {\n const ua = userAgent.toLowerCase();\n\n return !isPhone(ua) && !isTablet(ua);\n};\n\n/**\n * UserAgent에서 기기 타입 구분\n * @param userAgent\n * @returns\n */\nexport const getFormFactorFromUserAgent = (userAgent: string) => {\n if (!userAgent) {\n return 'pc';\n }\n\n const ua = userAgent.toLowerCase();\n\n if (isTablet(ua)) {\n return 'tablet';\n }\n\n if (isPhone(ua)) {\n return 'phone';\n }\n\n return 'pc';\n};\n\n/**\n * UserAgent에서 운영체제 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 운영체제 이름\n */\nexport const getOSName = (userAgent: string): OSName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 체크 (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(ua)) {\n return 'ios';\n }\n\n // Android 체크\n if (ua.includes('android')) {\n return 'android';\n }\n\n // Windows 체크\n if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) {\n return 'windows';\n }\n\n // macOS 체크 (Mac OS X, macOS)\n if (ua.includes('mac os x') || ua.includes('macos') || ua.includes('macintosh')) {\n return 'mac';\n }\n\n // Linux 체크 (Android 제외)\n if (ua.includes('linux') && !ua.includes('android')) {\n return 'linux';\n }\n\n return 'unknown';\n};\n\n/**\n * 현재 브라우저의 운영체제 이름을 가져오기\n * @returns 현재 환경의 운영체제 이름\n */\nexport const getCurrentOSName = (): OSName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSName(navigator.userAgent);\n};\n\n/**\n * UserAgent에서 OS 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns OS 버전 문자열\n */\nexport const getOSVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 버전 (iPhone OS 15_0, iPad OS 15_0)\n const iosMatch = ua.match(/os (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (iosMatch && iosMatch.length >= 3) {\n const major = iosMatch[1];\n const minor = iosMatch[2];\n const patch = iosMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n // Android 버전\n const androidMatch = ua.match(/android (\\d+(?:\\.\\d+)*)/);\n if (androidMatch && androidMatch[1]) {\n return androidMatch[1];\n }\n\n // Windows 버전\n const windowsMatch = ua.match(/windows nt (\\d+\\.\\d+)/);\n if (windowsMatch && windowsMatch[1]) {\n const version = windowsMatch[1];\n // Windows NT 버전을 실제 Windows 버전으로 매핑\n const windowsVersionMap: Record<string, string> = {\n '10.0': '10/11',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.1': 'XP'\n };\n\n return windowsVersionMap[version] || version;\n }\n\n // macOS 버전\n const macMatch = ua.match(/mac os x (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (macMatch && macMatch.length >= 3) {\n const major = macMatch[1];\n const minor = macMatch[2];\n const patch = macMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 이름\n */\nexport const getBrowserName = (userAgent: string): BrowserName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium 기반) - Chrome보다 먼저 체크해야 함\n if (ua.includes('edg/') || ua.includes('edge/')) {\n return 'edge';\n }\n\n // Samsung Internet\n if (ua.includes('samsungbrowser')) {\n return 'samsung';\n }\n\n // Opera - Chrome보다 먼저 체크해야 함\n if (ua.includes('opr/') || ua.includes('opera')) {\n return 'opera';\n }\n\n // Chrome (Chromium 기반 브라우저들보다 늦게 체크)\n if (ua.includes('chrome') && !ua.includes('edg')) {\n return 'chrome';\n }\n\n // Firefox\n if (ua.includes('firefox')) {\n return 'firefox';\n }\n\n // Safari (Chrome와 구분하기 위해 webkit 체크)\n if (ua.includes('safari') && !ua.includes('chrome')) {\n return 'safari';\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 버전\n */\nexport const getBrowserVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium)\n const edgMatch = ua.match(/edg\\/(\\d+(?:\\.\\d+)*)/);\n if (edgMatch && edgMatch[1]) {\n return edgMatch[1];\n }\n\n // Samsung Internet\n const samsungMatch = ua.match(/samsungbrowser\\/(\\d+(?:\\.\\d+)*)/);\n if (samsungMatch && samsungMatch[1]) {\n return samsungMatch[1];\n }\n\n // Opera\n const operaMatch = ua.match(/(?:opr|opera)\\/(\\d+(?:\\.\\d+)*)/);\n if (operaMatch && operaMatch[1]) {\n return operaMatch[1];\n }\n\n // Chrome\n const chromeMatch = ua.match(/chrome\\/(\\d+(?:\\.\\d+)*)/);\n if (chromeMatch && chromeMatch[1] && !ua.includes('edg')) {\n return chromeMatch[1];\n }\n\n // Firefox\n const firefoxMatch = ua.match(/firefox\\/(\\d+(?:\\.\\d+)*)/);\n if (firefoxMatch && firefoxMatch[1]) {\n return firefoxMatch[1];\n }\n\n // Safari\n const safariMatch = ua.match(/version\\/(\\d+(?:\\.\\d+)*)/);\n if (safariMatch && safariMatch[1] && ua.includes('safari') && !ua.includes('chrome')) {\n return safariMatch[1];\n }\n\n return 'unknown';\n};\n/**\n * 현재 브라우저의 OS 버전을 가져오기\n * @returns 현재 환경의 OS 버전\n */\nexport const getCurrentOSVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSVersion(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 이름을 가져오기\n * @returns 현재 환경의 브라우저 이름\n */\nexport const getCurrentBrowserName = (): BrowserName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserName(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 버전을 가져오기\n * @returns 현재 환경의 브라우저 버전\n */\nexport const getCurrentBrowserVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserVersion(navigator.userAgent);\n};\n","/**\n * Message 이벤트 헨들러를 관리하는 클래스입니다. (싱글턴)\n * 모든 message 핸들러는 여기를 통해 등록해야합니다.\n * window.addEventListener('message') 의 중복을 방지하기 위함입니다.\n */\nexport class MessageEventManager {\n private static instance: MessageEventManager;\n private handlers = new Map<string, (event: MessageEvent) => void>();\n\n static getInstance(): MessageEventManager {\n if (!MessageEventManager.instance) {\n MessageEventManager.instance = new MessageEventManager();\n }\n\n return MessageEventManager.instance;\n }\n\n private constructor() {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n *\n * @param event\n */\n private handleMessage(event: MessageEvent): void {\n // 모든 등록된 핸들러 실행\n for (const [key, handler] of this.handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Message handler ${key} error:`, error);\n }\n }\n }\n\n /**\n * 이벤트 헨들러 함수를 등록합니다.\n * @param key\n * @param handler\n */\n registerHandler(key: string, handler: (event: MessageEvent) => void): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * 이벤트 핸들러 함수를 삭제합니다.\n * @param key\n */\n unregisterHandler(key: string): void {\n this.handlers.delete(key);\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/timing-utils.ts","../src/utils/environment-utils.ts","../src/utils/user-agent-utils.ts","../src/utils/event-handler-utils.ts","../src/utils/canvas-utils.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * 쓰로틀\n * @param func\n * @param delay\n * @returns\n */\nexport function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n const now = Date.now();\n\n if (now - lastCall >= delay) {\n // 마지막 호출로부터 delay 시간이 지났으면 즉시 실행\n lastCall = now;\n func(...args);\n } else if (!timeout) {\n // 대기 중인 타이머가 없으면 새로운 타이머 설정\n timeout = setTimeout(\n () => {\n lastCall = Date.now();\n func(...args);\n timeout = null;\n },\n delay - (now - lastCall)\n );\n }\n };\n}\n\n/**\n * 디바운스\n * @param func\n * @param delay\n * @returns\n */\nexport function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout | null = null;\n\n return (...args: Parameters<T>) => {\n if (timeout) {\n clearTimeout(timeout);\n }\n timeout = setTimeout(() => {\n func(...args);\n timeout = null;\n }, delay);\n };\n}\n","/**\n * 호스트명에서 서브도메인을 추출합니다.\n * @param hostname 호스트명\n * @returns 서브도메인 (예: nxl-dsp-dev)\n */\nexport const getSubdomain = (hostname: string): string => {\n if (!hostname || hostname === 'localhost' || hostname === '127.0.0.1') {\n return '';\n }\n\n const parts = hostname.split('.');\n\n // 최소 3개 부분이 있어야 서브도메인 존재 (subdomain.domain.com)\n if (parts.length < 3) {\n return '';\n }\n\n // 첫 번째 부분이 서브도메인\n return parts[0] ?? '';\n};\n\n/**\n * 호스트명을 기반으로 환경을 판단합니다.\n * @param hostname 호스트명\n * @returns 환경 구분 문자열 ('local' | 'dev' | 'stg' | 'prd')\n */\nexport const getEnvironmentFromHostname = (hostname: string): 'local' | 'dev' | 'stg' | 'prd' => {\n const subDomain = getSubdomain(hostname);\n\n // localhost 판단\n if (hostname === 'localhost' || hostname === '127.0.0.1' || hostname.startsWith('localhost:')) {\n return 'local';\n }\n\n // dev 환경 판단\n if (subDomain.includes(`dev`)) {\n return 'dev';\n }\n\n // stg 환경 판단\n if (subDomain.includes('stg')) {\n return 'stg';\n }\n\n // 기본 운영\n return 'prd';\n};\n\n/**\n * 환경에 맞는 API 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getApiHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://nxl-dsp-dev.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://nxl-dsp-stg.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://nxl-dsp.hanwhalife.com';\n};\n\n/**\n * 환경에 맞는 CDN 호스트명을 반환합니다.\n * 호스트명을 강제하고 싶으면 두 번째 파라미터로 넘기세요.\n * @param currentHostname\n * @param forceApiHostName\n * @returns\n */\nexport const getCdnHostNameFromEnvironment = (currentHostname: string, forceApiHostName?: string) => {\n if (!isClient()) {\n return '';\n }\n\n if (forceApiHostName) {\n return forceApiHostName;\n }\n\n const environment = getEnvironmentFromHostname(currentHostname);\n\n if (environment === 'local' || environment === 'dev') {\n return 'https://dev-dsp-static.hanwhalife.com';\n }\n\n if (environment === 'stg') {\n return 'https://stg-dsp-static.hanwhalife.com';\n }\n\n // 기본 운영\n return 'https://dsp-static.hanwhalife.com';\n};\n\n/**\n * @see https://github.com/storybookjs/storybook/issues/32028#issuecomment-3298982086\n * @note 스토리북에서 버그로인해 window객체를 정상적으로 탐지하지 못하는 이슈우회\n */\nexport const isClient = () => {\n try {\n return !!window;\n } catch {\n return false;\n }\n};\n\n// window.isStorybookEnv 접근을 위한 타입캐스팅\ndeclare const window: Window & { isStorybookEnv?: boolean };\n/**\n * 현재 실행 환경이 Storybook인지 확인하는 함수\n *\n * 사용 전, `viteFinal` 설정에서 `window.isStorybookEnv`를 `true`로 정의해야 정상 동작합니다.\n *\n * 예시:\n * ```ts\n * const config: StorybookConfig = {\n * viteFinal: (config) => {\n * // window.isStorybookEnv를 true로 설정 (boolean 값으로 처리됨)\n * config.define = {\n * ...config.define,\n * 'window.isStorybookEnv': 'true',\n * };\n *\n * return config;\n * },\n * };\n * ```\n */\nexport const isStorybookEnv = () => {\n try {\n return window.isStorybookEnv === true;\n } catch {\n // window가 존재하지 않는 등 예외 상황에서는 false 반환\n return false;\n }\n};\n","import { ExecutionEnvironment, OSName, BrowserName } from '../types/common.types';\n\nimport { isClient } from './environment-utils';\n/**\n * 한화생명 영업지원 웹 실행 환경 탐지\n * @returns\n */\nexport const getDspExecutionEnvironment = (): ExecutionEnvironment => {\n if (!isClient()) {\n return 'unknown';\n }\n\n if (window.n2Bridge) {\n return 'android-webview';\n }\n\n if (window.webkit) {\n return 'ios-webview';\n }\n\n if (window.self !== window.top) {\n return 'iframe';\n }\n\n return 'web';\n};\n\n/**\n * UserAgent에 SspApp 이 있는지 검사\n * 있으면, DSP 앱\n * @param userAgent\n * @returns\n */\nexport const checkUserAgentDspApp = (userAgent: string) => {\n return userAgent.toLowerCase().includes('sspapp');\n};\n\n/**\n * 한화생명 영업지원 웹뷰 환경 여부 판단\n * @returns 웹뷰(Android/iOS) 환경이면 true, 아니면 false\n */\nexport const isDspApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) && (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * FP 플래너 웹뷰 환경 여부 판단\n * @returns\n */\nexport const isFpPlannerApp = (): boolean => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return (\n checkUserAgentDspApp(navigator.userAgent) === false &&\n (environment === 'android-webview' || environment === 'ios-webview')\n );\n};\n\n/**\n * 영업 포털 환경 여부 판단\n * @returns\n */\nexport const isSalesPortal = () => {\n if (!isClient()) {\n return false;\n }\n\n const environment = getDspExecutionEnvironment();\n\n return environment === 'iframe';\n};\n\n/**\n * 태블릿 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isTablet = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 태블릿\n ua.includes('ipad') ||\n // Android 태블릿 (Mobile 키워드 없음)\n (ua.includes('android') && !ua.includes('mobile')) ||\n // 명시적 태블릿 키워드\n ua.includes('tablet') ||\n // Amazon 태블릿\n ua.includes('kindle') ||\n ua.includes('silk') ||\n /kf[a-z]{2}wi|kftt/.test(ua) ||\n // BlackBerry 태블릿\n ua.includes('playbook') ||\n // 삼성 갤럭시 탭 (개선된 정규식)\n /gt-p\\d{4}|sm-[tp]\\d{3}/.test(ua) ||\n // 구글 넥서스/픽셀 태블릿\n /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) ||\n // 기타 브랜드 태블릿\n /xoom|transformer|mediapad|mipad|tab\\s/.test(ua) ||\n // Windows 태블릿 (개선된 조건)\n (ua.includes('windows') && (ua.includes('touch') || ua.includes('tablet'))) ||\n ua.includes('surface')\n );\n};\n\n/**\n * 스마트폰 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPhone = (userAgent: string): boolean => {\n const ua = userAgent.toLowerCase();\n\n return (\n // Apple 모바일\n ua.includes('iphone') ||\n ua.includes('ipod') ||\n // Android 스마트폰 (Mobile 키워드 있음)\n (ua.includes('android') && ua.includes('mobile')) ||\n // BlackBerry\n ua.includes('blackberry') ||\n ua.includes('bb10') ||\n // Windows Mobile\n ua.includes('windows phone') ||\n ua.includes('windows mobile') ||\n ua.includes('iemobile') ||\n // Opera Mobile\n ua.includes('opera mini') ||\n ua.includes('opera mobi') ||\n // 기타 모바일 브라우저\n (ua.includes('mobile') &&\n (ua.includes('firefox') || ua.includes('chrome') || ua.includes('safari') || ua.includes('edge'))) ||\n // 모바일 키워드 (태블릿 제외)\n (ua.includes('mobile') && !ua.includes('tablet')) ||\n // 삼성 갤럭시 폰 (개선)\n /sm-[a-z]\\d{3}[a-z]?|gt-[a-z]\\d{4}/.test(ua) ||\n // LG, HTC 폰\n /lg-[a-z]\\d{3,4}|htc[_\\s]/.test(ua) ||\n // 화웨이/샤오미 등 (개선)\n /huawei|honor|redmi|mi[\\s\\d]|oneplus|oppo|vivo/.test(ua)\n );\n};\n\n/**\n * 데스크톱 여부 판단\n * @param userAgent\n * @returns\n */\nexport const isPc = (userAgent: string) => {\n const ua = userAgent.toLowerCase();\n\n return !isPhone(ua) && !isTablet(ua);\n};\n\n/**\n * UserAgent에서 기기 타입 구분\n * @param userAgent\n * @returns\n */\nexport const getFormFactorFromUserAgent = (userAgent: string) => {\n if (!userAgent) {\n return 'pc';\n }\n\n const ua = userAgent.toLowerCase();\n\n if (isTablet(ua)) {\n return 'tablet';\n }\n\n if (isPhone(ua)) {\n return 'phone';\n }\n\n return 'pc';\n};\n\n/**\n * UserAgent에서 운영체제 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 운영체제 이름\n */\nexport const getOSName = (userAgent: string): OSName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 체크 (iPhone, iPad, iPod)\n if (/iphone|ipad|ipod/.test(ua)) {\n return 'ios';\n }\n\n // Android 체크\n if (ua.includes('android')) {\n return 'android';\n }\n\n // Windows 체크\n if (ua.includes('windows') || ua.includes('win32') || ua.includes('win64')) {\n return 'windows';\n }\n\n // macOS 체크 (Mac OS X, macOS)\n if (ua.includes('mac os x') || ua.includes('macos') || ua.includes('macintosh')) {\n return 'mac';\n }\n\n // Linux 체크 (Android 제외)\n if (ua.includes('linux') && !ua.includes('android')) {\n return 'linux';\n }\n\n return 'unknown';\n};\n\n/**\n * 현재 브라우저의 운영체제 이름을 가져오기\n * @returns 현재 환경의 운영체제 이름\n */\nexport const getCurrentOSName = (): OSName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSName(navigator.userAgent);\n};\n\n/**\n * UserAgent에서 OS 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns OS 버전 문자열\n */\nexport const getOSVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // iOS 버전 (iPhone OS 15_0, iPad OS 15_0)\n const iosMatch = ua.match(/os (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (iosMatch && iosMatch.length >= 3) {\n const major = iosMatch[1];\n const minor = iosMatch[2];\n const patch = iosMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n // Android 버전\n const androidMatch = ua.match(/android (\\d+(?:\\.\\d+)*)/);\n if (androidMatch && androidMatch[1]) {\n return androidMatch[1];\n }\n\n // Windows 버전\n const windowsMatch = ua.match(/windows nt (\\d+\\.\\d+)/);\n if (windowsMatch && windowsMatch[1]) {\n const version = windowsMatch[1];\n // Windows NT 버전을 실제 Windows 버전으로 매핑\n const windowsVersionMap: Record<string, string> = {\n '10.0': '10/11',\n '6.3': '8.1',\n '6.2': '8',\n '6.1': '7',\n '6.0': 'Vista',\n '5.1': 'XP'\n };\n\n return windowsVersionMap[version] || version;\n }\n\n // macOS 버전\n const macMatch = ua.match(/mac os x (\\d+)_(\\d+)(?:_(\\d+))?/);\n if (macMatch && macMatch.length >= 3) {\n const major = macMatch[1];\n const minor = macMatch[2];\n const patch = macMatch[3];\n\n return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 이름을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 이름\n */\nexport const getBrowserName = (userAgent: string): BrowserName => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium 기반) - Chrome보다 먼저 체크해야 함\n if (ua.includes('edg/') || ua.includes('edge/')) {\n return 'edge';\n }\n\n // Samsung Internet\n if (ua.includes('samsungbrowser')) {\n return 'samsung';\n }\n\n // Opera - Chrome보다 먼저 체크해야 함\n if (ua.includes('opr/') || ua.includes('opera')) {\n return 'opera';\n }\n\n // Chrome (Chromium 기반 브라우저들보다 늦게 체크)\n if (ua.includes('chrome') && !ua.includes('edg')) {\n return 'chrome';\n }\n\n // Firefox\n if (ua.includes('firefox')) {\n return 'firefox';\n }\n\n // Safari (Chrome와 구분하기 위해 webkit 체크)\n if (ua.includes('safari') && !ua.includes('chrome')) {\n return 'safari';\n }\n\n return 'unknown';\n};\n\n/**\n * UserAgent에서 브라우저 버전을 추출\n * @param userAgent - 브라우저의 userAgent 문자열\n * @returns 브라우저 버전\n */\nexport const getBrowserVersion = (userAgent: string): string => {\n if (!userAgent) {\n return 'unknown';\n }\n\n const ua = userAgent.toLowerCase();\n\n // Edge (Chromium)\n const edgMatch = ua.match(/edg\\/(\\d+(?:\\.\\d+)*)/);\n if (edgMatch && edgMatch[1]) {\n return edgMatch[1];\n }\n\n // Samsung Internet\n const samsungMatch = ua.match(/samsungbrowser\\/(\\d+(?:\\.\\d+)*)/);\n if (samsungMatch && samsungMatch[1]) {\n return samsungMatch[1];\n }\n\n // Opera\n const operaMatch = ua.match(/(?:opr|opera)\\/(\\d+(?:\\.\\d+)*)/);\n if (operaMatch && operaMatch[1]) {\n return operaMatch[1];\n }\n\n // Chrome\n const chromeMatch = ua.match(/chrome\\/(\\d+(?:\\.\\d+)*)/);\n if (chromeMatch && chromeMatch[1] && !ua.includes('edg')) {\n return chromeMatch[1];\n }\n\n // Firefox\n const firefoxMatch = ua.match(/firefox\\/(\\d+(?:\\.\\d+)*)/);\n if (firefoxMatch && firefoxMatch[1]) {\n return firefoxMatch[1];\n }\n\n // Safari\n const safariMatch = ua.match(/version\\/(\\d+(?:\\.\\d+)*)/);\n if (safariMatch && safariMatch[1] && ua.includes('safari') && !ua.includes('chrome')) {\n return safariMatch[1];\n }\n\n return 'unknown';\n};\n/**\n * 현재 브라우저의 OS 버전을 가져오기\n * @returns 현재 환경의 OS 버전\n */\nexport const getCurrentOSVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getOSVersion(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 이름을 가져오기\n * @returns 현재 환경의 브라우저 이름\n */\nexport const getCurrentBrowserName = (): BrowserName => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserName(navigator.userAgent);\n};\n\n/**\n * 현재 브라우저의 버전을 가져오기\n * @returns 현재 환경의 브라우저 버전\n */\nexport const getCurrentBrowserVersion = (): string => {\n if (!isClient() || typeof navigator === 'undefined') {\n return 'unknown';\n }\n\n return getBrowserVersion(navigator.userAgent);\n};\n","/**\n * Message 이벤트 헨들러를 관리하는 클래스입니다. (싱글턴)\n * 모든 message 핸들러는 여기를 통해 등록해야합니다.\n * window.addEventListener('message') 의 중복을 방지하기 위함입니다.\n */\nexport class MessageEventManager {\n private static instance: MessageEventManager;\n private handlers = new Map<string, (event: MessageEvent) => void>();\n\n static getInstance(): MessageEventManager {\n if (!MessageEventManager.instance) {\n MessageEventManager.instance = new MessageEventManager();\n }\n\n return MessageEventManager.instance;\n }\n\n private constructor() {\n window.addEventListener('message', this.handleMessage.bind(this));\n }\n\n /**\n *\n * @param event\n */\n private handleMessage(event: MessageEvent): void {\n // 모든 등록된 핸들러 실행\n for (const [key, handler] of this.handlers) {\n try {\n handler(event);\n } catch (error) {\n console.error(`Message handler ${key} error:`, error);\n }\n }\n }\n\n /**\n * 이벤트 헨들러 함수를 등록합니다.\n * @param key\n * @param handler\n */\n registerHandler(key: string, handler: (event: MessageEvent) => void): void {\n this.handlers.set(key, handler);\n }\n\n /**\n * 이벤트 핸들러 함수를 삭제합니다.\n * @param key\n */\n unregisterHandler(key: string): void {\n this.handlers.delete(key);\n }\n}\n","interface ConvertTextToImgParams {\n /** 이미지로 변환할 문자열 */\n targetStr: string;\n /** 캔버스 너비 (지정하지 않으면 텍스트 길이에 따라 자동 계산) */\n canvasWidth?: number;\n /** 캔버스 높이 (지정하지 않으면 기본값 150px) */\n canvasHeight?: number;\n /** 배경색 (지정하지 않으면 투명) */\n backgroundColor?: string;\n /** 폰트 크기 (지정하지 않으면 기본값 75px) */\n fontSize?: number;\n /** 폰트 색상 (지정하지 않으면 기본값 검정색) */\n fontColor?: string;\n /** 폰트 두께 (지정하지 않으면 기본값 bold) */\n fontWeight?: string;\n}\n\n/**\n * 텍스트를 이미지(Base64)로 변환하는 함수\n * @param params - 변환에 필요한 파라미터 객체\n * @returns Base64로 인코딩된 이미지 데이터 URL\n */\nexport const convertTextToImg = ({\n targetStr,\n canvasWidth,\n canvasHeight,\n backgroundColor,\n fontColor,\n fontSize,\n fontWeight\n}: ConvertTextToImgParams): string => {\n // 1. 메모리에 캔버스 요소 생성\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n\n if (!ctx) {\n // 캔버스 컨텍스트를 가져올 수 없는 경우 에러 처리\n throw new Error('Canvas context를 가져올 수 없습니다.');\n }\n\n // 2. 캔버스 크기 설정\n const defaultHeight = 150;\n const calculatedWidth = targetStr.length * 70; // 글자 수 기반 너비 계산\n\n canvas.width = canvasWidth ?? calculatedWidth;\n canvas.height = canvasHeight ?? defaultHeight;\n\n // 3. 배경색 처리\n if (backgroundColor) {\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n }\n\n // 4. 텍스트 그리기\n ctx.fillStyle = fontColor ?? 'black';\n ctx.font = `${fontSize ?? 75}px ${fontWeight ?? 'bold'}`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle'; // 텍스트를 수직 중앙에 더 잘 맞추기 위해 추가\n\n // 텍스트를 캔버스 중앙에 그립니다.\n ctx.fillText(targetStr, canvas.width / 2, canvas.height / 2);\n\n // 5. Base64 이미지 데이터로 변환하여 반환\n return canvas.toDataURL(); // 기본적으로 'image/png'\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sales-frontend-utils",
3
- "version": "0.0.11",
3
+ "version": "0.0.12",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -24,8 +24,8 @@
24
24
  "@types/node": "^22.14.0",
25
25
  "tsup": "^8.4.0",
26
26
  "typescript": "5.8.2",
27
- "sales-frontend-typescript-config": "0.0.2",
28
- "eslint-config-sales-frontend-eslint-config-v8": "^0.0.6"
27
+ "eslint-config-sales-frontend-eslint-config-v8": "^0.0.6",
28
+ "sales-frontend-typescript-config": "0.0.2"
29
29
  },
30
30
  "scripts": {
31
31
  "lint": "eslint . --max-warnings 0",