@libs-ui/utils 0.2.355-9 → 0.2.356-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +633 -2
- package/base64.d.ts +25 -0
- package/cache.d.ts +73 -0
- package/collection.d.ts +12 -0
- package/color.d.ts +37 -0
- package/communicate-micro.d.ts +34 -1
- package/crypto-3rd.d.ts +12 -0
- package/crypto.d.ts +17 -0
- package/dangerous-object.d.ts +8 -1
- package/data.d.ts +5 -3
- package/date.d.ts +12 -0
- package/dom.d.ts +56 -0
- package/download.d.ts +21 -0
- package/esm2022/base64.mjs +27 -2
- package/esm2022/cache.mjs +74 -1
- package/esm2022/collection.mjs +13 -1
- package/esm2022/color.mjs +38 -1
- package/esm2022/communicate-micro.mjs +37 -5
- package/esm2022/crypto-3rd.mjs +13 -1
- package/esm2022/crypto.mjs +18 -1
- package/esm2022/dangerous-object.mjs +11 -2
- package/esm2022/data.mjs +6 -4
- package/esm2022/date.mjs +13 -1
- package/esm2022/dom.mjs +57 -1
- package/esm2022/download.mjs +22 -1
- package/esm2022/file.mjs +54 -1
- package/esm2022/format-number.mjs +31 -3
- package/esm2022/format-text.mjs +73 -2
- package/esm2022/function-check-embed-frame.mjs +28 -1
- package/esm2022/pattern.mjs +83 -3
- package/esm2022/trace.mjs +8 -1
- package/esm2022/two-way-signal-object.mjs +14 -1
- package/esm2022/uri.mjs +22 -3
- package/esm2022/url-search-params.mjs +68 -1
- package/esm2022/url.mjs +10 -1
- package/esm2022/uuid.mjs +7 -1
- package/esm2022/xss-filter.mjs +14 -1
- package/fesm2022/libs-ui-utils.mjs +723 -21
- package/fesm2022/libs-ui-utils.mjs.map +1 -1
- package/file.d.ts +53 -0
- package/format-number.d.ts +29 -1
- package/format-text.d.ts +71 -0
- package/function-check-embed-frame.d.ts +22 -0
- package/package.json +2 -2
- package/pattern.d.ts +81 -1
- package/trace.d.ts +7 -0
- package/two-way-signal-object.d.ts +13 -0
- package/uri.d.ts +20 -0
- package/url-search-params.d.ts +67 -0
- package/url.d.ts +9 -0
- package/uuid.d.ts +6 -0
- package/xss-filter.d.ts +13 -0
package/cache.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import { TYPE_LANGUAGE_SUPPORT } from '@libs-ui/interfaces-types';
|
|
2
|
+
/**
|
|
3
|
+
* Tiện ích quản lý Cache, hỗ trợ cả LocalStorage (đồng bộ) và IndexedDB (bất đồng bộ)
|
|
4
|
+
* Tự động mã hóa dữ liệu và xử lý thời gian hết hạn
|
|
5
|
+
*/
|
|
2
6
|
export declare class UtilsCache {
|
|
3
7
|
static readonly CACHE_EXPIRE_TIME_DEFAULT: number;
|
|
4
8
|
static readonly CACHE_EXPIRE_NONE = -1;
|
|
@@ -12,31 +16,100 @@ export declare class UtilsCache {
|
|
|
12
16
|
private static itemIndexByKey;
|
|
13
17
|
private static dbVersion;
|
|
14
18
|
private static db;
|
|
19
|
+
/**
|
|
20
|
+
* Khởi tạo cấu hình cho Cache
|
|
21
|
+
* @param config Cấu hình khởi tạo (tên DB, key ngôn ngữ, event clear...)
|
|
22
|
+
*/
|
|
15
23
|
static init(config: {
|
|
16
24
|
indexedDBName?: string;
|
|
17
25
|
languageKeyCache?: string;
|
|
18
26
|
typeKeyClearLocalStorage?: string;
|
|
19
27
|
listKeyKeepWhenClearAll?: Array<string>;
|
|
20
28
|
}): void;
|
|
29
|
+
/**
|
|
30
|
+
* Lưu ngôn ngữ hiện tại vào cache
|
|
31
|
+
* @param lang Mã ngôn ngữ (vi, en, ...)
|
|
32
|
+
*/
|
|
21
33
|
static setLang(lang: TYPE_LANGUAGE_SUPPORT): void;
|
|
34
|
+
/**
|
|
35
|
+
* Lấy ngôn ngữ từ cache
|
|
36
|
+
* @returns Mã ngôn ngữ
|
|
37
|
+
*/
|
|
22
38
|
static getLang(): TYPE_LANGUAGE_SUPPORT;
|
|
23
39
|
private static openDB;
|
|
24
40
|
private static getObjectStore;
|
|
25
41
|
private static get LocalStorage();
|
|
26
42
|
private static getLocalStorageFakeOnSafari;
|
|
27
43
|
private static getLocalStorageFake;
|
|
44
|
+
/**
|
|
45
|
+
* Lấy giá trị từ IndexedDB theo key (bất đồng bộ)
|
|
46
|
+
* @param key Khóa cache
|
|
47
|
+
* @param default_value Giá trị mặc định nếu không tìm thấy
|
|
48
|
+
* @param isKeyMD5 Nếu true, key đã là MD5. Nếu false (mặc định), sẽ tự động MD5 key.
|
|
49
|
+
* @returns Promise chứa giá trị đã giải mã
|
|
50
|
+
*/
|
|
28
51
|
static GetAsync<T = any>(key: string, default_value?: any, isKeyMD5?: boolean): Promise<T>;
|
|
52
|
+
/**
|
|
53
|
+
* Lấy giá trị từ LocalStorage theo key (đồng bộ)
|
|
54
|
+
* @param key Khóa cache
|
|
55
|
+
* @param default_value Giá trị mặc định nếu không tìm thấy
|
|
56
|
+
* @returns Giá trị đã giải mã hoặc giá trị mặc định
|
|
57
|
+
*/
|
|
29
58
|
static Get<T = any>(key: string, default_value?: any): T;
|
|
30
59
|
static GetDefaultValueBySpecificKey(key: string, default_value: any): any;
|
|
60
|
+
/**
|
|
61
|
+
* Lưu giá trị vào IndexedDB (bất đồng bộ)
|
|
62
|
+
* @param key Khóa cache
|
|
63
|
+
* @param value Giá trị cần lưu
|
|
64
|
+
* @param expireTimeBySecond Thời gian hết hạn (giây). Mặc định 5 phút. Dùng CACHE_EXPIRE_NONE để vĩnh viễn.
|
|
65
|
+
* @param isKeyMD5 Nếu true, key đã là MD5.
|
|
66
|
+
* @returns Promise chứa thông tin kết quả
|
|
67
|
+
*/
|
|
31
68
|
static SetAsync<T = any>(key: string, value: any, expireTimeBySecond?: number, isKeyMD5?: boolean): Promise<T>;
|
|
69
|
+
/**
|
|
70
|
+
* Lưu giá trị vào LocalStorage (đồng bộ)
|
|
71
|
+
* @param key Khóa cache
|
|
72
|
+
* @param value Giá trị cần lưu
|
|
73
|
+
* @param expireTimeBySecond Thời gian hết hạn (giây). Mặc định 5 phút.
|
|
74
|
+
* @returns true nếu thành công
|
|
75
|
+
*/
|
|
32
76
|
static Set(key: string, value: any, expireTimeBySecond?: number): boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Xóa một key trong IndexedDB
|
|
79
|
+
* @param key Khóa cần xóa
|
|
80
|
+
* @param isMD5 Nếu true, key đã được MD5.
|
|
81
|
+
*/
|
|
33
82
|
static ClearAsync(key: string, isMD5?: boolean): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Xóa một key trong LocalStorage
|
|
85
|
+
* @param key Khóa cần xóa
|
|
86
|
+
*/
|
|
34
87
|
static Clear(key: string): void;
|
|
88
|
+
/**
|
|
89
|
+
* Xóa toàn bộ dữ liệu trong IndexedDB
|
|
90
|
+
*/
|
|
35
91
|
static ClearAllAsync(): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Xóa toàn bộ dữ liệu trong LocalStorage (kiểm soát các key đặc biệt)
|
|
94
|
+
*/
|
|
36
95
|
static ClearAll(): void;
|
|
37
96
|
private static GetDataByKeys;
|
|
38
97
|
private static SetDataByKey;
|
|
98
|
+
/**
|
|
99
|
+
* Xóa tất cả các khóa bắt đầu bằng tiền tố nhất định trong IndexedDB
|
|
100
|
+
* @param keyCacheStartWith Tiền tố khóa
|
|
101
|
+
* @param isKeyMD5 Nếu true, tiền tố đã được MD5.
|
|
102
|
+
*/
|
|
39
103
|
static DeleteKeyStartWithAsync(keyCacheStartWith: string, isKeyMD5?: boolean): Promise<unknown>;
|
|
104
|
+
/**
|
|
105
|
+
* Xóa tất cả các khóa bắt đầu bằng tiền tố nhất định trong LocalStorage
|
|
106
|
+
* @param keyCache Tiền tố khóa
|
|
107
|
+
* @param isMD5 Nếu true, tiền tố sẽ được MD5 trước khi so sánh.
|
|
108
|
+
*/
|
|
40
109
|
static DeleteKeyStartWith(keyCache: string, isMD5?: boolean): void;
|
|
110
|
+
/**
|
|
111
|
+
* Xóa hoàn toàn cơ sở dữ liệu IndexedDB
|
|
112
|
+
* @param dbName Tên DB, mặc định theo cấu hình.
|
|
113
|
+
*/
|
|
41
114
|
static DeleteDatabaseIndexDB(dbName?: string): Promise<unknown>;
|
|
42
115
|
}
|
package/collection.d.ts
CHANGED
|
@@ -1,2 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thêm tất cả phần tử trong mảng vào một Set
|
|
3
|
+
* @param setStore Đối tượng Set mục tiêu
|
|
4
|
+
* @param data Mảng các phần tử cần thêm
|
|
5
|
+
* @returns Set sau khi đã thêm dữ liệu
|
|
6
|
+
*/
|
|
1
7
|
export declare const addArrayToSet: <T>(setStore: Set<T>, data: T[]) => Set<T>;
|
|
8
|
+
/**
|
|
9
|
+
* Chuyển đổi Set sang Array, có hỗ trợ mapping function
|
|
10
|
+
* @param data Đối tượng Set cần chuyển đổi
|
|
11
|
+
* @param functionMap Hàm mapping tùy chọn để biến đổi từng phần tử
|
|
12
|
+
* @returns Mảng kết quả
|
|
13
|
+
*/
|
|
2
14
|
export declare const convertSetToArray: <T = any, U = any>(data: Set<T>, functionMap?: (value: T) => U) => Array<U>;
|
package/color.d.ts
CHANGED
|
@@ -4,10 +4,47 @@ export interface IColorContrastFromOrigin {
|
|
|
4
4
|
light: string;
|
|
5
5
|
dark: string;
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Lấy cụ thể một shade hoặc tint của màu dựa trên bước (step)
|
|
9
|
+
* @param color Mã màu HEX (3 hoặc 6 ký tự)
|
|
10
|
+
* @param stepNumber Bước màu cần lấy (5, 10, 15... 100)
|
|
11
|
+
* @returns Đối tượng chứa thông tin bước màu và mã HEX light/dark
|
|
12
|
+
*/
|
|
7
13
|
export declare const colorStepContrastFromOrigin: (color: string, stepNumber: number) => IColorContrastFromOrigin | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Tạo ra danh sách các sắc độ (shades & tints) từ một màu gốc
|
|
16
|
+
* @param color Mã màu HEX
|
|
17
|
+
* @returns Mảng các đối tượng chứa step, label, light hex và dark hex
|
|
18
|
+
*/
|
|
8
19
|
export declare const colorContrastFromOrigin: (color: string) => Array<IColorContrastFromOrigin>;
|
|
20
|
+
/**
|
|
21
|
+
* Chuyển đổi đối tượng RGB sang mã HEX (không có dấu #)
|
|
22
|
+
* @param rgb Đối tượng chứa red, green, blue
|
|
23
|
+
* @returns Chuỗi HEX 6 ký tự
|
|
24
|
+
*/
|
|
9
25
|
export declare const rgbToHex: (rgb: any) => string;
|
|
26
|
+
/**
|
|
27
|
+
* Danh sách các mã màu định nghĩa sẵn để sử dụng trong getColorById
|
|
28
|
+
*/
|
|
10
29
|
export declare const listColorDefine: Array<string>;
|
|
30
|
+
/**
|
|
31
|
+
* Lấy một màu định nghĩa sẵn dựa trên chuỗi đầu vào (như ID người dùng, tên...)
|
|
32
|
+
* Màu trả về là duy nhất và cố định cho cùng một chuỗi đầu vào.
|
|
33
|
+
* @param str Chuỗi để hash lấy màu
|
|
34
|
+
* @returns Mã màu HEX từ listColorDefine
|
|
35
|
+
*/
|
|
11
36
|
export declare const getColorById: (str: string) => string;
|
|
37
|
+
/**
|
|
38
|
+
* Loại bỏ các thuộc tính màu sắc (color, background...) "gần trắng" khỏi chuỗi style CSS
|
|
39
|
+
* Giúp tránh việc hiển thị chữ trắng trên nền trắng khi merge style lung tung.
|
|
40
|
+
* @param style Chuỗi style CSS (ví dụ: "color: #fff; font-size: 14px;")
|
|
41
|
+
* @returns Chuỗi style đã được làm sạch
|
|
42
|
+
*/
|
|
12
43
|
export declare const detectAndCleanNearWhiteColors: (style: string) => string;
|
|
44
|
+
/**
|
|
45
|
+
* Kiểm tra một màu có phải là "gần trắng" hay không
|
|
46
|
+
* Dựa trên luminance > 0.95 và saturation < 0.1
|
|
47
|
+
* @param color Mã màu (HEX, RGB, RGBA hoặc tên màu CSS)
|
|
48
|
+
* @returns true nếu màu gần trắng
|
|
49
|
+
*/
|
|
13
50
|
export declare const isNearWhite: (color: string) => boolean;
|
package/communicate-micro.d.ts
CHANGED
|
@@ -1,18 +1,51 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
1
|
import { DestroyRef } from '@angular/core';
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
/**
|
|
4
|
+
* Cấu hình các key global cho truyền thông micro
|
|
5
|
+
*/
|
|
3
6
|
export declare class UtilsCommunicateMicroKeyGlobal {
|
|
7
|
+
/** Key sự kiện cho modal */
|
|
4
8
|
static KEY_MESSAGE_MODAL: string;
|
|
9
|
+
/** Bỏ qua cập nhật thời gian live event modal */
|
|
5
10
|
static IGNORE_INTERVAL_UPDATE_TIME_LIVE_EVENT_MODAL: boolean;
|
|
6
11
|
}
|
|
12
|
+
/**
|
|
13
|
+
* Tiện ích hỗ trợ truyền thông giữa các cửa sổ, iframes (Cross-document communication)
|
|
14
|
+
* Sử dụng Window.postMessage kèm theo mã hóa/giải mã dữ liệu tự động.
|
|
15
|
+
*/
|
|
7
16
|
export declare class UtilsCommunicateMicro {
|
|
8
17
|
private static initdEvent?;
|
|
9
18
|
private static subs;
|
|
10
19
|
private static allMessageSub;
|
|
20
|
+
/**
|
|
21
|
+
* Khởi tạo trình lắng nghe sự kiện 'message' trên window hiện tại.
|
|
22
|
+
* Cần được gọi một lần duy nhất tại Root Component (AppComponent).
|
|
23
|
+
* @param currentWindow Đối tượng window hiện tại
|
|
24
|
+
* @param destroyRef Reference để tự động unsubscribe khi component bị hủy
|
|
25
|
+
*/
|
|
11
26
|
static initEvent(currentWindow: Window, destroyRef: DestroyRef): void;
|
|
27
|
+
/**
|
|
28
|
+
* Gửi message tới cửa sổ cha (Parent) hoặc top window.
|
|
29
|
+
* Thường dùng khi app chạy trong Iframe.
|
|
30
|
+
* @param data Dữ liệu cần gửi ({type: string, response: any})
|
|
31
|
+
*/
|
|
12
32
|
static PostMessageToParent(data: any): void;
|
|
33
|
+
/**
|
|
34
|
+
* Gửi message tới tất cả các iframe con có trong trang.
|
|
35
|
+
* @param data Dữ liệu cần gửi ({type: string, response: any})
|
|
36
|
+
*/
|
|
13
37
|
static PostMessageToChildren(data: any): void;
|
|
38
|
+
/**
|
|
39
|
+
* Gửi message tới cửa sổ đã mở cửa sổ hiện tại (Window Opener).
|
|
40
|
+
* @param data Dữ liệu cần gửi ({type: string, response: any})
|
|
41
|
+
*/
|
|
14
42
|
static PostMessageToOpener(data: any): void;
|
|
15
43
|
private static convertData;
|
|
44
|
+
/**
|
|
45
|
+
* Đăng ký lắng nghe các message theo type cụ thể. Trả về một RxJS Subject.
|
|
46
|
+
* @param messageType Type của message hoặc danh sách các types cần lắng nghe
|
|
47
|
+
* @returns Subject sẽ phát ra message event khi nhận được dữ liệu hợp lệ
|
|
48
|
+
*/
|
|
16
49
|
static GetMessage(messageType: string | Array<string>): Subject<MessageEvent>;
|
|
17
50
|
private static initSubject;
|
|
18
51
|
}
|
package/crypto-3rd.d.ts
CHANGED
|
@@ -3,5 +3,17 @@
|
|
|
3
3
|
* @param value key mã hóa, độ dài bằng 24 hoặc 32 ký tự.
|
|
4
4
|
*/
|
|
5
5
|
export declare const setKeyCrypto3rd: (value: string) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Mã hóa dữ liệu dạng chuỗi bằng thuật toán AES-CBC.
|
|
8
|
+
* Yêu cầu key mã hóa đã được thiết lập qua setKeyCrypto3rd.
|
|
9
|
+
* @param plainData Chuỗi văn bản thuần túy cần mã hóa
|
|
10
|
+
* @returns Chuỗi kết quả đã được mã hóa (Base64 string)
|
|
11
|
+
*/
|
|
6
12
|
export declare const encrypt3rd: (plainData: string) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Giải mã dữ liệu đã được mã hóa bằng AES-CBC.
|
|
15
|
+
* Yêu cầu cùng một key mã hóa đã dùng để encrypt.
|
|
16
|
+
* @param encryptedData Chuỗi dữ liệu đã mã hóa
|
|
17
|
+
* @returns Chuỗi văn bản thuần túy sau khi giải mã (UTF-8)
|
|
18
|
+
*/
|
|
7
19
|
export declare const decrypt3rd: (encryptedData: string) => string;
|
package/crypto.d.ts
CHANGED
|
@@ -3,6 +3,23 @@
|
|
|
3
3
|
* @param value key mã hóa, độ dài bằng 24 hoặc 32 ký tự.
|
|
4
4
|
*/
|
|
5
5
|
export declare const setKeyCrypto: (value: string) => void;
|
|
6
|
+
/**
|
|
7
|
+
* Mã hóa dữ liệu dạng chuỗi bằng thuật toán AES-CBC.
|
|
8
|
+
* Yêu cầu key mã hóa đã được thiết lập qua setKeyCrypto.
|
|
9
|
+
* @param plainData Chuỗi văn bản thuần túy cần mã hóa
|
|
10
|
+
* @returns Chuỗi kết quả đã được mã hóa (Base64 string)
|
|
11
|
+
*/
|
|
6
12
|
export declare const encrypt: (plainData: string) => string;
|
|
13
|
+
/**
|
|
14
|
+
* Giải mã dữ liệu đã được mã hóa bằng AES-CBC.
|
|
15
|
+
* Yêu cầu cùng một key mã hóa đã dùng để encrypt.
|
|
16
|
+
* @param encryptedData Chuỗi dữ liệu đã mã hóa
|
|
17
|
+
* @returns Chuỗi văn bản thuần túy sau khi giải mã (UTF-8)
|
|
18
|
+
*/
|
|
7
19
|
export declare const decrypt: (encryptedData: string) => string;
|
|
20
|
+
/**
|
|
21
|
+
* Tạo mã hash MD5 từ chuỗi văn bản.
|
|
22
|
+
* @param plainData Chuỗi văn bản cần hash
|
|
23
|
+
* @returns Chuỗi mã hash MD5 (32 ký tự hex)
|
|
24
|
+
*/
|
|
8
25
|
export declare const md5: (plainData: string) => string;
|
package/dangerous-object.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpParams } from '@angular/common/http';
|
|
2
|
-
import {
|
|
2
|
+
import { ElementRef, TemplateRef } from '@angular/core';
|
|
3
3
|
import { Dayjs } from 'dayjs';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
5
|
/**
|
|
@@ -77,3 +77,10 @@ export declare const isReturnAsIsObject: (obj: any) => boolean;
|
|
|
77
77
|
* Kiểm tra xem đối tượng có an toàn để clone/convert không
|
|
78
78
|
*/
|
|
79
79
|
export declare const isSafeToProcess: (obj: any) => boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Kiểm tra xem giá trị có phải là kiểu dữ liệu nguyên thủy (Primitive) không.
|
|
82
|
+
* Bao gồm: string, number, boolean, symbol, bigint, null, undefined.
|
|
83
|
+
* @param value Giá trị cần kiểm tra
|
|
84
|
+
* @returns true nếu là kiểu nguyên thủy
|
|
85
|
+
*/
|
|
86
|
+
export declare const isPrimitiveType: (value: any) => boolean;
|
package/data.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tính dung lượng (ước tính) của
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Tính toán dung lượng (ước tính) của một đối tượng trong bộ nhớ.
|
|
3
|
+
* Hàm sử dụng JSON.stringify và Blob để tính toán kích thước thực tế theo byte.
|
|
4
|
+
*
|
|
5
|
+
* @param obj Đối tượng cần tính dung lượng (Object, Array, Primitive...)
|
|
6
|
+
* @returns Chuỗi mô tả dung lượng đã được format (ví dụ: "100 bytes", "2.50 KB", "1.20 MB"). Trả về "N/A" nếu không thể serialize.
|
|
5
7
|
*/
|
|
6
8
|
export declare const getObjectSize: (obj: unknown) => string;
|
package/date.d.ts
CHANGED
|
@@ -2,9 +2,21 @@ import { GetDayjsConfig, GetDayjsReturn, NonNullableDate } from '@libs-ui/interf
|
|
|
2
2
|
import dayjs from 'dayjs';
|
|
3
3
|
import 'dayjs/locale/en';
|
|
4
4
|
import 'dayjs/locale/vi';
|
|
5
|
+
/**
|
|
6
|
+
* Thiết lập múi giờ mặc định cho hệ thống (mặc định là Asia/Ho_Chi_Minh).
|
|
7
|
+
* @param localeZone Tên múi giờ (ví dụ: 'America/New_York')
|
|
8
|
+
*/
|
|
5
9
|
export declare const setDefaultTimeZone: (localeZone?: string) => void;
|
|
10
|
+
/**
|
|
11
|
+
* Thiết lập pattern Regex để nhận diện và chuẩn hóa các chuỗi thời gian UTC đặc biệt.
|
|
12
|
+
* @param pattern Regex pattern dùng để kiểm tra và replace chuỗi thời gian
|
|
13
|
+
*/
|
|
6
14
|
export declare const setPatternCheckTimeUTC: (pattern: RegExp) => void;
|
|
7
15
|
export type TYPE_FUNCTION_FORMAT_DATE = (time: dayjs.ConfigType, formatOutput: string, lang?: string) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Cung cấp một hàm format tùy chỉnh ghi đè lên logic mặc định của formatDate.
|
|
18
|
+
* @param functionCustom Hàm format tùy chỉnh
|
|
19
|
+
*/
|
|
8
20
|
export declare const updateFunctionFormatDate: (functionCustom: TYPE_FUNCTION_FORMAT_DATE) => void;
|
|
9
21
|
/**
|
|
10
22
|
* @description Lấy đối tượng dayjs theo config
|
package/dom.d.ts
CHANGED
|
@@ -1,25 +1,81 @@
|
|
|
1
1
|
import { DestroyRef } from '@angular/core';
|
|
2
2
|
import { IBoundingClientRect } from '@libs-ui/interfaces-types';
|
|
3
3
|
import Bowser from 'bowser';
|
|
4
|
+
/**
|
|
5
|
+
* Lấy thông tin thiết bị và trình duyệt (Sử dụng thư viện Bowser).
|
|
6
|
+
* @returns Đối tượng Parser chứa thông tin OS, Browser, Platform...
|
|
7
|
+
*/
|
|
4
8
|
export declare const getDeviceInfo: () => Bowser.Parser.Parser;
|
|
9
|
+
/**
|
|
10
|
+
* Kiểm tra xem thiết bị hiện tại có hỗ trợ cảm ứng (Touch) không.
|
|
11
|
+
* @returns true nếu là thiết bị cảm ứng
|
|
12
|
+
*/
|
|
5
13
|
export declare const isTouchDevice: () => boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Xác định tên sự kiện click phù hợp cho thiết bị (click cho desktop, pointerdown cho touch).
|
|
16
|
+
*/
|
|
6
17
|
export declare const getEventNameHandleClick: string;
|
|
18
|
+
/**
|
|
19
|
+
* Chuyển đổi một chuỗi HTML thành đối tượng Document.
|
|
20
|
+
* @param htmlStr Chuỗi HTML cần parse
|
|
21
|
+
* @returns Đối tượng Document tương ứng
|
|
22
|
+
*/
|
|
7
23
|
export declare const getDocumentByString: (htmlStr: string) => Document;
|
|
24
|
+
/**
|
|
25
|
+
* Sao chép các thuộc tính cơ bản của IBoundingClientRect.
|
|
26
|
+
* @param rect Đối tượng IBoundingClientRect gốc
|
|
27
|
+
* @returns Đối tượng IBoundingClientRect đã được copy
|
|
28
|
+
*/
|
|
8
29
|
export declare const cloneIBoundingClientRect: (rect: IBoundingClientRect) => IBoundingClientRect;
|
|
30
|
+
/**
|
|
31
|
+
* Gán nhiều thuộc tính CSS style cho một Element.
|
|
32
|
+
* @param el Phần tử HTML cần gán style
|
|
33
|
+
* @param styles Đối tượng chứa các style (ví dụ: { color: 'red', display: 'block' })
|
|
34
|
+
*/
|
|
9
35
|
export declare const setStylesElement: (el: HTMLElement, styles: Record<string, string>) => void;
|
|
36
|
+
/**
|
|
37
|
+
* Lấy kích thước Viewport hiển thị của cửa sổ trình duyệt.
|
|
38
|
+
* @param win Đối tượng Window (mặc định là window)
|
|
39
|
+
* @returns Đối tượng chứa width và height
|
|
40
|
+
*/
|
|
10
41
|
export declare const getViewport: (win?: Window) => {
|
|
11
42
|
width: number;
|
|
12
43
|
height: number;
|
|
13
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Thiết lập vị trí con trỏ (caret) cho thẻ Input hoặc Textarea.
|
|
47
|
+
* @param element Thẻ input hoặc textarea
|
|
48
|
+
* @param position Vị trí cần đặt con trỏ
|
|
49
|
+
*/
|
|
14
50
|
export declare const setCaretPosition: (element: HTMLTextAreaElement | HTMLInputElement, position: number) => void;
|
|
51
|
+
/**
|
|
52
|
+
* Kiểm tra xem một phần tử có đang hiển thị trong vùng nhìn thấy (viewport) của một container không.
|
|
53
|
+
* @param container Element cha chứa vùng scroll
|
|
54
|
+
* @param element Element cần kiểm tra
|
|
55
|
+
* @param elementScroll (Tùy chọn) Element đại diện cho vùng scroll nếu khác container
|
|
56
|
+
* @param maxTopLeft (Tùy chọn) Offset bổ sung để kiểm tra
|
|
57
|
+
* @returns true nếu nằm trong vùng nhìn thấy
|
|
58
|
+
*/
|
|
15
59
|
export declare const checkViewInScreen: (container: HTMLElement, element: HTMLElement, elementScroll?: HTMLElement, maxTopLeft?: {
|
|
16
60
|
top?: number;
|
|
17
61
|
left?: number;
|
|
18
62
|
}) => boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Kiểm tra xem tọa độ chuột hiện tại có nằm trong vùng của một Element không.
|
|
65
|
+
* @param mousePosition Đối tượng chứa clientX, clientY
|
|
66
|
+
* @param element Element cần kiểm tra
|
|
67
|
+
* @param rect (Tùy chọn) Bounding rect đã có sẵn để tối ưu hiệu năng
|
|
68
|
+
* @returns true nếu chuột đang đè lên phần tử
|
|
69
|
+
*/
|
|
19
70
|
export declare const checkMouseOverInContainer: (mousePosition: {
|
|
20
71
|
clientX: number;
|
|
21
72
|
clientY: number;
|
|
22
73
|
}, element?: HTMLElement, rect?: DOMRect) => boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Tạo sự kiện Kéo-Thả (Drag) nâng cao dựa trên RxJS cho một Element.
|
|
76
|
+
* @param config Cấu hình sự kiện (element, các hàm callback, destroyRef)
|
|
77
|
+
* @returns Observable phát ra sự kiện mousemove trong quá trình kéo
|
|
78
|
+
*/
|
|
23
79
|
export declare const getDragEventByElement: (config: {
|
|
24
80
|
elementMouseDown: HTMLElement;
|
|
25
81
|
functionMouseDown?: (event: MouseEvent) => void;
|
package/download.d.ts
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tải file từ URL bằng XMLHttpRequest.
|
|
3
|
+
* Khác với `downloadFileByUrl`, hàm này sử dụng XHR để tải file, hữu ích hơn
|
|
4
|
+
* trong các trường hợp cần header tùy chỉnh hoặc gọi API nội bộ.
|
|
5
|
+
* @param fileUrl URL của file cần tải
|
|
6
|
+
* @param filename Tên file sẽ được lưu về máy
|
|
7
|
+
*/
|
|
1
8
|
export declare const downloadFileByUrlUseXmlRequest: (fileUrl: string, filename: string) => void;
|
|
9
|
+
/**
|
|
10
|
+
* Tải file từ URL bằng cách tạo thẻ `<a>` ảo và kích hoạt sự kiện click.
|
|
11
|
+
* Hỗ trợ chế độ mở file trên tab mới (onlyOpen) hoặc tải xuống thực sự.
|
|
12
|
+
* @param fileUrl URL trực tiếp của file hoặc Blob URL
|
|
13
|
+
* @param filename Tên file sẽ được lưu khi tải về
|
|
14
|
+
* @param onlyOpen Nếu `true`, chỉ mở file trong tab mới thay vì tải về
|
|
15
|
+
*/
|
|
2
16
|
export declare const downloadFileByUrl: (fileUrl: string, filename: string, onlyOpen?: boolean) => Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Tải ảnh từ một phần tử `<img>` dựa trên thuộc tính `src` (hỗ trợ Base64 Data URL).
|
|
19
|
+
* Thường dùng để cho phép người dùng lưu ảnh barcode, QR code về máy.
|
|
20
|
+
* @param imageElement Phần tử `<img>` cần lấy ảnh
|
|
21
|
+
* @param typeFileDownload Loại MIME của file (mặc định: 'image/png')
|
|
22
|
+
* @param nameFile Tên file sẽ được lưu (mặc định: 'barcode')
|
|
23
|
+
*/
|
|
3
24
|
export declare const downloadImageFromELement: (imageElement: HTMLImageElement, typeFileDownload?: string, nameFile?: string) => void;
|
package/esm2022/base64.mjs
CHANGED
|
@@ -1,10 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { decodeURI, encodeURI } from './uri';
|
|
2
|
+
/**
|
|
3
|
+
* Mã hóa chuỗi thành Base64 (có hỗ trợ ký tự đặc biệt qua encodeURI)
|
|
4
|
+
* @param value Chuỗi cần mã hóa
|
|
5
|
+
* @returns Chuỗi đã mã hóa Base64
|
|
6
|
+
*/
|
|
2
7
|
export const base64Encode = (value) => {
|
|
3
8
|
return btoa(encodeURI(value));
|
|
4
9
|
};
|
|
10
|
+
/**
|
|
11
|
+
* Giải mã chuỗi Base64 (có hỗ trợ ký tự đặc biệt qua decodeURI)
|
|
12
|
+
* @param value Chuỗi Base64 cần giải mã
|
|
13
|
+
* @returns Chuỗi đã giải mã
|
|
14
|
+
*/
|
|
5
15
|
export const base64Decode = (value) => {
|
|
6
16
|
return decodeURI(atob(value));
|
|
7
17
|
};
|
|
18
|
+
/**
|
|
19
|
+
* Chuyển đổi dữ liệu Base64 thành Blob
|
|
20
|
+
* @param dataBase64 Dữ liệu Base64 (có thể bao gồm marker ;base64,)
|
|
21
|
+
* @returns Blob tương ứng
|
|
22
|
+
*/
|
|
8
23
|
export const convertBase64ToBlob = (dataBase64) => {
|
|
9
24
|
const BASE64_MARKER = ';base64,';
|
|
10
25
|
if (dataBase64.indexOf(BASE64_MARKER) === -1) {
|
|
@@ -25,12 +40,22 @@ export const convertBase64ToBlob = (dataBase64) => {
|
|
|
25
40
|
const blob = new Blob([uInt8Array], { type: contentType });
|
|
26
41
|
return blob;
|
|
27
42
|
};
|
|
43
|
+
/**
|
|
44
|
+
* Chuyển đổi File thành Base64 string hoặc Object URL tùy loại file
|
|
45
|
+
* @param file Đối tượng File cần chuyển đổi
|
|
46
|
+
* @returns Nếu là ảnh, trả về Base64 string. Ngược lại trả về Object URL.
|
|
47
|
+
*/
|
|
28
48
|
export const convertFileToBase64_ObjectUrl = async (file) => {
|
|
29
49
|
if (!file.type.match(/image.*/)) {
|
|
30
50
|
return URL.createObjectURL(file);
|
|
31
51
|
}
|
|
32
52
|
return await convertFileToBase64(file);
|
|
33
53
|
};
|
|
54
|
+
/**
|
|
55
|
+
* Chuyển đổi File thành Base64 string
|
|
56
|
+
* @param file Đối tượng File cần chuyển đổi
|
|
57
|
+
* @returns Promise chứa chuỗi Base64
|
|
58
|
+
*/
|
|
34
59
|
export const convertFileToBase64 = (file) => {
|
|
35
60
|
return new Promise((resolve) => {
|
|
36
61
|
const reader = new FileReader();
|
|
@@ -40,4 +65,4 @@ export const convertFileToBase64 = (file) => {
|
|
|
40
65
|
};
|
|
41
66
|
});
|
|
42
67
|
};
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZTY0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvYmFzZTY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBRTdDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUM1QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDNUMsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsVUFBa0IsRUFBRSxFQUFFO0lBQ3hELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztJQUVqQyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0MsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUVwRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBRTNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFHLEtBQUssRUFBRSxJQUFVLEVBQWlDLEVBQUU7SUFDL0YsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDaEMsT0FBTyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxPQUFPLE1BQU0sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDO0FBRUY7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLENBQUMsSUFBVSxFQUFpQyxFQUFFO0lBQy9FLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBRWhDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRlY29kZVVSSSwgZW5jb2RlVVJJIH0gZnJvbSAnLi91cmknO1xuXG4vKipcbiAqIE3DoyBow7NhIGNodeG7l2kgdGjDoG5oIEJhc2U2NCAoY8OzIGjhu5cgdHLhu6Mga8O9IHThu7EgxJHhurdjIGJp4buHdCBxdWEgZW5jb2RlVVJJKVxuICogQHBhcmFtIHZhbHVlIENodeG7l2kgY+G6p24gbcOjIGjDs2FcbiAqIEByZXR1cm5zIENodeG7l2kgxJHDoyBtw6MgaMOzYSBCYXNlNjRcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2U2NEVuY29kZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBidG9hKGVuY29kZVVSSSh2YWx1ZSkpO1xufTtcblxuLyoqXG4gKiBHaeG6o2kgbcOjIGNodeG7l2kgQmFzZTY0IChjw7MgaOG7lyB0cuG7oyBrw70gdOG7sSDEkeG6t2MgYmnhu4d0IHF1YSBkZWNvZGVVUkkpXG4gKiBAcGFyYW0gdmFsdWUgQ2h14buXaSBCYXNlNjQgY+G6p24gZ2nhuqNpIG3Do1xuICogQHJldHVybnMgQ2h14buXaSDEkcOjIGdp4bqjaSBtw6NcbiAqL1xuZXhwb3J0IGNvbnN0IGJhc2U2NERlY29kZSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBkZWNvZGVVUkkoYXRvYih2YWx1ZSkpO1xufTtcblxuLyoqXG4gKiBDaHV54buDbiDEkeG7lWkgZOG7ryBsaeG7h3UgQmFzZTY0IHRow6BuaCBCbG9iXG4gKiBAcGFyYW0gZGF0YUJhc2U2NCBE4buvIGxp4buHdSBCYXNlNjQgKGPDsyB0aOG7gyBiYW8gZ+G7k20gbWFya2VyIDtiYXNlNjQsKVxuICogQHJldHVybnMgQmxvYiB0xrDGoW5nIOG7qW5nXG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0QmFzZTY0VG9CbG9iID0gKGRhdGFCYXNlNjQ6IHN0cmluZykgPT4ge1xuICBjb25zdCBCQVNFNjRfTUFSS0VSID0gJztiYXNlNjQsJztcblxuICBpZiAoZGF0YUJhc2U2NC5pbmRleE9mKEJBU0U2NF9NQVJLRVIpID09PSAtMSkge1xuICAgIGNvbnN0IHBhcnRzID0gZGF0YUJhc2U2NC5zcGxpdCgnLCcpO1xuICAgIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFydHNbMF0uc3BsaXQoJzonKVsxXTtcbiAgICBjb25zdCByYXcgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3Jhd10sIHsgdHlwZTogY29udGVudFR5cGUgfSk7XG5cbiAgICByZXR1cm4gYmxvYjtcbiAgfVxuICBjb25zdCBwYXJ0cyA9IGRhdGFCYXNlNjQuc3BsaXQoQkFTRTY0X01BUktFUik7XG4gIGNvbnN0IGNvbnRlbnRUeXBlID0gcGFydHNbMF0uc3BsaXQoJzonKVsxXTtcbiAgY29uc3QgcmF3ID0gd2luZG93LmF0b2IocGFydHNbMV0pO1xuICBjb25zdCByYXdMZW5ndGggPSByYXcubGVuZ3RoO1xuICBjb25zdCB1SW50OEFycmF5ID0gbmV3IFVpbnQ4QXJyYXkocmF3TGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0xlbmd0aDsgKytpKSB7XG4gICAgdUludDhBcnJheVtpXSA9IHJhdy5jaGFyQ29kZUF0KGkpO1xuICB9XG5cbiAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt1SW50OEFycmF5XSwgeyB0eXBlOiBjb250ZW50VHlwZSB9KTtcblxuICByZXR1cm4gYmxvYjtcbn07XG5cbi8qKlxuICogQ2h1eeG7g24gxJHhu5VpIEZpbGUgdGjDoG5oIEJhc2U2NCBzdHJpbmcgaG/hurdjIE9iamVjdCBVUkwgdMO5eSBsb+G6oWkgZmlsZVxuICogQHBhcmFtIGZpbGUgxJDhu5FpIHTGsOG7o25nIEZpbGUgY+G6p24gY2h1eeG7g24gxJHhu5VpXG4gKiBAcmV0dXJucyBO4bq/dSBsw6Ag4bqjbmgsIHRy4bqjIHbhu4EgQmFzZTY0IHN0cmluZy4gTmfGsOG7o2MgbOG6oWkgdHLhuqMgduG7gSBPYmplY3QgVVJMLlxuICovXG5leHBvcnQgY29uc3QgY29udmVydEZpbGVUb0Jhc2U2NF9PYmplY3RVcmwgPSBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8c3RyaW5nIHwgQXJyYXlCdWZmZXI+ID0+IHtcbiAgaWYgKCFmaWxlLnR5cGUubWF0Y2goL2ltYWdlLiovKSkge1xuICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGZpbGUpO1xuICB9XG5cbiAgcmV0dXJuIGF3YWl0IGNvbnZlcnRGaWxlVG9CYXNlNjQoZmlsZSk7XG59O1xuXG4vKipcbiAqIENodXnhu4NuIMSR4buVaSBGaWxlIHRow6BuaCBCYXNlNjQgc3RyaW5nXG4gKiBAcGFyYW0gZmlsZSDEkOG7kWkgdMaw4bujbmcgRmlsZSBj4bqnbiBjaHV54buDbiDEkeG7lWlcbiAqIEByZXR1cm5zIFByb21pc2UgY2jhu6lhIGNodeG7l2kgQmFzZTY0XG4gKi9cbmV4cG9ydCBjb25zdCBjb252ZXJ0RmlsZVRvQmFzZTY0ID0gKGZpbGU6IEZpbGUpOiBQcm9taXNlPHN0cmluZyB8IEFycmF5QnVmZmVyPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgICByZWFkZXIub25sb2FkID0gKGV2ZW50KSA9PiB7XG4gICAgICByZXNvbHZlKGV2ZW50LnRhcmdldD8ucmVzdWx0ID8/ICcnKTtcbiAgICB9O1xuICB9KTtcbn07XG4iXX0=
|