sales-frontend-utils 0.0.41 → 0.0.42

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.
Files changed (85) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +11 -442
  4. package/dist/index.d.ts +11 -442
  5. package/dist/index.js +1 -1
  6. package/dist/index.js.map +1 -1
  7. package/dist/types/common.types.cjs +4 -0
  8. package/dist/types/common.types.cjs.map +1 -0
  9. package/dist/types/common.types.d.cts +11 -0
  10. package/dist/types/common.types.d.ts +11 -0
  11. package/dist/types/common.types.js +3 -0
  12. package/dist/types/common.types.js.map +1 -0
  13. package/dist/types/window.types.d.cjs +4 -0
  14. package/dist/types/window.types.d.cjs.map +1 -0
  15. package/dist/types/window.types.d.d.cts +6 -0
  16. package/dist/types/window.types.d.d.ts +6 -0
  17. package/dist/types/window.types.d.js +3 -0
  18. package/dist/types/window.types.d.js.map +1 -0
  19. package/dist/utils/age-utils.cjs +214 -0
  20. package/dist/utils/age-utils.cjs.map +1 -0
  21. package/dist/utils/age-utils.d.cts +63 -0
  22. package/dist/utils/age-utils.d.ts +63 -0
  23. package/dist/utils/age-utils.js +207 -0
  24. package/dist/utils/age-utils.js.map +1 -0
  25. package/dist/utils/astx2-utils.cjs +108 -0
  26. package/dist/utils/astx2-utils.cjs.map +1 -0
  27. package/dist/utils/astx2-utils.d.cts +28 -0
  28. package/dist/utils/astx2-utils.d.ts +28 -0
  29. package/dist/utils/astx2-utils.js +102 -0
  30. package/dist/utils/astx2-utils.js.map +1 -0
  31. package/dist/utils/canvas-utils.cjs +70 -0
  32. package/dist/utils/canvas-utils.cjs.map +1 -0
  33. package/dist/utils/canvas-utils.d.cts +30 -0
  34. package/dist/utils/canvas-utils.d.ts +30 -0
  35. package/dist/utils/canvas-utils.js +67 -0
  36. package/dist/utils/canvas-utils.js.map +1 -0
  37. package/dist/utils/cookie-utils.cjs +43 -0
  38. package/dist/utils/cookie-utils.cjs.map +1 -0
  39. package/dist/utils/cookie-utils.d.cts +13 -0
  40. package/dist/utils/cookie-utils.d.ts +13 -0
  41. package/dist/utils/cookie-utils.js +39 -0
  42. package/dist/utils/cookie-utils.js.map +1 -0
  43. package/dist/utils/date-utils.cjs +158 -0
  44. package/dist/utils/date-utils.cjs.map +1 -0
  45. package/dist/utils/date-utils.d.cts +100 -0
  46. package/dist/utils/date-utils.d.ts +100 -0
  47. package/dist/utils/date-utils.js +141 -0
  48. package/dist/utils/date-utils.js.map +1 -0
  49. package/dist/utils/environment-utils.cjs +187 -0
  50. package/dist/utils/environment-utils.cjs.map +1 -0
  51. package/dist/utils/environment-utils.d.cts +93 -0
  52. package/dist/utils/environment-utils.d.ts +93 -0
  53. package/dist/utils/environment-utils.js +175 -0
  54. package/dist/utils/environment-utils.js.map +1 -0
  55. package/dist/utils/event-handler-utils.cjs +53 -0
  56. package/dist/utils/event-handler-utils.cjs.map +1 -0
  57. package/dist/utils/event-handler-utils.d.cts +29 -0
  58. package/dist/utils/event-handler-utils.d.ts +29 -0
  59. package/dist/utils/event-handler-utils.js +51 -0
  60. package/dist/utils/event-handler-utils.js.map +1 -0
  61. package/dist/utils/file-utils.cjs +116 -0
  62. package/dist/utils/file-utils.cjs.map +1 -0
  63. package/dist/utils/file-utils.d.cts +20 -0
  64. package/dist/utils/file-utils.d.ts +20 -0
  65. package/dist/utils/file-utils.js +106 -0
  66. package/dist/utils/file-utils.js.map +1 -0
  67. package/dist/utils/formatting.cjs +41 -0
  68. package/dist/utils/formatting.cjs.map +1 -0
  69. package/dist/utils/formatting.d.cts +7 -0
  70. package/dist/utils/formatting.d.ts +7 -0
  71. package/dist/utils/formatting.js +35 -0
  72. package/dist/utils/formatting.js.map +1 -0
  73. package/dist/utils/timing-utils.cjs +40 -0
  74. package/dist/utils/timing-utils.cjs.map +1 -0
  75. package/dist/utils/timing-utils.d.cts +16 -0
  76. package/dist/utils/timing-utils.d.ts +16 -0
  77. package/dist/utils/timing-utils.js +37 -0
  78. package/dist/utils/timing-utils.js.map +1 -0
  79. package/dist/utils/user-agent-utils.cjs +328 -0
  80. package/dist/utils/user-agent-utils.cjs.map +1 -0
  81. package/dist/utils/user-agent-utils.d.cts +113 -0
  82. package/dist/utils/user-agent-utils.d.ts +113 -0
  83. package/dist/utils/user-agent-utils.js +307 -0
  84. package/dist/utils/user-agent-utils.js.map +1 -0
  85. package/package.json +111 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/file-utils.ts"],"names":[],"mappings":"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","file":"file-utils.js","sourcesContent":["export function base64ToBlob(base64String: string, contentType = '') {\n const regex = /^data:([a-zA-Z0-9/+.-]+);base64,/;\n const matches = base64String.match(regex);\n\n if (matches === null) {\n throw new Error('Invalid base64 string');\n }\n\n const contentTypeFinal = contentType || matches[1];\n const byteCharacters = atob(base64String.replace(regex, ''));\n const byteNumbers = new Array(byteCharacters.length);\n for (let i = 0; i < byteCharacters.length; i++) {\n byteNumbers[i] = byteCharacters.charCodeAt(i);\n }\n\n const byteArray = new Uint8Array(byteNumbers);\n\n return new Blob([byteArray], { type: contentTypeFinal });\n}\n\nexport function base64ToFile(base64String: string, fileName: string, contentType = '') {\n const blob = base64ToBlob(base64String, contentType);\n\n if (!blob) {\n throw new Error('Invalid base64 string');\n }\n\n return blobToFile(blob, fileName);\n}\n\nexport function blobToFile(blob: Blob, fileName: string) {\n return new File([blob], fileName, {\n type: blob.type,\n lastModified: Date.now()\n });\n}\n\nexport async function fileToBase64(file: File | Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n\n reader.onload = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n\n reader.onerror = (error) => {\n reject(error);\n };\n\n reader.readAsDataURL(file);\n });\n}\n\n/**\n * 파일확장자 리턴\n * @param data string File Blob\n */\nexport function getExt(data: string | File | Blob) {\n if (typeof data === 'string') {\n return data.split('.').pop();\n }\n\n if (data instanceof File) {\n return data.name.split('.').pop();\n }\n\n if (data instanceof Blob) {\n return data.type.split('/').pop();\n }\n}\n\nexport async function objectUrlToBlob(objectUrl: string) {\n try {\n const response = await fetch(objectUrl);\n const blob = await response.blob();\n\n return blob;\n } catch (error) {\n console.error('Error converting object URL to Blob:', error);\n throw error;\n }\n}\n\nexport async function objectUrlToBase64(objectUrl: string): Promise<string> {\n const blob = await objectUrlToBlob(objectUrl);\n\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => {\n if (typeof reader.result === 'string') {\n resolve(reader.result);\n } else {\n reject(new Error('Invalid file type'));\n }\n };\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport function downloadBlob(blob: Blob, filename: string) {\n // 1. Create a temporary URL for the Blob object\n const url = URL.createObjectURL(blob);\n\n // 2. Create a hidden anchor element\n const link = document.createElement('a');\n link.style.display = 'none';\n link.href = url;\n\n // 3. Set the 'download' attribute with the desired file name\n // This attribute forces the browser to download the URL content instead of navigating to it\n link.download = `${filename}.${getExt(blob)}`;\n\n // 4. Append the link to the body (necessary for the click to work in some browsers)\n document.body.appendChild(link);\n\n // 5. Simulate a click on the link to trigger the download\n link.click();\n\n // 6. Clean up: Remove the link and revoke the object URL\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n}\n\n/**\n * image url을 File Object로 변경.\n * @param imageUrl fileObject로 변경할 image url\n * @return file object\n */\nexport async function imageUrlToFile(imageUrl: string): Promise<File> {\n const headers = new Headers();\n headers.append('cache-control', 'no-cache');\n const resImage = await fetch(imageUrl, { headers });\n const blob = await resImage.blob();\n const { type } = blob;\n const name = type.split('/').join('.');\n const file = new File([blob], name, { type });\n\n return file;\n}\n"]}
@@ -0,0 +1,41 @@
1
+ 'use strict';
2
+
3
+ // src/utils/formatting.ts
4
+ var formatDate = (date) => date ? date.toISOString().slice(0, 10).replace(/-/g, "") : "";
5
+ var formatDateToMD = (dateString) => {
6
+ if (!dateString || dateString.length !== 8) {
7
+ return "";
8
+ }
9
+ const month = dateString.substring(4, 6);
10
+ const day = dateString.substring(6, 8);
11
+ return `${month}.${day}`;
12
+ };
13
+ var formatDateToYMD = (dateString) => {
14
+ if (!dateString || dateString.length !== 8) {
15
+ return "";
16
+ }
17
+ const year = dateString.substring(2, 4);
18
+ const month = dateString.substring(4, 6);
19
+ const day = dateString.substring(6, 8);
20
+ return `${year}.${month}.${day}`;
21
+ };
22
+ var maskPolicyNumber = (policyNumber) => {
23
+ if (policyNumber.length <= 5) {
24
+ return policyNumber;
25
+ }
26
+ return `${policyNumber.substring(0, 1)}****${policyNumber.substring(5)}`;
27
+ };
28
+ var maskName = (name) => {
29
+ if (name.length <= 2) {
30
+ return `${name.substring(0, 1)}*`;
31
+ }
32
+ return `${name.substring(0, 1)}${"*".repeat(name.length - 2)}${name.substring(name.length - 1)}`;
33
+ };
34
+
35
+ exports.formatDate = formatDate;
36
+ exports.formatDateToMD = formatDateToMD;
37
+ exports.formatDateToYMD = formatDateToYMD;
38
+ exports.maskName = maskName;
39
+ exports.maskPolicyNumber = maskPolicyNumber;
40
+ //# sourceMappingURL=formatting.cjs.map
41
+ //# sourceMappingURL=formatting.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/formatting.ts"],"names":[],"mappings":";;;AACO,IAAM,UAAa,GAAA,CAAC,IACzB,KAAA,IAAA,GAAO,KAAK,WAAY,EAAA,CAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAA,CAAE,OAAQ,CAAA,IAAA,EAAM,EAAE,CAAI,GAAA;AAGhD,IAAA,cAAA,GAAiB,CAAC,UAAgC,KAAA;AAC7D,EAAA,IAAI,CAAC,UAAA,IAAc,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA;AAC1C,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,MAAM,GAAM,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AAErC,EAAO,OAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACxB;AAGa,IAAA,eAAA,GAAkB,CAAC,UAAgC,KAAA;AAC9D,EAAA,IAAI,CAAC,UAAA,IAAc,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA;AAC1C,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,MAAM,IAAO,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AACtC,EAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,MAAM,GAAM,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AAErC,EAAA,OAAO,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,KAAK,IAAI,GAAG,CAAA,CAAA;AAChC;AAGa,IAAA,gBAAA,GAAmB,CAAC,YAAiC,KAAA;AAChE,EAAI,IAAA,YAAA,CAAa,UAAU,CAAG,EAAA;AAC5B,IAAO,OAAA,YAAA;AAAA;AAGT,EAAO,OAAA,CAAA,EAAG,YAAa,CAAA,SAAA,CAAU,CAAG,EAAA,CAAC,CAAC,CAAO,IAAA,EAAA,YAAA,CAAa,SAAU,CAAA,CAAC,CAAC,CAAA,CAAA;AACxE;AAGa,IAAA,QAAA,GAAW,CAAC,IAAyB,KAAA;AAChD,EAAI,IAAA,IAAA,CAAK,UAAU,CAAG,EAAA;AACpB,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA;AAGhC,EAAA,OAAO,GAAG,IAAK,CAAA,SAAA,CAAU,GAAG,CAAC,CAAC,GAAG,GAAI,CAAA,MAAA,CAAO,KAAK,MAAS,GAAA,CAAC,CAAC,CAAG,EAAA,IAAA,CAAK,UAAU,IAAK,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAChG","file":"formatting.cjs","sourcesContent":["// 날짜 포멧\nexport const formatDate = (date: Date | null): string =>\n date ? date.toISOString().slice(0, 10).replace(/-/g, '') : '';\n\n// 날짜 MM.DD 포멧\nexport const formatDateToMD = (dateString?: string): string => {\n if (!dateString || dateString.length !== 8) {\n return '';\n }\n const month = dateString.substring(4, 6);\n const day = dateString.substring(6, 8);\n\n return `${month}.${day}`;\n};\n\n// 날짜 YY.MM.DD 포맷\nexport const formatDateToYMD = (dateString?: string): string => {\n if (!dateString || dateString.length !== 8) {\n return '';\n }\n const year = dateString.substring(2, 4); // 뒤 2자리만\n const month = dateString.substring(4, 6);\n const day = dateString.substring(6, 8);\n\n return `${year}.${month}.${day}`;\n};\n\n// 증권번호 마스킹\nexport const maskPolicyNumber = (policyNumber: string): string => {\n if (policyNumber.length <= 5) {\n return policyNumber;\n }\n\n return `${policyNumber.substring(0, 1)}****${policyNumber.substring(5)}`;\n};\n\n// 이름 마스킹\nexport const maskName = (name: string): string => {\n if (name.length <= 2) {\n return `${name.substring(0, 1)}*`;\n }\n\n return `${name.substring(0, 1)}${'*'.repeat(name.length - 2)}${name.substring(name.length - 1)}`;\n};\n"]}
@@ -0,0 +1,7 @@
1
+ declare const formatDate: (date: Date | null) => string;
2
+ declare const formatDateToMD: (dateString?: string) => string;
3
+ declare const formatDateToYMD: (dateString?: string) => string;
4
+ declare const maskPolicyNumber: (policyNumber: string) => string;
5
+ declare const maskName: (name: string) => string;
6
+
7
+ export { formatDate, formatDateToMD, formatDateToYMD, maskName, maskPolicyNumber };
@@ -0,0 +1,7 @@
1
+ declare const formatDate: (date: Date | null) => string;
2
+ declare const formatDateToMD: (dateString?: string) => string;
3
+ declare const formatDateToYMD: (dateString?: string) => string;
4
+ declare const maskPolicyNumber: (policyNumber: string) => string;
5
+ declare const maskName: (name: string) => string;
6
+
7
+ export { formatDate, formatDateToMD, formatDateToYMD, maskName, maskPolicyNumber };
@@ -0,0 +1,35 @@
1
+ // src/utils/formatting.ts
2
+ var formatDate = (date) => date ? date.toISOString().slice(0, 10).replace(/-/g, "") : "";
3
+ var formatDateToMD = (dateString) => {
4
+ if (!dateString || dateString.length !== 8) {
5
+ return "";
6
+ }
7
+ const month = dateString.substring(4, 6);
8
+ const day = dateString.substring(6, 8);
9
+ return `${month}.${day}`;
10
+ };
11
+ var formatDateToYMD = (dateString) => {
12
+ if (!dateString || dateString.length !== 8) {
13
+ return "";
14
+ }
15
+ const year = dateString.substring(2, 4);
16
+ const month = dateString.substring(4, 6);
17
+ const day = dateString.substring(6, 8);
18
+ return `${year}.${month}.${day}`;
19
+ };
20
+ var maskPolicyNumber = (policyNumber) => {
21
+ if (policyNumber.length <= 5) {
22
+ return policyNumber;
23
+ }
24
+ return `${policyNumber.substring(0, 1)}****${policyNumber.substring(5)}`;
25
+ };
26
+ var maskName = (name) => {
27
+ if (name.length <= 2) {
28
+ return `${name.substring(0, 1)}*`;
29
+ }
30
+ return `${name.substring(0, 1)}${"*".repeat(name.length - 2)}${name.substring(name.length - 1)}`;
31
+ };
32
+
33
+ export { formatDate, formatDateToMD, formatDateToYMD, maskName, maskPolicyNumber };
34
+ //# sourceMappingURL=formatting.js.map
35
+ //# sourceMappingURL=formatting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/formatting.ts"],"names":[],"mappings":";AACO,IAAM,UAAa,GAAA,CAAC,IACzB,KAAA,IAAA,GAAO,KAAK,WAAY,EAAA,CAAE,KAAM,CAAA,CAAA,EAAG,EAAE,CAAA,CAAE,OAAQ,CAAA,IAAA,EAAM,EAAE,CAAI,GAAA;AAGhD,IAAA,cAAA,GAAiB,CAAC,UAAgC,KAAA;AAC7D,EAAA,IAAI,CAAC,UAAA,IAAc,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA;AAC1C,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,MAAM,GAAM,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AAErC,EAAO,OAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AACxB;AAGa,IAAA,eAAA,GAAkB,CAAC,UAAgC,KAAA;AAC9D,EAAA,IAAI,CAAC,UAAA,IAAc,UAAW,CAAA,MAAA,KAAW,CAAG,EAAA;AAC1C,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,MAAM,IAAO,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AACtC,EAAA,MAAM,KAAQ,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AACvC,EAAA,MAAM,GAAM,GAAA,UAAA,CAAW,SAAU,CAAA,CAAA,EAAG,CAAC,CAAA;AAErC,EAAA,OAAO,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,KAAK,IAAI,GAAG,CAAA,CAAA;AAChC;AAGa,IAAA,gBAAA,GAAmB,CAAC,YAAiC,KAAA;AAChE,EAAI,IAAA,YAAA,CAAa,UAAU,CAAG,EAAA;AAC5B,IAAO,OAAA,YAAA;AAAA;AAGT,EAAO,OAAA,CAAA,EAAG,YAAa,CAAA,SAAA,CAAU,CAAG,EAAA,CAAC,CAAC,CAAO,IAAA,EAAA,YAAA,CAAa,SAAU,CAAA,CAAC,CAAC,CAAA,CAAA;AACxE;AAGa,IAAA,QAAA,GAAW,CAAC,IAAyB,KAAA;AAChD,EAAI,IAAA,IAAA,CAAK,UAAU,CAAG,EAAA;AACpB,IAAA,OAAO,CAAG,EAAA,IAAA,CAAK,SAAU,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA,CAAA;AAAA;AAGhC,EAAA,OAAO,GAAG,IAAK,CAAA,SAAA,CAAU,GAAG,CAAC,CAAC,GAAG,GAAI,CAAA,MAAA,CAAO,KAAK,MAAS,GAAA,CAAC,CAAC,CAAG,EAAA,IAAA,CAAK,UAAU,IAAK,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAChG","file":"formatting.js","sourcesContent":["// 날짜 포멧\nexport const formatDate = (date: Date | null): string =>\n date ? date.toISOString().slice(0, 10).replace(/-/g, '') : '';\n\n// 날짜 MM.DD 포멧\nexport const formatDateToMD = (dateString?: string): string => {\n if (!dateString || dateString.length !== 8) {\n return '';\n }\n const month = dateString.substring(4, 6);\n const day = dateString.substring(6, 8);\n\n return `${month}.${day}`;\n};\n\n// 날짜 YY.MM.DD 포맷\nexport const formatDateToYMD = (dateString?: string): string => {\n if (!dateString || dateString.length !== 8) {\n return '';\n }\n const year = dateString.substring(2, 4); // 뒤 2자리만\n const month = dateString.substring(4, 6);\n const day = dateString.substring(6, 8);\n\n return `${year}.${month}.${day}`;\n};\n\n// 증권번호 마스킹\nexport const maskPolicyNumber = (policyNumber: string): string => {\n if (policyNumber.length <= 5) {\n return policyNumber;\n }\n\n return `${policyNumber.substring(0, 1)}****${policyNumber.substring(5)}`;\n};\n\n// 이름 마스킹\nexport const maskName = (name: string): string => {\n if (name.length <= 2) {\n return `${name.substring(0, 1)}*`;\n }\n\n return `${name.substring(0, 1)}${'*'.repeat(name.length - 2)}${name.substring(name.length - 1)}`;\n};\n"]}
@@ -0,0 +1,40 @@
1
+ 'use strict';
2
+
3
+ // src/utils/timing-utils.ts
4
+ function throttle(func, delay) {
5
+ let lastCall = 0;
6
+ let timeout = null;
7
+ return (...args) => {
8
+ const now = Date.now();
9
+ if (now - lastCall >= delay) {
10
+ lastCall = now;
11
+ func(...args);
12
+ } else if (!timeout) {
13
+ timeout = setTimeout(
14
+ () => {
15
+ lastCall = Date.now();
16
+ func(...args);
17
+ timeout = null;
18
+ },
19
+ delay - (now - lastCall)
20
+ );
21
+ }
22
+ };
23
+ }
24
+ function debounce(func, delay) {
25
+ let timeout = null;
26
+ return (...args) => {
27
+ if (timeout) {
28
+ clearTimeout(timeout);
29
+ }
30
+ timeout = setTimeout(() => {
31
+ func(...args);
32
+ timeout = null;
33
+ }, delay);
34
+ };
35
+ }
36
+
37
+ exports.debounce = debounce;
38
+ exports.throttle = throttle;
39
+ //# sourceMappingURL=timing-utils.cjs.map
40
+ //# sourceMappingURL=timing-utils.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/timing-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","file":"timing-utils.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"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 쓰로틀
3
+ * @param func
4
+ * @param delay
5
+ * @returns
6
+ */
7
+ declare function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void;
8
+ /**
9
+ * 디바운스
10
+ * @param func
11
+ * @param delay
12
+ * @returns
13
+ */
14
+ declare function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void;
15
+
16
+ export { debounce, throttle };
@@ -0,0 +1,16 @@
1
+ /**
2
+ * 쓰로틀
3
+ * @param func
4
+ * @param delay
5
+ * @returns
6
+ */
7
+ declare function throttle<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void;
8
+ /**
9
+ * 디바운스
10
+ * @param func
11
+ * @param delay
12
+ * @returns
13
+ */
14
+ declare function debounce<T extends (...args: any[]) => void>(func: T, delay: number): (...args: Parameters<T>) => void;
15
+
16
+ export { debounce, throttle };
@@ -0,0 +1,37 @@
1
+ // src/utils/timing-utils.ts
2
+ function throttle(func, delay) {
3
+ let lastCall = 0;
4
+ let timeout = null;
5
+ return (...args) => {
6
+ const now = Date.now();
7
+ if (now - lastCall >= delay) {
8
+ lastCall = now;
9
+ func(...args);
10
+ } else if (!timeout) {
11
+ timeout = setTimeout(
12
+ () => {
13
+ lastCall = Date.now();
14
+ func(...args);
15
+ timeout = null;
16
+ },
17
+ delay - (now - lastCall)
18
+ );
19
+ }
20
+ };
21
+ }
22
+ function debounce(func, delay) {
23
+ let timeout = null;
24
+ return (...args) => {
25
+ if (timeout) {
26
+ clearTimeout(timeout);
27
+ }
28
+ timeout = setTimeout(() => {
29
+ func(...args);
30
+ timeout = null;
31
+ }, delay);
32
+ };
33
+ }
34
+
35
+ export { debounce, throttle };
36
+ //# sourceMappingURL=timing-utils.js.map
37
+ //# sourceMappingURL=timing-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/timing-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","file":"timing-utils.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"]}
@@ -0,0 +1,328 @@
1
+ 'use strict';
2
+
3
+ // src/utils/environment-utils.ts
4
+ var isClient = () => {
5
+ try {
6
+ return !!window;
7
+ } catch {
8
+ return false;
9
+ }
10
+ };
11
+
12
+ // src/utils/user-agent-utils.ts
13
+ var getDspExecutionEnvironment = () => {
14
+ if (!isClient()) {
15
+ return "unknown";
16
+ }
17
+ if (window.n2Bridge) {
18
+ return "android-webview";
19
+ }
20
+ if (window.webkit?.messageHandlers) {
21
+ return "ios-webview";
22
+ }
23
+ if (window.self !== window.top) {
24
+ return "iframe";
25
+ }
26
+ return "web";
27
+ };
28
+ var isProductionApp = () => {
29
+ if (!isClient()) {
30
+ return false;
31
+ }
32
+ return isDspApp() || isFpPlannerApp();
33
+ };
34
+ var checkUserAgentDspApp = (userAgent) => {
35
+ return userAgent.toLowerCase().includes("sspapp");
36
+ };
37
+ var isDspApp = () => {
38
+ if (!isClient()) {
39
+ return false;
40
+ }
41
+ const environment = getDspExecutionEnvironment();
42
+ return checkUserAgentDspApp(navigator.userAgent) && (environment === "android-webview" || environment === "ios-webview");
43
+ };
44
+ var isFpPlannerApp = () => {
45
+ if (!isClient()) {
46
+ return false;
47
+ }
48
+ const environment = getDspExecutionEnvironment();
49
+ return checkUserAgentDspApp(navigator.userAgent) === false && (environment === "android-webview" || environment === "ios-webview");
50
+ };
51
+ var isSalesPortal = () => {
52
+ if (!isClient()) {
53
+ return false;
54
+ }
55
+ const environment = getDspExecutionEnvironment();
56
+ return environment === "iframe";
57
+ };
58
+ var isTablet = (userAgent) => {
59
+ const ua = userAgent.toLowerCase();
60
+ return (
61
+ // Apple 태블릿
62
+ ua.includes("ipad") || // Android 태블릿 (Mobile 키워드 없음)
63
+ ua.includes("android") && !ua.includes("mobile") || // 명시적 태블릿 키워드
64
+ ua.includes("tablet") || // Amazon 태블릿
65
+ ua.includes("kindle") || ua.includes("silk") || /kf[a-z]{2}wi|kftt/.test(ua) || // BlackBerry 태블릿
66
+ ua.includes("playbook") || // 삼성 갤럭시 탭 (개선된 정규식)
67
+ /gt-p\d{4}|sm-[tp]\d{3}/.test(ua) || // 구글 넥서스/픽셀 태블릿
68
+ /nexus (?:[789]|10)|pixel [cs]|pixel slate/.test(ua) || // 기타 브랜드 태블릿
69
+ /xoom|transformer|mediapad|mipad|tab\s/.test(ua) || // Windows 태블릿 (개선된 조건)
70
+ ua.includes("windows") && (ua.includes("touch") || ua.includes("tablet")) || ua.includes("surface")
71
+ );
72
+ };
73
+ var isPhone = (userAgent) => {
74
+ const ua = userAgent.toLowerCase();
75
+ return (
76
+ // Apple 모바일
77
+ ua.includes("iphone") || ua.includes("ipod") || // Android 스마트폰 (Mobile 키워드 있음)
78
+ ua.includes("android") && ua.includes("mobile") || // BlackBerry
79
+ ua.includes("blackberry") || ua.includes("bb10") || // Windows Mobile
80
+ ua.includes("windows phone") || ua.includes("windows mobile") || ua.includes("iemobile") || // Opera Mobile
81
+ ua.includes("opera mini") || ua.includes("opera mobi") || // 기타 모바일 브라우저
82
+ ua.includes("mobile") && (ua.includes("firefox") || ua.includes("chrome") || ua.includes("safari") || ua.includes("edge")) || // 모바일 키워드 (태블릿 제외)
83
+ ua.includes("mobile") && !ua.includes("tablet") || // 삼성 갤럭시 폰 (개선)
84
+ /sm-[a-z]\d{3}[a-z]?|gt-[a-z]\d{4}/.test(ua) || // LG, HTC 폰
85
+ /lg-[a-z]\d{3,4}|htc[_\s]/.test(ua) || // 화웨이/샤오미 등 (개선)
86
+ /huawei|honor|redmi|mi[\s\d]|oneplus|oppo|vivo/.test(ua)
87
+ );
88
+ };
89
+ var isPc = (userAgent) => {
90
+ const ua = userAgent.toLowerCase();
91
+ return !isPhone(ua) && !isTablet(ua);
92
+ };
93
+ var getFormFactorFromUserAgent = (userAgent) => {
94
+ if (!userAgent) {
95
+ return "pc";
96
+ }
97
+ const ua = userAgent.toLowerCase();
98
+ if (isTablet(ua)) {
99
+ return "tablet";
100
+ }
101
+ if (isPhone(ua)) {
102
+ return "phone";
103
+ }
104
+ return "pc";
105
+ };
106
+ var getOSName = (userAgent) => {
107
+ if (!userAgent) {
108
+ return "unknown";
109
+ }
110
+ const ua = userAgent.toLowerCase();
111
+ if (/iphone|ipad|ipod/.test(ua)) {
112
+ return "ios";
113
+ }
114
+ if (ua.includes("android")) {
115
+ return "android";
116
+ }
117
+ if (ua.includes("windows") || ua.includes("win32") || ua.includes("win64")) {
118
+ return "windows";
119
+ }
120
+ if (ua.includes("mac os x") || ua.includes("macos") || ua.includes("macintosh")) {
121
+ return "mac";
122
+ }
123
+ if (ua.includes("linux") && !ua.includes("android")) {
124
+ return "linux";
125
+ }
126
+ return "unknown";
127
+ };
128
+ var getCurrentOSName = () => {
129
+ if (!isClient() || typeof navigator === "undefined") {
130
+ return "unknown";
131
+ }
132
+ return getOSName(navigator.userAgent);
133
+ };
134
+ var getOSVersion = (userAgent) => {
135
+ if (!userAgent) {
136
+ return "unknown";
137
+ }
138
+ const ua = userAgent.toLowerCase();
139
+ const iosMatch = ua.match(/os (\d+)_(\d+)(?:_(\d+))?/);
140
+ if (iosMatch && iosMatch.length >= 3) {
141
+ const major = iosMatch[1];
142
+ const minor = iosMatch[2];
143
+ const patch = iosMatch[3];
144
+ return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;
145
+ }
146
+ const androidMatch = ua.match(/android (\d+(?:\.\d+)*)/);
147
+ if (androidMatch && androidMatch[1]) {
148
+ return androidMatch[1];
149
+ }
150
+ const windowsMatch = ua.match(/windows nt (\d+\.\d+)/);
151
+ if (windowsMatch && windowsMatch[1]) {
152
+ const version = windowsMatch[1];
153
+ const windowsVersionMap = {
154
+ "10.0": "10/11",
155
+ "6.3": "8.1",
156
+ "6.2": "8",
157
+ "6.1": "7",
158
+ "6.0": "Vista",
159
+ "5.1": "XP"
160
+ };
161
+ return windowsVersionMap[version] || version;
162
+ }
163
+ const macMatch = ua.match(/mac os x (\d+)_(\d+)(?:_(\d+))?/);
164
+ if (macMatch && macMatch.length >= 3) {
165
+ const major = macMatch[1];
166
+ const minor = macMatch[2];
167
+ const patch = macMatch[3];
168
+ return patch ? `${major}.${minor}.${patch}` : `${major}.${minor}`;
169
+ }
170
+ return "unknown";
171
+ };
172
+ var getBrowserName = (userAgent) => {
173
+ if (!userAgent) {
174
+ return "unknown";
175
+ }
176
+ const ua = userAgent.toLowerCase();
177
+ if (ua.includes("edg/") || ua.includes("edge/")) {
178
+ return "edge";
179
+ }
180
+ if (ua.includes("samsungbrowser")) {
181
+ return "samsung";
182
+ }
183
+ if (ua.includes("opr/") || ua.includes("opera")) {
184
+ return "opera";
185
+ }
186
+ if (ua.includes("chrome") && !ua.includes("edg")) {
187
+ return "chrome";
188
+ }
189
+ if (ua.includes("firefox")) {
190
+ return "firefox";
191
+ }
192
+ if (ua.includes("safari") && !ua.includes("chrome")) {
193
+ return "safari";
194
+ }
195
+ return "unknown";
196
+ };
197
+ var getBrowserVersion = (userAgent) => {
198
+ if (!userAgent) {
199
+ return "unknown";
200
+ }
201
+ const ua = userAgent.toLowerCase();
202
+ const edgMatch = ua.match(/edg\/(\d+(?:\.\d+)*)/);
203
+ if (edgMatch && edgMatch[1]) {
204
+ return edgMatch[1];
205
+ }
206
+ const samsungMatch = ua.match(/samsungbrowser\/(\d+(?:\.\d+)*)/);
207
+ if (samsungMatch && samsungMatch[1]) {
208
+ return samsungMatch[1];
209
+ }
210
+ const operaMatch = ua.match(/(?:opr|opera)\/(\d+(?:\.\d+)*)/);
211
+ if (operaMatch && operaMatch[1]) {
212
+ return operaMatch[1];
213
+ }
214
+ const chromeMatch = ua.match(/chrome\/(\d+(?:\.\d+)*)/);
215
+ if (chromeMatch && chromeMatch[1] && !ua.includes("edg")) {
216
+ return chromeMatch[1];
217
+ }
218
+ const firefoxMatch = ua.match(/firefox\/(\d+(?:\.\d+)*)/);
219
+ if (firefoxMatch && firefoxMatch[1]) {
220
+ return firefoxMatch[1];
221
+ }
222
+ const safariMatch = ua.match(/version\/(\d+(?:\.\d+)*)/);
223
+ if (safariMatch && safariMatch[1] && ua.includes("safari") && !ua.includes("chrome")) {
224
+ return safariMatch[1];
225
+ }
226
+ return "unknown";
227
+ };
228
+ var getCurrentOSVersion = () => {
229
+ if (!isClient() || typeof navigator === "undefined") {
230
+ return "unknown";
231
+ }
232
+ return getOSVersion(navigator.userAgent);
233
+ };
234
+ var getCurrentBrowserName = () => {
235
+ if (!isClient() || typeof navigator === "undefined") {
236
+ return "unknown";
237
+ }
238
+ return getBrowserName(navigator.userAgent);
239
+ };
240
+ var getCurrentBrowserVersion = () => {
241
+ if (!isClient() || typeof navigator === "undefined") {
242
+ return "unknown";
243
+ }
244
+ return getBrowserVersion(navigator.userAgent);
245
+ };
246
+ var getOrCreateDeviceId = () => {
247
+ if (typeof window === "undefined") {
248
+ return "";
249
+ }
250
+ const STORAGE_KEY = "dsp_device_id";
251
+ let deviceId = localStorage.getItem(STORAGE_KEY);
252
+ if (!deviceId) {
253
+ const timestamp = Date.now().toString(36);
254
+ const random = Math.random().toString(36).substring(2, 15);
255
+ deviceId = `dsp-web-${timestamp}-${random}`;
256
+ try {
257
+ localStorage.setItem(STORAGE_KEY, deviceId);
258
+ } catch (error) {
259
+ console.warn("[DeviceId] localStorage \uC800\uC7A5 \uC2E4\uD328:", error);
260
+ }
261
+ }
262
+ return deviceId;
263
+ };
264
+ var getDeviceModel = () => {
265
+ if (!isClient()) {
266
+ return "";
267
+ }
268
+ const ua = navigator.userAgent;
269
+ if (/iPad/.test(ua)) {
270
+ return "iPad";
271
+ }
272
+ if (/iPhone/.test(ua)) {
273
+ return "iPhone";
274
+ }
275
+ if (/iPod/.test(ua)) {
276
+ return "iPod Touch";
277
+ }
278
+ if (/SM-[A-Z0-9]+/.test(ua)) {
279
+ const match = ua.match(/SM-[A-Z0-9]+/);
280
+ return match ? `Samsung ${match[0]}` : "Samsung";
281
+ }
282
+ if (/Pixel/.test(ua)) {
283
+ const match = ua.match(/Pixel [0-9]+[a-zA-Z]*/);
284
+ return match ? `Google ${match[0]}` : "Google Pixel";
285
+ }
286
+ if (/Mi\s|Redmi|POCO/.test(ua)) {
287
+ return "Xiaomi";
288
+ }
289
+ if (/HUAWEI/.test(ua)) {
290
+ return "Huawei";
291
+ }
292
+ if (/OnePlus/.test(ua)) {
293
+ return "OnePlus";
294
+ }
295
+ if (/Windows/.test(ua)) {
296
+ return "Windows PC";
297
+ }
298
+ if (/Mac OS X/.test(ua)) {
299
+ return "Mac";
300
+ }
301
+ if (/Linux/.test(ua)) {
302
+ return "Linux PC";
303
+ }
304
+ return "Unknown";
305
+ };
306
+
307
+ exports.checkUserAgentDspApp = checkUserAgentDspApp;
308
+ exports.getBrowserName = getBrowserName;
309
+ exports.getBrowserVersion = getBrowserVersion;
310
+ exports.getCurrentBrowserName = getCurrentBrowserName;
311
+ exports.getCurrentBrowserVersion = getCurrentBrowserVersion;
312
+ exports.getCurrentOSName = getCurrentOSName;
313
+ exports.getCurrentOSVersion = getCurrentOSVersion;
314
+ exports.getDeviceModel = getDeviceModel;
315
+ exports.getDspExecutionEnvironment = getDspExecutionEnvironment;
316
+ exports.getFormFactorFromUserAgent = getFormFactorFromUserAgent;
317
+ exports.getOSName = getOSName;
318
+ exports.getOSVersion = getOSVersion;
319
+ exports.getOrCreateDeviceId = getOrCreateDeviceId;
320
+ exports.isDspApp = isDspApp;
321
+ exports.isFpPlannerApp = isFpPlannerApp;
322
+ exports.isPc = isPc;
323
+ exports.isPhone = isPhone;
324
+ exports.isProductionApp = isProductionApp;
325
+ exports.isSalesPortal = isSalesPortal;
326
+ exports.isTablet = isTablet;
327
+ //# sourceMappingURL=user-agent-utils.cjs.map
328
+ //# sourceMappingURL=user-agent-utils.cjs.map