@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,90 @@
1
+ import { convertBase64ToBlob } from './base64';
2
+ import { get, set } from './helpers';
3
+ import { uuid } from './uuid';
4
+ export const isTypeImage = (file) => (file.type.match(/image.*/) ? true : false);
5
+ export const isTypeVideo = (file) => (file.type.match(/video.*/) ? true : false);
6
+ export const isTypeAudio = (file) => (file.type.match(/audio.*/) ? true : false);
7
+ export const isTypeFile = (file) => (file instanceof File || Object.prototype.toString.call(file) === '[object File]' ? true : false);
8
+ export const ExcelExtList = ['xls', 'xlsx', 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'];
9
+ export const DocumentExtList = [
10
+ 'doc',
11
+ 'docx',
12
+ 'xls',
13
+ 'xlsx',
14
+ 'ppt',
15
+ 'pptx',
16
+ 'pdf',
17
+ 'json',
18
+ 'xml',
19
+ 'application/msword',
20
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
21
+ 'application/vnd.ms-excel',
22
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
23
+ 'application/vnd.ms-powerpoint',
24
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
25
+ 'application/pdf',
26
+ 'application/json',
27
+ 'application/xml',
28
+ ];
29
+ export const isIncludeDocumentExtList = (ext, listExt = DocumentExtList) => listExt.includes(ext) || listExt.includes(`application/${ext}`);
30
+ export const ImageExtList = ['gif', 'jpg', 'jpeg', 'png', 'image/gif', 'image/jpeg', 'image/jpeg', 'image/png'];
31
+ export const isIncludeImageExtList = (ext, listExt = ImageExtList) => listExt.includes(ext);
32
+ export const VideoExtList = ['mp4', 'mov', 'mpg', 'avi', 'wmv', 'video/mp4', 'video/quicktime', 'video/mpeg', 'video/x-msvideo', 'video/x-ms-wmv'];
33
+ export const isIncludeVideoExtList = (ext, listExt = VideoExtList) => listExt.includes(ext);
34
+ export const AudioExtList = ['mp3', 'wav', 'ogg', 'aac', 'm4a', 'flac', 'wma', 'audio/mpeg', 'audio/wav', 'audio/ogg', 'audio/aac', 'audio/mp4', 'audio/flac', 'audio/x-ms-wma'];
35
+ export const isIncludeAudioExtList = (ext, listExt = AudioExtList) => listExt.includes(ext);
36
+ export const getFileExtension = (file) => {
37
+ if (file instanceof File && file.type) {
38
+ return (file.type.split('/').pop() || '').toLowerCase();
39
+ }
40
+ file = file;
41
+ if (file.mimetype || file.file?.type) {
42
+ return file.mimetype || file.file?.type;
43
+ }
44
+ let fileName = file.name;
45
+ const url = get(file, 'url') || get(file, 'origin_url');
46
+ if (!fileName && !url) {
47
+ return;
48
+ }
49
+ if (!fileName && url) {
50
+ fileName = url.split('/').pop() || '';
51
+ set(file, 'name', fileName);
52
+ }
53
+ const dots = fileName.split('.');
54
+ if (!dots) {
55
+ return;
56
+ }
57
+ return (dots.pop() || '').toLowerCase();
58
+ };
59
+ export const getLabelBySizeFile = (size, toFixed = 2) => {
60
+ if (size < 1024 * 1024) {
61
+ return ` ${(size / 1024).toFixed(toFixed)} KB`;
62
+ }
63
+ return ` ${(size / (1024 * 1024)).toFixed(toFixed)} MB`;
64
+ };
65
+ export const convertBlobToFile = (blob, fileName) => {
66
+ const type = blob.type.split('/')[1];
67
+ const name = fileName ? `${fileName.split('.')[0]}.${type}` : `${uuid()}.${type}`;
68
+ return new File([blob], name, { type: blob.type, lastModified: Date.now() });
69
+ };
70
+ export const convertUrlToFile = (url, fileName) => {
71
+ return new Promise((resolve, reject) => {
72
+ const xhr = new XMLHttpRequest();
73
+ xhr.onload = function () {
74
+ const reader = new FileReader();
75
+ reader.onloadend = () => {
76
+ const file = convertBase64ToBlob(reader.result);
77
+ resolve(convertBlobToFile(file, fileName || Date.now().toLocaleString()));
78
+ };
79
+ reader.onerror = () => resolve(undefined);
80
+ reader.readAsDataURL(xhr.response);
81
+ };
82
+ xhr.onerror = (err) => {
83
+ reject(err);
84
+ };
85
+ xhr.open('GET', url);
86
+ xhr.responseType = 'blob';
87
+ xhr.send();
88
+ });
89
+ };
90
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2ZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFOUIsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBaUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFpQixFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksWUFBWSxJQUFJLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FB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QUUsRUFBRTtZQUNwQixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDZCxDQUFDLENBQUM7UUFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNyQixHQUFHLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztRQUMxQixHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDYixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElGaWxlIH0gZnJvbSAnQGxpYnMtdWkvaW50ZXJmYWNlcy10eXBlcyc7XG5pbXBvcnQgeyBjb252ZXJ0QmFzZTY0VG9CbG9iIH0gZnJvbSAnLi9iYXNlNjQnO1xuaW1wb3J0IHsgZ2V0LCBzZXQgfSBmcm9tICcuL2hlbHBlcnMnO1xuaW1wb3J0IHsgdXVpZCB9IGZyb20gJy4vdXVpZCc7XG5cbmV4cG9ydCBjb25zdCBpc1R5cGVJbWFnZSA9IChmaWxlOiBGaWxlIHwgQmxvYikgPT4gKGZpbGUudHlwZS5tYXRjaCgvaW1hZ2UuKi8pID8gdHJ1ZSA6IGZhbHNlKTtcbmV4cG9ydCBjb25zdCBpc1R5cGVWaWRlbyA9IChmaWxlOiBGaWxlIHwgQmxvYikgPT4gKGZpbGUudHlwZS5tYXRjaCgvdmlkZW8uKi8pID8gdHJ1ZSA6IGZhbHNlKTtcbmV4cG9ydCBjb25zdCBpc1R5cGVBdWRpbyA9IChmaWxlOiBGaWxlIHwgQmxvYikgPT4gKGZpbGUudHlwZS5tYXRjaCgvYXVkaW8uKi8pID8gdHJ1ZSA6IGZhbHNlKTtcbmV4cG9ydCBjb25zdCBpc1R5cGVGaWxlID0gKGZpbGU6IEZpbGUpID0+IChmaWxlIGluc3RhbmNlb2YgRmlsZSB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZmlsZSkgPT09ICdbb2JqZWN0IEZpbGVdJyA/IHRydWUgOiBmYWxzZSk7XG5cbmV4cG9ydCBjb25zdCBFeGNlbEV4dExpc3QgPSBbJ3hscycsICd4bHN4JywgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCddO1xuZXhwb3J0IGNvbnN0IERvY3VtZW50RXh0TGlzdCA9IFtcbiAgJ2RvYycsXG4gICdkb2N4JyxcbiAgJ3hscycsXG4gICd4bHN4JyxcbiAgJ3BwdCcsXG4gICdwcHR4JyxcbiAgJ3BkZicsXG4gICdqc29uJyxcbiAgJ3htbCcsXG4gICdhcHBsaWNhdGlvbi9tc3dvcmQnLFxuICAnYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LndvcmRwcm9jZXNzaW5nbWwuZG9jdW1lbnQnLFxuICAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJyxcbiAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0JyxcbiAgJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JyxcbiAgJ2FwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5wcmVzZW50YXRpb25tbC5wcmVzZW50YXRpb24nLFxuICAnYXBwbGljYXRpb24vcGRmJyxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAnYXBwbGljYXRpb24veG1sJyxcbl07XG5leHBvcnQgY29uc3QgaXNJbmNsdWRlRG9jdW1lbnRFeHRMaXN0ID0gKGV4dDogc3RyaW5nLCBsaXN0RXh0OiBBcnJheTxzdHJpbmc+ID0gRG9jdW1lbnRFeHRMaXN0KSA9PiBsaXN0RXh0LmluY2x1ZGVzKGV4dCkgfHwgbGlzdEV4dC5pbmNsdWRlcyhgYXBwbGljYXRpb24vJHtleHR9YCk7XG5cbmV4cG9ydCBjb25zdCBJbWFnZUV4dExpc3QgPSBbJ2dpZicsICdqcGcnLCAnanBlZycsICdwbmcnLCAnaW1hZ2UvZ2lmJywgJ2ltYWdlL2pwZWcnLCAnaW1hZ2UvanBlZycsICdpbWFnZS9wbmcnXTtcbmV4cG9ydCBjb25zdCBpc0luY2x1ZGVJbWFnZUV4dExpc3QgPSAoZXh0OiBzdHJpbmcsIGxpc3RFeHQ6IEFycmF5PHN0cmluZz4gPSBJbWFnZUV4dExpc3QpID0+IGxpc3RFeHQuaW5jbHVkZXMoZXh0KTtcblxuZXhwb3J0IGNvbnN0IFZpZGVvRXh0TGlzdCA9IFsnbXA0JywgJ21vdicsICdtcGcnLCAnYXZpJywgJ3dtdicsICd2aWRlby9tcDQnLCAndmlkZW8vcXVpY2t0aW1lJywgJ3ZpZGVvL21wZWcnLCAndmlkZW8veC1tc3ZpZGVvJywgJ3ZpZGVvL3gtbXMtd212J107XG5leHBvcnQgY29uc3QgaXNJbmNsdWRlVmlkZW9FeHRMaXN0ID0gKGV4dDogc3RyaW5nLCBsaXN0RXh0OiBBcnJheTxzdHJpbmc+ID0gVmlkZW9FeHRMaXN0KSA9PiBsaXN0RXh0LmluY2x1ZGVzKGV4dCk7XG5leHBvcnQgY29uc3QgQXVkaW9FeHRMaXN0ID0gWydtcDMnLCAnd2F2JywgJ29nZycsICdhYWMnLCAnbTRhJywgJ2ZsYWMnLCAnd21hJywgJ2F1ZGlvL21wZWcnLCAnYXVkaW8vd2F2JywgJ2F1ZGlvL29nZycsICdhdWRpby9hYWMnLCAnYXVkaW8vbXA0JywgJ2F1ZGlvL2ZsYWMnLCAnYXVkaW8veC1tcy13bWEnXTtcbmV4cG9ydCBjb25zdCBpc0luY2x1ZGVBdWRpb0V4dExpc3QgPSAoZXh0OiBzdHJpbmcsIGxpc3RFeHQ6IEFycmF5PHN0cmluZz4gPSBBdWRpb0V4dExpc3QpID0+IGxpc3RFeHQuaW5jbHVkZXMoZXh0KTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVFeHRlbnNpb24gPSAoZmlsZTogSUZpbGUgfCBGaWxlKSA9PiB7XG4gIGlmIChmaWxlIGluc3RhbmNlb2YgRmlsZSAmJiBmaWxlLnR5cGUpIHtcbiAgICByZXR1cm4gKGZpbGUudHlwZS5zcGxpdCgnLycpLnBvcCgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpO1xuICB9XG4gIGZpbGUgPSBmaWxlIGFzIElGaWxlO1xuICBpZiAoZmlsZS5taW1ldHlwZSB8fCBmaWxlLmZpbGU/LnR5cGUpIHtcbiAgICByZXR1cm4gZmlsZS5taW1ldHlwZSB8fCBmaWxlLmZpbGU/LnR5cGU7XG4gIH1cblxuICBsZXQgZmlsZU5hbWUgPSBmaWxlLm5hbWUgYXMgc3RyaW5nO1xuICBjb25zdCB1cmwgPSBnZXQoZmlsZSwgJ3VybCcpIHx8IGdldChmaWxlLCAnb3JpZ2luX3VybCcpO1xuICBpZiAoIWZpbGVOYW1lICYmICF1cmwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFmaWxlTmFtZSAmJiB1cmwpIHtcbiAgICBmaWxlTmFtZSA9IHVybC5zcGxpdCgnLycpLnBvcCgpIHx8ICcnO1xuICAgIHNldChmaWxlLCAnbmFtZScsIGZpbGVOYW1lKTtcbiAgfVxuICBjb25zdCBkb3RzID0gZmlsZU5hbWUuc3BsaXQoJy4nKTtcblxuICBpZiAoIWRvdHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZXR1cm4gKGRvdHMucG9wKCkgfHwgJycpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TGFiZWxCeVNpemVGaWxlID0gKHNpemU6IG51bWJlciwgdG9GaXhlZCA9IDIpID0+IHtcbiAgaWYgKHNpemUgPCAxMDI0ICogMTAyNCkge1xuICAgIHJldHVybiBgICR7KHNpemUgLyAxMDI0KS50b0ZpeGVkKHRvRml4ZWQpfSBLQmA7XG4gIH1cblxuICByZXR1cm4gYCAkeyhzaXplIC8gKDEwMjQgKiAxMDI0KSkudG9GaXhlZCh0b0ZpeGVkKX0gTUJgO1xufTtcblxuZXhwb3J0IGNvbnN0IGNvbnZlcnRCbG9iVG9GaWxlID0gKGJsb2I6IEJsb2IsIGZpbGVOYW1lPzogc3RyaW5nKTogRmlsZSA9PiB7XG4gIGNvbnN0IHR5cGUgPSBibG9iLnR5cGUuc3BsaXQoJy8nKVsxXTtcbiAgY29uc3QgbmFtZSA9IGZpbGVOYW1lID8gYCR7ZmlsZU5hbWUuc3BsaXQoJy4nKVswXX0uJHt0eXBlfWAgOiBgJHt1dWlkKCl9LiR7dHlwZX1gO1xuXG4gIHJldHVybiBuZXcgRmlsZShbYmxvYl0sIG5hbWUsIHsgdHlwZTogYmxvYi50eXBlLCBsYXN0TW9kaWZpZWQ6IERhdGUubm93KCkgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgY29udmVydFVybFRvRmlsZSA9ICh1cmw6IHN0cmluZywgZmlsZU5hbWU/OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPEZpbGUgfCB1bmRlZmluZWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBjb252ZXJ0QmFzZTY0VG9CbG9iKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgcmVzb2x2ZShjb252ZXJ0QmxvYlRvRmlsZShmaWxlLCBmaWxlTmFtZSB8fCBEYXRlLm5vdygpLnRvTG9jYWxlU3RyaW5nKCkpKTtcbiAgICAgIH07XG4gICAgICByZWFkZXIub25lcnJvciA9ICgpID0+IHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIub25lcnJvciA9IChlcnIpID0+IHtcbiAgICAgIHJlamVjdChlcnIpO1xuICAgIH07XG4gICAgeGhyLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdibG9iJztcbiAgICB4aHIuc2VuZCgpO1xuICB9KTtcbn07XG4iXX0=
@@ -0,0 +1,66 @@
1
+ import { UtilsCache } from './cache';
2
+ import { isNil } from './helpers';
3
+ import { UtilsLanguageConstants } from './language';
4
+ export const formatNumber = (value) => {
5
+ const lang = UtilsCache.getLang();
6
+ if (lang === UtilsLanguageConstants.EN) {
7
+ return `${value}`.replace(/[,]/g, '');
8
+ }
9
+ return `${value}`.replace(/[.]/g, '').replace(/[,]/g, '.');
10
+ };
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ export const viewDataNumberByLanguage = (value, acceptNegativeValue, parseFixed = 1, ignoreFormatSeparator = false, ignoreParseFloat = false) => {
13
+ const lang = UtilsCache.getLang();
14
+ if (!`${value}`.trim()) {
15
+ return '';
16
+ }
17
+ if (isNil(value) || (!acceptNegativeValue && +value <= 0)) {
18
+ return 0;
19
+ }
20
+ if (typeof value === 'string' && !ignoreFormatSeparator) {
21
+ value = formatNumber(value);
22
+ }
23
+ const isFloat = value.toString().includes('.');
24
+ const [intStr, floatStr] = value.toString().split('.');
25
+ if (!floatStr?.length) {
26
+ parseFixed = 0;
27
+ }
28
+ const round = (value, parseFixed) => {
29
+ const fixed = Math.pow(10, parseFixed);
30
+ return Math.round(value * fixed) / fixed;
31
+ };
32
+ if (parseFixed > (floatStr?.length || 0)) {
33
+ const maxParseFixed = acceptNegativeValue && +value < 0 ? 17 : 16;
34
+ const fixed = maxParseFixed - (intStr?.length || 0);
35
+ parseFixed = parseFixed < fixed ? parseFixed : fixed;
36
+ }
37
+ if (isFloat && !ignoreParseFloat) {
38
+ value = parseFloat(round(+value, parseFixed).toFixed(parseFixed));
39
+ }
40
+ // Xử lý không format dữ liệu phần thập phân
41
+ const valueString = value.toString();
42
+ const index = valueString.indexOf('.');
43
+ if (index !== -1 && (parseFixed > 3 || ignoreParseFloat)) {
44
+ let decimalPart = valueString.substring(index + 1, valueString.length);
45
+ let int = valueString.substring(0, index + 1);
46
+ if (ignoreParseFloat) {
47
+ decimalPart = decimalPart.substring(0, parseFixed);
48
+ }
49
+ if (lang === UtilsLanguageConstants.EN) {
50
+ int = int.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
51
+ return `${int}${decimalPart}`;
52
+ }
53
+ int = int.replace('.', ',').replace(/\B(?=(\d{3})+(?!\d))/g, '.');
54
+ return `${int}${decimalPart}`;
55
+ }
56
+ if (index === -1 || parseFixed <= 3) {
57
+ if (lang === UtilsLanguageConstants.EN) {
58
+ return value.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',');
59
+ }
60
+ return value
61
+ .toString()
62
+ .replace('.', ',')
63
+ .replace(/\B(?=(\d{3})+(?!\d))/g, '.');
64
+ }
65
+ };
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LW51bWJlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL2Zvcm1hdC1udW1iZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNyQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFzQixFQUFVLEVBQUU7SUFDN0QsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRWxDLElBQUksSUFBSSxLQUFLLHNCQUFzQixDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxPQUFPLEdBQUcsS0FBSyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVGLDhEQUE4RDtBQUM5RCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLEtBQXNCLEVBQUUsbUJBQXdDLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxxQkFBcUIsR0FBRyxLQUFLLEVBQUUsZ0JBQWdCLEdBQUcsS0FBSyxFQUFPLEVBQUU7SUFDekwsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRWxDLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDdkIsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLG1CQUFtQixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUQsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3hELEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0MsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXZELElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDdEIsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUNqQixDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1FBQ2xELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUMsQ0FBQztJQUVGLElBQUksVUFBVSxHQUFHLENBQUMsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLG1CQUFtQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQUcsYUFBYSxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVwRCxVQUFVLEdBQUcsVUFBVSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDdkQsQ0FBQztJQUVELElBQUksT0FBTyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNqQyxLQUFLLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsNENBQTRDO0lBQzVDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXZDLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7UUFDekQsSUFBSSxXQUFXLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN2RSxJQUFJLEdBQUcsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFOUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JCLFdBQVcsR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxJQUFJLEtBQUssc0JBQXNCLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFaEQsT0FBTyxHQUFHLEdBQUcsR0FBRyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQ0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUVsRSxPQUFPLEdBQUcsR0FBRyxHQUFHLFdBQVcsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxDQUFDLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDcEMsSUFBSSxJQUFJLEtBQUssc0JBQXNCLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDdkMsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxPQUFPLEtBQUs7YUFDVCxRQUFRLEVBQUU7YUFDVixPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQzthQUNqQixPQUFPLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFV0aWxzQ2FjaGUgfSBmcm9tICcuL2NhY2hlJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IFV0aWxzTGFuZ3VhZ2VDb25zdGFudHMgfSBmcm9tICcuL2xhbmd1YWdlJztcblxuZXhwb3J0IGNvbnN0IGZvcm1hdE51bWJlciA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgbGFuZyA9IFV0aWxzQ2FjaGUuZ2V0TGFuZygpO1xuXG4gIGlmIChsYW5nID09PSBVdGlsc0xhbmd1YWdlQ29uc3RhbnRzLkVOKSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvWyxdL2csICcnKTtcbiAgfVxuXG4gIHJldHVybiBgJHt2YWx1ZX1gLnJlcGxhY2UoL1suXS9nLCAnJykucmVwbGFjZSgvWyxdL2csICcuJyk7XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNvbnN0IHZpZXdEYXRhTnVtYmVyQnlMYW5ndWFnZSA9ICh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBhY2NlcHROZWdhdGl2ZVZhbHVlOiBib29sZWFuIHwgdW5kZWZpbmVkLCBwYXJzZUZpeGVkID0gMSwgaWdub3JlRm9ybWF0U2VwYXJhdG9yID0gZmFsc2UsIGlnbm9yZVBhcnNlRmxvYXQgPSBmYWxzZSk6IGFueSA9PiB7XG4gIGNvbnN0IGxhbmcgPSBVdGlsc0NhY2hlLmdldExhbmcoKTtcblxuICBpZiAoIWAke3ZhbHVlfWAudHJpbSgpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGlmIChpc05pbCh2YWx1ZSkgfHwgKCFhY2NlcHROZWdhdGl2ZVZhbHVlICYmICt2YWx1ZSA8PSAwKSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFpZ25vcmVGb3JtYXRTZXBhcmF0b3IpIHtcbiAgICB2YWx1ZSA9IGZvcm1hdE51bWJlcih2YWx1ZSk7XG4gIH1cblxuICBjb25zdCBpc0Zsb2F0ID0gdmFsdWUudG9TdHJpbmcoKS5pbmNsdWRlcygnLicpO1xuICBjb25zdCBbaW50U3RyLCBmbG9hdFN0cl0gPSB2YWx1ZS50b1N0cmluZygpLnNwbGl0KCcuJyk7XG5cbiAgaWYgKCFmbG9hdFN0cj8ubGVuZ3RoKSB7XG4gICAgcGFyc2VGaXhlZCA9IDA7XG4gIH1cbiAgY29uc3Qgcm91bmQgPSAodmFsdWU6IG51bWJlciwgcGFyc2VGaXhlZDogbnVtYmVyKSA9PiB7XG4gICAgY29uc3QgZml4ZWQgPSBNYXRoLnBvdygxMCwgcGFyc2VGaXhlZCk7XG5cbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIGZpeGVkKSAvIGZpeGVkO1xuICB9O1xuXG4gIGlmIChwYXJzZUZpeGVkID4gKGZsb2F0U3RyPy5sZW5ndGggfHwgMCkpIHtcbiAgICBjb25zdCBtYXhQYXJzZUZpeGVkID0gYWNjZXB0TmVnYXRpdmVWYWx1ZSAmJiArdmFsdWUgPCAwID8gMTcgOiAxNjtcbiAgICBjb25zdCBmaXhlZCA9IG1heFBhcnNlRml4ZWQgLSAoaW50U3RyPy5sZW5ndGggfHwgMCk7XG5cbiAgICBwYXJzZUZpeGVkID0gcGFyc2VGaXhlZCA8IGZpeGVkID8gcGFyc2VGaXhlZCA6IGZpeGVkO1xuICB9XG5cbiAgaWYgKGlzRmxvYXQgJiYgIWlnbm9yZVBhcnNlRmxvYXQpIHtcbiAgICB2YWx1ZSA9IHBhcnNlRmxvYXQocm91bmQoK3ZhbHVlLCBwYXJzZUZpeGVkKS50b0ZpeGVkKHBhcnNlRml4ZWQpKTtcbiAgfVxuXG4gIC8vIFjhu60gbMO9IGtow7RuZyBmb3JtYXQgZOG7ryBsaeG7h3UgcGjhuqduIHRo4bqtcCBwaMOiblxuICBjb25zdCB2YWx1ZVN0cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gIGNvbnN0IGluZGV4ID0gdmFsdWVTdHJpbmcuaW5kZXhPZignLicpO1xuXG4gIGlmIChpbmRleCAhPT0gLTEgJiYgKHBhcnNlRml4ZWQgPiAzIHx8IGlnbm9yZVBhcnNlRmxvYXQpKSB7XG4gICAgbGV0IGRlY2ltYWxQYXJ0ID0gdmFsdWVTdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgMSwgdmFsdWVTdHJpbmcubGVuZ3RoKTtcbiAgICBsZXQgaW50ID0gdmFsdWVTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7XG5cbiAgICBpZiAoaWdub3JlUGFyc2VGbG9hdCkge1xuICAgICAgZGVjaW1hbFBhcnQgPSBkZWNpbWFsUGFydC5zdWJzdHJpbmcoMCwgcGFyc2VGaXhlZCk7XG4gICAgfVxuICAgIGlmIChsYW5nID09PSBVdGlsc0xhbmd1YWdlQ29uc3RhbnRzLkVOKSB7XG4gICAgICBpbnQgPSBpbnQucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKTtcblxuICAgICAgcmV0dXJuIGAke2ludH0ke2RlY2ltYWxQYXJ0fWA7XG4gICAgfVxuICAgIGludCA9IGludC5yZXBsYWNlKCcuJywgJywnKS5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLicpO1xuXG4gICAgcmV0dXJuIGAke2ludH0ke2RlY2ltYWxQYXJ0fWA7XG4gIH1cbiAgaWYgKGluZGV4ID09PSAtMSB8fCBwYXJzZUZpeGVkIDw9IDMpIHtcbiAgICBpZiAobGFuZyA9PT0gVXRpbHNMYW5ndWFnZUNvbnN0YW50cy5FTikge1xuICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxCKD89KFxcZHszfSkrKD8hXFxkKSkvZywgJywnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgICAgIC50b1N0cmluZygpXG4gICAgICAucmVwbGFjZSgnLicsICcsJylcbiAgICAgIC5yZXBsYWNlKC9cXEIoPz0oXFxkezN9KSsoPyFcXGQpKS9nLCAnLicpO1xuICB9XG59O1xuIl19
@@ -0,0 +1,149 @@
1
+ import { CHARACTER_DATA_EMPTY } from './constants';
2
+ import { patternEmoji } from './pattern';
3
+ export const highlightByKeyword = (value, search, ignoreHighlight, classHightLight) => {
4
+ if (!value) {
5
+ return CHARACTER_DATA_EMPTY;
6
+ }
7
+ try {
8
+ if (!search || ignoreHighlight) {
9
+ return value;
10
+ }
11
+ const keysReplace = getValueReplace(search, value);
12
+ if (!keysReplace || !keysReplace.length) {
13
+ return value;
14
+ }
15
+ if (!classHightLight) {
16
+ classHightLight = 'bg-[#19344a] text-white';
17
+ }
18
+ keysReplace.forEach((key) => {
19
+ const regExp = new RegExp(key, 'gi');
20
+ value = value?.replace(regExp, `<span class="${classHightLight}">$&</span>`);
21
+ });
22
+ }
23
+ catch (error) {
24
+ console.log(error);
25
+ }
26
+ finally {
27
+ // eslint-disable-next-line no-unsafe-finally
28
+ return value;
29
+ }
30
+ };
31
+ const getValueReplace = (search, value) => {
32
+ const searchConvert = deleteUnicode(search).toLowerCase();
33
+ const valueConvert = deleteUnicode(value).toLowerCase();
34
+ const keys = new Set();
35
+ let i = 0;
36
+ while ((i = valueConvert.indexOf(searchConvert, i)) >= 0) {
37
+ const endIndex = i + search.length;
38
+ keys.add(value.substring(i, endIndex));
39
+ i += +valueConvert.length;
40
+ }
41
+ return Array.from(keys);
42
+ };
43
+ export const formatTextCompare = (text, options) => {
44
+ if (!text) {
45
+ return text;
46
+ }
47
+ text = text.normalize('NFC');
48
+ return formatByOptions(text, options);
49
+ };
50
+ export const fullNameFormat = (value) => {
51
+ if (!value) {
52
+ return value;
53
+ }
54
+ return capitalize(value, { lowercaseOtherCharacter: true, trim: true, removeMultipleSpace: true, removeEmoji: true });
55
+ };
56
+ export const capitalize = (text, options) => {
57
+ if (!text) {
58
+ return text;
59
+ }
60
+ text = formatByOptions(text, options);
61
+ return text
62
+ .split(' ')
63
+ .map((word) => firstLetterToUpperCase(word))
64
+ .join(' ');
65
+ };
66
+ export const firstLetterToUpperCase = (text, options) => {
67
+ if (!text) {
68
+ return text;
69
+ }
70
+ return uppercaseByPosition(text, 0, options);
71
+ };
72
+ export const uppercaseByPosition = (text, position, options) => {
73
+ if (!text) {
74
+ return text;
75
+ }
76
+ text = formatByOptions(text, options);
77
+ return `${text.substring(0, position)}${text.charAt(position).toUpperCase()}${text.substring(position + 1)}`;
78
+ };
79
+ const formatByOptions = (text, options) => {
80
+ if (!text || !options) {
81
+ return text;
82
+ }
83
+ if (options?.uppercaseOtherCharacter) {
84
+ text = text.toUpperCase();
85
+ }
86
+ if (options?.lowercaseOtherCharacter) {
87
+ text = text.toLowerCase();
88
+ }
89
+ if (options?.removeMultipleSpace) {
90
+ text = text.replace(/\u200B|\u00A0/g, '');
91
+ text = text.replace(/\s+/g, ' ');
92
+ }
93
+ if (options?.removeEmoji) {
94
+ text = removeEmoji(text);
95
+ }
96
+ if (options?.removeUnicode) {
97
+ text = deleteUnicode(text);
98
+ }
99
+ if (options?.trim) {
100
+ text = text.trim();
101
+ }
102
+ return text;
103
+ };
104
+ export const escapeHtml = (str) => {
105
+ if (!str || typeof str !== 'string') {
106
+ return str;
107
+ }
108
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');
109
+ };
110
+ export const decodeEscapeHtml = (str) => {
111
+ const htmlTag = document.createElement('textarea');
112
+ htmlTag.innerHTML = str;
113
+ while (str) {
114
+ if (str === htmlTag.value) {
115
+ str = htmlTag.value;
116
+ htmlTag.remove();
117
+ break;
118
+ }
119
+ str = htmlTag.value;
120
+ htmlTag.innerHTML = str;
121
+ }
122
+ return str;
123
+ };
124
+ export const deleteUnicode = (str) => {
125
+ str = str.replace(/à|á|ạ|ả|ã|â|ầ|ấ|ậ|ẩ|ẫ|ă|ằ|ắ|ặ|ẳ|ẵ/g, 'a');
126
+ str = str.replace(/è|é|ẹ|ẻ|ẽ|ê|ề|ế|ệ|ể|ễ|ễ/g, 'e');
127
+ str = str.replace(/ì|í|ị|ỉ|ĩ/g, 'i');
128
+ str = str.replace(/ò|ó|ọ|ỏ|õ|ô|ồ|ố|ộ|ổ|ỗ|ơ|ờ|ớ|ợ|ở|ỡ/g, 'o');
129
+ str = str.replace(/ù|ú|ụ|ủ|ũ|ư|ừ|ứ|ự|ử|ữ/g, 'u');
130
+ str = str.replace(/ỳ|ý|ỵ|ỷ|ỹ/g, 'y');
131
+ str = str.replace(/đ/g, 'd');
132
+ str = str.replace(/À|Á|Ạ|Ả|Ã|Â|Ầ|Ấ|Ậ|Ẩ|Ẫ|Ă|Ằ|Ắ|Ặ|Ẳ|Ẵ/g, 'A');
133
+ str = str.replace(/È|É|Ẹ|Ẻ|Ẽ|Ê|Ề|Ế|Ệ|Ể|Ễ/g, 'E');
134
+ str = str.replace(/Ì|Í|Ị|Ỉ|Ĩ/g, 'I');
135
+ str = str.replace(/Ò|Ó|Ọ|Ỏ|Õ|Ô|Ồ|Ố|Ộ|Ổ|Ỗ|Ơ|Ờ|Ớ|Ợ|Ở|Ỡ/g, 'O');
136
+ str = str.replace(/Ù|Ú|Ụ|Ủ|Ũ|Ư|Ừ|Ứ|Ự|Ử|Ữ/g, 'U');
137
+ str = str.replace(/Ỳ|Ý|Ỵ|Ỷ|Ỹ/g, 'Y');
138
+ str = str.replace(/Đ/g, 'D');
139
+ str = str.replace(/\u0300|\u0301|\u0303|\u0309|\u0323/g, ''); // ̀ ́ ̃ ̉ ̣ huyền, sắc, ngã, hỏi, nặng
140
+ str = str.replace(/\u02C6|\u0306|\u031B/g, ''); // ˆ ̆ ̛ Â, Ê, Ă, Ơ, Ư
141
+ return str.normalize('NFC');
142
+ };
143
+ export const removeEmoji = (text) => {
144
+ if (!text || !text.trim()) {
145
+ return text;
146
+ }
147
+ return text.replace(patternEmoji(), '');
148
+ };
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybWF0LXRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9mb3JtYXQtdGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDbkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLEtBQXlCLEVBQUUsTUFBMEIsRUFBRSxlQUF5QixFQUFFLGVBQXdCLEVBQUUsRUFBRTtJQUMvSSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDWCxPQUFPLG9CQUFvQixDQUFDO0lBQzlCLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxJQUFJLGVBQWUsRUFBRSxDQUFDO1lBQy9CLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELE1BQU0sV0FBVyxHQUFrQixlQUFlLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRWxFLElBQUksQ0FBQyxXQUFXLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDeEMsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLGVBQWUsR0FBRyx5QkFBeUIsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUVyQyxLQUFLLEdBQUcsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLGVBQWUsYUFBYSxDQUFDLENBQUM7UUFDL0UsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FB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T0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUU3QixHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxxQ0FBcUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztJQUN0RyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyx1QkFBdUIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLHVCQUF1QjtJQUV2RSxPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUU7SUFDMUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVGV4dEZvcm1hdE9wdGlvbnMgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IENIQVJBQ1RFUl9EQVRBX0VNUFRZIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgcGF0dGVybkVtb2ppIH0gZnJvbSAnLi9wYXR0ZXJuJztcblxuZXhwb3J0IGNvbnN0IGhpZ2hsaWdodEJ5S2V5d29yZCA9ICh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBzZWFyY2g6IHN0cmluZyB8IHVuZGVmaW5lZCwgaWdub3JlSGlnaGxpZ2h0PzogYm9vbGVhbiwgY2xhc3NIaWdodExpZ2h0Pzogc3RyaW5nKSA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gQ0hBUkFDVEVSX0RBVEFfRU1QVFk7XG4gIH1cbiAgdHJ5IHtcbiAgICBpZiAoIXNlYXJjaCB8fCBpZ25vcmVIaWdobGlnaHQpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3Qga2V5c1JlcGxhY2U6IEFycmF5PHN0cmluZz4gPSBnZXRWYWx1ZVJlcGxhY2Uoc2VhcmNoLCB2YWx1ZSk7XG5cbiAgICBpZiAoIWtleXNSZXBsYWNlIHx8ICFrZXlzUmVwbGFjZS5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKCFjbGFzc0hpZ2h0TGlnaHQpIHtcbiAgICAgIGNsYXNzSGlnaHRMaWdodCA9ICdiZy1bIzE5MzQ0YV0gdGV4dC13aGl0ZSc7XG4gICAgfVxuICAgIGtleXNSZXBsYWNlLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgcmVnRXhwID0gbmV3IFJlZ0V4cChrZXksICdnaScpO1xuXG4gICAgICB2YWx1ZSA9IHZhbHVlPy5yZXBsYWNlKHJlZ0V4cCwgYDxzcGFuIGNsYXNzPVwiJHtjbGFzc0hpZ2h0TGlnaHR9XCI+JCY8L3NwYW4+YCk7XG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpO1xuICB9IGZpbmFsbHkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnNhZmUtZmluYWxseVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxufTtcblxuY29uc3QgZ2V0VmFsdWVSZXBsYWNlID0gKHNlYXJjaDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nW10gPT4ge1xuICBjb25zdCBzZWFyY2hDb252ZXJ0ID0gZGVsZXRlVW5pY29kZShzZWFyY2gpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IHZhbHVlQ29udmVydCA9IGRlbGV0ZVVuaWNvZGUodmFsdWUpLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGtleXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBsZXQgaSA9IDA7XG5cbiAgd2hpbGUgKChpID0gdmFsdWVDb252ZXJ0LmluZGV4T2Yoc2VhcmNoQ29udmVydCwgaSkpID49IDApIHtcbiAgICBjb25zdCBlbmRJbmRleCA9IGkgKyBzZWFyY2gubGVuZ3RoO1xuXG4gICAga2V5cy5hZGQodmFsdWUuc3Vic3RyaW5nKGksIGVuZEluZGV4KSk7XG4gICAgaSArPSArdmFsdWVDb252ZXJ0Lmxlbmd0aDtcbiAgfVxuXG4gIHJldHVybiBBcnJheS5mcm9tKGtleXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdFRleHRDb21wYXJlID0gKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IElUZXh0Rm9ybWF0T3B0aW9ucykgPT4ge1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSB0ZXh0Lm5vcm1hbGl6ZSgnTkZDJyk7XG5cbiAgcmV0dXJuIGZvcm1hdEJ5T3B0aW9ucyh0ZXh0LCBvcHRpb25zKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmdWxsTmFtZUZvcm1hdCA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNhcGl0YWxpemUodmFsdWUsIHsgbG93ZXJjYXNlT3RoZXJDaGFyYWN0ZXI6IHRydWUsIHRyaW06IHRydWUsIHJlbW92ZU11bHRpcGxlU3BhY2U6IHRydWUsIHJlbW92ZUVtb2ppOiB0cnVlIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemUgPSAodGV4dDogc3RyaW5nLCBvcHRpb25zPzogSVRleHRGb3JtYXRPcHRpb25zKSA9PiB7XG4gIGlmICghdGV4dCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG4gIHRleHQgPSBmb3JtYXRCeU9wdGlvbnModGV4dCwgb3B0aW9ucyk7XG4gIHJldHVybiB0ZXh0XG4gICAgLnNwbGl0KCcgJylcbiAgICAubWFwKCh3b3JkKSA9PiBmaXJzdExldHRlclRvVXBwZXJDYXNlKHdvcmQpKVxuICAgIC5qb2luKCcgJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZmlyc3RMZXR0ZXJUb1VwcGVyQ2FzZSA9ICh0ZXh0OiBzdHJpbmcsIG9wdGlvbnM/OiBJVGV4dEZvcm1hdE9wdGlvbnMpID0+IHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgcmV0dXJuIHVwcGVyY2FzZUJ5UG9zaXRpb24odGV4dCwgMCwgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBwZXJjYXNlQnlQb3NpdGlvbiA9ICh0ZXh0OiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIsIG9wdGlvbnM/OiBJVGV4dEZvcm1hdE9wdGlvbnMpID0+IHtcbiAgaWYgKCF0ZXh0KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cbiAgdGV4dCA9IGZvcm1hdEJ5T3B0aW9ucyh0ZXh0LCBvcHRpb25zKTtcbiAgcmV0dXJuIGAke3RleHQuc3Vic3RyaW5nKDAsIHBvc2l0aW9uKX0ke3RleHQuY2hhckF0KHBvc2l0aW9uKS50b1VwcGVyQ2FzZSgpfSR7dGV4dC5zdWJzdHJpbmcocG9zaXRpb24gKyAxKX1gO1xufTtcblxuY29uc3QgZm9ybWF0QnlPcHRpb25zID0gKHRleHQ6IHN0cmluZywgb3B0aW9ucz86IElUZXh0Rm9ybWF0T3B0aW9ucykgPT4ge1xuICBpZiAoIXRleHQgfHwgIW9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuICBpZiAob3B0aW9ucz8udXBwZXJjYXNlT3RoZXJDaGFyYWN0ZXIpIHtcbiAgICB0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/Lmxvd2VyY2FzZU90aGVyQ2hhcmFjdGVyKSB7XG4gICAgdGV4dCA9IHRleHQudG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIGlmIChvcHRpb25zPy5yZW1vdmVNdWx0aXBsZVNwYWNlKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFx1MjAwQnxcXHUwMEEwL2csICcnKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHMrL2csICcgJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucmVtb3ZlRW1vamkpIHtcbiAgICB0ZXh0ID0gcmVtb3ZlRW1vamkodGV4dCk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8ucmVtb3ZlVW5pY29kZSkge1xuICAgIHRleHQgPSBkZWxldGVVbmljb2RlKHRleHQpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/LnRyaW0pIHtcbiAgICB0ZXh0ID0gdGV4dC50cmltKCk7XG4gIH1cblxuICByZXR1cm4gdGV4dDtcbn07XG5cbmV4cG9ydCBjb25zdCBlc2NhcGVIdG1sID0gKHN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgaWYgKCFzdHIgfHwgdHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8mL2csICcmYW1wOycpLnJlcGxhY2UoLzwvZywgJyZsdDsnKS5yZXBsYWNlKC8+L2csICcmZ3Q7JykucmVwbGFjZSgvXCIvZywgJyZxdW90OycpLnJlcGxhY2UoLycvZywgJyYjMDM5OycpO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlY29kZUVzY2FwZUh0bWwgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBodG1sVGFnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcblxuICBodG1sVGFnLmlubmVySFRNTCA9IHN0cjtcbiAgd2hpbGUgKHN0cikge1xuICAgIGlmIChzdHIgPT09IGh0bWxUYWcudmFsdWUpIHtcbiAgICAgIHN0ciA9IGh0bWxUYWcudmFsdWU7XG4gICAgICBodG1sVGFnLnJlbW92ZSgpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHN0ciA9IGh0bWxUYWcudmFsdWU7XG4gICAgaHRtbFRhZy5pbm5lckhUTUwgPSBzdHI7XG4gIH1cblxuICByZXR1cm4gc3RyO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlbGV0ZVVuaWNvZGUgPSAoc3RyOiBzdHJpbmcpID0+IHtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OgfMOhfOG6oXzhuqN8w6N8w6J84bqnfOG6pXzhuq184bqpfOG6q3zEg3zhurF84bqvfOG6t3zhurN84bq1L2csICdhJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DqHzDqXzhurl84bq7fOG6vXzDqnzhu4F84bq/fOG7h3zhu4N8w6rMg3zhu4UvZywgJ2UnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OsfMOtfOG7i3zhu4l8xKkvZywgJ2knKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OyfMOzfOG7jXzhu498w7V8w7R84buTfOG7kXzhu5l84buVfOG7l3zGoXzhu5184bubfOG7o3zhu5984buhL2csICdvJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DuXzDunzhu6V84bunfMWpfMawfOG7q3zhu6l84buxfOG7rXzhu68vZywgJ3UnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL+G7s3zDvXzhu7V84bu3fOG7uS9nLCAneScpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvxJEvZywgJ2QnKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8OAfMOBfOG6oHzhuqJ8w4N8w4J84bqmfOG6pHzhuqx84bqofOG6qnzEgnzhurB84bqufOG6tnzhurJ84bq0L2csICdBJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DiHzDiXzhurh84bq6fOG6vHzDinzhu4B84bq+fOG7hnzhu4J84buEL2csICdFJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DjHzDjXzhu4p84buIfMSoL2csICdJJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/DknzDk3zhu4x84buOfMOVfMOUfOG7knzhu5B84buYfOG7lHzhu5Z8xqB84bucfOG7mnzhu6J84buefOG7oC9nLCAnTycpO1xuICBzdHIgPSBzdHIucmVwbGFjZSgvw5l8w5p84bukfOG7pnzFqHzGr3zhu6p84buofOG7sHzhu6x84buuL2csICdVJyk7XG4gIHN0ciA9IHN0ci5yZXBsYWNlKC/hu7J8w5184bu0fOG7tnzhu7gvZywgJ1knKTtcbiAgc3RyID0gc3RyLnJlcGxhY2UoL8SQL2csICdEJyk7XG5cbiAgc3RyID0gc3RyLnJlcGxhY2UoL1xcdTAzMDB8XFx1MDMwMXxcXHUwMzAzfFxcdTAzMDl8XFx1MDMyMy9nLCAnJyk7IC8vIMyAIMyBIMyDIMyJIMyjICBodXnhu4FuLCBz4bqvYywgbmfDoywgaOG7j2ksIG7hurduZ1xuICBzdHIgPSBzdHIucmVwbGFjZSgvXFx1MDJDNnxcXHUwMzA2fFxcdTAzMUIvZywgJycpOyAvLyDLhiDMhiDMmyAgw4IsIMOKLCDEgiwgxqAsIMavXG5cbiAgcmV0dXJuIHN0ci5ub3JtYWxpemUoJ05GQycpO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZUVtb2ppID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICBpZiAoIXRleHQgfHwgIXRleHQudHJpbSgpKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICByZXR1cm4gdGV4dC5yZXBsYWNlKHBhdHRlcm5FbW9qaSgpLCAnJyk7XG59O1xuIl19
@@ -0,0 +1,10 @@
1
+ let functionCheck = () => {
2
+ return window.parent !== window.top;
3
+ };
4
+ export const updateFunctionCheckEmbedFrame = (functionCustom) => {
5
+ functionCheck = functionCustom;
6
+ };
7
+ export const isEmbedFrame = () => {
8
+ return functionCheck();
9
+ };
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY2hlY2stZW1iZWQtZnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9mdW5jdGlvbi1jaGVjay1lbWJlZC1mcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxJQUFJLGFBQWEsR0FBRyxHQUFHLEVBQUU7SUFDdkIsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxHQUFHLENBQUM7QUFDdEMsQ0FBQyxDQUFDO0FBQ0YsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsQ0FBQyxjQUE2QixFQUFFLEVBQUU7SUFDN0UsYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNqQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsR0FBWSxFQUFFO0lBQ3hDLE9BQU8sYUFBYSxFQUFFLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsibGV0IGZ1bmN0aW9uQ2hlY2sgPSAoKSA9PiB7XG4gIHJldHVybiB3aW5kb3cucGFyZW50ICE9PSB3aW5kb3cudG9wO1xufTtcbmV4cG9ydCBjb25zdCB1cGRhdGVGdW5jdGlvbkNoZWNrRW1iZWRGcmFtZSA9IChmdW5jdGlvbkN1c3RvbTogKCkgPT4gYm9vbGVhbikgPT4ge1xuICBmdW5jdGlvbkNoZWNrID0gZnVuY3Rpb25DdXN0b207XG59O1xuXG5leHBvcnQgY29uc3QgaXNFbWJlZEZyYW1lID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZnVuY3Rpb25DaGVjaygpO1xufTtcbiJdfQ==
@@ -0,0 +1,174 @@
1
+ import { isNil } from './helpers';
2
+ const DEFAULT_MIN_TICK_COUNT = 5;
3
+ const DEFAULT_MAX_TICK_COUNT = 10;
4
+ const MIN_DISTANCE_TO_ZERO = 3;
5
+ const NEGATIVE_THRESHOLD = -5;
6
+ const FALLBACK_NEGATIVE_VALUE = -4;
7
+ const MAX_POW_NUMBER = 14;
8
+ const MAX_TEMPLATE_NUMBER = 10;
9
+ /**
10
+ * Tính toán smart axis scale cho biểu đồ
11
+ *
12
+ * @param maxData - Giá trị tối đa của dữ liệu
13
+ * @param options - Các tùy chọn cấu hình axis scale
14
+ * @returns Cấu hình axis scale bao gồm stepSize, max, min, tickAmount
15
+ *
16
+ * @throws {Error} INVALID_NEGATIVE_DATA - khi maxData < 0 mà acceptNegative = false
17
+ * @throws {Error} MISSING_MIN_NEGATIVE - khi acceptNegative = true nhưng thiếu minNegative
18
+ * @throws {Error} INVALID_RANGE - khi maxData < minNegative
19
+ * @throws {Error} INVALID_MIN_NEGATIVE - khi minNegative >= 0
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * const result = getSmartAxisScale(100, { minTickCount: 5, maxTickCount: 10 });
24
+ * // returns { stepSize: 20, max: 120, min: 0, tickAmount: 6 }
25
+ * ```
26
+ */
27
+ export const getSmartAxisScale = (originalMaxData, options) => {
28
+ let maxData = originalMaxData;
29
+ validateInputs(maxData, options);
30
+ const minTickCount = options?.minTickCount || DEFAULT_MIN_TICK_COUNT;
31
+ const maxTickCount = options?.maxTickCount || DEFAULT_MAX_TICK_COUNT;
32
+ let scaleDirection = 1;
33
+ let rangeDistance = maxData;
34
+ if (options?.acceptNegative && !isNil(options.minNegative)) {
35
+ if (maxData === 0) {
36
+ maxData = -1;
37
+ }
38
+ if (maxData <= 0) {
39
+ rangeDistance = options.minNegative;
40
+ }
41
+ if (rangeDistance > NEGATIVE_THRESHOLD) {
42
+ rangeDistance = FALLBACK_NEGATIVE_VALUE;
43
+ }
44
+ if (maxData > 0) {
45
+ rangeDistance = maxData + Math.abs(options.minNegative);
46
+ scaleDirection = -1;
47
+ }
48
+ }
49
+ if (Math.abs(rangeDistance) < MIN_DISTANCE_TO_ZERO) {
50
+ rangeDistance = MIN_DISTANCE_TO_ZERO;
51
+ }
52
+ const stepCandidates = getStepCandidates(maxData, minTickCount, options?.minNegative || 0, options?.acceptStepIsTypeFloat, options?.stepCandidates, options?.acceptNegative);
53
+ for (const step of stepCandidates) {
54
+ let tickCount = Math.abs(Math.ceil(rangeDistance / step)) + (scaleDirection === -1 ? 2 : 1);
55
+ let maxValue = maxData <= 0 ? 0 : step * tickCount * scaleDirection;
56
+ let minValue = 0;
57
+ if (tickCount >= minTickCount && tickCount <= maxTickCount) {
58
+ if (maxData < maxValue) {
59
+ if (options?.acceptNegative) {
60
+ let tick = 1;
61
+ while (!isNil(options.minNegative) && tick <= tickCount && minValue >= options.minNegative) {
62
+ minValue = tick * step;
63
+ tick++;
64
+ }
65
+ }
66
+ const maxValuePositive = maxValue - Math.abs(minValue);
67
+ tickCount = maxValuePositive - originalMaxData > Math.abs(step) && tickCount - 1 >= minTickCount ? tickCount - 1 : tickCount;
68
+ maxValue = step * tickCount * scaleDirection - minValue * scaleDirection;
69
+ return {
70
+ stepSize: Math.abs(step),
71
+ max: maxValue,
72
+ min: minValue,
73
+ tickAmount: tickCount,
74
+ };
75
+ }
76
+ }
77
+ }
78
+ let step = Math.ceil(rangeDistance / minTickCount) || 1;
79
+ let maxValue = step * minTickCount;
80
+ if (rangeDistance === maxValue) {
81
+ step = step + Math.ceil(step / 10);
82
+ maxValue = step * minTickCount;
83
+ }
84
+ return {
85
+ stepSize: Math.abs(step),
86
+ max: maxValue,
87
+ min: 0,
88
+ tickAmount: minTickCount,
89
+ };
90
+ };
91
+ // Cache cho các giá trị lũy thừa 10 để tối ưu hiệu suất
92
+ const POWER_CACHE = new Map();
93
+ /**
94
+ * Tạo danh sách các step candidates cho việc tính toán scale
95
+ * @param maxData - Giá trị dữ liệu tối đa
96
+ * @param minStep - Số bước tối thiểu
97
+ * @param minNegative - Giá trị âm tối thiểu
98
+ * @param acceptStepIsTypeFloat - Có chấp nhận step thập phân không
99
+ * @param stepCandidatesByOptions - Step candidates do người dùng cung cấp
100
+ * @param includeNegativeSteps - Có bao gồm các step âm không
101
+ * @returns Danh sách các step candidates
102
+ */
103
+ const getStepCandidates = (maxData, minStep, minNegative, acceptStepIsTypeFloat = false, stepCandidatesByOptions, includeNegativeSteps = false) => {
104
+ // Nếu có step candidates tùy chỉnh, sử dụng chúng
105
+ if (stepCandidatesByOptions && stepCandidatesByOptions.length > 0) {
106
+ return stepCandidatesByOptions;
107
+ }
108
+ const stepCandidates = new Array();
109
+ const maxValueStep = Math.abs(Math.max(maxData, Math.abs(minNegative || 0))) / minStep;
110
+ // Tạo step candidates dựa trên lũy thừa của 10
111
+ for (let powNumber = 0; powNumber <= MAX_POW_NUMBER; powNumber++) {
112
+ // Sử dụng cache để tối ưu hiệu suất
113
+ if (!POWER_CACHE.has(powNumber)) {
114
+ POWER_CACHE.set(powNumber, Math.pow(10, powNumber));
115
+ }
116
+ const powValue = POWER_CACHE.get(powNumber);
117
+ for (let templateNumber = 1; templateNumber < MAX_TEMPLATE_NUMBER; templateNumber++) {
118
+ // Thêm step thập phân nếu được chấp nhận
119
+ if (acceptStepIsTypeFloat) {
120
+ const step = powValue * (((templateNumber - 1) * 2 + 1) / 2);
121
+ stepCandidates.push(step);
122
+ }
123
+ const step = powValue * templateNumber;
124
+ stepCandidates.push(step);
125
+ // Dừng khi step đã đủ lớn
126
+ if (step >= maxValueStep) {
127
+ checkAndSetNegativeSteps(stepCandidates, includeNegativeSteps, minNegative);
128
+ return stepCandidates;
129
+ }
130
+ }
131
+ }
132
+ checkAndSetNegativeSteps(stepCandidates, includeNegativeSteps, minNegative);
133
+ return stepCandidates;
134
+ };
135
+ /**
136
+ * Kiểm tra và thêm các step âm vào danh sách candidates nếu cần
137
+ * @param stepCandidates - Danh sách step candidates hiện tại
138
+ * @param acceptNegative - Có chấp nhận giá trị âm không
139
+ * @param minNegative - Giá trị âm tối thiểu
140
+ */
141
+ const checkAndSetNegativeSteps = (stepCandidates, acceptNegative, minNegative) => {
142
+ if (acceptNegative && minNegative < 0) {
143
+ // Tạo các step âm và thêm vào đầu danh sách
144
+ const negativeSteps = [...stepCandidates].map((step) => -step);
145
+ stepCandidates.unshift(...negativeSteps);
146
+ }
147
+ };
148
+ /**
149
+ * Kiểm tra tính hợp lệ của các tham số đầu vào
150
+ * @param maxData - Giá trị dữ liệu tối đa
151
+ * @param options - Các tùy chọn cấu hình
152
+ * @throws {Error} Khi các tham số không hợp lệ
153
+ */
154
+ const validateInputs = (maxData, options) => {
155
+ // Kiểm tra maxData âm khi không chấp nhận giá trị âm
156
+ if (maxData < 0 && !options?.acceptNegative) {
157
+ throw new Error('maxData is less than 0 and acceptNegative is false');
158
+ }
159
+ if (options?.acceptNegative) {
160
+ // Kiểm tra minNegative có được cung cấp không
161
+ if (isNil(options.minNegative)) {
162
+ throw new Error('minNegative is required when acceptNegative is true');
163
+ }
164
+ // Kiểm tra maxData phải >= minNegative
165
+ if (maxData < options.minNegative) {
166
+ throw new Error('maxData is less than minNegative');
167
+ }
168
+ // Kiểm tra minNegative phải là số âm
169
+ if (options.minNegative >= 0) {
170
+ throw new Error('minNegative must be negative');
171
+ }
172
+ }
173
+ };
174
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0LXNtYXJ0LWF4aXMtc2NhbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy9nZXQtc21hcnQtYXhpcy1zY2FsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLE1BQU0sc0JBQXNCLEdBQUcsRUFBRSxDQUFDO0FBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBQy9CLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDOUIsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNuQyxNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7QUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUM7QUFtQi9COzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsZUFBdUIsRUFBRSxPQUEwQixFQUFtQixFQUFFO0lBQ3hHLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQztJQUU5QixjQUFjLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sWUFBWSxHQUFHLE9BQU8sRUFBRSxZQUFZLElBQUksc0JBQXNCLENBQUM7SUFDckUsTUFBTSxZQUFZLEdBQUcsT0FBTyxFQUFFLFlBQVksSUFBSSxzQkFBc0IsQ0FBQztJQUVyRSxJQUFJLGNBQWMsR0FBRyxDQUFDLENBQUM7SUFDdkIsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDO0lBRTVCLElBQUksT0FBTyxFQUFFLGNBQWMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLEdBQUcsQ0FBQyxD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bnN0IERFRkFVTFRfTUlOX1RJQ0tfQ09VTlQgPSA1O1xuY29uc3QgREVGQVVMVF9NQVhfVElDS19DT1VOVCA9IDEwO1xuY29uc3QgTUlOX0RJU1RBTkNFX1RPX1pFUk8gPSAzO1xuY29uc3QgTkVHQVRJVkVfVEhSRVNIT0xEID0gLTU7XG5jb25zdCBGQUxMQkFDS19ORUdBVElWRV9WQUxVRSA9IC00O1xuY29uc3QgTUFYX1BPV19OVU1CRVIgPSAxNDtcbmNvbnN0IE1BWF9URU1QTEFURV9OVU1CRVIgPSAxMDtcblxuLy8g4pyFIFRow6ptIGludGVyZmFjZXMgxJHhu4MgdMSDbmcgY8aw4budbmcgdHlwZSBzYWZldHlcbmludGVyZmFjZSBBeGlzU2NhbGVPcHRpb25zIHtcbiAgbWluVGlja0NvdW50PzogbnVtYmVyOyAvLyBT4buRIGzGsOG7o25nIHRpY2sgdOG7kWkgdGhp4buDdVxuICBtYXhUaWNrQ291bnQ/OiBudW1iZXI7IC8vIFPhu5EgbMaw4bujbmcgdGljayB04buRaSDEkWFcbiAgc3RlcENhbmRpZGF0ZXM/OiBudW1iZXJbXTsgLy8gRGFuaCBzw6FjaCBjw6FjIHN0ZXAgY2FuZGlkYXRlcyB0w7l5IGNo4buJbmhcbiAgYWNjZXB0TmVnYXRpdmU/OiBib29sZWFuOyAvLyBDw7MgY2jhuqVwIG5o4bqtbiBnacOhIHRy4buLIMOibSBraMO0bmdcbiAgbWluTmVnYXRpdmU/OiBudW1iZXI7IC8vIEdpw6EgdHLhu4sgw6JtIHThu5FpIHRoaeG7g3VcbiAgYWNjZXB0U3RlcElzVHlwZUZsb2F0PzogYm9vbGVhbjsgLy8gQ8OzIGNo4bqlcCBuaOG6rW4gc3RlcCBsw6Agc+G7kSB0aOG6rXAgcGjDom4ga2jDtG5nXG59XG5cbmludGVyZmFjZSBBeGlzU2NhbGVSZXN1bHQge1xuICBzdGVwU2l6ZTogbnVtYmVyOyAvLyBLw61jaCB0aMaw4bubYyBixrDhu5tjXG4gIG1heDogbnVtYmVyOyAvLyBHacOhIHRy4buLIHThu5FpIMSRYSBj4bunYSB0cuG7pWNcbiAgbWluOiBudW1iZXI7IC8vIEdpw6EgdHLhu4sgdOG7kWkgdGhp4buDdSBj4bunYSB0cuG7pWNcbiAgdGlja0Ftb3VudDogbnVtYmVyOyAvLyBT4buRIGzGsOG7o25nIHRpY2tcbn1cblxuLyoqXG4gKiBUw61uaCB0b8OhbiBzbWFydCBheGlzIHNjYWxlIGNobyBiaeG7g3UgxJHhu5NcbiAqXG4gKiBAcGFyYW0gbWF4RGF0YSAtIEdpw6EgdHLhu4sgdOG7kWkgxJFhIGPhu6dhIGThu68gbGnhu4d1XG4gKiBAcGFyYW0gb3B0aW9ucyAtIEPDoWMgdMO5eSBjaOG7jW4gY+G6pXUgaMOsbmggYXhpcyBzY2FsZVxuICogQHJldHVybnMgQ+G6pXUgaMOsbmggYXhpcyBzY2FsZSBiYW8gZ+G7k20gc3RlcFNpemUsIG1heCwgbWluLCB0aWNrQW1vdW50XG4gKlxuICogQHRocm93cyB7RXJyb3J9IElOVkFMSURfTkVHQVRJVkVfREFUQSAtIGtoaSBtYXhEYXRhIDwgMCBtw6AgYWNjZXB0TmVnYXRpdmUgPSBmYWxzZVxuICogQHRocm93cyB7RXJyb3J9IE1JU1NJTkdfTUlOX05FR0FUSVZFIC0ga2hpIGFjY2VwdE5lZ2F0aXZlID0gdHJ1ZSBuaMawbmcgdGhp4bq/dSBtaW5OZWdhdGl2ZVxuICogQHRocm93cyB7RXJyb3J9IElOVkFMSURfUkFOR0UgLSBraGkgbWF4RGF0YSA8IG1pbk5lZ2F0aXZlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSU5WQUxJRF9NSU5fTkVHQVRJVkUgLSBraGkgbWluTmVnYXRpdmUgPj0gMFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCByZXN1bHQgPSBnZXRTbWFydEF4aXNTY2FsZSgxMDAsIHsgbWluVGlja0NvdW50OiA1LCBtYXhUaWNrQ291bnQ6IDEwIH0pO1xuICogLy8gcmV0dXJucyB7IHN0ZXBTaXplOiAyMCwgbWF4OiAxMjAsIG1pbjogMCwgdGlja0Ftb3VudDogNiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNtYXJ0QXhpc1NjYWxlID0gKG9yaWdpbmFsTWF4RGF0YTogbnVtYmVyLCBvcHRpb25zPzogQXhpc1NjYWxlT3B0aW9ucyk6IEF4aXNTY2FsZVJlc3VsdCA9PiB7XG4gIGxldCBtYXhEYXRhID0gb3JpZ2luYWxNYXhEYXRhO1xuXG4gIHZhbGlkYXRlSW5wdXRzKG1heERhdGEsIG9wdGlvbnMpO1xuICBjb25zdCBtaW5UaWNrQ291bnQgPSBvcHRpb25zPy5taW5UaWNrQ291bnQgfHwgREVGQVVMVF9NSU5fVElDS19DT1VOVDtcbiAgY29uc3QgbWF4VGlja0NvdW50ID0gb3B0aW9ucz8ubWF4VGlja0NvdW50IHx8IERFRkFVTFRfTUFYX1RJQ0tfQ09VTlQ7XG5cbiAgbGV0IHNjYWxlRGlyZWN0aW9uID0gMTtcbiAgbGV0IHJhbmdlRGlzdGFuY2UgPSBtYXhEYXRhO1xuXG4gIGlmIChvcHRpb25zPy5hY2NlcHROZWdhdGl2ZSAmJiAhaXNOaWwob3B0aW9ucy5taW5OZWdhdGl2ZSkpIHtcbiAgICBpZiAobWF4RGF0YSA9PT0gMCkge1xuICAgICAgbWF4RGF0YSA9IC0xO1xuICAgIH1cbiAgICBpZiAobWF4RGF0YSA8PSAwKSB7XG4gICAgICByYW5nZURpc3RhbmNlID0gb3B0aW9ucy5taW5OZWdhdGl2ZTtcbiAgICB9XG4gICAgaWYgKHJhbmdlRGlzdGFuY2UgPiBORUdBVElWRV9USFJFU0hPTEQpIHtcbiAgICAgIHJhbmdlRGlzdGFuY2UgPSBGQUxMQkFDS19ORUdBVElWRV9WQUxVRTtcbiAgICB9XG4gICAgaWYgKG1heERhdGEgPiAwKSB7XG4gICAgICByYW5nZURpc3RhbmNlID0gbWF4RGF0YSArIE1hdGguYWJzKG9wdGlvbnMubWluTmVnYXRpdmUpO1xuICAgICAgc2NhbGVEaXJlY3Rpb24gPSAtMTtcbiAgICB9XG4gIH1cbiAgaWYgKE1hdGguYWJzKHJhbmdlRGlzdGFuY2UpIDwgTUlOX0RJU1RBTkNFX1RPX1pFUk8pIHtcbiAgICByYW5nZURpc3RhbmNlID0gTUlOX0RJU1RBTkNFX1RPX1pFUk87XG4gIH1cblxuICBjb25zdCBzdGVwQ2FuZGlkYXRlcyA9IGdldFN0ZXBDYW5kaWRhdGVzKG1heERhdGEsIG1pblRpY2tDb3VudCwgb3B0aW9ucz8ubWluTmVnYXRpdmUgfHwgMCwgb3B0aW9ucz8uYWNjZXB0U3RlcElzVHlwZUZsb2F0LCBvcHRpb25zPy5zdGVwQ2FuZGlkYXRlcywgb3B0aW9ucz8uYWNjZXB0TmVnYXRpdmUpO1xuICBmb3IgKGNvbnN0IHN0ZXAgb2Ygc3RlcENhbmRpZGF0ZXMpIHtcbiAgICBsZXQgdGlja0NvdW50ID0gTWF0aC5hYnMoTWF0aC5jZWlsKHJhbmdlRGlzdGFuY2UgLyBzdGVwKSkgKyAoc2NhbGVEaXJlY3Rpb24gPT09IC0xID8gMiA6IDEpO1xuICAgIGxldCBtYXhWYWx1ZSA9IG1heERhdGEgPD0gMCA/IDAgOiBzdGVwICogdGlja0NvdW50ICogc2NhbGVEaXJlY3Rpb247XG4gICAgbGV0IG1pblZhbHVlID0gMDtcblxuICAgIGlmICh0aWNrQ291bnQgPj0gbWluVGlja0NvdW50ICYmIHRpY2tDb3VudCA8PSBtYXhUaWNrQ291bnQpIHtcbiAgICAgIGlmIChtYXhEYXRhIDwgbWF4VmFsdWUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmFjY2VwdE5lZ2F0aXZlKSB7XG4gICAgICAgICAgbGV0IHRpY2sgPSAxO1xuICAgICAgICAgIHdoaWxlICghaXNOaWwob3B0aW9ucy5taW5OZWdhdGl2ZSkgJiYgdGljayA8PSB0aWNrQ291bnQgJiYgbWluVmFsdWUgPj0gb3B0aW9ucy5taW5OZWdhdGl2ZSkge1xuICAgICAgICAgICAgbWluVmFsdWUgPSB0aWNrICogc3RlcDtcbiAgICAgICAgICAgIHRpY2srKztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWF4VmFsdWVQb3NpdGl2ZSA9IG1heFZhbHVlIC0gTWF0aC5hYnMobWluVmFsdWUpO1xuICAgICAgICB0aWNrQ291bnQgPSBtYXhWYWx1ZVBvc2l0aXZlIC0gb3JpZ2luYWxNYXhEYXRhID4gTWF0aC5hYnMoc3RlcCkgJiYgdGlja0NvdW50IC0gMSA+PSBtaW5UaWNrQ291bnQgPyB0aWNrQ291bnQgLSAxIDogdGlja0NvdW50O1xuXG4gICAgICAgIG1heFZhbHVlID0gc3RlcCAqIHRpY2tDb3VudCAqIHNjYWxlRGlyZWN0aW9uIC0gbWluVmFsdWUgKiBzY2FsZURpcmVjdGlvbjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdGVwU2l6ZTogTWF0aC5hYnMoc3RlcCksXG4gICAgICAgICAgbWF4OiBtYXhWYWx1ZSxcbiAgICAgICAgICBtaW46IG1pblZhbHVlLFxuICAgICAgICAgIHRpY2tBbW91bnQ6IHRpY2tDb3VudCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsZXQgc3RlcCA9IE1hdGguY2VpbChyYW5nZURpc3RhbmNlIC8gbWluVGlja0NvdW50KSB8fCAxO1xuICBsZXQgbWF4VmFsdWUgPSBzdGVwICogbWluVGlja0NvdW50O1xuICBpZiAocmFuZ2VEaXN0YW5jZSA9PT0gbWF4VmFsdWUpIHtcbiAgICBzdGVwID0gc3RlcCArIE1hdGguY2VpbChzdGVwIC8gMTApO1xuICAgIG1heFZhbHVlID0gc3RlcCAqIG1pblRpY2tDb3VudDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHN0ZXBTaXplOiBNYXRoLmFicyhzdGVwKSxcbiAgICBtYXg6IG1heFZhbHVlLFxuICAgIG1pbjogMCxcbiAgICB0aWNrQW1vdW50OiBtaW5UaWNrQ291bnQsXG4gIH07XG59O1xuXG4vLyBDYWNoZSBjaG8gY8OhYyBnacOhIHRy4buLIGzFqXkgdGjhu6thIDEwIMSR4buDIHThu5FpIMawdSBoaeG7h3Ugc3XhuqV0XG5jb25zdCBQT1dFUl9DQUNIRSA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG5cbi8qKlxuICogVOG6oW8gZGFuaCBzw6FjaCBjw6FjIHN0ZXAgY2FuZGlkYXRlcyBjaG8gdmnhu4djIHTDrW5oIHRvw6FuIHNjYWxlXG4gKiBAcGFyYW0gbWF4RGF0YSAtIEdpw6EgdHLhu4sgZOG7ryBsaeG7h3UgdOG7kWkgxJFhXG4gKiBAcGFyYW0gbWluU3RlcCAtIFPhu5EgYsaw4bubYyB04buRaSB0aGnhu4N1XG4gKiBAcGFyYW0gbWluTmVnYXRpdmUgLSBHacOhIHRy4buLIMOibSB04buRaSB0aGnhu4N1XG4gKiBAcGFyYW0gYWNjZXB0U3RlcElzVHlwZUZsb2F0IC0gQ8OzIGNo4bqlcCBuaOG6rW4gc3RlcCB0aOG6rXAgcGjDom4ga2jDtG5nXG4gKiBAcGFyYW0gc3RlcENhbmRpZGF0ZXNCeU9wdGlvbnMgLSBTdGVwIGNhbmRpZGF0ZXMgZG8gbmfGsOG7nWkgZMO5bmcgY3VuZyBj4bqlcFxuICogQHBhcmFtIGluY2x1ZGVOZWdhdGl2ZVN0ZXBzIC0gQ8OzIGJhbyBn4buTbSBjw6FjIHN0ZXAgw6JtIGtow7RuZ1xuICogQHJldHVybnMgRGFuaCBzw6FjaCBjw6FjIHN0ZXAgY2FuZGlkYXRlc1xuICovXG5jb25zdCBnZXRTdGVwQ2FuZGlkYXRlcyA9IChtYXhEYXRhOiBudW1iZXIsIG1pblN0ZXA6IG51bWJlciwgbWluTmVnYXRpdmU6IG51bWJlciwgYWNjZXB0U3RlcElzVHlwZUZsb2F0ID0gZmFsc2UsIHN0ZXBDYW5kaWRhdGVzQnlPcHRpb25zPzogbnVtYmVyW10sIGluY2x1ZGVOZWdhdGl2ZVN0ZXBzID0gZmFsc2UpOiBudW1iZXJbXSA9PiB7XG4gIC8vIE7hur91IGPDsyBzdGVwIGNhbmRpZGF0ZXMgdMO5eSBjaOG7iW5oLCBz4butIGThu6VuZyBjaMO6bmdcbiAgaWYgKHN0ZXBDYW5kaWRhdGVzQnlPcHRpb25zICYmIHN0ZXBDYW5kaWRhdGVzQnlPcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gc3RlcENhbmRpZGF0ZXNCeU9wdGlvbnM7XG4gIH1cblxuICBjb25zdCBzdGVwQ2FuZGlkYXRlcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gIGNvbnN0IG1heFZhbHVlU3RlcCA9IE1hdGguYWJzKE1hdGgubWF4KG1heERhdGEsIE1hdGguYWJzKG1pbk5lZ2F0aXZlIHx8IDApKSkgLyBtaW5TdGVwO1xuXG4gIC8vIFThuqFvIHN0ZXAgY2FuZGlkYXRlcyBk4buxYSB0csOqbiBsxal5IHRo4burYSBj4bunYSAxMFxuICBmb3IgKGxldCBwb3dOdW1iZXIgPSAwOyBwb3dOdW1iZXIgPD0gTUFYX1BPV19OVU1CRVI7IHBvd051bWJlcisrKSB7XG4gICAgLy8gU+G7rSBk4bulbmcgY2FjaGUgxJHhu4MgdOG7kWkgxrB1IGhp4buHdSBzdeG6pXRcbiAgICBpZiAoIVBPV0VSX0NBQ0hFLmhhcyhwb3dOdW1iZXIpKSB7XG4gICAgICBQT1dFUl9DQUNIRS5zZXQocG93TnVtYmVyLCBNYXRoLnBvdygxMCwgcG93TnVtYmVyKSk7XG4gICAgfVxuICAgIGNvbnN0IHBvd1ZhbHVlID0gUE9XRVJfQ0FDSEUuZ2V0KHBvd051bWJlcikgYXMgbnVtYmVyO1xuXG4gICAgZm9yIChsZXQgdGVtcGxhdGVOdW1iZXIgPSAxOyB0ZW1wbGF0ZU51bWJlciA8IE1BWF9URU1QTEFURV9OVU1CRVI7IHRlbXBsYXRlTnVtYmVyKyspIHtcbiAgICAgIC8vIFRow6ptIHN0ZXAgdGjhuq1wIHBow6JuIG7hur91IMSRxrDhu6NjIGNo4bqlcCBuaOG6rW5cbiAgICAgIGlmIChhY2NlcHRTdGVwSXNUeXBlRmxvYXQpIHtcbiAgICAgICAgY29uc3Qgc3RlcCA9IHBvd1ZhbHVlICogKCgodGVtcGxhdGVOdW1iZXIgLSAxKSAqIDIgKyAxKSAvIDIpO1xuICAgICAgICBzdGVwQ2FuZGlkYXRlcy5wdXNoKHN0ZXApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzdGVwID0gcG93VmFsdWUgKiB0ZW1wbGF0ZU51bWJlcjtcbiAgICAgIHN0ZXBDYW5kaWRhdGVzLnB1c2goc3RlcCk7XG5cbiAgICAgIC8vIEThu6tuZyBraGkgc3RlcCDEkcOjIMSR4bunIGzhu5tuXG4gICAgICBpZiAoc3RlcCA+PSBtYXhWYWx1ZVN0ZXApIHtcbiAgICAgICAgY2hlY2tBbmRTZXROZWdhdGl2ZVN0ZXBzKHN0ZXBDYW5kaWRhdGVzLCBpbmNsdWRlTmVnYXRpdmVTdGVwcywgbWluTmVnYXRpdmUpO1xuICAgICAgICByZXR1cm4gc3RlcENhbmRpZGF0ZXM7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hlY2tBbmRTZXROZWdhdGl2ZVN0ZXBzKHN0ZXBDYW5kaWRhdGVzLCBpbmNsdWRlTmVnYXRpdmVTdGVwcywgbWluTmVnYXRpdmUpO1xuICByZXR1cm4gc3RlcENhbmRpZGF0ZXM7XG59O1xuXG4vKipcbiAqIEtp4buDbSB0cmEgdsOgIHRow6ptIGPDoWMgc3RlcCDDom0gdsOgbyBkYW5oIHPDoWNoIGNhbmRpZGF0ZXMgbuG6v3UgY+G6p25cbiAqIEBwYXJhbSBzdGVwQ2FuZGlkYXRlcyAtIERhbmggc8OhY2ggc3RlcCBjYW5kaWRhdGVzIGhp4buHbiB04bqhaVxuICogQHBhcmFtIGFjY2VwdE5lZ2F0aXZlIC0gQ8OzIGNo4bqlcCBuaOG6rW4gZ2nDoSB0cuG7iyDDom0ga2jDtG5nXG4gKiBAcGFyYW0gbWluTmVnYXRpdmUgLSBHacOhIHRy4buLIMOibSB04buRaSB0aGnhu4N1XG4gKi9cbmNvbnN0IGNoZWNrQW5kU2V0TmVnYXRpdmVTdGVwcyA9IChzdGVwQ2FuZGlkYXRlczogbnVtYmVyW10sIGFjY2VwdE5lZ2F0aXZlOiBib29sZWFuLCBtaW5OZWdhdGl2ZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gIGlmIChhY2NlcHROZWdhdGl2ZSAmJiBtaW5OZWdhdGl2ZSA8IDApIHtcbiAgICAvLyBU4bqhbyBjw6FjIHN0ZXAgw6JtIHbDoCB0aMOqbSB2w6BvIMSR4bqndSBkYW5oIHPDoWNoXG4gICAgY29uc3QgbmVnYXRpdmVTdGVwcyA9IFsuLi5zdGVwQ2FuZGlkYXRlc10ubWFwKChzdGVwKSA9PiAtc3RlcCk7XG4gICAgc3RlcENhbmRpZGF0ZXMudW5zaGlmdCguLi5uZWdhdGl2ZVN0ZXBzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaeG7g20gdHJhIHTDrW5oIGjhu6NwIGzhu4cgY+G7p2EgY8OhYyB0aGFtIHPhu5EgxJHhuqd1IHbDoG9cbiAqIEBwYXJhbSBtYXhEYXRhIC0gR2nDoSB0cuG7iyBk4buvIGxp4buHdSB04buRaSDEkWFcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ8OhYyB0w7l5IGNo4buNbiBj4bqldSBow6xuaFxuICogQHRocm93cyB7RXJyb3J9IEtoaSBjw6FjIHRoYW0gc+G7kSBraMO0bmcgaOG7o3AgbOG7h1xuICovXG5jb25zdCB2YWxpZGF0ZUlucHV0cyA9IChtYXhEYXRhOiBudW1iZXIsIG9wdGlvbnM/OiBBeGlzU2NhbGVPcHRpb25zKTogdm9pZCA9PiB7XG4gIC8vIEtp4buDbSB0cmEgbWF4RGF0YSDDom0ga2hpIGtow7RuZyBjaOG6pXAgbmjhuq1uIGdpw6EgdHLhu4sgw6JtXG4gIGlmIChtYXhEYXRhIDwgMCAmJiAhb3B0aW9ucz8uYWNjZXB0TmVnYXRpdmUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21heERhdGEgaXMgbGVzcyB0aGFuIDAgYW5kIGFjY2VwdE5lZ2F0aXZlIGlzIGZhbHNlJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucz8uYWNjZXB0TmVnYXRpdmUpIHtcbiAgICAvLyBLaeG7g20gdHJhIG1pbk5lZ2F0aXZlIGPDsyDEkcaw4bujYyBjdW5nIGPhuqVwIGtow7RuZ1xuICAgIGlmIChpc05pbChvcHRpb25zLm1pbk5lZ2F0aXZlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW5OZWdhdGl2ZSBpcyByZXF1aXJlZCB3aGVuIGFjY2VwdE5lZ2F0aXZlIGlzIHRydWUnKTtcbiAgICB9XG5cbiAgICAvLyBLaeG7g20gdHJhIG1heERhdGEgcGjhuqNpID49IG1pbk5lZ2F0aXZlXG4gICAgaWYgKG1heERhdGEgPCBvcHRpb25zLm1pbk5lZ2F0aXZlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21heERhdGEgaXMgbGVzcyB0aGFuIG1pbk5lZ2F0aXZlJyk7XG4gICAgfVxuXG4gICAgLy8gS2nhu4NtIHRyYSBtaW5OZWdhdGl2ZSBwaOG6o2kgbMOgIHPhu5Egw6JtXG4gICAgaWYgKG9wdGlvbnMubWluTmVnYXRpdmUgPj0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtaW5OZWdhdGl2ZSBtdXN0IGJlIG5lZ2F0aXZlJyk7XG4gICAgfVxuICB9XG59O1xuIl19