@libs-ui/utils 0.1.1-1

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 (65) hide show
  1. package/README.md +3 -0
  2. package/base64.d.ts +5 -0
  3. package/cache.d.ts +42 -0
  4. package/color.d.ts +11 -0
  5. package/communicate-micro.d.ts +16 -0
  6. package/constants.d.ts +10 -0
  7. package/crypto-3rd.d.ts +7 -0
  8. package/crypto.d.ts +8 -0
  9. package/dangerous-object.d.ts +79 -0
  10. package/date.d.ts +44 -0
  11. package/dom.d.ts +52 -0
  12. package/download.d.ts +3 -0
  13. package/esm2022/base64.mjs +43 -0
  14. package/esm2022/cache.mjs +388 -0
  15. package/esm2022/color.mjs +133 -0
  16. package/esm2022/communicate-micro.mjs +149 -0
  17. package/esm2022/constants.mjs +11 -0
  18. package/esm2022/crypto-3rd.mjs +38 -0
  19. package/esm2022/crypto.mjs +41 -0
  20. package/esm2022/dangerous-object.mjs +149 -0
  21. package/esm2022/date.mjs +191 -0
  22. package/esm2022/dom.mjs +256 -0
  23. package/esm2022/download.mjs +41 -0
  24. package/esm2022/file.mjs +90 -0
  25. package/esm2022/format-number.mjs +66 -0
  26. package/esm2022/format-text.mjs +149 -0
  27. package/esm2022/function-check-embed-frame.mjs +10 -0
  28. package/esm2022/get-smart-axis-scale.mjs +174 -0
  29. package/esm2022/helpers.mjs +651 -0
  30. package/esm2022/http-params.mjs +80 -0
  31. package/esm2022/index.mjs +30 -0
  32. package/esm2022/inject-token.mjs +5 -0
  33. package/esm2022/key-cache.mjs +31 -0
  34. package/esm2022/key-code.mjs +123 -0
  35. package/esm2022/language.mjs +70 -0
  36. package/esm2022/libs-ui-utils.mjs +5 -0
  37. package/esm2022/pattern.mjs +62 -0
  38. package/esm2022/random.mjs +42 -0
  39. package/esm2022/two-way-signal-object.mjs +131 -0
  40. package/esm2022/uri.mjs +25 -0
  41. package/esm2022/url-search-params.mjs +99 -0
  42. package/esm2022/uuid.mjs +18 -0
  43. package/esm2022/xss-filter.mjs +10 -0
  44. package/fesm2022/libs-ui-utils.mjs +3234 -0
  45. package/fesm2022/libs-ui-utils.mjs.map +1 -0
  46. package/file.d.ts +18 -0
  47. package/format-number.d.ts +2 -0
  48. package/format-text.d.ts +11 -0
  49. package/function-check-embed-frame.d.ts +2 -0
  50. package/get-smart-axis-scale.d.ts +34 -0
  51. package/helpers.d.ts +270 -0
  52. package/http-params.d.ts +37 -0
  53. package/index.d.ts +29 -0
  54. package/inject-token.d.ts +4 -0
  55. package/key-cache.d.ts +1 -0
  56. package/key-code.d.ts +122 -0
  57. package/language.d.ts +37 -0
  58. package/package.json +29 -0
  59. package/pattern.d.ts +20 -0
  60. package/random.d.ts +3 -0
  61. package/two-way-signal-object.d.ts +15 -0
  62. package/uri.d.ts +5 -0
  63. package/url-search-params.d.ts +25 -0
  64. package/uuid.d.ts +1 -0
  65. package/xss-filter.d.ts +3 -0
@@ -0,0 +1,191 @@
1
+ import { isSignal } from '@angular/core';
2
+ import dayjs from 'dayjs';
3
+ import 'dayjs/locale/en';
4
+ import 'dayjs/locale/vi';
5
+ import customParseFormat from 'dayjs/plugin/customParseFormat';
6
+ import localeData from 'dayjs/plugin/localeData';
7
+ import timezone from 'dayjs/plugin/timezone';
8
+ import updateLocale from 'dayjs/plugin/updateLocale';
9
+ import utc from 'dayjs/plugin/utc';
10
+ import { UtilsCache } from './cache';
11
+ dayjs.extend(localeData);
12
+ dayjs.extend(updateLocale);
13
+ dayjs.extend(utc);
14
+ dayjs.extend(timezone);
15
+ dayjs.extend(customParseFormat);
16
+ let timeZoneSetup = 'Asia/Ho_Chi_Minh';
17
+ export const setDefaultTimeZone = (localeZone = timeZoneSetup) => {
18
+ timeZoneSetup = localeZone;
19
+ dayjs.tz.setDefault(localeZone);
20
+ };
21
+ let functionFormatDate = undefined;
22
+ export const updateFunctionFormatDate = (functionCustom) => {
23
+ functionFormatDate = functionCustom;
24
+ };
25
+ /**
26
+ * @description Lấy đối tượng dayjs theo config
27
+ * @param config nếu không có config sẽ trả về đối tượng dayjs là thời gian hiện tại
28
+ * @param config.date thời gian cần lấy
29
+ * @param config.returnDayjsIfConfigDateNotExist true nếu muốn trả về đối tượng dayjs nếu config.date không có
30
+ * @param config.utc true nếu muốn lấy thời gian UTC
31
+ * @param config.formatOfDate định dạng thời gian đang được truyền vào
32
+ */
33
+ export const getDayjs = (config) => {
34
+ // helper cast để tránh lặp lại kiểu điều kiện ở các return
35
+ const out = (v) => v;
36
+ if (!config) {
37
+ return out(dayjs().tz());
38
+ }
39
+ config.date = !config.date && config.returnDayjsIfConfigDateNotExist ? dayjs().tz() : config.date;
40
+ if (typeof config.date === 'number') {
41
+ config.date = dayjs.unix(config.date);
42
+ }
43
+ if (!config.date) {
44
+ return out(undefined);
45
+ }
46
+ let { date, utc, formatOfDate } = config;
47
+ while (isSignal(date)) {
48
+ date = date();
49
+ }
50
+ while (isSignal(utc)) {
51
+ utc = utc();
52
+ }
53
+ while (isSignal(formatOfDate)) {
54
+ formatOfDate = formatOfDate();
55
+ }
56
+ if (utc) {
57
+ if (formatOfDate) {
58
+ return out(dayjs(date, formatOfDate).utc());
59
+ }
60
+ const dateInputIsUTC = (dayjs.isDayjs(date) && date.isUTC()) || (typeof date === 'string' && date.includes('Z'));
61
+ if (dateInputIsUTC) {
62
+ return out(dayjs(date));
63
+ }
64
+ return out(dayjs(date).utc());
65
+ }
66
+ if (typeof date === 'string' && !date.includes('Z') && !date.includes('+')) {
67
+ return out(formatOfDate ? dayjs.tz(date, formatOfDate, config.localeZone || timeZoneSetup) : dayjs.tz(date, config.localeZone || timeZoneSetup));
68
+ }
69
+ return out((formatOfDate ? dayjs(date, formatOfDate) : dayjs(date)).tz());
70
+ };
71
+ /**
72
+ * @description Kiểm tra xem hai ngày có khác nhau không (khác ngày trong tuần)
73
+ * @param date1 ngày thứ nhất cần so sánh
74
+ * @param date2 ngày thứ hai cần so sánh
75
+ * @returns true nếu hai ngày khác nhau, false nếu giống nhau hoặc không thể so sánh
76
+ */
77
+ export const isDifferenceDay = (date1, date2) => {
78
+ if (isDifferenceMonth(date1, date2)) {
79
+ return true;
80
+ }
81
+ const day1 = getDayjs({ date: date1 })?.day();
82
+ const day2 = getDayjs({ date: date2 })?.day();
83
+ return day1 !== day2;
84
+ };
85
+ /**
86
+ * @description Kiểm tra xem hai ngày có khác tháng không
87
+ * @param date1 ngày thứ nhất cần so sánh
88
+ * @param date2 ngày thứ hai cần so sánh
89
+ * @returns true nếu hai ngày khác tháng, false nếu cùng tháng hoặc không thể so sánh
90
+ */
91
+ export const isDifferenceMonth = (date1, date2) => {
92
+ if (isDifferenceYear(date1, date2)) {
93
+ return true;
94
+ }
95
+ const month1 = getDayjs({ date: date1 })?.month();
96
+ const month2 = getDayjs({ date: date2 })?.month();
97
+ return month1 !== month2;
98
+ };
99
+ /**
100
+ * @description Kiểm tra xem hai ngày có khác năm không
101
+ * @param date1 ngày thứ nhất cần so sánh
102
+ * @param date2 ngày thứ hai cần so sánh
103
+ * @returns true nếu hai ngày khác năm, false nếu cùng năm hoặc không thể so sánh
104
+ */
105
+ export const isDifferenceYear = (date1, date2) => {
106
+ const year1 = getDayjs({ date: date1 })?.year();
107
+ const year2 = getDayjs({ date: date2 })?.year();
108
+ return year1 !== year2;
109
+ };
110
+ /**
111
+ * @description Lấy ra chuỗi thời gian hiển thị theo định dạng và ngôn ngữ
112
+ * @param date thời gian cần định dạng
113
+ * @param format định dạng thời gian muốn lấy ra
114
+ * @param lang lấy theo ngôn ngữ
115
+ */
116
+ export const formatDate = (date, formatOutput = 'YYYY/MM/DD HH:mm', lang, formatInput) => {
117
+ if (!date) {
118
+ return '';
119
+ }
120
+ lang = lang || UtilsCache.getLang();
121
+ if (functionFormatDate) {
122
+ return functionFormatDate(date, formatOutput, lang);
123
+ }
124
+ date = getDayjs({ date, formatOfDate: formatInput }).locale(lang);
125
+ if (lang === 'vi') {
126
+ dayjs.updateLocale('vi', {
127
+ monthsShort: 'Thg 1_Thg 2_Thg 3_Thg 4_Thg 5_Thg 6_Thg 7_Thg 8_Thg 9_Thg 10_Thg 11_Thg 12'.split('_'),
128
+ });
129
+ }
130
+ return date.format(getFormatData(getTypeByFormat(formatOutput), lang)) || '';
131
+ };
132
+ const getTypeByFormat = (format) => {
133
+ if (format === 'dm' || format === 'dmy' || format === 'dmy hm' || format === 'my') {
134
+ return format;
135
+ }
136
+ if (format === 'DD/MM/YYYY' || format === 'YYYY-MM-DD' || format === 'dd/MM/yyyy' || format === 'dd-MM-yyyy' || format === 'dd/mm/yyyy') {
137
+ return 'dmy';
138
+ }
139
+ if (format === 'MM-DD' || format === 'dd/MM' || format === 'dd/mm') {
140
+ return 'dm';
141
+ }
142
+ if (format === 'M/YYYY' || format === 'YYYY-MM' || format === 'MM/yyyy') {
143
+ return 'my';
144
+ }
145
+ if (format === 'YYYY/MM/DD hh:mm:ss' || format === 'dmy hms' || format === 'dd/mm/yyyy hh:mm:ss') {
146
+ return 'dmy hms';
147
+ }
148
+ if (format === 'hh:mm' || format === 'HH:mm') {
149
+ return 'hh:mm';
150
+ }
151
+ if (format === 'hh:mm A' || format === 'HH:mm A') {
152
+ return 'hh:mm A';
153
+ }
154
+ return 'dmy hm';
155
+ };
156
+ const getFormatData = (type, lang) => {
157
+ switch (type) {
158
+ case 'dm':
159
+ if (lang === 'vi') {
160
+ return 'D MMM';
161
+ }
162
+ return 'MMM D';
163
+ case 'dmy':
164
+ if (lang === 'vi') {
165
+ return 'D MMM, YYYY';
166
+ }
167
+ return 'MMM D, YYYY';
168
+ case 'dmy hm':
169
+ if (lang === 'vi') {
170
+ return 'D MMM, YYYY HH:mm';
171
+ }
172
+ return 'MMM D, YYYY HH:mm';
173
+ case 'my':
174
+ if (lang === 'vi') {
175
+ return 'MMM, YYYY';
176
+ }
177
+ return 'MMM YYYY ';
178
+ case 'dmy hms':
179
+ if (lang === 'vi') {
180
+ return 'D MMM, YYYY HH:mm:ss';
181
+ }
182
+ return 'MMM D, YYYY HH:mm:ss';
183
+ case 'hh:mm':
184
+ case 'HH:mm':
185
+ return 'HH:mm';
186
+ case 'hh:mm A':
187
+ case 'HH:mm A':
188
+ return 'HH:mm A';
189
+ }
190
+ };
191
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8saUJBQWlCLE1BQU0sZ0NBQWdDLENBQUM7QUFDL0QsT0FBTyxVQUFVLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxRQUFRLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxZQUFZLE1BQU0sMkJBQTJCLENBQUM7QUFDckQsT0FBTyxHQUFHLE1BQU0sa0JBQWtCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3pCLEtBQUssQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDM0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNsQixLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZCLEtBQUssQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUNoQyxJQUFJLGFBQWEsR0FBRyxrQkFBa0IsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFVBQVUsR0FBRyxhQUFhLEVBQUUsRUFBRTtJQUMvRCxhQUFhLEdBQUcsVUFBVSxDQUFDO0lBQzNCLEtBQUssQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUdGLElBQUksa0JBQWtCLEdBQTBDLFNBQVMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSx3QkFB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QVksRUFBRSxFQUFFO0lBQ25JLFFBQVEsSUFBSSxFQUFFLENBQUM7UUFDYixLQUFLLElBQUk7WUFDUCxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxPQUFPLENBQUM7WUFDakIsQ0FBQztZQUVELE9BQU8sT0FBTyxDQUFDO1FBRWpCLEtBQUssS0FBSztZQUNSLElBQUksSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNsQixPQUFPLGFBQWEsQ0FBQztZQUN2QixDQUFDO1lBRUQsT0FBTyxhQUFhLENBQUM7UUFFdkIsS0FBSyxRQUFRO1lBQ1gsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sbUJBQW1CLENBQUM7WUFDN0IsQ0FBQztZQUVELE9BQU8sbUJBQW1CLENBQUM7UUFFN0IsS0FBSyxJQUFJO1lBQ1AsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU8sV0FBVyxDQUFDO1lBQ3JCLENBQUM7WUFFRCxPQUFPLFdBQVcsQ0FBQztRQUVyQixLQUFLLFNBQVM7WUFDWixJQUFJLElBQUksS0FBSyxJQUFJLEVBQUUsQ0FBQztnQkFDbEIsT0FBTyxzQkFBc0IsQ0FBQztZQUNoQyxDQUFDO1lBRUQsT0FBTyxzQkFBc0IsQ0FBQztRQUVoQyxLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssT0FBTztZQUNWLE9BQU8sT0FBTyxDQUFDO1FBRWpCLEtBQUssU0FBUyxDQUFDO1FBQ2YsS0FBSyxTQUFTO1lBQ1osT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBHZXREYXlqc0NvbmZpZywgR2V0RGF5anNSZXR1cm4sIE5vbk51bGxhYmxlRGF0ZSwgVFlQRV9PQkpFQ1QgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbic7XG5pbXBvcnQgJ2RheWpzL2xvY2FsZS92aSc7XG5pbXBvcnQgY3VzdG9tUGFyc2VGb3JtYXQgZnJvbSAnZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0JztcbmltcG9ydCBsb2NhbGVEYXRhIGZyb20gJ2RheWpzL3BsdWdpbi9sb2NhbGVEYXRhJztcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUnO1xuaW1wb3J0IHVwZGF0ZUxvY2FsZSBmcm9tICdkYXlqcy9wbHVnaW4vdXBkYXRlTG9jYWxlJztcbmltcG9ydCB1dGMgZnJvbSAnZGF5anMvcGx1Z2luL3V0Yyc7XG5pbXBvcnQgeyBVdGlsc0NhY2hlIH0gZnJvbSAnLi9jYWNoZSc7XG5kYXlqcy5leHRlbmQobG9jYWxlRGF0YSk7XG5kYXlqcy5leHRlbmQodXBkYXRlTG9jYWxlKTtcbmRheWpzLmV4dGVuZCh1dGMpO1xuZGF5anMuZXh0ZW5kKHRpbWV6b25lKTtcbmRheWpzLmV4dGVuZChjdXN0b21QYXJzZUZvcm1hdCk7XG5sZXQgdGltZVpvbmVTZXR1cCA9ICdBc2lhL0hvX0NoaV9NaW5oJztcblxuZXhwb3J0IGNvbnN0IHNldERlZmF1bHRUaW1lWm9uZSA9IChsb2NhbGVab25lID0gdGltZVpvbmVTZXR1cCkgPT4ge1xuICB0aW1lWm9uZVNldHVwID0gbG9jYWxlWm9uZTtcbiAgZGF5anMudHouc2V0RGVmYXVsdChsb2NhbGVab25lKTtcbn07XG5cbmV4cG9ydCB0eXBlIFRZUEVfRlVOQ1RJT05fRk9STUFUX0RBVEUgPSAodGltZTogZGF5anMuQ29uZmlnVHlwZSwgZm9ybWF0T3V0cHV0OiBzdHJpbmcsIGxhbmc/OiBzdHJpbmcpID0+IHN0cmluZztcbmxldCBmdW5jdGlvbkZvcm1hdERhdGU6IFRZUEVfRlVOQ1RJT05fRk9STUFUX0RBVEUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVGdW5jdGlvbkZvcm1hdERhdGUgPSAoZnVuY3Rpb25DdXN0b206IFRZUEVfRlVOQ1RJT05fRk9STUFUX0RBVEUpID0+IHtcbiAgZnVuY3Rpb25Gb3JtYXREYXRlID0gZnVuY3Rpb25DdXN0b207XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBM4bqleSDEkeG7kWkgdMaw4bujbmcgZGF5anMgdGhlbyBjb25maWdcbiAqIEBwYXJhbSBjb25maWcgbuG6v3Uga2jDtG5nIGPDsyBjb25maWcgc+G6vSB0cuG6oyB24buBIMSR4buRaSB0xrDhu6NuZyBkYXlqcyBsw6AgdGjhu51pIGdpYW4gaGnhu4duIHThuqFpXG4gKiBAcGFyYW0gY29uZmlnLmRhdGUgdGjhu51pIGdpYW4gY+G6p24gbOG6pXlcbiAqIEBwYXJhbSBjb25maWcucmV0dXJuRGF5anNJZkNvbmZpZ0RhdGVOb3RFeGlzdCB0cnVlIG7hur91IG114buRbiB0cuG6oyB24buBIMSR4buRaSB0xrDhu6NuZyBkYXlqcyBu4bq/dSBjb25maWcuZGF0ZSBraMO0bmcgY8OzXG4gKiBAcGFyYW0gY29uZmlnLnV0YyB0cnVlIG7hur91IG114buRbiBs4bqleSB0aOG7nWkgZ2lhbiBVVENcbiAqIEBwYXJhbSBjb25maWcuZm9ybWF0T2ZEYXRlIMSR4buLbmggZOG6oW5nIHRo4budaSBnaWFuIMSRYW5nIMSRxrDhu6NjIHRydXnhu4FuIHbDoG9cbiAqL1xuZXhwb3J0IGNvbnN0IGdldERheWpzID0gPEMgZXh0ZW5kcyBHZXREYXlqc0NvbmZpZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4oY29uZmlnPzogQyk6IEdldERheWpzUmV0dXJuPEM+ID0+IHtcbiAgLy8gaGVscGVyIGNhc3QgxJHhu4MgdHLDoW5oIGzhurdwIGzhuqFpIGtp4buDdSDEkWnhu4F1IGtp4buHbiDhu58gY8OhYyByZXR1cm5cbiAgY29uc3Qgb3V0ID0gKHY6IHVua25vd24pID0+IHYgYXMgR2V0RGF5anNSZXR1cm48Qz47XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIG91dChkYXlqcygpLnR6KCkpO1xuICB9XG4gIGNvbmZpZy5kYXRlID0gIWNvbmZpZy5kYXRlICYmIGNvbmZpZy5yZXR1cm5EYXlqc0lmQ29uZmlnRGF0ZU5vdEV4aXN0ID8gZGF5anMoKS50eigpIDogY29uZmlnLmRhdGU7XG4gIGlmICh0eXBlb2YgY29uZmlnLmRhdGUgPT09ICdudW1iZXInKSB7XG4gICAgY29uZmlnLmRhdGUgPSBkYXlqcy51bml4KGNvbmZpZy5kYXRlKTtcbiAgfVxuICBpZiAoIWNvbmZpZy5kYXRlKSB7XG4gICAgcmV0dXJuIG91dCh1bmRlZmluZWQpO1xuICB9XG4gIGxldCB7IGRhdGUsIHV0YywgZm9ybWF0T2ZEYXRlIH0gPSBjb25maWcgYXMgVFlQRV9PQkpFQ1Q7XG5cbiAgd2hpbGUgKGlzU2lnbmFsKGRhdGUpKSB7XG4gICAgZGF0ZSA9IGRhdGUoKTtcbiAgfVxuICB3aGlsZSAoaXNTaWduYWwodXRjKSkge1xuICAgIHV0YyA9IHV0YygpO1xuICB9XG4gIHdoaWxlIChpc1NpZ25hbChmb3JtYXRPZkRhdGUpKSB7XG4gICAgZm9ybWF0T2ZEYXRlID0gZm9ybWF0T2ZEYXRlKCk7XG4gIH1cblxuICBpZiAodXRjKSB7XG4gICAgaWYgKGZvcm1hdE9mRGF0ZSkge1xuICAgICAgcmV0dXJuIG91dChkYXlqcyhkYXRlLCBmb3JtYXRPZkRhdGUpLnV0YygpKTtcbiAgICB9XG4gICAgY29uc3QgZGF0ZUlucHV0SXNVVEMgPSAoZGF5anMuaXNEYXlqcyhkYXRlKSAmJiBkYXRlLmlzVVRDKCkpIHx8ICh0eXBlb2YgZGF0ZSA9PT0gJ3N0cmluZycgJiYgKGRhdGUgYXMgc3RyaW5nKS5pbmNsdWRlcygnWicpKTtcblxuICAgIGlmIChkYXRlSW5wdXRJc1VUQykge1xuICAgICAgcmV0dXJuIG91dChkYXlqcyhkYXRlKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dChkYXlqcyhkYXRlKS51dGMoKSk7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnICYmICEoZGF0ZSBhcyBzdHJpbmcpLmluY2x1ZGVzKCdaJykgJiYgIShkYXRlIGFzIHN0cmluZykuaW5jbHVkZXMoJysnKSkge1xuICAgIHJldHVybiBvdXQoZm9ybWF0T2ZEYXRlID8gZGF5anMudHooZGF0ZSwgZm9ybWF0T2ZEYXRlLCBjb25maWcubG9jYWxlWm9uZSB8fCB0aW1lWm9uZVNldHVwKSA6IGRheWpzLnR6KGRhdGUsIGNvbmZpZy5sb2NhbGVab25lIHx8IHRpbWVab25lU2V0dXApKTtcbiAgfVxuXG4gIHJldHVybiBvdXQoKGZvcm1hdE9mRGF0ZSA/IGRheWpzKGRhdGUsIGZvcm1hdE9mRGF0ZSkgOiBkYXlqcyhkYXRlKSkudHooKSk7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLaeG7g20gdHJhIHhlbSBoYWkgbmfDoHkgY8OzIGtow6FjIG5oYXUga2jDtG5nIChraMOhYyBuZ8OgeSB0cm9uZyB0deG6p24pXG4gKiBAcGFyYW0gZGF0ZTEgbmfDoHkgdGjhu6kgbmjhuqV0IGPhuqduIHNvIHPDoW5oXG4gKiBAcGFyYW0gZGF0ZTIgbmfDoHkgdGjhu6kgaGFpIGPhuqduIHNvIHPDoW5oXG4gKiBAcmV0dXJucyB0cnVlIG7hur91IGhhaSBuZ8OgeSBraMOhYyBuaGF1LCBmYWxzZSBu4bq/dSBnaeG7kW5nIG5oYXUgaG/hurdjIGtow7RuZyB0aOG7gyBzbyBzw6FuaFxuICovXG5leHBvcnQgY29uc3QgaXNEaWZmZXJlbmNlRGF5ID0gKGRhdGUxOiBOb25OdWxsYWJsZURhdGUsIGRhdGUyOiBOb25OdWxsYWJsZURhdGUpID0+IHtcbiAgaWYgKGlzRGlmZmVyZW5jZU1vbnRoKGRhdGUxLCBkYXRlMikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBkYXkxID0gZ2V0RGF5anMoeyBkYXRlOiBkYXRlMSB9KT8uZGF5KCk7XG4gIGNvbnN0IGRheTIgPSBnZXREYXlqcyh7IGRhdGU6IGRhdGUyIH0pPy5kYXkoKTtcblxuICByZXR1cm4gZGF5MSAhPT0gZGF5Mjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEtp4buDbSB0cmEgeGVtIGhhaSBuZ8OgeSBjw7Mga2jDoWMgdGjDoW5nIGtow7RuZ1xuICogQHBhcmFtIGRhdGUxIG5nw6B5IHRo4bupIG5o4bqldCBj4bqnbiBzbyBzw6FuaFxuICogQHBhcmFtIGRhdGUyIG5nw6B5IHRo4bupIGhhaSBj4bqnbiBzbyBzw6FuaFxuICogQHJldHVybnMgdHJ1ZSBu4bq/dSBoYWkgbmfDoHkga2jDoWMgdGjDoW5nLCBmYWxzZSBu4bq/dSBjw7luZyB0aMOhbmcgaG/hurdjIGtow7RuZyB0aOG7gyBzbyBzw6FuaFxuICovXG5leHBvcnQgY29uc3QgaXNEaWZmZXJlbmNlTW9udGggPSAoZGF0ZTE6IE5vbk51bGxhYmxlRGF0ZSwgZGF0ZTI6IE5vbk51bGxhYmxlRGF0ZSkgPT4ge1xuICBpZiAoaXNEaWZmZXJlbmNlWWVhcihkYXRlMSwgZGF0ZTIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgbW9udGgxID0gZ2V0RGF5anMoeyBkYXRlOiBkYXRlMSB9KT8ubW9udGgoKTtcbiAgY29uc3QgbW9udGgyID0gZ2V0RGF5anMoeyBkYXRlOiBkYXRlMiB9KT8ubW9udGgoKTtcblxuICByZXR1cm4gbW9udGgxICE9PSBtb250aDI7XG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLaeG7g20gdHJhIHhlbSBoYWkgbmfDoHkgY8OzIGtow6FjIG7Eg20ga2jDtG5nXG4gKiBAcGFyYW0gZGF0ZTEgbmfDoHkgdGjhu6kgbmjhuqV0IGPhuqduIHNvIHPDoW5oXG4gKiBAcGFyYW0gZGF0ZTIgbmfDoHkgdGjhu6kgaGFpIGPhuqduIHNvIHPDoW5oXG4gKiBAcmV0dXJucyB0cnVlIG7hur91IGhhaSBuZ8OgeSBraMOhYyBuxINtLCBmYWxzZSBu4bq/dSBjw7luZyBuxINtIGhv4bq3YyBraMO0bmcgdGjhu4Mgc28gc8OhbmhcbiAqL1xuZXhwb3J0IGNvbnN0IGlzRGlmZmVyZW5jZVllYXIgPSAoZGF0ZTE6IE5vbk51bGxhYmxlRGF0ZSwgZGF0ZTI6IE5vbk51bGxhYmxlRGF0ZSkgPT4ge1xuICBjb25zdCB5ZWFyMSA9IGdldERheWpzKHsgZGF0ZTogZGF0ZTEgfSk/LnllYXIoKTtcbiAgY29uc3QgeWVhcjIgPSBnZXREYXlqcyh7IGRhdGU6IGRhdGUyIH0pPy55ZWFyKCk7XG5cbiAgcmV0dXJuIHllYXIxICE9PSB5ZWFyMjtcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEzhuqV5IHJhIGNodeG7l2kgdGjhu51pIGdpYW4gaGnhu4NuIHRo4buLIHRoZW8gxJHhu4tuaCBk4bqhbmcgdsOgIG5nw7RuIG5n4buvXG4gKiBAcGFyYW0gZGF0ZSB0aOG7nWkgZ2lhbiBj4bqnbiDEkeG7i25oIGThuqFuZ1xuICogQHBhcmFtIGZvcm1hdCDEkeG7i25oIGThuqFuZyB0aOG7nWkgZ2lhbiBtdeG7kW4gbOG6pXkgcmFcbiAqIEBwYXJhbSBsYW5nIGzhuqV5IHRoZW8gbmfDtG4gbmfhu69cbiAqL1xuZXhwb3J0IGNvbnN0IGZvcm1hdERhdGUgPSAoZGF0ZTogZGF5anMuQ29uZmlnVHlwZSwgZm9ybWF0T3V0cHV0ID0gJ1lZWVkvTU0vREQgSEg6bW0nLCBsYW5nPzogc3RyaW5nLCBmb3JtYXRJbnB1dD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghZGF0ZSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBsYW5nID0gbGFuZyB8fCAoVXRpbHNDYWNoZS5nZXRMYW5nKCkgYXMgc3RyaW5nKTtcbiAgaWYgKGZ1bmN0aW9uRm9ybWF0RGF0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbkZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0T3V0cHV0LCBsYW5nKTtcbiAgfVxuXG4gIGRhdGUgPSBnZXREYXlqcyh7IGRhdGUsIGZvcm1hdE9mRGF0ZTogZm9ybWF0SW5wdXQgfSkubG9jYWxlKGxhbmcpO1xuICBpZiAobGFuZyA9PT0gJ3ZpJykge1xuICAgIGRheWpzLnVwZGF0ZUxvY2FsZSgndmknLCB7XG4gICAgICBtb250aHNTaG9ydDogJ1RoZyAxX1RoZyAyX1RoZyAzX1RoZyA0X1RoZyA1X1RoZyA2X1RoZyA3X1RoZyA4X1RoZyA5X1RoZyAxMF9UaGcgMTFfVGhnIDEyJy5zcGxpdCgnXycpLFxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGRhdGUuZm9ybWF0KGdldEZvcm1hdERhdGEoZ2V0VHlwZUJ5Rm9ybWF0KGZvcm1hdE91dHB1dCksIGxhbmcpKSB8fCAnJztcbn07XG5cbmNvbnN0IGdldFR5cGVCeUZvcm1hdCA9IChmb3JtYXQ6IHN0cmluZyk6ICdkbScgfCAnZG15JyB8ICdkbXkgaG0nIHwgJ215JyB8ICdkbXkgaG1zJyB8ICdoaDptbScgfCAnSEg6bW0nIHwgJ2hoOm1tIEEnIHwgJ0hIOm1tIEEnID0+IHtcbiAgaWYgKGZvcm1hdCA9PT0gJ2RtJyB8fCBmb3JtYXQgPT09ICdkbXknIHx8IGZvcm1hdCA9PT0gJ2RteSBobScgfHwgZm9ybWF0ID09PSAnbXknKSB7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdERC9NTS9ZWVlZJyB8fCBmb3JtYXQgPT09ICdZWVlZLU1NLUREJyB8fCBmb3JtYXQgPT09ICdkZC9NTS95eXl5JyB8fCBmb3JtYXQgPT09ICdkZC1NTS15eXl5JyB8fCBmb3JtYXQgPT09ICdkZC9tbS95eXl5Jykge1xuICAgIHJldHVybiAnZG15JztcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdNTS1ERCcgfHwgZm9ybWF0ID09PSAnZGQvTU0nIHx8IGZvcm1hdCA9PT0gJ2RkL21tJykge1xuICAgIHJldHVybiAnZG0nO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gJ00vWVlZWScgfHwgZm9ybWF0ID09PSAnWVlZWS1NTScgfHwgZm9ybWF0ID09PSAnTU0veXl5eScpIHtcbiAgICByZXR1cm4gJ215JztcbiAgfVxuXG4gIGlmIChmb3JtYXQgPT09ICdZWVlZL01NL0REIGhoOm1tOnNzJyB8fCBmb3JtYXQgPT09ICdkbXkgaG1zJyB8fCBmb3JtYXQgPT09ICdkZC9tbS95eXl5IGhoOm1tOnNzJykge1xuICAgIHJldHVybiAnZG15IGhtcyc7XG4gIH1cblxuICBpZiAoZm9ybWF0ID09PSAnaGg6bW0nIHx8IGZvcm1hdCA9PT0gJ0hIOm1tJykge1xuICAgIHJldHVybiAnaGg6bW0nO1xuICB9XG5cbiAgaWYgKGZvcm1hdCA9PT0gJ2hoOm1tIEEnIHx8IGZvcm1hdCA9PT0gJ0hIOm1tIEEnKSB7XG4gICAgcmV0dXJuICdoaDptbSBBJztcbiAgfVxuXG4gIHJldHVybiAnZG15IGhtJztcbn07XG5cbmNvbnN0IGdldEZvcm1hdERhdGEgPSAodHlwZTogJ2RtJyB8ICdkbXknIHwgJ2RteSBobScgfCAnbXknIHwgJ2RteSBobXMnIHwgJ2hoOm1tJyB8ICdoaDptbSBBJyB8ICdISDptbScgfCAnSEg6bW0gQScsIGxhbmc6IHN0cmluZykgPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlICdkbSc6XG4gICAgICBpZiAobGFuZyA9PT0gJ3ZpJykge1xuICAgICAgICByZXR1cm4gJ0QgTU1NJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNTU0gRCc7XG5cbiAgICBjYXNlICdkbXknOlxuICAgICAgaWYgKGxhbmcgPT09ICd2aScpIHtcbiAgICAgICAgcmV0dXJuICdEIE1NTSwgWVlZWSc7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAnTU1NIEQsIFlZWVknO1xuXG4gICAgY2FzZSAnZG15IGhtJzpcbiAgICAgIGlmIChsYW5nID09PSAndmknKSB7XG4gICAgICAgIHJldHVybiAnRCBNTU0sIFlZWVkgSEg6bW0nO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gJ01NTSBELCBZWVlZIEhIOm1tJztcblxuICAgIGNhc2UgJ215JzpcbiAgICAgIGlmIChsYW5nID09PSAndmknKSB7XG4gICAgICAgIHJldHVybiAnTU1NLCBZWVlZJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNTU0gWVlZWSAnO1xuXG4gICAgY2FzZSAnZG15IGhtcyc6XG4gICAgICBpZiAobGFuZyA9PT0gJ3ZpJykge1xuICAgICAgICByZXR1cm4gJ0QgTU1NLCBZWVlZIEhIOm1tOnNzJztcbiAgICAgIH1cblxuICAgICAgcmV0dXJuICdNTU0gRCwgWVlZWSBISDptbTpzcyc7XG5cbiAgICBjYXNlICdoaDptbSc6XG4gICAgY2FzZSAnSEg6bW0nOlxuICAgICAgcmV0dXJuICdISDptbSc7XG5cbiAgICBjYXNlICdoaDptbSBBJzpcbiAgICBjYXNlICdISDptbSBBJzpcbiAgICAgIHJldHVybiAnSEg6bW0gQSc7XG4gIH1cbn07XG4iXX0=
@@ -0,0 +1,256 @@
1
+ import DeviceDetector from 'device-detector-js';
2
+ import Quill from 'quill';
3
+ import { finalize, fromEvent, lastValueFrom, mergeMap, startWith, takeUntil, tap, timer } from 'rxjs';
4
+ import { decodeEscapeHtml } from './format-text';
5
+ import { set } from './helpers';
6
+ const deviceDetector = new DeviceDetector();
7
+ const parser = new DOMParser();
8
+ const quill = new Quill(document.createElement('div'));
9
+ export const getDeviceInfo = () => {
10
+ return deviceDetector.parse(window.navigator.userAgent);
11
+ };
12
+ export const getPlatFromBrowser = () => {
13
+ const info = getDeviceInfo();
14
+ return `${info.client?.name} ${info.client?.version}`;
15
+ };
16
+ export const getEventNameHandleClick = (() => {
17
+ const deviceInfo = getDeviceInfo();
18
+ let nameEventHandleClick = deviceInfo.device?.type === 'desktop' ? 'click' : 'touchstart';
19
+ if ('onpointerdown' in window) {
20
+ nameEventHandleClick = 'pointerdown';
21
+ }
22
+ return nameEventHandleClick;
23
+ })();
24
+ export const getDocumentByString = (htmlStr) => {
25
+ return parser.parseFromString(htmlStr, 'text/html');
26
+ };
27
+ export const cloneIBoundingClientRect = (rect) => {
28
+ return {
29
+ top: rect['top'],
30
+ left: rect['left'],
31
+ width: rect['width'],
32
+ height: rect['height'],
33
+ bottom: rect['bottom'],
34
+ };
35
+ };
36
+ export const setStylesElement = (el, styles) => {
37
+ Object.keys(styles).forEach((key) => set(el, `style.${key}`, styles[key]));
38
+ };
39
+ export const getViewport = (win = window) => {
40
+ const doc = win.document.documentElement, body = win.document.getElementsByTagName('body')[0], w = win.innerWidth || doc.clientWidth || body.clientWidth, h = win.innerHeight || doc.clientHeight || body.clientHeight;
41
+ return { width: w, height: h };
42
+ };
43
+ export const setCaretPosition = (element, position) => {
44
+ if (!element || !element.setSelectionRange) {
45
+ return;
46
+ }
47
+ element.focus();
48
+ element.setSelectionRange(position, position);
49
+ };
50
+ export const checkViewInScreen = (container, element, elementScroll, maxTopLeft) => {
51
+ if (!container || !element) {
52
+ return false;
53
+ }
54
+ const rectContainer = cloneIBoundingClientRect(container.getBoundingClientRect());
55
+ if (elementScroll) {
56
+ const rectElementScroll = elementScroll.getBoundingClientRect();
57
+ rectContainer['left'] = rectElementScroll.left;
58
+ rectContainer['top'] = rectElementScroll.top;
59
+ }
60
+ const rectElement = element.getBoundingClientRect();
61
+ const { left, top } = rectElement;
62
+ const topContainer = rectContainer['top'];
63
+ const leftContainer = rectContainer['left'];
64
+ const widthContainer = rectContainer['width'];
65
+ const heightContainer = rectContainer['height'];
66
+ const scrollTopContainer = container.scrollTop;
67
+ const scrollLeftContainer = container.scrollLeft;
68
+ const limitTop = topContainer + scrollTopContainer + heightContainer;
69
+ const limitLeft = leftContainer + scrollLeftContainer + widthContainer;
70
+ const maxTopItem = top + (maxTopLeft?.top || 0);
71
+ const maxLeftItem = left + (maxTopLeft?.left || 0);
72
+ if (topContainer <= maxTopItem && maxTopItem <= limitTop && leftContainer <= maxLeftItem && maxLeftItem <= limitLeft) {
73
+ return true;
74
+ }
75
+ return false;
76
+ };
77
+ export const checkMouseOverInContainer = (mousePosition, element, rect) => {
78
+ if (!element && !rect) {
79
+ return false;
80
+ }
81
+ const rectElement = rect || element?.getBoundingClientRect() || {};
82
+ const { left, top, width, height } = rectElement;
83
+ const limitLeft = left + width;
84
+ const limitTop = top + height;
85
+ const { clientX, clientY } = mousePosition;
86
+ if (left <= clientX && clientX <= limitLeft && top <= clientY && clientY <= limitTop) {
87
+ return true;
88
+ }
89
+ return false;
90
+ };
91
+ export const getDragEventByElement = (config) => {
92
+ let timer;
93
+ const addClass = () => {
94
+ timer = setTimeout(() => {
95
+ document.body.classList.add('!select-none');
96
+ document.body.classList.add('!cursor-grabbing');
97
+ }, 250);
98
+ };
99
+ const removeClass = () => {
100
+ document.body.classList.remove('!select-none');
101
+ document.body.classList.remove('!cursor-grabbing');
102
+ clearTimeout(timer);
103
+ };
104
+ fromEvent(config.elementMouseDown, 'mouseleave')
105
+ .pipe(tap(() => document.body.classList.remove('cursor-pointer')), takeUntil(config.onDestroy))
106
+ .subscribe();
107
+ fromEvent(config.elementMouseDown, 'mouseenter')
108
+ .pipe(tap(() => document.body.classList.add('cursor-pointer')), takeUntil(config.onDestroy))
109
+ .subscribe();
110
+ const mouseDown = fromEvent(config.elementMouseDown, 'mousedown').pipe(tap((e) => {
111
+ e.stopPropagation();
112
+ addClass();
113
+ config.functionMouseDown?.(e);
114
+ }));
115
+ const mouseup = fromEvent(config.elementMouseUp || document, 'mouseup').pipe(tap((e) => {
116
+ e.stopPropagation();
117
+ removeClass();
118
+ config.functionMouseUp?.(e);
119
+ }));
120
+ const mousemove = fromEvent(config.elementMouseMove || document, 'mousemove').pipe(tap((e) => {
121
+ e.stopPropagation();
122
+ config.functionMouseMove?.(e);
123
+ }), takeUntil(mouseup));
124
+ return mouseDown.pipe(mergeMap((e) => (config.isStartWithMouseDownEvent ? mousemove.pipe(startWith(e)) : mousemove)), takeUntil(config.onDestroy), finalize(removeClass));
125
+ };
126
+ export const getHTMLFromQuill = async (data, options) => {
127
+ const { replaceNewLineTo = '<br>', replaceTagBRTo, replaceTags, replaceBrToDiv } = options || {};
128
+ const delta = typeof data === 'string' ? await getDeltaFromHTML(data) : data;
129
+ if (options?.functionReplaceDelta) {
130
+ options.functionReplaceDelta(delta);
131
+ }
132
+ delta.ops.forEach((op) => {
133
+ if (op.insert) {
134
+ if (typeof op.insert === 'string') {
135
+ if (replaceNewLineTo) {
136
+ op.insert = op.insert.replace(/\n/g, replaceNewLineTo);
137
+ }
138
+ if (replaceTagBRTo) {
139
+ op.insert = op.insert.replace(/<br>/g, replaceTagBRTo);
140
+ }
141
+ if (replaceTags?.length) {
142
+ for (const tag of replaceTags) {
143
+ op.insert = op.insert.replace(new RegExp(`<${tag.tag}>`, 'g'), `<${tag.replaceTo}>`);
144
+ op.insert = op.insert.replace(new RegExp(`</${tag.tag}>`, 'g'), `</${tag.replaceTo}>`);
145
+ }
146
+ }
147
+ }
148
+ }
149
+ });
150
+ quill.setContents(delta);
151
+ let htmlText = options?.getRootHtml ? quill.root.innerHTML : quill.root.firstElementChild?.innerHTML;
152
+ if (replaceBrToDiv) {
153
+ htmlText = convertHtmlToDivBlocks(htmlText || '');
154
+ }
155
+ return decodeEscapeHtml(htmlText || '');
156
+ };
157
+ export const convertHtmlToDivBlocks = (html) => {
158
+ const BREAK_TOKEN = '<<<BREAK>>>';
159
+ // Bước 1: thay <br> thành token tạm
160
+ const normalizedHtml = html.replace(/<br\s*\/?>/gi, BREAK_TOKEN);
161
+ // Bước 2: tách theo token
162
+ const parts = normalizedHtml.split(BREAK_TOKEN);
163
+ const parser = new DOMParser();
164
+ const divs = [];
165
+ for (const raw of parts) {
166
+ const trimmed = raw.trim();
167
+ if (!trimmed)
168
+ continue;
169
+ // parse mỗi phần nhỏ như một document riêng
170
+ const doc = parser.parseFromString(trimmed, 'text/html');
171
+ const body = doc.body;
172
+ // Lấy lại nội dung bên trong body
173
+ divs.push(`<div>${body.innerHTML}</div>`);
174
+ }
175
+ return divs.join('');
176
+ };
177
+ export const getDeltaFromHTML = async (html) => {
178
+ quill.root.innerHTML = html;
179
+ setTimeout(() => {
180
+ console.log(quill.getContents());
181
+ }, 1000);
182
+ await lastValueFrom(timer(1000));
183
+ return quill.getContents();
184
+ };
185
+ export const processPasteData = async (e, config) => {
186
+ const element = config.element;
187
+ const files = e.clipboardData?.files;
188
+ if (files?.length) {
189
+ e.preventDefault();
190
+ config.handlerPasteFile?.(files);
191
+ config.callBack?.('file');
192
+ return;
193
+ }
194
+ // Lưu selection TRƯỚC khi prevent default
195
+ const selection = window.getSelection();
196
+ let savedRange = null;
197
+ if (selection && selection.rangeCount > 0) {
198
+ const range = selection.getRangeAt(0);
199
+ // Chỉ lưu nếu range nằm trong contentText element
200
+ const container = range.commonAncestorContainer;
201
+ const isInContentElement = element.contains(container.nodeType === Node.TEXT_NODE ? container.parentNode : container);
202
+ if (isInContentElement) {
203
+ savedRange = range.cloneRange();
204
+ }
205
+ }
206
+ // Prevent default để tự xử lý paste
207
+ e.preventDefault();
208
+ // Sử dụng Quill để clean HTML content
209
+ const htmlContent = e.clipboardData?.getData('text/html') || '';
210
+ const plainText = e.clipboardData?.getData('text/plain') || '';
211
+ let contentToInsert = (plainText || '').replace(/\n/g, '<br>');
212
+ if (htmlContent) {
213
+ contentToInsert = await getHTMLFromQuill(htmlContent);
214
+ }
215
+ if (!contentToInsert) {
216
+ config.callBack?.('no-content');
217
+ return;
218
+ }
219
+ if (savedRange) {
220
+ insertContentWithRange(contentToInsert, savedRange, element);
221
+ config.callBack?.('range');
222
+ return;
223
+ }
224
+ element.innerHTML += contentToInsert;
225
+ config.callBack?.('content');
226
+ };
227
+ export const insertContentWithRange = (content, savedRange, element) => {
228
+ const selection = window.getSelection();
229
+ if (!selection) {
230
+ // Fallback: append vào cuối
231
+ element.innerHTML += content;
232
+ return;
233
+ }
234
+ // Restore selection
235
+ selection.removeAllRanges();
236
+ selection.addRange(savedRange);
237
+ // Xóa nội dung đã select (nếu có)
238
+ savedRange.deleteContents();
239
+ // Tạo document fragment từ HTML content
240
+ const tempDiv = document.createElement('div');
241
+ tempDiv.innerHTML = content;
242
+ const fragment = document.createDocumentFragment();
243
+ while (tempDiv.firstChild) {
244
+ fragment.appendChild(tempDiv.firstChild);
245
+ }
246
+ // Insert fragment tại vị trí range
247
+ savedRange.insertNode(fragment);
248
+ // Di chuyển cursor đến cuối nội dung vừa insert
249
+ if (fragment.lastChild) {
250
+ savedRange.setStartAfter(fragment.lastChild);
251
+ }
252
+ savedRange.collapse(true);
253
+ selection.removeAllRanges();
254
+ selection.addRange(savedRange);
255
+ };
256
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvZG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sY0FBYyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUUxQixPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBVyxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVoQyxNQUFNLGNBQWMsR0FBRyxJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7QUFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDaEMsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDMUQsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxFQUFFO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLGFBQWEsRUFBRSxDQUFDO0lBQzdCLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDO0FBQ3hELENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsR0FBRyxFQUFFO0lBQzNDLE1BQU0sVUFBVSxHQUFH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QVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoQyxnREFBZ0Q7SUFDaEQsSUFBSSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDdkIsVUFBVSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsQ0FBQztJQUNELFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsU0FBUyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDakMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueSAqL1xuaW1wb3J0IHsgSUJvdW5kaW5nQ2xpZW50UmVjdCB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IERldmljZURldGVjdG9yIGZyb20gJ2RldmljZS1kZXRlY3Rvci1qcyc7XG5pbXBvcnQgUXVpbGwgZnJvbSAncXVpbGwnO1xuaW1wb3J0IERlbHRhIGZyb20gJ3F1aWxsLWRlbHRhJztcbmltcG9ydCB7IGZpbmFsaXplLCBmcm9tRXZlbnQsIGxhc3RWYWx1ZUZyb20sIG1lcmdlTWFwLCBzdGFydFdpdGgsIFN1YmplY3QsIHRha2VVbnRpbCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZGVjb2RlRXNjYXBlSHRtbCB9IGZyb20gJy4vZm9ybWF0LXRleHQnO1xuaW1wb3J0IHsgc2V0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuY29uc3QgZGV2aWNlRGV0ZWN0b3IgPSBuZXcgRGV2aWNlRGV0ZWN0b3IoKTtcbmNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbmNvbnN0IHF1aWxsID0gbmV3IFF1aWxsKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpKTtcblxuZXhwb3J0IGNvbnN0IGdldERldmljZUluZm8gPSAoKSA9PiB7XG4gIHJldHVybiBkZXZpY2VEZXRlY3Rvci5wYXJzZSh3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59O1xuZXhwb3J0IGNvbnN0IGdldFBsYXRGcm9tQnJvd3NlciA9ICgpID0+IHtcbiAgY29uc3QgaW5mbyA9IGdldERldmljZUluZm8oKTtcbiAgcmV0dXJuIGAke2luZm8uY2xpZW50Py5uYW1lfSAke2luZm8uY2xpZW50Py52ZXJzaW9ufWA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXZlbnROYW1lSGFuZGxlQ2xpY2sgPSAoKCkgPT4ge1xuICBjb25zdCBkZXZpY2VJbmZvID0gZ2V0RGV2aWNlSW5mbygpO1xuICBsZXQgbmFtZUV2ZW50SGFuZGxlQ2xpY2sgPSBkZXZpY2VJbmZvLmRldmljZT8udHlwZSA9PT0gJ2Rlc2t0b3AnID8gJ2NsaWNrJyA6ICd0b3VjaHN0YXJ0JztcbiAgaWYgKCdvbnBvaW50ZXJkb3duJyBpbiB3aW5kb3cpIHtcbiAgICBuYW1lRXZlbnRIYW5kbGVDbGljayA9ICdwb2ludGVyZG93bic7XG4gIH1cblxuICByZXR1cm4gbmFtZUV2ZW50SGFuZGxlQ2xpY2s7XG59KSgpO1xuXG5leHBvcnQgY29uc3QgZ2V0RG9jdW1lbnRCeVN0cmluZyA9IChodG1sU3RyOiBzdHJpbmcpOiBEb2N1bWVudCA9PiB7XG4gIHJldHVybiBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKGh0bWxTdHIsICd0ZXh0L2h0bWwnKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbG9uZUlCb3VuZGluZ0NsaWVudFJlY3QgPSAocmVjdDogSUJvdW5kaW5nQ2xpZW50UmVjdCk6IElCb3VuZGluZ0NsaWVudFJlY3QgPT4ge1xuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdFsndG9wJ10sXG4gICAgbGVmdDogcmVjdFsnbGVmdCddLFxuICAgIHdpZHRoOiByZWN0Wyd3aWR0aCddLFxuICAgIGhlaWdodDogcmVjdFsnaGVpZ2h0J10sXG4gICAgYm90dG9tOiByZWN0Wydib3R0b20nXSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRTdHlsZXNFbGVtZW50ID0gKGVsOiBIVE1MRWxlbWVudCwgc3R5bGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoa2V5OiBzdHJpbmcpID0+IHNldChlbCwgYHN0eWxlLiR7a2V5fWAsIHN0eWxlc1trZXldKSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Vmlld3BvcnQgPSAod2luOiBXaW5kb3cgPSB3aW5kb3cpOiB7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyIH0gPT4ge1xuICBjb25zdCBkb2MgPSB3aW4uZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFxuICAgIGJvZHkgPSB3aW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSxcbiAgICB3ID0gd2luLmlubmVyV2lkdGggfHwgZG9jLmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50V2lkdGgsXG4gICAgaCA9IHdpbi5pbm5lckhlaWdodCB8fCBkb2MuY2xpZW50SGVpZ2h0IHx8IGJvZHkuY2xpZW50SGVpZ2h0O1xuXG4gIHJldHVybiB7IHdpZHRoOiB3LCBoZWlnaHQ6IGggfTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDYXJldFBvc2l0aW9uID0gKGVsZW1lbnQ6IEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBIVE1MSW5wdXRFbGVtZW50LCBwb3NpdGlvbjogbnVtYmVyKTogdm9pZCA9PiB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5zZXRTZWxlY3Rpb25SYW5nZSkge1xuICAgIHJldHVybjtcbiAgfVxuICBlbGVtZW50LmZvY3VzKCk7XG4gIGVsZW1lbnQuc2V0U2VsZWN0aW9uUmFuZ2UocG9zaXRpb24sIHBvc2l0aW9uKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGVja1ZpZXdJblNjcmVlbiA9IChjb250YWluZXI6IEhUTUxFbGVtZW50LCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZWxlbWVudFNjcm9sbD86IEhUTUxFbGVtZW50LCBtYXhUb3BMZWZ0PzogeyB0b3A/OiBudW1iZXI7IGxlZnQ/OiBudW1iZXIgfSk6IGJvb2xlYW4gPT4ge1xuICBpZiAoIWNvbnRhaW5lciB8fCAhZWxlbWVudCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJlY3RDb250YWluZXIgPSBjbG9uZUlCb3VuZGluZ0NsaWVudFJlY3QoY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKTtcblxuICBpZiAoZWxlbWVudFNjcm9sbCkge1xuICAgIGNvbnN0IHJlY3RFbGVtZW50U2Nyb2xsID0gZWxlbWVudFNjcm9sbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIHJlY3RDb250YWluZXJbJ2xlZnQnXSA9IHJlY3RFbGVtZW50U2Nyb2xsLmxlZnQ7XG4gICAgcmVjdENvbnRhaW5lclsndG9wJ10gPSByZWN0RWxlbWVudFNjcm9sbC50b3A7XG4gIH1cblxuICBjb25zdCByZWN0RWxlbWVudCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIGNvbnN0IHsgbGVmdCwgdG9wIH0gPSByZWN0RWxlbWVudDtcbiAgY29uc3QgdG9wQ29udGFpbmVyID0gcmVjdENvbnRhaW5lclsndG9wJ107XG4gIGNvbnN0IGxlZnRDb250YWluZXIgPSByZWN0Q29udGFpbmVyWydsZWZ0J107XG4gIGNvbnN0IHdpZHRoQ29udGFpbmVyID0gcmVjdENvbnRhaW5lclsnd2lkdGgnXTtcbiAgY29uc3QgaGVpZ2h0Q29udGFpbmVyID0gcmVjdENvbnRhaW5lclsnaGVpZ2h0J107XG4gIGNvbnN0IHNjcm9sbFRvcENvbnRhaW5lciA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG4gIGNvbnN0IHNjcm9sbExlZnRDb250YWluZXIgPSBjb250YWluZXIuc2Nyb2xsTGVmdDtcbiAgY29uc3QgbGltaXRUb3AgPSB0b3BDb250YWluZXIgKyBzY3JvbGxUb3BDb250YWluZXIgKyBoZWlnaHRDb250YWluZXI7XG4gIGNvbnN0IGxpbWl0TGVmdCA9IGxlZnRDb250YWluZXIgKyBzY3JvbGxMZWZ0Q29udGFpbmVyICsgd2lkdGhDb250YWluZXI7XG5cbiAgY29uc3QgbWF4VG9wSXRlbSA9IHRvcCArIChtYXhUb3BMZWZ0Py50b3AgfHwgMCk7XG4gIGNvbnN0IG1heExlZnRJdGVtID0gbGVmdCArIChtYXhUb3BMZWZ0Py5sZWZ0IHx8IDApO1xuXG4gIGlmICh0b3BDb250YWluZXIgPD0gbWF4VG9wSXRlbSAmJiBtYXhUb3BJdGVtIDw9IGxpbWl0VG9wICYmIGxlZnRDb250YWluZXIgPD0gbWF4TGVmdEl0ZW0gJiYgbWF4TGVmdEl0ZW0gPD0gbGltaXRMZWZ0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgY2hlY2tNb3VzZU92ZXJJbkNvbnRhaW5lciA9IChtb3VzZVBvc2l0aW9uOiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sIGVsZW1lbnQ/OiBIVE1MRWxlbWVudCwgcmVjdD86IERPTVJlY3QpOiBib29sZWFuID0+IHtcbiAgaWYgKCFlbGVtZW50ICYmICFyZWN0KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlY3RFbGVtZW50ID0gcmVjdCB8fCBlbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB8fCAoe30gYXMgRE9NUmVjdCk7XG4gIGNvbnN0IHsgbGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0IH0gPSByZWN0RWxlbWVudDtcbiAgY29uc3QgbGltaXRMZWZ0ID0gbGVmdCArIHdpZHRoO1xuICBjb25zdCBsaW1pdFRvcCA9IHRvcCArIGhlaWdodDtcbiAgY29uc3QgeyBjbGllbnRYLCBjbGllbnRZIH0gPSBtb3VzZVBvc2l0aW9uO1xuICBpZiAobGVmdCA8PSBjbGllbnRYICYmIGNsaWVudFggPD0gbGltaXRMZWZ0ICYmIHRvcCA8PSBjbGllbnRZICYmIGNsaWVudFkgPD0gbGltaXRUb3ApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREcmFnRXZlbnRCeUVsZW1lbnQgPSAoY29uZmlnOiB7XG4gIGVsZW1lbnRNb3VzZURvd246IEhUTUxFbGVtZW50O1xuICBmdW5jdGlvbk1vdXNlRG93bj86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgaXNTdGFydFdpdGhNb3VzZURvd25FdmVudD86IGJvb2xlYW47XG4gIGVsZW1lbnRNb3VzZU1vdmU/OiBIVE1MRWxlbWVudDtcbiAgZnVuY3Rpb25Nb3VzZU1vdmU/OiAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHZvaWQ7XG4gIGVsZW1lbnRNb3VzZVVwPzogSFRNTEVsZW1lbnQ7XG4gIGZ1bmN0aW9uTW91c2VVcD86IChldmVudDogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgb25EZXN0cm95OiBTdWJqZWN0PGFueT47XG59KSA9PiB7XG4gIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gIGNvbnN0IGFkZENsYXNzID0gKCkgPT4ge1xuICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJyFzZWxlY3Qtbm9uZScpO1xuICAgICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCchY3Vyc29yLWdyYWJiaW5nJyk7XG4gICAgfSwgMjUwKTtcbiAgfTtcbiAgY29uc3QgcmVtb3ZlQ2xhc3MgPSAoKSA9PiB7XG4gICAgZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCchc2VsZWN0LW5vbmUnKTtcbiAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJyFjdXJzb3ItZ3JhYmJpbmcnKTtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xuICBmcm9tRXZlbnQoY29uZmlnLmVsZW1lbnRNb3VzZURvd24sICdtb3VzZWxlYXZlJylcbiAgICAucGlwZShcbiAgICAgIHRhcCgoKSA9PiBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2N1cnNvci1wb2ludGVyJykpLFxuICAgICAgdGFrZVVudGlsKGNvbmZpZy5vbkRlc3Ryb3kpXG4gICAgKVxuICAgIC5zdWJzY3JpYmUoKTtcbiAgZnJvbUV2ZW50KGNvbmZpZy5lbGVtZW50TW91c2VEb3duLCAnbW91c2VlbnRlcicpXG4gICAgLnBpcGUoXG4gICAgICB0YXAoKCkgPT4gZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKCdjdXJzb3ItcG9pbnRlcicpKSxcbiAgICAgIHRha2VVbnRpbChjb25maWcub25EZXN0cm95KVxuICAgIClcbiAgICAuc3Vic2NyaWJlKCk7XG5cbiAgY29uc3QgbW91c2VEb3duID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VEb3duLCAnbW91c2Vkb3duJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBhZGRDbGFzcygpO1xuICAgICAgY29uZmlnLmZ1bmN0aW9uTW91c2VEb3duPy4oZSk7XG4gICAgfSlcbiAgKTtcbiAgY29uc3QgbW91c2V1cCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb25maWcuZWxlbWVudE1vdXNlVXAgfHwgZG9jdW1lbnQsICdtb3VzZXVwJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICByZW1vdmVDbGFzcygpO1xuICAgICAgY29uZmlnLmZ1bmN0aW9uTW91c2VVcD8uKGUpO1xuICAgIH0pXG4gICk7XG5cbiAgY29uc3QgbW91c2Vtb3ZlID0gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbmZpZy5lbGVtZW50TW91c2VNb3ZlIHx8IGRvY3VtZW50LCAnbW91c2Vtb3ZlJykucGlwZShcbiAgICB0YXAoKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBjb25maWcuZnVuY3Rpb25Nb3VzZU1vdmU/LihlKTtcbiAgICB9KSxcbiAgICB0YWtlVW50aWwobW91c2V1cClcbiAgKTtcblxuICByZXR1cm4gbW91c2VEb3duLnBpcGUoXG4gICAgbWVyZ2VNYXAoKGU6IE1vdXNlRXZlbnQpID0+IChjb25maWcuaXNTdGFydFdpdGhNb3VzZURvd25FdmVudCA/IG1vdXNlbW92ZS5waXBlKHN0YXJ0V2l0aChlKSkgOiBtb3VzZW1vdmUpKSxcbiAgICB0YWtlVW50aWwoY29uZmlnLm9uRGVzdHJveSksXG4gICAgZmluYWxpemUocmVtb3ZlQ2xhc3MpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0SFRNTEZyb21RdWlsbCA9IGFzeW5jIChcbiAgZGF0YTogRGVsdGEgfCBzdHJpbmcsXG4gIG9wdGlvbnM/OiB7XG4gICAgZ2V0Um9vdEh0bWw/OiBib29sZWFuO1xuICAgIHJlcGxhY2VOZXdMaW5lVG8/OiBzdHJpbmc7XG4gICAgcmVwbGFjZVRhZ0JSVG8/OiBzdHJpbmc7XG4gICAgcmVwbGFjZUJyVG9EaXY/OiBib29sZWFuO1xuICAgIGZ1bmN0aW9uUmVwbGFjZURlbHRhPzogKG9wOiBEZWx0YSkgPT4gdm9pZDtcbiAgICByZXBsYWNlVGFncz86IHtcbiAgICAgIHRhZzogc3RyaW5nO1xuICAgICAgcmVwbGFjZVRvOiBzdHJpbmc7XG4gICAgfVtdO1xuICB9XG4pOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICBjb25zdCB7IHJlcGxhY2VOZXdMaW5lVG8gPSAnPGJyPicsIHJlcGxhY2VUYWdCUlRvLCByZXBsYWNlVGFncywgcmVwbGFjZUJyVG9EaXYgfSA9IG9wdGlvbnMgfHwge307XG4gIGNvbnN0IGRlbHRhID0gdHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnID8gYXdhaXQgZ2V0RGVsdGFGcm9tSFRNTChkYXRhKSA6IGRhdGE7XG4gIGlmIChvcHRpb25zPy5mdW5jdGlvblJlcGxhY2VEZWx0YSkge1xuICAgIG9wdGlvbnMuZnVuY3Rpb25SZXBsYWNlRGVsdGEoZGVsdGEpO1xuICB9XG5cbiAgZGVsdGEub3BzLmZvckVhY2goKG9wKSA9PiB7XG4gICAgaWYgKG9wLmluc2VydCkge1xuICAgICAgaWYgKHR5cGVvZiBvcC5pbnNlcnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGlmIChyZXBsYWNlTmV3TGluZVRvKSB7XG4gICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UoL1xcbi9nLCByZXBsYWNlTmV3TGluZVRvKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVwbGFjZVRhZ0JSVG8pIHtcbiAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZSgvPGJyPi9nLCByZXBsYWNlVGFnQlJUbyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVwbGFjZVRhZ3M/Lmxlbmd0aCkge1xuICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHJlcGxhY2VUYWdzKSB7XG4gICAgICAgICAgICBvcC5pbnNlcnQgPSBvcC5pbnNlcnQucmVwbGFjZShuZXcgUmVnRXhwKGA8JHt0YWcudGFnfT5gLCAnZycpLCBgPCR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgb3AuaW5zZXJ0ID0gb3AuaW5zZXJ0LnJlcGxhY2UobmV3IFJlZ0V4cChgPC8ke3RhZy50YWd9PmAsICdnJyksIGA8LyR7dGFnLnJlcGxhY2VUb30+YCkgYXMgc3RyaW5nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHF1aWxsLnNldENvbnRlbnRzKGRlbHRhKTtcbiAgbGV0IGh0bWxUZXh0ID0gb3B0aW9ucz8uZ2V0Um9vdEh0bWwgPyBxdWlsbC5yb290LmlubmVySFRNTCA6IHF1aWxsLnJvb3QuZmlyc3RFbGVtZW50Q2hpbGQ/LmlubmVySFRNTDtcbiAgaWYgKHJlcGxhY2VCclRvRGl2KSB7XG4gICAgaHRtbFRleHQgPSBjb252ZXJ0SHRtbFRvRGl2QmxvY2tzKGh0bWxUZXh0IHx8ICcnKTtcbiAgfVxuICByZXR1cm4gZGVjb2RlRXNjYXBlSHRtbChodG1sVGV4dCB8fCAnJyk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydEh0bWxUb0RpdkJsb2NrcyA9IChodG1sOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBCUkVBS19UT0tFTiA9ICc8PDxCUkVBSz4+Pic7XG4gIC8vIELGsOG7m2MgMTogdGhheSA8YnI+IHRow6BuaCB0b2tlbiB04bqhbVxuICBjb25zdCBub3JtYWxpemVkSHRtbCA9IGh0bWwucmVwbGFjZSgvPGJyXFxzKlxcLz8+L2dpLCBCUkVBS19UT0tFTik7XG5cbiAgLy8gQsaw4bubYyAyOiB0w6FjaCB0aGVvIHRva2VuXG4gIGNvbnN0IHBhcnRzID0gbm9ybWFsaXplZEh0bWwuc3BsaXQoQlJFQUtfVE9LRU4pO1xuXG4gIGNvbnN0IHBhcnNlciA9IG5ldyBET01QYXJzZXIoKTtcbiAgY29uc3QgZGl2czogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHJhdyBvZiBwYXJ0cykge1xuICAgIGNvbnN0IHRyaW1tZWQgPSByYXcudHJpbSgpO1xuICAgIGlmICghdHJpbW1lZCkgY29udGludWU7XG5cbiAgICAvLyBwYXJzZSBt4buXaSBwaOG6p24gbmjhu48gbmjGsCBt4buZdCBkb2N1bWVudCByacOqbmdcbiAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRyaW1tZWQsICd0ZXh0L2h0bWwnKTtcbiAgICBjb25zdCBib2R5ID0gZG9jLmJvZHk7XG5cbiAgICAvLyBM4bqleSBs4bqhaSBu4buZaSBkdW5nIGLDqm4gdHJvbmcgYm9keVxuICAgIGRpdnMucHVzaChgPGRpdj4ke2JvZHkuaW5uZXJIVE1MfTwvZGl2PmApO1xuICB9XG5cbiAgcmV0dXJuIGRpdnMuam9pbignJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVsdGFGcm9tSFRNTCA9IGFzeW5jIChodG1sOiBzdHJpbmcpOiBQcm9taXNlPERlbHRhPiA9PiB7XG4gIHF1aWxsLnJvb3QuaW5uZXJIVE1MID0gaHRtbDtcbiAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgY29uc29sZS5sb2cocXVpbGwuZ2V0Q29udGVudHMoKSk7XG4gIH0sIDEwMDApO1xuXG4gIGF3YWl0IGxhc3RWYWx1ZUZyb20odGltZXIoMTAwMCkpO1xuICByZXR1cm4gcXVpbGwuZ2V0Q29udGVudHMoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBwcm9jZXNzUGFzdGVEYXRhID0gYXN5bmMgKFxuICBlOiBDbGlwYm9hcmRFdmVudCxcbiAgY29uZmlnOiB7XG4gICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgaGFuZGxlclBhc3RlRmlsZT86IChmaWxlczogRmlsZUxpc3QpID0+IHZvaWQ7XG4gICAgY2FsbEJhY2s/OiAocG9zaXRvblJldHVybjogJ2ZpbGUnIHwgJ3JhbmdlJyB8ICdjb250ZW50JyB8ICduby1jb250ZW50JykgPT4gdm9pZDtcbiAgfVxuKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBjb25maWcuZWxlbWVudDtcbiAgY29uc3QgZmlsZXMgPSBlLmNsaXBib2FyZERhdGE/LmZpbGVzO1xuICBpZiAoZmlsZXM/Lmxlbmd0aCkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25maWcuaGFuZGxlclBhc3RlRmlsZT8uKGZpbGVzKTtcbiAgICBjb25maWcuY2FsbEJhY2s/LignZmlsZScpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBMxrB1IHNlbGVjdGlvbiBUUsav4buaQyBraGkgcHJldmVudCBkZWZhdWx0XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgbGV0IHNhdmVkUmFuZ2U6IFJhbmdlIHwgbnVsbCA9IG51bGw7XG4gIGlmIChzZWxlY3Rpb24gJiYgc2VsZWN0aW9uLnJhbmdlQ291bnQgPiAwKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBzZWxlY3Rpb24uZ2V0UmFuZ2VBdCgwKTtcbiAgICAvLyBDaOG7iSBsxrB1IG7hur91IHJhbmdlIG7hurFtIHRyb25nIGNvbnRlbnRUZXh0IGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSByYW5nZS5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtcbiAgICBjb25zdCBpc0luQ29udGVudEVsZW1lbnQgPSBlbGVtZW50LmNvbnRhaW5zKGNvbnRhaW5lci5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUgPyBjb250YWluZXIucGFyZW50Tm9kZSA6IGNvbnRhaW5lcik7XG4gICAgaWYgKGlzSW5Db250ZW50RWxlbWVudCkge1xuICAgICAgc2F2ZWRSYW5nZSA9IHJhbmdlLmNsb25lUmFuZ2UoKTtcbiAgICB9XG4gIH1cbiAgLy8gUHJldmVudCBkZWZhdWx0IMSR4buDIHThu7EgeOG7rSBsw70gcGFzdGVcbiAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBT4butIGThu6VuZyBRdWlsbCDEkeG7gyBjbGVhbiBIVE1MIGNvbnRlbnRcbiAgY29uc3QgaHRtbENvbnRlbnQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvaHRtbCcpIHx8ICcnO1xuICBjb25zdCBwbGFpblRleHQgPSBlLmNsaXBib2FyZERhdGE/LmdldERhdGEoJ3RleHQvcGxhaW4nKSB8fCAnJztcbiAgbGV0IGNvbnRlbnRUb0luc2VydCA9IChwbGFpblRleHQgfHwgJycpLnJlcGxhY2UoL1xcbi9nLCAnPGJyPicpO1xuICBpZiAoaHRtbENvbnRlbnQpIHtcbiAgICBjb250ZW50VG9JbnNlcnQgPSBhd2FpdCBnZXRIVE1MRnJvbVF1aWxsKGh0bWxDb250ZW50KTtcbiAgfVxuXG4gIGlmICghY29udGVudFRvSW5zZXJ0KSB7XG4gICAgY29uZmlnLmNhbGxCYWNrPy4oJ25vLWNvbnRlbnQnKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoc2F2ZWRSYW5nZSkge1xuICAgIGluc2VydENvbnRlbnRXaXRoUmFuZ2UoY29udGVudFRvSW5zZXJ0LCBzYXZlZFJhbmdlLCBlbGVtZW50KTtcbiAgICBjb25maWcuY2FsbEJhY2s/LigncmFuZ2UnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgZWxlbWVudC5pbm5lckhUTUwgKz0gY29udGVudFRvSW5zZXJ0O1xuICBjb25maWcuY2FsbEJhY2s/LignY29udGVudCcpO1xufTtcblxuZXhwb3J0IGNvbnN0IGluc2VydENvbnRlbnRXaXRoUmFuZ2UgPSAoY29udGVudDogc3RyaW5nLCBzYXZlZFJhbmdlOiBSYW5nZSwgZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoIXNlbGVjdGlvbikge1xuICAgIC8vIEZhbGxiYWNrOiBhcHBlbmQgdsOgbyBjdeG7kWlcbiAgICBlbGVtZW50LmlubmVySFRNTCArPSBjb250ZW50O1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBSZXN0b3JlIHNlbGVjdGlvblxuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIHNlbGVjdGlvbi5hZGRSYW5nZShzYXZlZFJhbmdlKTtcbiAgLy8gWMOzYSBu4buZaSBkdW5nIMSRw6Mgc2VsZWN0IChu4bq/dSBjw7MpXG4gIHNhdmVkUmFuZ2UuZGVsZXRlQ29udGVudHMoKTtcbiAgLy8gVOG6oW8gZG9jdW1lbnQgZnJhZ21lbnQgdOG7qyBIVE1MIGNvbnRlbnRcbiAgY29uc3QgdGVtcERpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICB0ZW1wRGl2LmlubmVySFRNTCA9IGNvbnRlbnQ7XG4gIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuICB3aGlsZSAodGVtcERpdi5maXJzdENoaWxkKSB7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQodGVtcERpdi5maXJzdENoaWxkKTtcbiAgfVxuICAvLyBJbnNlcnQgZnJhZ21lbnQgdOG6oWkgduG7iyB0csOtIHJhbmdlXG4gIHNhdmVkUmFuZ2UuaW5zZXJ0Tm9kZShmcmFnbWVudCk7XG4gIC8vIERpIGNodXnhu4NuIGN1cnNvciDEkeG6v24gY3Xhu5FpIG7hu5lpIGR1bmcgduG7q2EgaW5zZXJ0XG4gIGlmIChmcmFnbWVudC5sYXN0Q2hpbGQpIHtcbiAgICBzYXZlZFJhbmdlLnNldFN0YXJ0QWZ0ZXIoZnJhZ21lbnQubGFzdENoaWxkKTtcbiAgfVxuICBzYXZlZFJhbmdlLmNvbGxhcHNlKHRydWUpO1xuICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIHNlbGVjdGlvbi5hZGRSYW5nZShzYXZlZFJhbmdlKTtcbn07XG4iXX0=
@@ -0,0 +1,41 @@
1
+ import { convertBase64ToBlob } from './base64';
2
+ export const downloadFileByUrlUseXmlRequest = (fileUrl, filename) => {
3
+ const xmlRequest = new XMLHttpRequest();
4
+ xmlRequest.open('GET', fileUrl, true);
5
+ xmlRequest.responseType = 'blob';
6
+ xmlRequest.onerror = () => {
7
+ const url = window.URL.createObjectURL(xmlRequest.response);
8
+ downloadFileByUrl(url, filename);
9
+ };
10
+ xmlRequest.onload = () => {
11
+ const url = window.URL.createObjectURL(xmlRequest.response);
12
+ downloadFileByUrl(url, filename);
13
+ };
14
+ xmlRequest.send();
15
+ };
16
+ export const downloadFileByUrl = async (fileUrl, filename, onlyOpen) => {
17
+ const downloadFileElement = document.createElement('a');
18
+ if (!onlyOpen) {
19
+ const response = await fetch(fileUrl);
20
+ if (response.ok) {
21
+ const blob = await response.blob();
22
+ fileUrl = URL.createObjectURL(blob);
23
+ }
24
+ }
25
+ downloadFileElement.href = fileUrl;
26
+ downloadFileElement.download = filename;
27
+ downloadFileElement.target = '_blank';
28
+ downloadFileElement.click();
29
+ downloadFileElement.remove();
30
+ };
31
+ export const downloadImageFromELement = (imageElement, typeFileDownload, nameFile) => {
32
+ const parentElement = imageElement?.src;
33
+ const blobData = convertBase64ToBlob(parentElement);
34
+ const blob = new Blob([blobData], { type: typeFileDownload || 'image/png' });
35
+ const url = window.URL.createObjectURL(blob);
36
+ const link = document.createElement('a');
37
+ link.href = url;
38
+ link.download = nameFile || 'barcode';
39
+ link.click();
40
+ };
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG93bmxvYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9kb3dubG9hZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxPQUFlLEVBQUUsUUFBZ0IsRUFBRSxFQUFFO0lBQ2xGLE1BQU0sVUFBVSxHQUFHLElBQUksY0FBYyxFQUFFLENBQUM7SUFFeEMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3RDLFVBQVUsQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLFVBQVUsQ0FBQyxPQUFPLEdBQUcsR0FBRyxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU1RCxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDO0lBQ0YsVUFBVSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDdkIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRTVELGlCQUFpQixDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNuQyxDQUFDLENBQUM7SUFDRixVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDcEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxFQUFFLE9BQWUsRUFBRSxRQUFnQixFQUFFLFFBQWtCLEVBQUUsRUFBRTtJQUMvRixNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxRQUFRLEdBQUcsTUFBTSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFdEMsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDaEIsTUFBTSxJQUFJLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFbkMsT0FBTyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsQ0FBQztJQUNILENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDO0lBQ25DLG1CQUFtQixDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7SUFDeEMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztJQUN0QyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztBQUMvQixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLFlBQThCLEVBQUUsZ0JBQXlCLEVBQUUsUUFBaUIsRUFBRSxFQUFFO0lBQ3ZILE1BQU0sYUFBYSxHQUFHLFlBQVksRUFBRSxHQUFHLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQUcsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsSUFBSSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFekMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7SUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLElBQUksU0FBUyxDQUFDO0lBQ3RDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUNmLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnZlcnRCYXNlNjRUb0Jsb2IgfSBmcm9tICcuL2Jhc2U2NCc7XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEZpbGVCeVVybFVzZVhtbFJlcXVlc3QgPSAoZmlsZVVybDogc3RyaW5nLCBmaWxlbmFtZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHhtbFJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICB4bWxSZXF1ZXN0Lm9wZW4oJ0dFVCcsIGZpbGVVcmwsIHRydWUpO1xuICB4bWxSZXF1ZXN0LnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgeG1sUmVxdWVzdC5vbmVycm9yID0gKCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHhtbFJlcXVlc3QucmVzcG9uc2UpO1xuXG4gICAgZG93bmxvYWRGaWxlQnlVcmwodXJsLCBmaWxlbmFtZSk7XG4gIH07XG4gIHhtbFJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKHhtbFJlcXVlc3QucmVzcG9uc2UpO1xuXG4gICAgZG93bmxvYWRGaWxlQnlVcmwodXJsLCBmaWxlbmFtZSk7XG4gIH07XG4gIHhtbFJlcXVlc3Quc2VuZCgpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRvd25sb2FkRmlsZUJ5VXJsID0gYXN5bmMgKGZpbGVVcmw6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZywgb25seU9wZW4/OiBib29sZWFuKSA9PiB7XG4gIGNvbnN0IGRvd25sb2FkRmlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgaWYgKCFvbmx5T3Blbikge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZmlsZVVybCk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XG5cbiAgICAgIGZpbGVVcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgIH1cbiAgfVxuICBkb3dubG9hZEZpbGVFbGVtZW50LmhyZWYgPSBmaWxlVXJsO1xuICBkb3dubG9hZEZpbGVFbGVtZW50LmRvd25sb2FkID0gZmlsZW5hbWU7XG4gIGRvd25sb2FkRmlsZUVsZW1lbnQudGFyZ2V0ID0gJ19ibGFuayc7XG4gIGRvd25sb2FkRmlsZUVsZW1lbnQuY2xpY2soKTtcbiAgZG93bmxvYWRGaWxlRWxlbWVudC5yZW1vdmUoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZEltYWdlRnJvbUVMZW1lbnQgPSAoaW1hZ2VFbGVtZW50OiBIVE1MSW1hZ2VFbGVtZW50LCB0eXBlRmlsZURvd25sb2FkPzogc3RyaW5nLCBuYW1lRmlsZT86IHN0cmluZykgPT4ge1xuICBjb25zdCBwYXJlbnRFbGVtZW50ID0gaW1hZ2VFbGVtZW50Py5zcmM7XG4gIGNvbnN0IGJsb2JEYXRhID0gY29udmVydEJhc2U2NFRvQmxvYihwYXJlbnRFbGVtZW50KTtcbiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtibG9iRGF0YV0sIHsgdHlwZTogdHlwZUZpbGVEb3dubG9hZCB8fCAnaW1hZ2UvcG5nJyB9KTtcbiAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XG4gIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG5cbiAgbGluay5ocmVmID0gdXJsO1xuICBsaW5rLmRvd25sb2FkID0gbmFtZUZpbGUgfHwgJ2JhcmNvZGUnO1xuICBsaW5rLmNsaWNrKCk7XG59O1xuIl19