@libs-ui/utils 0.2.355-8 → 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/esm2022/uri.mjs
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
|
-
import { omitBy } from './helpers';
|
|
2
|
-
import { isNil } from './helpers';
|
|
1
|
+
import { isNil, omitBy } from './helpers';
|
|
3
2
|
export const ENCODE_URI_PATTERN = /%([0-9A-F]{2})/g;
|
|
3
|
+
/**
|
|
4
|
+
* Giải mã chuỗi URI một cách an toàn.
|
|
5
|
+
*
|
|
6
|
+
* @param value Chuỗi cần giải mã.
|
|
7
|
+
* @returns Chuỗi đã được giải mã.
|
|
8
|
+
*/
|
|
4
9
|
export const decodeURI = (value) => {
|
|
5
10
|
return decodeURIComponent(value
|
|
6
11
|
.split('')
|
|
@@ -9,11 +14,25 @@ export const decodeURI = (value) => {
|
|
|
9
14
|
})
|
|
10
15
|
.join(''));
|
|
11
16
|
};
|
|
17
|
+
/**
|
|
18
|
+
* Mã hóa chuỗi URI.
|
|
19
|
+
*
|
|
20
|
+
* @param value Chuỗi cần mã hóa.
|
|
21
|
+
* @returns Chuỗi đã được mã hóa.
|
|
22
|
+
*/
|
|
12
23
|
export const encodeURI = (value) => {
|
|
13
24
|
return encodeURIComponent(value).replace(ENCODE_URI_PATTERN, (match, p1) => {
|
|
14
25
|
return String.fromCharCode(parseInt(p1, 16));
|
|
15
26
|
});
|
|
16
27
|
};
|
|
28
|
+
/**
|
|
29
|
+
* Chuyển đổi đối tượng parameters thành chuỗi query string hoặc body string.
|
|
30
|
+
* Tự động loại bỏ các giá trị rỗng, null, hoặc undefined.
|
|
31
|
+
*
|
|
32
|
+
* @param params Đối tượng chứa các tham số.
|
|
33
|
+
* @param isBody Nếu true, trả về chuỗi không có dấu '?' ở đầu.
|
|
34
|
+
* @returns Chuỗi tham số đã được mã hóa.
|
|
35
|
+
*/
|
|
17
36
|
export const endCodeUrl = (params, isBody) => {
|
|
18
37
|
params = omitBy(params, (param) => param === '' || isNil(param));
|
|
19
38
|
let res = '';
|
|
@@ -22,4 +41,4 @@ export const endCodeUrl = (params, isBody) => {
|
|
|
22
41
|
}
|
|
23
42
|
return res === '' ? '' : `${isBody ? '' : '?'}${res.substring(1)}`;
|
|
24
43
|
};
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvdXJpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLGlCQUFpQixDQUFDO0FBRXBEOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYSxFQUFFLEVBQUU7SUFDekMsT0FBTyxrQkFBa0IsQ0FDdkIsS0FBSztTQUNGLEtBQUssQ0FBQyxFQUFFLENBQUM7U0FDVCxHQUFHLENBQUMsQ0FBQyxDQUFTLEVBQUUsRUFBRTtRQUNqQixPQUFPLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FDWixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUY7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUN6QyxPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUN6RSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUY7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQW1CLEVBQUUsTUFBZSxFQUFVLEVBQUU7SUFDekUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxFQUFFLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDakUsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO0lBRWIsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixHQUFHLElBQUksSUFBSSxDQUFDLElBQUksa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDckUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVFlQRV9PQkpFQ1QgfSBmcm9tICdAbGlicy11aS9pbnRlcmZhY2VzLXR5cGVzJztcbmltcG9ydCB7IGlzTmlsLCBvbWl0QnkgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgRU5DT0RFX1VSSV9QQVRURVJOID0gLyUoWzAtOUEtRl17Mn0pL2c7XG5cbi8qKlxuICogR2nhuqNpIG3DoyBjaHXhu5dpIFVSSSBt4buZdCBjw6FjaCBhbiB0b8Ogbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgQ2h14buXaSBj4bqnbiBnaeG6o2kgbcOjLlxuICogQHJldHVybnMgQ2h14buXaSDEkcOjIMSRxrDhu6NjIGdp4bqjaSBtw6MuXG4gKi9cbmV4cG9ydCBjb25zdCBkZWNvZGVVUkkgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KFxuICAgIHZhbHVlXG4gICAgICAuc3BsaXQoJycpXG4gICAgICAubWFwKChjOiBzdHJpbmcpID0+IHtcbiAgICAgICAgcmV0dXJuICclJyArICgnMDAnICsgYy5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSkuc2xpY2UoLTIpO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKVxuICApO1xufTtcblxuLyoqXG4gKiBNw6MgaMOzYSBjaHXhu5dpIFVSSS5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgQ2h14buXaSBj4bqnbiBtw6MgaMOzYS5cbiAqIEByZXR1cm5zIENodeG7l2kgxJHDoyDEkcaw4bujYyBtw6MgaMOzYS5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuY29kZVVSSSA9ICh2YWx1ZTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpLnJlcGxhY2UoRU5DT0RFX1VSSV9QQVRURVJOLCAobWF0Y2gsIHAxKSA9PiB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUocGFyc2VJbnQocDEsIDE2KSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBDaHV54buDbiDEkeG7lWkgxJHhu5FpIHTGsOG7o25nIHBhcmFtZXRlcnMgdGjDoG5oIGNodeG7l2kgcXVlcnkgc3RyaW5nIGhv4bq3YyBib2R5IHN0cmluZy5cbiAqIFThu7EgxJHhu5luZyBsb+G6oWkgYuG7jyBjw6FjIGdpw6EgdHLhu4sgcuG7l25nLCBudWxsLCBob+G6t2MgdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgxJDhu5FpIHTGsOG7o25nIGNo4bupYSBjw6FjIHRoYW0gc+G7kS5cbiAqIEBwYXJhbSBpc0JvZHkgTuG6v3UgdHJ1ZSwgdHLhuqMgduG7gSBjaHXhu5dpIGtow7RuZyBjw7MgZOG6pXUgJz8nIOG7nyDEkeG6p3UuXG4gKiBAcmV0dXJucyBDaHXhu5dpIHRoYW0gc+G7kSDEkcOjIMSRxrDhu6NjIG3DoyBow7NhLlxuICovXG5leHBvcnQgY29uc3QgZW5kQ29kZVVybCA9IChwYXJhbXM6IFRZUEVfT0JKRUNULCBpc0JvZHk6IGJvb2xlYW4pOiBzdHJpbmcgPT4ge1xuICBwYXJhbXMgPSBvbWl0QnkocGFyYW1zLCAocGFyYW0pID0+IHBhcmFtID09PSAnJyB8fCBpc05pbChwYXJhbSkpO1xuICBsZXQgcmVzID0gJyc7XG5cbiAgZm9yIChjb25zdCBwIGluIHBhcmFtcykge1xuICAgIHJlcyArPSBgJiR7cH09JHtlbmNvZGVVUklDb21wb25lbnQocGFyYW1zW3BdKX1gO1xuICB9XG5cbiAgcmV0dXJuIHJlcyA9PT0gJycgPyAnJyA6IGAke2lzQm9keSA/ICcnIDogJz8nfSR7cmVzLnN1YnN0cmluZygxKX1gO1xufTtcbiJdfQ==
|
|
@@ -1,17 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tiện ích xử lý tham số truy vấn trên URL (URL Search Parameters).
|
|
3
|
+
* Cung cấp các phương thức để parse, thêm, xóa, lấy giá trị và so sánh các tham số.
|
|
4
|
+
*/
|
|
1
5
|
export class UtilsUrlSearchParams {
|
|
2
6
|
static instance;
|
|
3
7
|
params;
|
|
8
|
+
/**
|
|
9
|
+
* Khởi tạo UtilsUrlSearchParams từ một chuỗi query string.
|
|
10
|
+
* @param paramString Chuỗi tham số (ví dụ: "?id=1&name=test" hoặc đơn giản là "id=1&name=test").
|
|
11
|
+
*/
|
|
4
12
|
constructor(paramString) {
|
|
5
13
|
this.params = new Array();
|
|
6
14
|
this.params.length = 0;
|
|
7
15
|
this.params.push(...this.buildParams(paramString));
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Lấy instance duy nhất (Singleton) của UtilsUrlSearchParams.
|
|
19
|
+
* @returns {UtilsUrlSearchParams} Instance của lớp.
|
|
20
|
+
*/
|
|
9
21
|
static getInstance() {
|
|
10
22
|
if (!this.instance) {
|
|
11
23
|
this.instance = new UtilsUrlSearchParams('');
|
|
12
24
|
}
|
|
13
25
|
return this.instance;
|
|
14
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* Chuyển đổi một đối tượng key-value thành chuỗi query string.
|
|
29
|
+
* @param params Đối tượng chứa các tham số (ví dụ: { id: "1", name: "test" }).
|
|
30
|
+
* @returns {string} Chuỗi query string đã được sắp xếp theo key (ví dụ: "id=1&name=test").
|
|
31
|
+
*/
|
|
15
32
|
static toStringParamObject(params) {
|
|
16
33
|
const paramsArr = Object.keys(params).map((key) => {
|
|
17
34
|
return {
|
|
@@ -21,6 +38,12 @@ export class UtilsUrlSearchParams {
|
|
|
21
38
|
});
|
|
22
39
|
return UtilsUrlSearchParams.ToString(paramsArr);
|
|
23
40
|
}
|
|
41
|
+
/**
|
|
42
|
+
* Chuyển đổi mảng các cặp key-value thành chuỗi query string.
|
|
43
|
+
* Các tham số sẽ được sắp xếp theo thứ tự bảng chữ cái của key.
|
|
44
|
+
* @param params Mảng các đối tượng { key, value }.
|
|
45
|
+
* @returns {string} Chuỗi query string.
|
|
46
|
+
*/
|
|
24
47
|
static ToString(params) {
|
|
25
48
|
let paramsStr = '';
|
|
26
49
|
params
|
|
@@ -31,6 +54,12 @@ export class UtilsUrlSearchParams {
|
|
|
31
54
|
});
|
|
32
55
|
return paramsStr;
|
|
33
56
|
}
|
|
57
|
+
/**
|
|
58
|
+
* Phân tích chuỗi query string thành mảng các cặp key-value.
|
|
59
|
+
* Tự động decode các giá trị và xử lý các trường hợp URL lỗi (nhiều dấu ?).
|
|
60
|
+
* @param paramString Chuỗi cần phân tích.
|
|
61
|
+
* @returns {Array<{ key: string; value: string }>} Mảng kết quả.
|
|
62
|
+
*/
|
|
34
63
|
buildParams(paramString) {
|
|
35
64
|
const paramsBuild = new Array();
|
|
36
65
|
if (!paramString) {
|
|
@@ -56,6 +85,11 @@ export class UtilsUrlSearchParams {
|
|
|
56
85
|
}
|
|
57
86
|
return paramsBuild;
|
|
58
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Thêm hoặc cập nhật giá trị của một tham số.
|
|
90
|
+
* @param key Tên tham số.
|
|
91
|
+
* @param value Giá trị tham số.
|
|
92
|
+
*/
|
|
59
93
|
set(key, value) {
|
|
60
94
|
const paramByKey = this.params.find((param) => param.key === key);
|
|
61
95
|
if (!paramByKey) {
|
|
@@ -64,25 +98,51 @@ export class UtilsUrlSearchParams {
|
|
|
64
98
|
}
|
|
65
99
|
paramByKey['value'] = value;
|
|
66
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Lấy giá trị của một tham số theo key.
|
|
103
|
+
* @param key Tên tham số cần lấy.
|
|
104
|
+
* @returns {string | undefined} Giá trị của tham số hoặc undefined nếu không tìm thấy.
|
|
105
|
+
*/
|
|
67
106
|
get(key) {
|
|
68
107
|
return this.params.find((param) => param.key === key)?.value;
|
|
69
108
|
}
|
|
109
|
+
/**
|
|
110
|
+
* Kiểm tra xem một tham số có tồn tại hay không.
|
|
111
|
+
* @param key Tên tham số cần kiểm tra.
|
|
112
|
+
* @returns {boolean} True nếu tồn tại.
|
|
113
|
+
*/
|
|
70
114
|
has(key) {
|
|
71
115
|
return this.params.some((param) => param.key === key);
|
|
72
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Xóa một tham số khỏi danh sách.
|
|
119
|
+
* @param key Tên tham số cần xóa.
|
|
120
|
+
*/
|
|
73
121
|
delete(key) {
|
|
74
122
|
const index = this.params.findIndex((param) => param.key === key);
|
|
75
123
|
if (index >= 0) {
|
|
76
124
|
this.params.splice(index, 1);
|
|
77
125
|
}
|
|
78
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* @returns {number} Số lượng tham số hiện có.
|
|
129
|
+
*/
|
|
79
130
|
length() {
|
|
80
131
|
return this.params.length;
|
|
81
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* Chuyển đổi các tham số hiện tại (hoặc mảng truyền vào) thành chuỗi query string.
|
|
135
|
+
* @param params (Tùy chọn) Mảng tham số cần convert. Nếu không truyền sẽ dùng params nội bộ.
|
|
136
|
+
* @returns {string} Chuỗi query string.
|
|
137
|
+
*/
|
|
82
138
|
toString(params) {
|
|
83
139
|
params = params || this.params;
|
|
84
140
|
return UtilsUrlSearchParams.ToString(params);
|
|
85
141
|
}
|
|
142
|
+
/**
|
|
143
|
+
* Chuyển đổi danh sách tham số hiện tại thành một đối tượng plain object.
|
|
144
|
+
* @returns {Record<string, string>} Đối tượng key-value.
|
|
145
|
+
*/
|
|
86
146
|
getParamObject() {
|
|
87
147
|
const params = {};
|
|
88
148
|
this.params.forEach((item) => {
|
|
@@ -90,10 +150,17 @@ export class UtilsUrlSearchParams {
|
|
|
90
150
|
});
|
|
91
151
|
return params;
|
|
92
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* So sánh hai chuỗi query string xem chúng có chứa cùng tập tham số và giá trị hay không.
|
|
155
|
+
* Thứ tự các tham số trong chuỗi ban đầu không quan trọng.
|
|
156
|
+
* @param param1 Chuỗi thứ nhất.
|
|
157
|
+
* @param param2 Chuỗi thứ hai.
|
|
158
|
+
* @returns {boolean} True nếu giống nhau.
|
|
159
|
+
*/
|
|
93
160
|
compareParams(param1, param2) {
|
|
94
161
|
const params1 = this.toString(this.buildParams(param1));
|
|
95
162
|
const params2 = this.toString(this.buildParams(param2));
|
|
96
163
|
return params1 === params2;
|
|
97
164
|
}
|
|
98
165
|
}
|
|
99
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXNlYXJjaC1wYXJhbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy91cmwtc2VhcmNoLXBhcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sb0JBQW9CO0lBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQXVCO0lBQ3RDLE1BQU0sQ0FBd0M7SUFDdEQsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFrQyxDQUFDO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRU0sTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQW1DO1FBQ25FLE1BQU0sU0FBUyxHQUEwQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ3ZGLE9BQU87Z0JBQ0wsR0FBRztnQkFDSCxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQzthQUNuQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU0sTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUE2QztRQUNsRSxJQUFJLFNBQVMs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QyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxhQUFhLENBQUMsTUFBYyxFQUFFLE1BQWM7UUFDakQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFFeEQsT0FBTyxPQUFPLEtBQUssT0FBTyxDQUFDO0lBQzdCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBVdGlsc1VybFNlYXJjaFBhcmFtcyB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBVdGlsc1VybFNlYXJjaFBhcmFtcztcbiAgcHJpdmF0ZSBwYXJhbXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT47XG4gIGNvbnN0cnVjdG9yKHBhcmFtU3RyaW5nOiBzdHJpbmcpIHtcbiAgICB0aGlzLnBhcmFtcyA9IG5ldyBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCk7XG4gICAgdGhpcy5wYXJhbXMubGVuZ3RoID0gMDtcbiAgICB0aGlzLnBhcmFtcy5wdXNoKC4uLnRoaXMuYnVpbGRQYXJhbXMocGFyYW1TdHJpbmcpKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVXRpbHNVcmxTZWFyY2hQYXJhbXMoJycpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b1N0cmluZ1BhcmFtT2JqZWN0KHBhcmFtczogeyBba2V5IGluIHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgY29uc3QgcGFyYW1zQXJyOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+ID0gT2JqZWN0LmtleXMocGFyYW1zKS5tYXAoKGtleSkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICB2YWx1ZTogcGFyYW1zW2tleV0sXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIFV0aWxzVXJsU2VhcmNoUGFyYW1zLlRvU3RyaW5nKHBhcmFtc0Fycik7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIFRvU3RyaW5nKHBhcmFtczogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9Pikge1xuICAgIGxldCBwYXJhbXNTdHIgPSAnJztcblxuICAgIHBhcmFtc1xuICAgICAgLnNvcnQoKGl0ZW0xLCBpdGVtMikgPT4gaXRlbTEua2V5LmxvY2FsZUNvbXBhcmUoaXRlbTIua2V5KSlcbiAgICAgIC5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IHsga2V5LCB2YWx1ZSB9ID0gaXRlbTtcblxuICAgICAgICBwYXJhbXNTdHIgPSBgJHtwYXJhbXNTdHJ9JHtwYXJhbXNTdHIgPyAnJicgOiAnJ30ke2tleX09JHt2YWx1ZX1gO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gcGFyYW1zU3RyO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFBhcmFtcyhwYXJhbVN0cmluZzogc3RyaW5nKTogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcGFyYW1zQnVpbGQgPSBuZXcgQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PigpO1xuXG4gICAgaWYgKCFwYXJhbVN0cmluZykge1xuICAgICAgcmV0dXJuIHBhcmFtc0J1aWxkO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtc0Vycm9yID0gcGFyYW1TdHJpbmcuc3BsaXQoJz8nKTtcblxuICAgIGlmIChwYXJhbXNFcnJvci5sZW5ndGggPiAyKSB7XG4gICAgICBwYXJhbVN0cmluZyA9IGAke3BhcmFtc0Vycm9yWzBdfT8ke3BhcmFtc0Vycm9yWzFdfSYke3BhcmFtc0Vycm9yLnNsaWNlKDIpLmpvaW4oJyYnKX1gO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtU3RyaW5nLnJlcGxhY2UoL1xcUytbP10vZywgJycpLnNwbGl0KCcmJyk7XG5cbiAgICBpZiAocGFyYW1zKSB7XG4gICAgICBwYXJhbXMuZm9yRWFjaCgocGFyYW0pID0+IHtcbiAgICAgICAgaWYgKHBhcmFtLmluZGV4T2YoJz0nKSA8IDApIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IFtrZXksIHZhbHVlXSA9IHBhcmFtLnNwbGl0KCc9Jyk7XG5cbiAgICAgICAga2V5ID0ga2V5LnJlcGxhY2UoL1s/Jl0rL2csICcnKTtcbiAgICAgICAgdmFsdWUgPSBkZWNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZSgvXFwrL2csICcgJykpO1xuICAgICAgICBpZiAoIXBhcmFtc0J1aWxkLnNvbWUoKHBhcmFtKSA9PiBwYXJhbS5rZXkgPT09IGtleSkpIHtcbiAgICAgICAgICBwYXJhbXNCdWlsZC5wdXNoKHsga2V5LCB2YWx1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtc0J1aWxkO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtQnlLZXkgPSB0aGlzLnBhcmFtcy5maW5kKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBrZXkpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICBpZiAoIXBhcmFtQnlLZXkpIHtcbiAgICAgIHRoaXMucGFyYW1zLnB1c2goeyBrZXksIHZhbHVlOiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZSgvXFwrL2csICcgJykpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGFyYW1CeUtleVsndmFsdWUnXSA9IHZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5maW5kKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBrZXkpPy52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBoYXMoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuc29tZSgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0ga2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBkZWxldGUoa2V5OiBzdHJpbmcpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMucGFyYW1zLmZpbmRJbmRleCgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0ga2V5KTtcblxuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICB0aGlzLnBhcmFtcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyB0b1N0cmluZyhwYXJhbXM/OiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KSB7XG4gICAgcGFyYW1zID0gcGFyYW1zIHx8IHRoaXMucGFyYW1zO1xuXG4gICAgcmV0dXJuIFV0aWxzVXJsU2VhcmNoUGFyYW1zLlRvU3RyaW5nKHBhcmFtcyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1PYmplY3QoKSB7XG4gICAgY29uc3QgcGFyYW1zID0ge30gYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblxuICAgIHRoaXMucGFyYW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHBhcmFtc1tpdGVtLmtleV0gPSBpdGVtLnZhbHVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHB1YmxpYyBjb21wYXJlUGFyYW1zKHBhcmFtMTogc3RyaW5nLCBwYXJhbTI6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtczEgPSB0aGlzLnRvU3RyaW5nKHRoaXMuYnVpbGRQYXJhbXMocGFyYW0xKSk7XG4gICAgY29uc3QgcGFyYW1zMiA9IHRoaXMudG9TdHJpbmcodGhpcy5idWlsZFBhcmFtcyhwYXJhbTIpKTtcblxuICAgIHJldHVybiBwYXJhbXMxID09PSBwYXJhbXMyO1xuICB9XG59XG4iXX0=
|
|
166
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLXNlYXJjaC1wYXJhbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzLXVpL3V0aWxzL3NyYy91cmwtc2VhcmNoLXBhcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sb0JBQW9CO0lBQ3ZCLE1BQU0sQ0FBQyxRQUFRLENBQXVCO0lBQ3RDLE1BQU0sQ0FBd0M7SUFFdEQ7OztPQUdHO0lBQ0gsWUFBWSxXQUFtQjtRQUM3QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksS0FBSyxFQUFrQyxDQUFDO1FBQzFELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTSxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksb0JBQW9CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0MsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFtQztRQUNuRSxNQUFNLFNBQVMsR0FBMEMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN2RixPQUFPO2dCQUNMLEdBQUc7Z0JBQ0gsS0FBSyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUM7YUFDbkIsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxvQkFBb0IsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FB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O0lBQ0ksY0FBYztRQUNuQixNQUFNLE1BQU0sR0FBRyxFQUE0QixDQUFDO1FBRTVDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGFBQWEsQ0FBQyxNQUFjLEVBQUUsTUFBYztRQUNqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUV4RCxPQUFPLE9BQU8sS0FBSyxPQUFPLENBQUM7SUFDN0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaeG7h24gw61jaCB44butIGzDvSB0aGFtIHPhu5EgdHJ1eSB24bqlbiB0csOqbiBVUkwgKFVSTCBTZWFyY2ggUGFyYW1ldGVycykuXG4gKiBDdW5nIGPhuqVwIGPDoWMgcGjGsMahbmcgdGjhu6ljIMSR4buDIHBhcnNlLCB0aMOqbSwgeMOzYSwgbOG6pXkgZ2nDoSB0cuG7iyB2w6Agc28gc8OhbmggY8OhYyB0aGFtIHPhu5EuXG4gKi9cbmV4cG9ydCBjbGFzcyBVdGlsc1VybFNlYXJjaFBhcmFtcyB7XG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBVdGlsc1VybFNlYXJjaFBhcmFtcztcbiAgcHJpdmF0ZSBwYXJhbXM6IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT47XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBVdGlsc1VybFNlYXJjaFBhcmFtcyB04burIG3hu5l0IGNodeG7l2kgcXVlcnkgc3RyaW5nLlxuICAgKiBAcGFyYW0gcGFyYW1TdHJpbmcgQ2h14buXaSB0aGFtIHPhu5EgKHbDrSBk4bulOiBcIj9pZD0xJm5hbWU9dGVzdFwiIGhv4bq3YyDEkcahbiBnaeG6o24gbMOgIFwiaWQ9MSZuYW1lPXRlc3RcIikuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwYXJhbVN0cmluZzogc3RyaW5nKSB7XG4gICAgdGhpcy5wYXJhbXMgPSBuZXcgQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PigpO1xuICAgIHRoaXMucGFyYW1zLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5wYXJhbXMucHVzaCguLi50aGlzLmJ1aWxkUGFyYW1zKHBhcmFtU3RyaW5nKSk7XG4gIH1cblxuICAvKipcbiAgICogTOG6pXkgaW5zdGFuY2UgZHV5IG5o4bqldCAoU2luZ2xldG9uKSBj4bunYSBVdGlsc1VybFNlYXJjaFBhcmFtcy5cbiAgICogQHJldHVybnMge1V0aWxzVXJsU2VhcmNoUGFyYW1zfSBJbnN0YW5jZSBj4bunYSBs4bubcC5cbiAgICovXG4gIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICBpZiAoIXRoaXMuaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMuaW5zdGFuY2UgPSBuZXcgVXRpbHNVcmxTZWFyY2hQYXJhbXMoJycpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmluc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENodXnhu4NuIMSR4buVaSBt4buZdCDEkeG7kWkgdMaw4bujbmcga2V5LXZhbHVlIHRow6BuaCBjaHXhu5dpIHF1ZXJ5IHN0cmluZy5cbiAgICogQHBhcmFtIHBhcmFtcyDEkOG7kWkgdMaw4bujbmcgY2jhu6lhIGPDoWMgdGhhbSBz4buRICh2w60gZOG7pTogeyBpZDogXCIxXCIsIG5hbWU6IFwidGVzdFwiIH0pLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaHXhu5dpIHF1ZXJ5IHN0cmluZyDEkcOjIMSRxrDhu6NjIHPhuq9wIHjhur9wIHRoZW8ga2V5ICh2w60gZOG7pTogXCJpZD0xJm5hbWU9dGVzdFwiKS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdG9TdHJpbmdQYXJhbU9iamVjdChwYXJhbXM6IHsgW2tleSBpbiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGNvbnN0IHBhcmFtc0FycjogQXJyYXk8eyBrZXk6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9PiA9IE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrZXkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGtleSxcbiAgICAgICAgdmFsdWU6IHBhcmFtc1trZXldLFxuICAgICAgfTtcbiAgICB9KTtcblxuICAgIHJldHVybiBVdGlsc1VybFNlYXJjaFBhcmFtcy5Ub1N0cmluZyhwYXJhbXNBcnIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENodXnhu4NuIMSR4buVaSBt4bqjbmcgY8OhYyBj4bq3cCBrZXktdmFsdWUgdGjDoG5oIGNodeG7l2kgcXVlcnkgc3RyaW5nLlxuICAgKiBDw6FjIHRoYW0gc+G7kSBz4bq9IMSRxrDhu6NjIHPhuq9wIHjhur9wIHRoZW8gdGjhu6kgdOG7sSBi4bqjbmcgY2jhu68gY8OhaSBj4bunYSBrZXkuXG4gICAqIEBwYXJhbSBwYXJhbXMgTeG6o25nIGPDoWMgxJHhu5FpIHTGsOG7o25nIHsga2V5LCB2YWx1ZSB9LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDaHXhu5dpIHF1ZXJ5IHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgVG9TdHJpbmcocGFyYW1zOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KSB7XG4gICAgbGV0IHBhcmFtc1N0ciA9ICcnO1xuXG4gICAgcGFyYW1zXG4gICAgICAuc29ydCgoaXRlbTEsIGl0ZW0yKSA9PiBpdGVtMS5rZXkubG9jYWxlQ29tcGFyZShpdGVtMi5rZXkpKVxuICAgICAgLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgeyBrZXksIHZhbHVlIH0gPSBpdGVtO1xuXG4gICAgICAgIHBhcmFtc1N0ciA9IGAke3BhcmFtc1N0cn0ke3BhcmFtc1N0ciA/ICcmJyA6ICcnfSR7a2V5fT0ke3ZhbHVlfWA7XG4gICAgICB9KTtcblxuICAgIHJldHVybiBwYXJhbXNTdHI7XG4gIH1cblxuICAvKipcbiAgICogUGjDom4gdMOtY2ggY2h14buXaSBxdWVyeSBzdHJpbmcgdGjDoG5oIG3huqNuZyBjw6FjIGPhurdwIGtleS12YWx1ZS5cbiAgICogVOG7sSDEkeG7mW5nIGRlY29kZSBjw6FjIGdpw6EgdHLhu4sgdsOgIHjhu60gbMO9IGPDoWMgdHLGsOG7nW5nIGjhu6NwIFVSTCBs4buXaSAobmhp4buBdSBk4bqldSA/KS5cbiAgICogQHBhcmFtIHBhcmFtU3RyaW5nIENodeG7l2kgY+G6p24gcGjDom4gdMOtY2guXG4gICAqIEByZXR1cm5zIHtBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+fSBN4bqjbmcga+G6v3QgcXXhuqMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkUGFyYW1zKHBhcmFtU3RyaW5nOiBzdHJpbmcpOiBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+IHtcbiAgICBjb25zdCBwYXJhbXNCdWlsZCA9IG5ldyBBcnJheTx7IGtleTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0+KCk7XG5cbiAgICBpZiAoIXBhcmFtU3RyaW5nKSB7XG4gICAgICByZXR1cm4gcGFyYW1zQnVpbGQ7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zRXJyb3IgPSBwYXJhbVN0cmluZy5zcGxpdCgnPycpO1xuXG4gICAgaWYgKHBhcmFtc0Vycm9yLmxlbmd0aCA+IDIpIHtcbiAgICAgIHBhcmFtU3RyaW5nID0gYCR7cGFyYW1zRXJyb3JbMF19PyR7cGFyYW1zRXJyb3JbMV19JiR7cGFyYW1zRXJyb3Iuc2xpY2UoMikuam9pbignJicpfWA7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1zID0gcGFyYW1TdHJpbmcucmVwbGFjZSgvXFxTK1s/XS9nLCAnJykuc3BsaXQoJyYnKTtcblxuICAgIGlmIChwYXJhbXMpIHtcbiAgICAgIHBhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICBpZiAocGFyYW0uaW5kZXhPZignPScpIDwgMCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgW2tleSwgdmFsdWVdID0gcGFyYW0uc3BsaXQoJz0nKTtcblxuICAgICAgICBrZXkgPSBrZXkucmVwbGFjZSgvWz8mXSsvZywgJycpO1xuICAgICAgICB2YWx1ZSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZS5yZXBsYWNlKC9cXCsvZywgJyAnKSk7XG4gICAgICAgIGlmICghcGFyYW1zQnVpbGQuc29tZSgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0ga2V5KSkge1xuICAgICAgICAgIHBhcmFtc0J1aWxkLnB1c2goeyBrZXksIHZhbHVlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGFyYW1zQnVpbGQ7XG4gIH1cblxuICAvKipcbiAgICogVGjDqm0gaG/hurdjIGPhuq1wIG5o4bqtdCBnacOhIHRy4buLIGPhu6dhIG3hu5l0IHRoYW0gc+G7kS5cbiAgICogQHBhcmFtIGtleSBUw6puIHRoYW0gc+G7kS5cbiAgICogQHBhcmFtIHZhbHVlIEdpw6EgdHLhu4sgdGhhbSBz4buRLlxuICAgKi9cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtQnlLZXkgPSB0aGlzLnBhcmFtcy5maW5kKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBrZXkpIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgICBpZiAoIXBhcmFtQnlLZXkpIHtcbiAgICAgIHRoaXMucGFyYW1zLnB1c2goeyBrZXksIHZhbHVlOiBkZWNvZGVVUklDb21wb25lbnQodmFsdWUucmVwbGFjZSgvXFwrL2csICcgJykpIH0pO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcGFyYW1CeUtleVsndmFsdWUnXSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEzhuqV5IGdpw6EgdHLhu4sgY+G7p2EgbeG7mXQgdGhhbSBz4buRIHRoZW8ga2V5LlxuICAgKiBAcGFyYW0ga2V5IFTDqm4gdGhhbSBz4buRIGPhuqduIGzhuqV5LlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgdW5kZWZpbmVkfSBHacOhIHRy4buLIGPhu6dhIHRoYW0gc+G7kSBob+G6t2MgdW5kZWZpbmVkIG7hur91IGtow7RuZyB0w6xtIHRo4bqleS5cbiAgICovXG4gIHB1YmxpYyBnZXQoa2V5OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbXMuZmluZCgocGFyYW0pID0+IHBhcmFtLmtleSA9PT0ga2V5KT8udmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogS2nhu4NtIHRyYSB4ZW0gbeG7mXQgdGhhbSBz4buRIGPDsyB04buTbiB04bqhaSBoYXkga2jDtG5nLlxuICAgKiBAcGFyYW0ga2V5IFTDqm4gdGhhbSBz4buRIGPhuqduIGtp4buDbSB0cmEuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIG7hur91IHThu5NuIHThuqFpLlxuICAgKi9cbiAgcHVibGljIGhhcyhrZXk6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnBhcmFtcy5zb21lKChwYXJhbSkgPT4gcGFyYW0ua2V5ID09PSBrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFjDs2EgbeG7mXQgdGhhbSBz4buRIGto4buPaSBkYW5oIHPDoWNoLlxuICAgKiBAcGFyYW0ga2V5IFTDqm4gdGhhbSBz4buRIGPhuqduIHjDs2EuXG4gICAqL1xuICBwdWJsaWMgZGVsZXRlKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLnBhcmFtcy5maW5kSW5kZXgoKHBhcmFtKSA9PiBwYXJhbS5rZXkgPT09IGtleSk7XG5cbiAgICBpZiAoaW5kZXggPj0gMCkge1xuICAgICAgdGhpcy5wYXJhbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge251bWJlcn0gU+G7kSBsxrDhu6NuZyB0aGFtIHPhu5EgaGnhu4duIGPDsy5cbiAgICovXG4gIHB1YmxpYyBsZW5ndGgoKSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1zLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaHV54buDbiDEkeG7lWkgY8OhYyB0aGFtIHPhu5EgaGnhu4duIHThuqFpIChob+G6t2MgbeG6o25nIHRydXnhu4FuIHbDoG8pIHRow6BuaCBjaHXhu5dpIHF1ZXJ5IHN0cmluZy5cbiAgICogQHBhcmFtIHBhcmFtcyAoVMO5eSBjaOG7jW4pIE3huqNuZyB0aGFtIHPhu5EgY+G6p24gY29udmVydC4gTuG6v3Uga2jDtG5nIHRydXnhu4FuIHPhur0gZMO5bmcgcGFyYW1zIG7hu5lpIGLhu5kuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IENodeG7l2kgcXVlcnkgc3RyaW5nLlxuICAgKi9cbiAgcHVibGljIHRvU3RyaW5nKHBhcmFtcz86IEFycmF5PHsga2V5OiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfT4pIHtcbiAgICBwYXJhbXMgPSBwYXJhbXMgfHwgdGhpcy5wYXJhbXM7XG5cbiAgICByZXR1cm4gVXRpbHNVcmxTZWFyY2hQYXJhbXMuVG9TdHJpbmcocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaHV54buDbiDEkeG7lWkgZGFuaCBzw6FjaCB0aGFtIHPhu5EgaGnhu4duIHThuqFpIHRow6BuaCBt4buZdCDEkeG7kWkgdMaw4bujbmcgcGxhaW4gb2JqZWN0LlxuICAgKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gxJDhu5FpIHTGsOG7o25nIGtleS12YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBnZXRQYXJhbU9iamVjdCgpIHtcbiAgICBjb25zdCBwYXJhbXMgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gICAgdGhpcy5wYXJhbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgcGFyYW1zW2l0ZW0ua2V5XSA9IGl0ZW0udmFsdWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvIHPDoW5oIGhhaSBjaHXhu5dpIHF1ZXJ5IHN0cmluZyB4ZW0gY2jDum5nIGPDsyBjaOG7qWEgY8O5bmcgdOG6rXAgdGhhbSBz4buRIHbDoCBnacOhIHRy4buLIGhheSBraMO0bmcuXG4gICAqIFRo4bupIHThu7EgY8OhYyB0aGFtIHPhu5EgdHJvbmcgY2h14buXaSBiYW4gxJHhuqd1IGtow7RuZyBxdWFuIHRy4buNbmcuXG4gICAqIEBwYXJhbSBwYXJhbTEgQ2h14buXaSB0aOG7qSBuaOG6pXQuXG4gICAqIEBwYXJhbSBwYXJhbTIgQ2h14buXaSB0aOG7qSBoYWkuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIG7hur91IGdp4buRbmcgbmhhdS5cbiAgICovXG4gIHB1YmxpYyBjb21wYXJlUGFyYW1zKHBhcmFtMTogc3RyaW5nLCBwYXJhbTI6IHN0cmluZykge1xuICAgIGNvbnN0IHBhcmFtczEgPSB0aGlzLnRvU3RyaW5nKHRoaXMuYnVpbGRQYXJhbXMocGFyYW0xKSk7XG4gICAgY29uc3QgcGFyYW1zMiA9IHRoaXMudG9TdHJpbmcodGhpcy5idWlsZFBhcmFtcyhwYXJhbTIpKTtcblxuICAgIHJldHVybiBwYXJhbXMxID09PSBwYXJhbXMyO1xuICB9XG59XG4iXX0=
|
package/esm2022/url.mjs
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chuẩn hóa một URL bằng cách loại bỏ các dấu gạch chéo kép (//) trong pathname.
|
|
3
|
+
*
|
|
4
|
+
* @param rawUrl - URL cần chuẩn hóa.
|
|
5
|
+
* @returns URL đã được chuẩn hóa dưới dạng chuỗi.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* normalizeUrl('https://example.com//path//to//file') // => 'https://example.com/path/to/file'
|
|
9
|
+
*/
|
|
1
10
|
export const normalizeUrl = (rawUrl) => {
|
|
2
11
|
const url = new URL(rawUrl);
|
|
3
12
|
url.pathname = url.pathname.replace(/\/{2,}/g, '/');
|
|
4
13
|
return url.toString();
|
|
5
14
|
};
|
|
6
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvdXJsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLENBQUMsTUFBYyxFQUFVLEVBQUU7SUFDckQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUIsR0FBRyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDcEQsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDeEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDaHXhuqluIGjDs2EgbeG7mXQgVVJMIGLhurFuZyBjw6FjaCBsb+G6oWkgYuG7jyBjw6FjIGThuqV1IGfhuqFjaCBjaMOpbyBrw6lwICgvLykgdHJvbmcgcGF0aG5hbWUuXG4gKlxuICogQHBhcmFtIHJhd1VybCAtIFVSTCBj4bqnbiBjaHXhuqluIGjDs2EuXG4gKiBAcmV0dXJucyBVUkwgxJHDoyDEkcaw4bujYyBjaHXhuqluIGjDs2EgZMaw4bubaSBk4bqhbmcgY2h14buXaS5cbiAqXG4gKiBAZXhhbXBsZVxuICogbm9ybWFsaXplVXJsKCdodHRwczovL2V4YW1wbGUuY29tLy9wYXRoLy90by8vZmlsZScpIC8vID0+ICdodHRwczovL2V4YW1wbGUuY29tL3BhdGgvdG8vZmlsZSdcbiAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVVybCA9IChyYXdVcmw6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmF3VXJsKTtcbiAgdXJsLnBhdGhuYW1lID0gdXJsLnBhdGhuYW1lLnJlcGxhY2UoL1xcL3syLH0vZywgJy8nKTtcbiAgcmV0dXJuIHVybC50b1N0cmluZygpO1xufTtcbiJdfQ==
|
package/esm2022/uuid.mjs
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
import { md5 } from './crypto';
|
|
2
|
+
/**
|
|
3
|
+
* Tạo một chuỗi định danh duy nhất (Unique ID) dựa trên thời gian (timestamp) và các ký tự ngẫu nhiên.
|
|
4
|
+
* Chuỗi kết quả được xáo trộn và băm bằng MD5, trả về một chuỗi 32 ký tự alphanumeric.
|
|
5
|
+
*
|
|
6
|
+
* @returns {string} Chuỗi định danh duy nhất (MD5 hash).
|
|
7
|
+
*/
|
|
2
8
|
export const uuid = () => {
|
|
3
9
|
const timestamp = performance.now() * 1000;
|
|
4
10
|
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()_+-=[]{}|;:,.<>?/~';
|
|
@@ -15,4 +21,4 @@ export const uuid = () => {
|
|
|
15
21
|
const shuffledString = charArray.join('');
|
|
16
22
|
return md5(shuffledString);
|
|
17
23
|
};
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3V1aWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFXLEVBQUU7SUFDL0IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyw0RkFBNEYsQ0FBQztJQUMzRyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7SUFDOUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV2QyxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1kNSB9IGZyb20gJy4vY3J5cHRvJztcblxuLyoqXG4gKiBU4bqhbyBt4buZdCBjaHXhu5dpIMSR4buLbmggZGFuaCBkdXkgbmjhuqV0IChVbmlxdWUgSUQpIGThu7FhIHRyw6puIHRo4budaSBnaWFuICh0aW1lc3RhbXApIHbDoCBjw6FjIGvDvSB04buxIG5n4bqrdSBuaGnDqm4uXG4gKiBDaHXhu5dpIGvhur90IHF14bqjIMSRxrDhu6NjIHjDoW8gdHLhu5luIHbDoCBixINtIGLhurFuZyBNRDUsIHRy4bqjIHbhu4EgbeG7mXQgY2h14buXaSAzMiBrw70gdOG7sSBhbHBoYW51bWVyaWMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQ2h14buXaSDEkeG7i25oIGRhbmggZHV5IG5o4bqldCAoTUQ1IGhhc2gpLlxuICovXG5leHBvcnQgY29uc3QgdXVpZCA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBwZXJmb3JtYW5jZS5ub3coKSAqIDEwMDA7XG4gIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8vfic7XG4gIGxldCByYW5kb21TdHJpbmcgPSAnJztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xuICAgIHJhbmRvbVN0cmluZyArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gIH1cbiAgY29uc3QgYmFzZVN0cmluZyA9IGAke01hdGguZmxvb3IodGltZXN0YW1wKX0tJHtyYW5kb21TdHJpbmd9YDtcbiAgY29uc3QgY2hhckFycmF5ID0gYmFzZVN0cmluZy5zcGxpdCgnJyk7XG5cbiAgZm9yIChsZXQgaSA9IGNoYXJBcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuXG4gICAgW2NoYXJBcnJheVtpXSwgY2hhckFycmF5W2pdXSA9IFtjaGFyQXJyYXlbal0sIGNoYXJBcnJheVtpXV07XG4gIH1cblxuICBjb25zdCBzaHVmZmxlZFN0cmluZyA9IGNoYXJBcnJheS5qb2luKCcnKTtcblxuICByZXR1cm4gbWQ1KHNodWZmbGVkU3RyaW5nKTtcbn07XG4iXX0=
|
package/esm2022/xss-filter.mjs
CHANGED
|
@@ -1,10 +1,23 @@
|
|
|
1
1
|
let functionXssFilter = async (value) => {
|
|
2
2
|
return value;
|
|
3
3
|
};
|
|
4
|
+
/**
|
|
5
|
+
* Cập nhật hàm lọc XSS.
|
|
6
|
+
* Cho phép ghi đè hàm xử lý XSS mặc định (trả về nguyên gốc) bằng một implementation bảo mật do project cung cấp (ví dụ: dùng DOMPurify).
|
|
7
|
+
*
|
|
8
|
+
* @param functionCustom Hàm xử lý XSS tùy chỉnh cần cập nhật.
|
|
9
|
+
*/
|
|
4
10
|
export const updateFunctionXssFilter = (functionCustom) => {
|
|
5
11
|
functionXssFilter = functionCustom;
|
|
6
12
|
};
|
|
13
|
+
/**
|
|
14
|
+
* Lọc dữ liệu thông qua hàm lọc XSS đã được định cấu hình.
|
|
15
|
+
* Theo mặc định, hàm này sẽ trả lại chuỗi ban đầu. Nếu bạn đã cung cấp một custom filter qua `updateFunctionXssFilter`, hàm đó sẽ được sử dụng.
|
|
16
|
+
*
|
|
17
|
+
* @param data Chuỗi dữ liệu đầu vào.
|
|
18
|
+
* @returns {Promise<string>} Promise chứa kết quả đã được lọc XSS.
|
|
19
|
+
*/
|
|
7
20
|
export const xssFilter = async (data) => {
|
|
8
21
|
return await functionXssFilter(data);
|
|
9
22
|
};
|
|
10
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHNzLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3hzcy1maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsSUFBSSxpQkFBaUIsR0FBc0IsS0FBSyxFQUFFLEtBQWEsRUFBbUIsRUFBRTtJQUNsRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxjQUFpQyxFQUFFLEVBQUU7SUFDM0UsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBc0IsS0FBSyxFQUFFLElBQVksRUFBRSxFQUFFO0lBQ2pFLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvL05PVEU6IERvIGzDoCBmdW5jdGlvbiB0cnV54buBbiB04burIGLDqm4gbmdvw6BpIHbDoG8gbsOqbiBz4bq9IGtow7RuZyBjw7MgdW5pdCB0ZXN0XG5leHBvcnQgdHlwZSBUWVBFX0ZVTkNUSU9OX1hTUyA9IChkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbmxldCBmdW5jdGlvblhzc0ZpbHRlcjogVFlQRV9GVU5DVElPTl9YU1MgPSBhc3luYyAodmFsdWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ+G6rXAgbmjhuq10IGjDoG0gbOG7jWMgWFNTLlxuICogQ2hvIHBow6lwIGdoaSDEkcOoIGjDoG0geOG7rSBsw70gWFNTIG3hurdjIMSR4buLbmggKHRy4bqjIHbhu4Egbmd1ecOqbiBn4buRYykgYuG6sW5nIG3hu5l0IGltcGxlbWVudGF0aW9uIGLhuqNvIG3huq10IGRvIHByb2plY3QgY3VuZyBj4bqlcCAodsOtIGThu6U6IGTDuW5nIERPTVB1cmlmeSkuXG4gKlxuICogQHBhcmFtIGZ1bmN0aW9uQ3VzdG9tIEjDoG0geOG7rSBsw70gWFNTIHTDuXkgY2jhu4luaCBj4bqnbiBj4bqtcCBuaOG6rXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGdW5jdGlvblhzc0ZpbHRlciA9IChmdW5jdGlvbkN1c3RvbTogVFlQRV9GVU5DVElPTl9YU1MpID0+IHtcbiAgZnVuY3Rpb25Yc3NGaWx0ZXIgPSBmdW5jdGlvbkN1c3RvbTtcbn07XG5cbi8qKlxuICogTOG7jWMgZOG7ryBsaeG7h3UgdGjDtG5nIHF1YSBow6BtIGzhu41jIFhTUyDEkcOjIMSRxrDhu6NjIMSR4buLbmggY+G6pXUgaMOsbmguXG4gKiBUaGVvIG3hurdjIMSR4buLbmgsIGjDoG0gbsOgeSBz4bq9IHRy4bqjIGzhuqFpIGNodeG7l2kgYmFuIMSR4bqndS4gTuG6v3UgYuG6oW4gxJHDoyBjdW5nIGPhuqVwIG3hu5l0IGN1c3RvbSBmaWx0ZXIgcXVhIGB1cGRhdGVGdW5jdGlvblhzc0ZpbHRlcmAsIGjDoG0gxJHDsyBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nLlxuICpcbiAqIEBwYXJhbSBkYXRhIENodeG7l2kgZOG7ryBsaeG7h3UgxJHhuqd1IHbDoG8uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIGNo4bupYSBr4bq/dCBxdeG6oyDEkcOjIMSRxrDhu6NjIGzhu41jIFhTUy5cbiAqL1xuZXhwb3J0IGNvbnN0IHhzc0ZpbHRlcjogVFlQRV9GVU5DVElPTl9YU1MgPSBhc3luYyAoZGF0YTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBhd2FpdCBmdW5jdGlvblhzc0ZpbHRlcihkYXRhKTtcbn07XG4iXX0=
|