sales-frontend-utils 0.0.12 โ†’ 0.0.14

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
@@ -67,10 +67,10 @@ var getApiHostNameFromEnvironment = (currentHostname, forceApiHostName) => {
67
67
  return forceApiHostName;
68
68
  }
69
69
  const environment = getEnvironmentFromHostname(currentHostname);
70
- if (environment === "local" || environment === "dev") {
70
+ if (environment === "dev") {
71
71
  return "https://nxl-dsp-dev.hanwhalife.com";
72
72
  }
73
- if (environment === "stg") {
73
+ if (environment === "local" || environment === "stg") {
74
74
  return "https://nxl-dsp-stg.hanwhalife.com";
75
75
  }
76
76
  return "https://nxl-dsp.hanwhalife.com";
@@ -122,6 +122,10 @@ var getDspExecutionEnvironment = () => {
122
122
  }
123
123
  return "web";
124
124
  };
125
+ var isWebView = () => {
126
+ const environment = getDspExecutionEnvironment();
127
+ return environment === "android-webview" || environment === "ios-webview";
128
+ };
125
129
  var checkUserAgentDspApp = (userAgent) => {
126
130
  return userAgent.toLowerCase().includes("sspapp");
127
131
  };
@@ -334,6 +338,66 @@ var getCurrentBrowserVersion = () => {
334
338
  }
335
339
  return getBrowserVersion(navigator.userAgent);
336
340
  };
341
+ var getOrCreateDeviceId = () => {
342
+ if (typeof window === "undefined") {
343
+ return "";
344
+ }
345
+ const STORAGE_KEY = "dsp_device_id";
346
+ let deviceId = localStorage.getItem(STORAGE_KEY);
347
+ if (!deviceId) {
348
+ const timestamp = Date.now().toString(36);
349
+ const random = Math.random().toString(36).substring(2, 15);
350
+ deviceId = `dsp-web-${timestamp}-${random}`;
351
+ try {
352
+ localStorage.setItem(STORAGE_KEY, deviceId);
353
+ } catch (error) {
354
+ console.warn("[DeviceId] localStorage \uC800\uC7A5 \uC2E4\uD328:", error);
355
+ }
356
+ }
357
+ return deviceId;
358
+ };
359
+ var getDeviceModel = () => {
360
+ if (!isClient()) {
361
+ return "";
362
+ }
363
+ const ua = navigator.userAgent;
364
+ if (/iPad/.test(ua)) {
365
+ return "iPad";
366
+ }
367
+ if (/iPhone/.test(ua)) {
368
+ return "iPhone";
369
+ }
370
+ if (/iPod/.test(ua)) {
371
+ return "iPod Touch";
372
+ }
373
+ if (/SM-[A-Z0-9]+/.test(ua)) {
374
+ const match = ua.match(/SM-[A-Z0-9]+/);
375
+ return match ? `Samsung ${match[0]}` : "Samsung";
376
+ }
377
+ if (/Pixel/.test(ua)) {
378
+ const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);
379
+ return match ? `Google ${match[0]}` : "Google Pixel";
380
+ }
381
+ if (/Mi\s|Redmi|POCO/.test(ua)) {
382
+ return "Xiaomi";
383
+ }
384
+ if (/HUAWEI/.test(ua)) {
385
+ return "Huawei";
386
+ }
387
+ if (/OnePlus/.test(ua)) {
388
+ return "OnePlus";
389
+ }
390
+ if (/Windows/.test(ua)) {
391
+ return "Windows PC";
392
+ }
393
+ if (/Mac OS X/.test(ua)) {
394
+ return "Mac";
395
+ }
396
+ if (/Linux/.test(ua)) {
397
+ return "Linux PC";
398
+ }
399
+ return "Unknown";
400
+ };
337
401
 
338
402
  // src/utils/event-handler-utils.ts
339
403
  var _MessageEventManager = class _MessageEventManager {
@@ -410,23 +474,63 @@ var convertTextToImg = ({
410
474
  return canvas.toDataURL();
411
475
  };
412
476
 
477
+ // src/utils/cookie-utils.ts
478
+ var getCookie = (name) => {
479
+ if (typeof document === "undefined") {
480
+ return "";
481
+ }
482
+ const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));
483
+ return match ? decodeURIComponent(match[2] || "") : "";
484
+ };
485
+ var setCookie = (name, value, options = {}) => {
486
+ if (typeof document === "undefined") {
487
+ return;
488
+ }
489
+ let cookieString = `${name}=${encodeURIComponent(value)}`;
490
+ if (options.expires) {
491
+ let expiresDate;
492
+ if (typeof options.expires === "number") {
493
+ expiresDate = /* @__PURE__ */ new Date();
494
+ expiresDate.setDate(expiresDate.getDate() + options.expires);
495
+ } else {
496
+ expiresDate = options.expires;
497
+ }
498
+ cookieString += `; expires=${expiresDate.toUTCString()}`;
499
+ }
500
+ cookieString += `; path=${options.path || "/"}`;
501
+ if (options.domain) {
502
+ cookieString += `; domain=${options.domain}`;
503
+ }
504
+ if (options.secure) {
505
+ cookieString += "; secure";
506
+ }
507
+ document.cookie = cookieString;
508
+ };
509
+ var deleteCookie = (name, options = {}) => {
510
+ setCookie(name, "", { ...options, expires: -1 });
511
+ };
512
+
413
513
  exports.MessageEventManager = MessageEventManager;
414
514
  exports.checkUserAgentDspApp = checkUserAgentDspApp;
415
515
  exports.convertTextToImg = convertTextToImg;
416
516
  exports.debounce = debounce;
517
+ exports.deleteCookie = deleteCookie;
417
518
  exports.getApiHostNameFromEnvironment = getApiHostNameFromEnvironment;
418
519
  exports.getBrowserName = getBrowserName;
419
520
  exports.getBrowserVersion = getBrowserVersion;
420
521
  exports.getCdnHostNameFromEnvironment = getCdnHostNameFromEnvironment;
522
+ exports.getCookie = getCookie;
421
523
  exports.getCurrentBrowserName = getCurrentBrowserName;
422
524
  exports.getCurrentBrowserVersion = getCurrentBrowserVersion;
423
525
  exports.getCurrentOSName = getCurrentOSName;
424
526
  exports.getCurrentOSVersion = getCurrentOSVersion;
527
+ exports.getDeviceModel = getDeviceModel;
425
528
  exports.getDspExecutionEnvironment = getDspExecutionEnvironment;
426
529
  exports.getEnvironmentFromHostname = getEnvironmentFromHostname;
427
530
  exports.getFormFactorFromUserAgent = getFormFactorFromUserAgent;
428
531
  exports.getOSName = getOSName;
429
532
  exports.getOSVersion = getOSVersion;
533
+ exports.getOrCreateDeviceId = getOrCreateDeviceId;
430
534
  exports.getSubdomain = getSubdomain;
431
535
  exports.isClient = isClient;
432
536
  exports.isDspApp = isDspApp;
@@ -436,6 +540,8 @@ exports.isPhone = isPhone;
436
540
  exports.isSalesPortal = isSalesPortal;
437
541
  exports.isStorybookEnv = isStorybookEnv;
438
542
  exports.isTablet = isTablet;
543
+ exports.isWebView = isWebView;
544
+ exports.setCookie = setCookie;
439
545
  exports.throttle = throttle;
440
546
  //# sourceMappingURL=index.cjs.map
441
547
  //# sourceMappingURL=index.cjs.map
@@ -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","../src/utils/canvas-utils.ts"],"names":[],"mappings":";;;;;;;AAMO,SAAS,QAAA,CAA6C,MAAS,KAAiD,EAAA;AACrH,EAAA,IAAI,QAAW,GAAA,CAAA;AACf,EAAA,IAAI,OAAiC,GAAA,IAAA;AAErC,EAAA,OAAO,IAAI,IAAwB,KAAA;AACjC,IAAM,MAAA,GAAA,GAAM,KAAK,GAAI,EAAA;AAErB,IAAI,IAAA,GAAA,GAAM,YAAY,KAAO,EAAA;AAE3B,MAAW,QAAA,GAAA,GAAA;AACX,MAAA,IAAA,CAAK,GAAG,IAAI,CAAA;AAAA,KACd,MAAA,IAAW,CAAC,OAAS,EAAA;AAEnB,MAAU,OAAA,GAAA,UAAA;AAAA,QACR,MAAM;AACJ,UAAA,QAAA,GAAW,KAAK,GAAI,EAAA;AACpB,UAAA,IAAA,CAAK,GAAG,IAAI,CAAA;AACZ,UAAU,OAAA,GAAA,IAAA;AAAA,SACZ;AAAA,QACA,SAAS,GAAM,GAAA,QAAA;AAAA,OACjB;AAAA;AACF,GACF;AACF;AAQO,SAAS,QAAA,CAA6C,MAAS,KAAiD,EAAA;AACrH,EAAA,IAAI,OAAiC,GAAA,IAAA;AAErC,EAAA,OAAO,IAAI,IAAwB,KAAA;AACjC,IAAA,IAAI,OAAS,EAAA;AACX,MAAA,YAAA,CAAa,OAAO,CAAA;AAAA;AAEtB,IAAA,OAAA,GAAU,WAAW,MAAM;AACzB,MAAA,IAAA,CAAK,GAAG,IAAI,CAAA;AACZ,MAAU,OAAA,GAAA,IAAA;AAAA,OACT,KAAK,CAAA;AAAA,GACV;AACF;;;AC5Ca,IAAA,YAAA,GAAe,CAAC,QAA6B,KAAA;AACxD,EAAA,IAAI,CAAC,QAAA,IAAY,QAAa,KAAA,WAAA,IAAe,aAAa,WAAa,EAAA;AACrE,IAAO,OAAA,EAAA;AAAA;AAGT,EAAM,MAAA,KAAA,GAAQ,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA;AAGhC,EAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,IAAO,OAAA,EAAA;AAAA;AAIT,EAAO,OAAA,KAAA,CAAM,CAAC,CAAK,IAAA,EAAA;AACrB;AAOa,IAAA,0BAAA,GAA6B,CAAC,QAAsD,KAAA;AAC/F,EAAM,MAAA,SAAA,GAAY,aAAa,QAAQ,CAAA;AAGvC,EAAA,IAAI,aAAa,WAAe,IAAA,QAAA,KAAa,eAAe,QAAS,CAAA,UAAA,CAAW,YAAY,CAAG,EAAA;AAC7F,IAAO,OAAA,OAAA;AAAA;AAIT,EAAI,IAAA,SAAA,CAAU,QAAS,CAAA,CAAA,GAAA,CAAK,CAAG,EAAA;AAC7B,IAAO,OAAA,KAAA;AAAA;AAIT,EAAI,IAAA,SAAA,CAAU,QAAS,CAAA,KAAK,CAAG,EAAA;AAC7B,IAAO,OAAA,KAAA;AAAA;AAIT,EAAO,OAAA,KAAA;AACT;AASa,IAAA,6BAAA,GAAgC,CAAC,eAAA,EAAyB,gBAA8B,KAAA;AACnG,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAO,OAAA,gBAAA;AAAA;AAGT,EAAM,MAAA,WAAA,GAAc,2BAA2B,eAAe,CAAA;AAE9D,EAAI,IAAA,WAAA,KAAgB,OAAW,IAAA,WAAA,KAAgB,KAAO,EAAA;AACpD,IAAO,OAAA,oCAAA;AAAA;AAGT,EAAA,IAAI,gBAAgB,KAAO,EAAA;AACzB,IAAO,OAAA,oCAAA;AAAA;AAIT,EAAO,OAAA,gCAAA;AACT;AASa,IAAA,6BAAA,GAAgC,CAAC,eAAA,EAAyB,gBAA8B,KAAA;AACnG,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,EAAA;AAAA;AAGT,EAAA,IAAI,gBAAkB,EAAA;AACpB,IAAO,OAAA,gBAAA;AAAA;AAGT,EAAM,MAAA,WAAA,GAAc,2BAA2B,eAAe,CAAA;AAE9D,EAAI,IAAA,WAAA,KAAgB,OAAW,IAAA,WAAA,KAAgB,KAAO,EAAA;AACpD,IAAO,OAAA,uCAAA;AAAA;AAGT,EAAA,IAAI,gBAAgB,KAAO,EAAA;AACzB,IAAO,OAAA,uCAAA;AAAA;AAIT,EAAO,OAAA,mCAAA;AACT;AAMO,IAAM,WAAW,MAAM;AAC5B,EAAI,IAAA;AACF,IAAA,OAAO,CAAC,CAAC,MAAA;AAAA,GACH,CAAA,MAAA;AACN,IAAO,OAAA,KAAA;AAAA;AAEX;AAwBO,IAAM,iBAAiB,MAAM;AAClC,EAAI,IAAA;AACF,IAAA,OAAO,OAAO,cAAmB,KAAA,IAAA;AAAA,GAC3B,CAAA,MAAA;AAEN,IAAO,OAAA,KAAA;AAAA;AAEX;;;AC1IO,IAAM,6BAA6B,MAA4B;AACpE,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,SAAA;AAAA;AAGT,EAAA,IAAI,OAAO,QAAU,EAAA;AACnB,IAAO,OAAA,iBAAA;AAAA;AAGT,EAAA,IAAI,OAAO,MAAQ,EAAA;AACjB,IAAO,OAAA,aAAA;AAAA;AAGT,EAAI,IAAA,MAAA,CAAO,IAAS,KAAA,MAAA,CAAO,GAAK,EAAA;AAC9B,IAAO,OAAA,QAAA;AAAA;AAGT,EAAO,OAAA,KAAA;AACT;AAQa,IAAA,oBAAA,GAAuB,CAAC,SAAsB,KAAA;AACzD,EAAA,OAAO,SAAU,CAAA,WAAA,EAAc,CAAA,QAAA,CAAS,QAAQ,CAAA;AAClD;AAMO,IAAM,WAAW,MAAe;AACrC,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,cAAc,0BAA2B,EAAA;AAE/C,EAAA,OACE,qBAAqB,SAAU,CAAA,SAAS,CAAM,KAAA,WAAA,KAAgB,qBAAqB,WAAgB,KAAA,aAAA,CAAA;AAEvG;AAMO,IAAM,iBAAiB,MAAe;AAC3C,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,cAAc,0BAA2B,EAAA;AAE/C,EAAA,OACE,qBAAqB,SAAU,CAAA,SAAS,MAAM,KAC7C,KAAA,WAAA,KAAgB,qBAAqB,WAAgB,KAAA,aAAA,CAAA;AAE1D;AAMO,IAAM,gBAAgB,MAAM;AACjC,EAAI,IAAA,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,KAAA;AAAA;AAGT,EAAA,MAAM,cAAc,0BAA2B,EAAA;AAE/C,EAAA,OAAO,WAAgB,KAAA,QAAA;AACzB;AAOa,IAAA,QAAA,GAAW,CAAC,SAA+B,KAAA;AACtD,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAEjC,EAAA;AAAA;AAAA,IAEE,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,IAEjB,GAAG,QAAS,CAAA,SAAS,KAAK,CAAC,EAAA,CAAG,SAAS,QAAQ,CAAA;AAAA,IAEhD,EAAA,CAAG,SAAS,QAAQ,CAAA;AAAA,IAEpB,EAAA,CAAG,QAAS,CAAA,QAAQ,CACpB,IAAA,EAAA,CAAG,SAAS,MAAM,CAAA,IAClB,mBAAoB,CAAA,IAAA,CAAK,EAAE,CAAA;AAAA,IAE3B,EAAA,CAAG,SAAS,UAAU,CAAA;AAAA,IAEtB,wBAAA,CAAyB,KAAK,EAAE,CAAA;AAAA,IAEhC,2CAAA,CAA4C,KAAK,EAAE,CAAA;AAAA,IAEnD,uCAAA,CAAwC,KAAK,EAAE,CAAA;AAAA,IAE9C,EAAG,CAAA,QAAA,CAAS,SAAS,CAAA,KAAM,GAAG,QAAS,CAAA,OAAO,CAAK,IAAA,EAAA,CAAG,QAAS,CAAA,QAAQ,CACxE,CAAA,IAAA,EAAA,CAAG,SAAS,SAAS;AAAA;AAEzB;AAOa,IAAA,OAAA,GAAU,CAAC,SAA+B,KAAA;AACrD,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAEjC,EAAA;AAAA;AAAA,IAEE,GAAG,QAAS,CAAA,QAAQ,CACpB,IAAA,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,IAEjB,GAAG,QAAS,CAAA,SAAS,CAAK,IAAA,EAAA,CAAG,SAAS,QAAQ,CAAA;AAAA,IAE/C,GAAG,QAAS,CAAA,YAAY,CACxB,IAAA,EAAA,CAAG,SAAS,MAAM,CAAA;AAAA,IAElB,EAAA,CAAG,QAAS,CAAA,eAAe,CAC3B,IAAA,EAAA,CAAG,SAAS,gBAAgB,CAAA,IAC5B,EAAG,CAAA,QAAA,CAAS,UAAU,CAAA;AAAA,IAEtB,GAAG,QAAS,CAAA,YAAY,CACxB,IAAA,EAAA,CAAG,SAAS,YAAY,CAAA;AAAA,IAEvB,GAAG,QAAS,CAAA,QAAQ,MAClB,EAAG,CAAA,QAAA,CAAS,SAAS,CAAK,IAAA,EAAA,CAAG,QAAS,CAAA,QAAQ,KAAK,EAAG,CAAA,QAAA,CAAS,QAAQ,CAAK,IAAA,EAAA,CAAG,SAAS,MAAM,CAAA,CAAA;AAAA,IAEhG,GAAG,QAAS,CAAA,QAAQ,KAAK,CAAC,EAAA,CAAG,SAAS,QAAQ,CAAA;AAAA,IAE/C,mCAAA,CAAoC,KAAK,EAAE,CAAA;AAAA,IAE3C,0BAAA,CAA2B,KAAK,EAAE,CAAA;AAAA,IAElC,+CAAA,CAAgD,KAAK,EAAE;AAAA;AAE3D;AAOa,IAAA,IAAA,GAAO,CAAC,SAAsB,KAAA;AACzC,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAEjC,EAAA,OAAO,CAAC,OAAQ,CAAA,EAAE,CAAK,IAAA,CAAC,SAAS,EAAE,CAAA;AACrC;AAOa,IAAA,0BAAA,GAA6B,CAAC,SAAsB,KAAA;AAC/D,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAEjC,EAAI,IAAA,QAAA,CAAS,EAAE,CAAG,EAAA;AAChB,IAAO,OAAA,QAAA;AAAA;AAGT,EAAI,IAAA,OAAA,CAAQ,EAAE,CAAG,EAAA;AACf,IAAO,OAAA,OAAA;AAAA;AAGT,EAAO,OAAA,IAAA;AACT;AAOa,IAAA,SAAA,GAAY,CAAC,SAA8B,KAAA;AACtD,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,SAAA;AAAA;AAGT,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAGjC,EAAI,IAAA,kBAAA,CAAmB,IAAK,CAAA,EAAE,CAAG,EAAA;AAC/B,IAAO,OAAA,KAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,QAAS,CAAA,SAAS,CAAG,EAAA;AAC1B,IAAO,OAAA,SAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,QAAS,CAAA,SAAS,CAAK,IAAA,EAAA,CAAG,QAAS,CAAA,OAAO,CAAK,IAAA,EAAA,CAAG,QAAS,CAAA,OAAO,CAAG,EAAA;AAC1E,IAAO,OAAA,SAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,QAAS,CAAA,UAAU,CAAK,IAAA,EAAA,CAAG,QAAS,CAAA,OAAO,CAAK,IAAA,EAAA,CAAG,QAAS,CAAA,WAAW,CAAG,EAAA;AAC/E,IAAO,OAAA,KAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,SAAS,OAAO,CAAA,IAAK,CAAC,EAAG,CAAA,QAAA,CAAS,SAAS,CAAG,EAAA;AACnD,IAAO,OAAA,OAAA;AAAA;AAGT,EAAO,OAAA,SAAA;AACT;AAMO,IAAM,mBAAmB,MAAc;AAC5C,EAAA,IAAI,CAAC,QAAA,EAAc,IAAA,OAAO,cAAc,WAAa,EAAA;AACnD,IAAO,OAAA,SAAA;AAAA;AAGT,EAAO,OAAA,SAAA,CAAU,UAAU,SAAS,CAAA;AACtC;AAOa,IAAA,YAAA,GAAe,CAAC,SAA8B,KAAA;AACzD,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,SAAA;AAAA;AAGT,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAGjC,EAAM,MAAA,QAAA,GAAW,EAAG,CAAA,KAAA,CAAM,2BAA2B,CAAA;AACrD,EAAI,IAAA,QAAA,IAAY,QAAS,CAAA,MAAA,IAAU,CAAG,EAAA;AACpC,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA;AAExB,IAAO,OAAA,KAAA,GAAQ,CAAG,EAAA,KAAK,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,KAAK,CAAK,CAAA,GAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA;AAIjE,EAAM,MAAA,YAAA,GAAe,EAAG,CAAA,KAAA,CAAM,yBAAyB,CAAA;AACvD,EAAI,IAAA,YAAA,IAAgB,YAAa,CAAA,CAAC,CAAG,EAAA;AACnC,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA;AAIvB,EAAM,MAAA,YAAA,GAAe,EAAG,CAAA,KAAA,CAAM,uBAAuB,CAAA;AACrD,EAAI,IAAA,YAAA,IAAgB,YAAa,CAAA,CAAC,CAAG,EAAA;AACnC,IAAM,MAAA,OAAA,GAAU,aAAa,CAAC,CAAA;AAE9B,IAAA,MAAM,iBAA4C,GAAA;AAAA,MAChD,MAAQ,EAAA,OAAA;AAAA,MACR,KAAO,EAAA,KAAA;AAAA,MACP,KAAO,EAAA,GAAA;AAAA,MACP,KAAO,EAAA,GAAA;AAAA,MACP,KAAO,EAAA,OAAA;AAAA,MACP,KAAO,EAAA;AAAA,KACT;AAEA,IAAO,OAAA,iBAAA,CAAkB,OAAO,CAAK,IAAA,OAAA;AAAA;AAIvC,EAAM,MAAA,QAAA,GAAW,EAAG,CAAA,KAAA,CAAM,iCAAiC,CAAA;AAC3D,EAAI,IAAA,QAAA,IAAY,QAAS,CAAA,MAAA,IAAU,CAAG,EAAA;AACpC,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA;AACxB,IAAM,MAAA,KAAA,GAAQ,SAAS,CAAC,CAAA;AAExB,IAAO,OAAA,KAAA,GAAQ,CAAG,EAAA,KAAK,CAAI,CAAA,EAAA,KAAK,CAAI,CAAA,EAAA,KAAK,CAAK,CAAA,GAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AAAA;AAGjE,EAAO,OAAA,SAAA;AACT;AAOa,IAAA,cAAA,GAAiB,CAAC,SAAmC,KAAA;AAChE,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,SAAA;AAAA;AAGT,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAGjC,EAAA,IAAI,GAAG,QAAS,CAAA,MAAM,KAAK,EAAG,CAAA,QAAA,CAAS,OAAO,CAAG,EAAA;AAC/C,IAAO,OAAA,MAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,QAAS,CAAA,gBAAgB,CAAG,EAAA;AACjC,IAAO,OAAA,SAAA;AAAA;AAIT,EAAA,IAAI,GAAG,QAAS,CAAA,MAAM,KAAK,EAAG,CAAA,QAAA,CAAS,OAAO,CAAG,EAAA;AAC/C,IAAO,OAAA,OAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,SAAS,QAAQ,CAAA,IAAK,CAAC,EAAG,CAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AAChD,IAAO,OAAA,QAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,QAAS,CAAA,SAAS,CAAG,EAAA;AAC1B,IAAO,OAAA,SAAA;AAAA;AAIT,EAAI,IAAA,EAAA,CAAG,SAAS,QAAQ,CAAA,IAAK,CAAC,EAAG,CAAA,QAAA,CAAS,QAAQ,CAAG,EAAA;AACnD,IAAO,OAAA,QAAA;AAAA;AAGT,EAAO,OAAA,SAAA;AACT;AAOa,IAAA,iBAAA,GAAoB,CAAC,SAA8B,KAAA;AAC9D,EAAA,IAAI,CAAC,SAAW,EAAA;AACd,IAAO,OAAA,SAAA;AAAA;AAGT,EAAM,MAAA,EAAA,GAAK,UAAU,WAAY,EAAA;AAGjC,EAAM,MAAA,QAAA,GAAW,EAAG,CAAA,KAAA,CAAM,sBAAsB,CAAA;AAChD,EAAI,IAAA,QAAA,IAAY,QAAS,CAAA,CAAC,CAAG,EAAA;AAC3B,IAAA,OAAO,SAAS,CAAC,CAAA;AAAA;AAInB,EAAM,MAAA,YAAA,GAAe,EAAG,CAAA,KAAA,CAAM,iCAAiC,CAAA;AAC/D,EAAI,IAAA,YAAA,IAAgB,YAAa,CAAA,CAAC,CAAG,EAAA;AACnC,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA;AAIvB,EAAM,MAAA,UAAA,GAAa,EAAG,CAAA,KAAA,CAAM,gCAAgC,CAAA;AAC5D,EAAI,IAAA,UAAA,IAAc,UAAW,CAAA,CAAC,CAAG,EAAA;AAC/B,IAAA,OAAO,WAAW,CAAC,CAAA;AAAA;AAIrB,EAAM,MAAA,WAAA,GAAc,EAAG,CAAA,KAAA,CAAM,yBAAyB,CAAA;AACtD,EAAI,IAAA,WAAA,IAAe,YAAY,CAAC,CAAA,IAAK,CAAC,EAAG,CAAA,QAAA,CAAS,KAAK,CAAG,EAAA;AACxD,IAAA,OAAO,YAAY,CAAC,CAAA;AAAA;AAItB,EAAM,MAAA,YAAA,GAAe,EAAG,CAAA,KAAA,CAAM,0BAA0B,CAAA;AACxD,EAAI,IAAA,YAAA,IAAgB,YAAa,CAAA,CAAC,CAAG,EAAA;AACnC,IAAA,OAAO,aAAa,CAAC,CAAA;AAAA;AAIvB,EAAM,MAAA,WAAA,GAAc,EAAG,CAAA,KAAA,CAAM,0BAA0B,CAAA;AACvD,EAAA,IAAI,WAAe,IAAA,WAAA,CAAY,CAAC,CAAA,IAAK,EAAG,CAAA,QAAA,CAAS,QAAQ,CAAA,IAAK,CAAC,EAAA,CAAG,QAAS,CAAA,QAAQ,CAAG,EAAA;AACpF,IAAA,OAAO,YAAY,CAAC,CAAA;AAAA;AAGtB,EAAO,OAAA,SAAA;AACT;AAKO,IAAM,sBAAsB,MAAc;AAC/C,EAAA,IAAI,CAAC,QAAA,EAAc,IAAA,OAAO,cAAc,WAAa,EAAA;AACnD,IAAO,OAAA,SAAA;AAAA;AAGT,EAAO,OAAA,YAAA,CAAa,UAAU,SAAS,CAAA;AACzC;AAMO,IAAM,wBAAwB,MAAmB;AACtD,EAAA,IAAI,CAAC,QAAA,EAAc,IAAA,OAAO,cAAc,WAAa,EAAA;AACnD,IAAO,OAAA,SAAA;AAAA;AAGT,EAAO,OAAA,cAAA,CAAe,UAAU,SAAS,CAAA;AAC3C;AAMO,IAAM,2BAA2B,MAAc;AACpD,EAAA,IAAI,CAAC,QAAA,EAAc,IAAA,OAAO,cAAc,WAAa,EAAA;AACnD,IAAO,OAAA,SAAA;AAAA;AAGT,EAAO,OAAA,iBAAA,CAAkB,UAAU,SAAS,CAAA;AAC9C;;;ACvaO,IAAM,oBAAA,GAAN,MAAM,oBAAoB,CAAA;AAAA,EAYvB,WAAc,GAAA;AAVtB,IAAQ,aAAA,CAAA,IAAA,EAAA,UAAA,sBAAe,GAA2C,EAAA,CAAA;AAWhE,IAAA,MAAA,CAAO,iBAAiB,SAAW,EAAA,IAAA,CAAK,aAAc,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA;AAClE,EAVA,OAAO,WAAmC,GAAA;AACxC,IAAI,IAAA,CAAC,qBAAoB,QAAU,EAAA;AACjC,MAAoB,oBAAA,CAAA,QAAA,GAAW,IAAI,oBAAoB,EAAA;AAAA;AAGzD,IAAA,OAAO,oBAAoB,CAAA,QAAA;AAAA;AAC7B;AAAA;AAAA;AAAA;AAAA,EAUQ,cAAc,KAA2B,EAAA;AAE/C,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,OAAO,CAAA,IAAK,KAAK,QAAU,EAAA;AAC1C,MAAI,IAAA;AACF,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,eACN,KAAO,EAAA;AACd,QAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,gBAAA,EAAmB,GAAG,CAAA,OAAA,CAAA,EAAW,KAAK,CAAA;AAAA;AACtD;AACF;AACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAA,CAAgB,KAAa,OAA8C,EAAA;AACzE,IAAK,IAAA,CAAA,QAAA,CAAS,GAAI,CAAA,GAAA,EAAK,OAAO,CAAA;AAAA;AAChC;AAAA;AAAA;AAAA;AAAA,EAMA,kBAAkB,GAAmB,EAAA;AACnC,IAAK,IAAA,CAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA;AAE5B,CAAA;AA9CE,aAAA,CADW,oBACI,EAAA,UAAA,CAAA;AADV,IAAM,mBAAN,GAAA;;;ACiBA,IAAM,mBAAmB,CAAC;AAAA,EAC/B,SAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAsC,KAAA;AAEpC,EAAM,MAAA,MAAA,GAAS,QAAS,CAAA,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAM,MAAA,GAAA,GAAM,MAAO,CAAA,UAAA,CAAW,IAAI,CAAA;AAElC,EAAA,IAAI,CAAC,GAAK,EAAA;AAER,IAAM,MAAA,IAAI,MAAM,0EAA6B,CAAA;AAAA;AAI/C,EAAA,MAAM,aAAgB,GAAA,GAAA;AACtB,EAAM,MAAA,eAAA,GAAkB,UAAU,MAAS,GAAA,EAAA;AAE3C,EAAA,MAAA,CAAO,QAAQ,WAAe,IAAA,eAAA;AAC9B,EAAA,MAAA,CAAO,SAAS,YAAgB,IAAA,aAAA;AAGhC,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAA,GAAA,CAAI,SAAY,GAAA,eAAA;AAChB,IAAA,GAAA,CAAI,SAAS,CAAG,EAAA,CAAA,EAAG,MAAO,CAAA,KAAA,EAAO,OAAO,MAAM,CAAA;AAAA;AAIhD,EAAA,GAAA,CAAI,YAAY,SAAa,IAAA,OAAA;AAC7B,EAAA,GAAA,CAAI,OAAO,CAAG,EAAA,QAAA,IAAY,EAAE,CAAA,GAAA,EAAM,cAAc,MAAM,CAAA,CAAA;AACtD,EAAA,GAAA,CAAI,SAAY,GAAA,QAAA;AAChB,EAAA,GAAA,CAAI,YAAe,GAAA,QAAA;AAGnB,EAAA,GAAA,CAAI,SAAS,SAAW,EAAA,MAAA,CAAO,QAAQ,CAAG,EAAA,MAAA,CAAO,SAAS,CAAC,CAAA;AAG3D,EAAA,OAAO,OAAO,SAAU,EAAA;AAC1B","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"]}
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","../src/utils/cookie-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 === 'dev') {\n return 'https://nxl-dsp-dev.hanwhalife.com';\n }\n\n if (environment === 'local' || 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// DSP, FP Planner\nexport const isWebView = () => {\n const environment = getDspExecutionEnvironment();\n\n return environment === 'android-webview' || environment === 'ios-webview';\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/**\n * ํด๋ผ์ด์–ธํŠธ์šฉ ๋””๋ฐ”์ด์Šค ID ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ(์ž„์‹œ๊ฐ’)\n */\nexport const getOrCreateDeviceId = (): string => {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const STORAGE_KEY = 'dsp_device_id';\n let deviceId = localStorage.getItem(STORAGE_KEY);\n\n if (!deviceId) {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 15);\n deviceId = `dsp-web-${timestamp}-${random}`;\n\n try {\n localStorage.setItem(STORAGE_KEY, deviceId);\n } catch (error) {\n console.warn('[DeviceId] localStorage ์ €์žฅ ์‹คํŒจ:', error);\n }\n }\n\n return deviceId;\n};\n\n/**\n * ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ ๊ฐ์ง€\n */\nexport const getDeviceModel = (): string => {\n if (!isClient()) {\n return '';\n }\n\n const ua = navigator.userAgent;\n\n // iOS\n if (/iPad/.test(ua)) {\n return 'iPad';\n }\n if (/iPhone/.test(ua)) {\n return 'iPhone';\n }\n if (/iPod/.test(ua)) {\n return 'iPod Touch';\n }\n\n // Android - ์ฃผ์š” ๋ธŒ๋žœ๋“œ\n if (/SM-[A-Z0-9]+/.test(ua)) {\n const match = ua.match(/SM-[A-Z0-9]+/);\n\n return match ? `Samsung ${match[0]}` : 'Samsung';\n }\n if (/Pixel/.test(ua)) {\n const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);\n\n return match ? `Google ${match[0]}` : 'Google Pixel';\n }\n if (/Mi\\s|Redmi|POCO/.test(ua)) {\n return 'Xiaomi';\n }\n if (/HUAWEI/.test(ua)) {\n return 'Huawei';\n }\n if (/OnePlus/.test(ua)) {\n return 'OnePlus';\n }\n\n // Desktop\n if (/Windows/.test(ua)) {\n return 'Windows PC';\n }\n if (/Mac OS X/.test(ua)) {\n return 'Mac';\n }\n if (/Linux/.test(ua)) {\n return 'Linux PC';\n }\n\n return 'Unknown';\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","export const getCookie = (name: string): string => {\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n};\n\nexport const setCookie = (\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n): void => {\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n};\n\nexport const deleteCookie = (name: string, options: { path?: string; domain?: string } = {}): void => {\n setCookie(name, '', { ...options, expires: -1 });\n};\n"]}
package/dist/index.d.cts CHANGED
@@ -28,6 +28,7 @@ type BrowserName = 'chrome' | 'firefox' | 'safari' | 'edge' | 'opera' | 'samsung
28
28
  * @returns
29
29
  */
30
30
  declare const getDspExecutionEnvironment: () => ExecutionEnvironment;
31
+ declare const isWebView: () => boolean;
31
32
  /**
32
33
  * UserAgent์— SspApp ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
33
34
  * ์žˆ์œผ๋ฉด, DSP ์•ฑ
@@ -118,6 +119,14 @@ declare const getCurrentBrowserName: () => BrowserName;
118
119
  * @returns ํ˜„์žฌ ํ™˜๊ฒฝ์˜ ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „
119
120
  */
120
121
  declare const getCurrentBrowserVersion: () => string;
122
+ /**
123
+ * ํด๋ผ์ด์–ธํŠธ์šฉ ๋””๋ฐ”์ด์Šค ID ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ(์ž„์‹œ๊ฐ’)
124
+ */
125
+ declare const getOrCreateDeviceId: () => string;
126
+ /**
127
+ * ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ ๊ฐ์ง€
128
+ */
129
+ declare const getDeviceModel: () => string;
121
130
 
122
131
  /**
123
132
  * ํ˜ธ์ŠคํŠธ๋ช…์—์„œ ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
@@ -225,4 +234,16 @@ interface ConvertTextToImgParams {
225
234
  */
226
235
  declare const convertTextToImg: ({ targetStr, canvasWidth, canvasHeight, backgroundColor, fontColor, fontSize, fontWeight }: ConvertTextToImgParams) => string;
227
236
 
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 };
237
+ declare const getCookie: (name: string) => string;
238
+ declare const setCookie: (name: string, value: string, options?: {
239
+ expires?: number | Date;
240
+ path?: string;
241
+ domain?: string;
242
+ secure?: boolean;
243
+ }) => void;
244
+ declare const deleteCookie: (name: string, options?: {
245
+ path?: string;
246
+ domain?: string;
247
+ }) => void;
248
+
249
+ export { type BrowserName, type ExecutionEnvironment, MessageEventManager, type OSName, checkUserAgentDspApp, convertTextToImg, debounce, deleteCookie, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCookie, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDeviceModel, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getOrCreateDeviceId, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, isWebView, setCookie, throttle };
package/dist/index.d.ts CHANGED
@@ -28,6 +28,7 @@ type BrowserName = 'chrome' | 'firefox' | 'safari' | 'edge' | 'opera' | 'samsung
28
28
  * @returns
29
29
  */
30
30
  declare const getDspExecutionEnvironment: () => ExecutionEnvironment;
31
+ declare const isWebView: () => boolean;
31
32
  /**
32
33
  * UserAgent์— SspApp ์ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ
33
34
  * ์žˆ์œผ๋ฉด, DSP ์•ฑ
@@ -118,6 +119,14 @@ declare const getCurrentBrowserName: () => BrowserName;
118
119
  * @returns ํ˜„์žฌ ํ™˜๊ฒฝ์˜ ๋ธŒ๋ผ์šฐ์ € ๋ฒ„์ „
119
120
  */
120
121
  declare const getCurrentBrowserVersion: () => string;
122
+ /**
123
+ * ํด๋ผ์ด์–ธํŠธ์šฉ ๋””๋ฐ”์ด์Šค ID ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ(์ž„์‹œ๊ฐ’)
124
+ */
125
+ declare const getOrCreateDeviceId: () => string;
126
+ /**
127
+ * ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ ๊ฐ์ง€
128
+ */
129
+ declare const getDeviceModel: () => string;
121
130
 
122
131
  /**
123
132
  * ํ˜ธ์ŠคํŠธ๋ช…์—์„œ ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
@@ -225,4 +234,16 @@ interface ConvertTextToImgParams {
225
234
  */
226
235
  declare const convertTextToImg: ({ targetStr, canvasWidth, canvasHeight, backgroundColor, fontColor, fontSize, fontWeight }: ConvertTextToImgParams) => string;
227
236
 
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 };
237
+ declare const getCookie: (name: string) => string;
238
+ declare const setCookie: (name: string, value: string, options?: {
239
+ expires?: number | Date;
240
+ path?: string;
241
+ domain?: string;
242
+ secure?: boolean;
243
+ }) => void;
244
+ declare const deleteCookie: (name: string, options?: {
245
+ path?: string;
246
+ domain?: string;
247
+ }) => void;
248
+
249
+ export { type BrowserName, type ExecutionEnvironment, MessageEventManager, type OSName, checkUserAgentDspApp, convertTextToImg, debounce, deleteCookie, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCookie, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDeviceModel, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getOrCreateDeviceId, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, isWebView, setCookie, throttle };
package/dist/index.js CHANGED
@@ -65,10 +65,10 @@ var getApiHostNameFromEnvironment = (currentHostname, forceApiHostName) => {
65
65
  return forceApiHostName;
66
66
  }
67
67
  const environment = getEnvironmentFromHostname(currentHostname);
68
- if (environment === "local" || environment === "dev") {
68
+ if (environment === "dev") {
69
69
  return "https://nxl-dsp-dev.hanwhalife.com";
70
70
  }
71
- if (environment === "stg") {
71
+ if (environment === "local" || environment === "stg") {
72
72
  return "https://nxl-dsp-stg.hanwhalife.com";
73
73
  }
74
74
  return "https://nxl-dsp.hanwhalife.com";
@@ -120,6 +120,10 @@ var getDspExecutionEnvironment = () => {
120
120
  }
121
121
  return "web";
122
122
  };
123
+ var isWebView = () => {
124
+ const environment = getDspExecutionEnvironment();
125
+ return environment === "android-webview" || environment === "ios-webview";
126
+ };
123
127
  var checkUserAgentDspApp = (userAgent) => {
124
128
  return userAgent.toLowerCase().includes("sspapp");
125
129
  };
@@ -332,6 +336,66 @@ var getCurrentBrowserVersion = () => {
332
336
  }
333
337
  return getBrowserVersion(navigator.userAgent);
334
338
  };
339
+ var getOrCreateDeviceId = () => {
340
+ if (typeof window === "undefined") {
341
+ return "";
342
+ }
343
+ const STORAGE_KEY = "dsp_device_id";
344
+ let deviceId = localStorage.getItem(STORAGE_KEY);
345
+ if (!deviceId) {
346
+ const timestamp = Date.now().toString(36);
347
+ const random = Math.random().toString(36).substring(2, 15);
348
+ deviceId = `dsp-web-${timestamp}-${random}`;
349
+ try {
350
+ localStorage.setItem(STORAGE_KEY, deviceId);
351
+ } catch (error) {
352
+ console.warn("[DeviceId] localStorage \uC800\uC7A5 \uC2E4\uD328:", error);
353
+ }
354
+ }
355
+ return deviceId;
356
+ };
357
+ var getDeviceModel = () => {
358
+ if (!isClient()) {
359
+ return "";
360
+ }
361
+ const ua = navigator.userAgent;
362
+ if (/iPad/.test(ua)) {
363
+ return "iPad";
364
+ }
365
+ if (/iPhone/.test(ua)) {
366
+ return "iPhone";
367
+ }
368
+ if (/iPod/.test(ua)) {
369
+ return "iPod Touch";
370
+ }
371
+ if (/SM-[A-Z0-9]+/.test(ua)) {
372
+ const match = ua.match(/SM-[A-Z0-9]+/);
373
+ return match ? `Samsung ${match[0]}` : "Samsung";
374
+ }
375
+ if (/Pixel/.test(ua)) {
376
+ const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);
377
+ return match ? `Google ${match[0]}` : "Google Pixel";
378
+ }
379
+ if (/Mi\s|Redmi|POCO/.test(ua)) {
380
+ return "Xiaomi";
381
+ }
382
+ if (/HUAWEI/.test(ua)) {
383
+ return "Huawei";
384
+ }
385
+ if (/OnePlus/.test(ua)) {
386
+ return "OnePlus";
387
+ }
388
+ if (/Windows/.test(ua)) {
389
+ return "Windows PC";
390
+ }
391
+ if (/Mac OS X/.test(ua)) {
392
+ return "Mac";
393
+ }
394
+ if (/Linux/.test(ua)) {
395
+ return "Linux PC";
396
+ }
397
+ return "Unknown";
398
+ };
335
399
 
336
400
  // src/utils/event-handler-utils.ts
337
401
  var _MessageEventManager = class _MessageEventManager {
@@ -408,6 +472,42 @@ var convertTextToImg = ({
408
472
  return canvas.toDataURL();
409
473
  };
410
474
 
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 };
475
+ // src/utils/cookie-utils.ts
476
+ var getCookie = (name) => {
477
+ if (typeof document === "undefined") {
478
+ return "";
479
+ }
480
+ const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));
481
+ return match ? decodeURIComponent(match[2] || "") : "";
482
+ };
483
+ var setCookie = (name, value, options = {}) => {
484
+ if (typeof document === "undefined") {
485
+ return;
486
+ }
487
+ let cookieString = `${name}=${encodeURIComponent(value)}`;
488
+ if (options.expires) {
489
+ let expiresDate;
490
+ if (typeof options.expires === "number") {
491
+ expiresDate = /* @__PURE__ */ new Date();
492
+ expiresDate.setDate(expiresDate.getDate() + options.expires);
493
+ } else {
494
+ expiresDate = options.expires;
495
+ }
496
+ cookieString += `; expires=${expiresDate.toUTCString()}`;
497
+ }
498
+ cookieString += `; path=${options.path || "/"}`;
499
+ if (options.domain) {
500
+ cookieString += `; domain=${options.domain}`;
501
+ }
502
+ if (options.secure) {
503
+ cookieString += "; secure";
504
+ }
505
+ document.cookie = cookieString;
506
+ };
507
+ var deleteCookie = (name, options = {}) => {
508
+ setCookie(name, "", { ...options, expires: -1 });
509
+ };
510
+
511
+ export { MessageEventManager, checkUserAgentDspApp, convertTextToImg, debounce, deleteCookie, getApiHostNameFromEnvironment, getBrowserName, getBrowserVersion, getCdnHostNameFromEnvironment, getCookie, getCurrentBrowserName, getCurrentBrowserVersion, getCurrentOSName, getCurrentOSVersion, getDeviceModel, getDspExecutionEnvironment, getEnvironmentFromHostname, getFormFactorFromUserAgent, getOSName, getOSVersion, getOrCreateDeviceId, getSubdomain, isClient, isDspApp, isFpPlannerApp, isPc, isPhone, isSalesPortal, isStorybookEnv, isTablet, isWebView, setCookie, throttle };
412
512
  //# sourceMappingURL=index.js.map
413
513
  //# 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","../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"]}
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","../src/utils/cookie-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 === 'dev') {\n return 'https://nxl-dsp-dev.hanwhalife.com';\n }\n\n if (environment === 'local' || 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// DSP, FP Planner\nexport const isWebView = () => {\n const environment = getDspExecutionEnvironment();\n\n return environment === 'android-webview' || environment === 'ios-webview';\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/**\n * ํด๋ผ์ด์–ธํŠธ์šฉ ๋””๋ฐ”์ด์Šค ID ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ(์ž„์‹œ๊ฐ’)\n */\nexport const getOrCreateDeviceId = (): string => {\n if (typeof window === 'undefined') {\n return '';\n }\n\n const STORAGE_KEY = 'dsp_device_id';\n let deviceId = localStorage.getItem(STORAGE_KEY);\n\n if (!deviceId) {\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 15);\n deviceId = `dsp-web-${timestamp}-${random}`;\n\n try {\n localStorage.setItem(STORAGE_KEY, deviceId);\n } catch (error) {\n console.warn('[DeviceId] localStorage ์ €์žฅ ์‹คํŒจ:', error);\n }\n }\n\n return deviceId;\n};\n\n/**\n * ๋””๋ฐ”์ด์Šค ๋ชจ๋ธ ๊ฐ์ง€\n */\nexport const getDeviceModel = (): string => {\n if (!isClient()) {\n return '';\n }\n\n const ua = navigator.userAgent;\n\n // iOS\n if (/iPad/.test(ua)) {\n return 'iPad';\n }\n if (/iPhone/.test(ua)) {\n return 'iPhone';\n }\n if (/iPod/.test(ua)) {\n return 'iPod Touch';\n }\n\n // Android - ์ฃผ์š” ๋ธŒ๋žœ๋“œ\n if (/SM-[A-Z0-9]+/.test(ua)) {\n const match = ua.match(/SM-[A-Z0-9]+/);\n\n return match ? `Samsung ${match[0]}` : 'Samsung';\n }\n if (/Pixel/.test(ua)) {\n const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);\n\n return match ? `Google ${match[0]}` : 'Google Pixel';\n }\n if (/Mi\\s|Redmi|POCO/.test(ua)) {\n return 'Xiaomi';\n }\n if (/HUAWEI/.test(ua)) {\n return 'Huawei';\n }\n if (/OnePlus/.test(ua)) {\n return 'OnePlus';\n }\n\n // Desktop\n if (/Windows/.test(ua)) {\n return 'Windows PC';\n }\n if (/Mac OS X/.test(ua)) {\n return 'Mac';\n }\n if (/Linux/.test(ua)) {\n return 'Linux PC';\n }\n\n return 'Unknown';\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","export const getCookie = (name: string): string => {\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n};\n\nexport const setCookie = (\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n): void => {\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n};\n\nexport const deleteCookie = (name: string, options: { path?: string; domain?: string } = {}): void => {\n setCookie(name, '', { ...options, expires: -1 });\n};\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sales-frontend-utils",
3
- "version": "0.0.12",
3
+ "version": "0.0.14",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",