@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.
Files changed (52) hide show
  1. package/README.md +633 -2
  2. package/base64.d.ts +25 -0
  3. package/cache.d.ts +73 -0
  4. package/collection.d.ts +12 -0
  5. package/color.d.ts +37 -0
  6. package/communicate-micro.d.ts +34 -1
  7. package/crypto-3rd.d.ts +12 -0
  8. package/crypto.d.ts +17 -0
  9. package/dangerous-object.d.ts +8 -1
  10. package/data.d.ts +5 -3
  11. package/date.d.ts +12 -0
  12. package/dom.d.ts +56 -0
  13. package/download.d.ts +21 -0
  14. package/esm2022/base64.mjs +27 -2
  15. package/esm2022/cache.mjs +74 -1
  16. package/esm2022/collection.mjs +13 -1
  17. package/esm2022/color.mjs +38 -1
  18. package/esm2022/communicate-micro.mjs +37 -5
  19. package/esm2022/crypto-3rd.mjs +13 -1
  20. package/esm2022/crypto.mjs +18 -1
  21. package/esm2022/dangerous-object.mjs +11 -2
  22. package/esm2022/data.mjs +6 -4
  23. package/esm2022/date.mjs +13 -1
  24. package/esm2022/dom.mjs +57 -1
  25. package/esm2022/download.mjs +22 -1
  26. package/esm2022/file.mjs +54 -1
  27. package/esm2022/format-number.mjs +31 -3
  28. package/esm2022/format-text.mjs +73 -2
  29. package/esm2022/function-check-embed-frame.mjs +28 -1
  30. package/esm2022/pattern.mjs +83 -3
  31. package/esm2022/trace.mjs +8 -1
  32. package/esm2022/two-way-signal-object.mjs +14 -1
  33. package/esm2022/uri.mjs +22 -3
  34. package/esm2022/url-search-params.mjs +68 -1
  35. package/esm2022/url.mjs +10 -1
  36. package/esm2022/uuid.mjs +7 -1
  37. package/esm2022/xss-filter.mjs +14 -1
  38. package/fesm2022/libs-ui-utils.mjs +723 -21
  39. package/fesm2022/libs-ui-utils.mjs.map +1 -1
  40. package/file.d.ts +53 -0
  41. package/format-number.d.ts +29 -1
  42. package/format-text.d.ts +71 -0
  43. package/function-check-embed-frame.d.ts +22 -0
  44. package/package.json +2 -2
  45. package/pattern.d.ts +81 -1
  46. package/trace.d.ts +7 -0
  47. package/two-way-signal-object.d.ts +13 -0
  48. package/uri.d.ts +20 -0
  49. package/url-search-params.d.ts +67 -0
  50. package/url.d.ts +9 -0
  51. package/uuid.d.ts +6 -0
  52. 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvdXJpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUVwRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUN6QyxPQUFPLGtCQUFrQixDQUN2QixLQUFLO1NBQ0YsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUNULEdBQUcsQ0FBQyxDQUFDLENBQVMsRUFBRSxFQUFFO1FBQ2pCLE9BQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO1NBQ0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUNaLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUN6QyxPQUFPLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUN6RSxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBbUIsRUFBRSxNQUFlLEVBQVUsRUFBRTtJQUN6RSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNqRSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFYixLQUFLLE1BQU0sQ0FBQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ3ZCLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ2xELENBQUM7SUFFRCxPQUFPLEdBQUcsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUNyRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUWVBFX09CSkVDVCB9IGZyb20gJ0BsaWJzLXVpL2ludGVyZmFjZXMtdHlwZXMnO1xuaW1wb3J0IHsgb21pdEJ5IH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IEVOQ09ERV9VUklfUEFUVEVSTiA9IC8lKFswLTlBLUZdezJ9KS9nO1xuXG5leHBvcnQgY29uc3QgZGVjb2RlVVJJID0gKHZhbHVlOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChcbiAgICB2YWx1ZVxuICAgICAgLnNwbGl0KCcnKVxuICAgICAgLm1hcCgoYzogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiAnJScgKyAoJzAwJyArIGMuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikpLnNsaWNlKC0yKTtcbiAgICAgIH0pXG4gICAgICAuam9pbignJylcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmNvZGVVUkkgPSAodmFsdWU6IHN0cmluZykgPT4ge1xuICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKS5yZXBsYWNlKEVOQ09ERV9VUklfUEFUVEVSTiwgKG1hdGNoLCBwMSkgPT4ge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KHAxLCAxNikpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBlbmRDb2RlVXJsID0gKHBhcmFtczogVFlQRV9PQkpFQ1QsIGlzQm9keTogYm9vbGVhbik6IHN0cmluZyA9PiB7XG4gIHBhcmFtcyA9IG9taXRCeShwYXJhbXMsIChwYXJhbSkgPT4gcGFyYW0gPT09ICcnIHx8IGlzTmlsKHBhcmFtKSk7XG4gIGxldCByZXMgPSAnJztcblxuICBmb3IgKGNvbnN0IHAgaW4gcGFyYW1zKSB7XG4gICAgcmVzICs9IGAmJHtwfT0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXNbcF0pfWA7XG4gIH1cblxuICByZXR1cm4gcmVzID09PSAnJyA/ICcnIDogYCR7aXNCb2R5ID8gJycgOiAnPyd9JHtyZXMuc3Vic3RyaW5nKDEpfWA7XG59O1xuIl19
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vbGlicy11aS91dGlscy9zcmMvdXJsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLE1BQWMsRUFBVSxFQUFFO0lBQ3JELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3BELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBub3JtYWxpemVVcmwgPSAocmF3VXJsOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB1cmwgPSBuZXcgVVJMKHJhd1VybCk7XG4gIHVybC5wYXRobmFtZSA9IHVybC5wYXRobmFtZS5yZXBsYWNlKC9cXC97Mix9L2csICcvJyk7XG4gIHJldHVybiB1cmwudG9TdHJpbmcoKTtcbn07XG4iXX0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3V1aWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsR0FBVyxFQUFFO0lBQy9CLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7SUFDM0MsTUFBTSxLQUFLLEdBQUcsNEZBQTRGLENBQUM7SUFDM0csSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRXRCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUMzQixZQUFZLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQzlELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDOUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5QyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUUxQyxPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtZDUgfSBmcm9tICcuL2NyeXB0byc7XG5cbmV4cG9ydCBjb25zdCB1dWlkID0gKCk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IHRpbWVzdGFtcCA9IHBlcmZvcm1hbmNlLm5vdygpICogMTAwMDtcbiAgY29uc3QgY2hhcnMgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkhQCMkJV4mKigpXystPVtde318OzosLjw+Py9+JztcbiAgbGV0IHJhbmRvbVN0cmluZyA9ICcnO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgcmFuZG9tU3RyaW5nICs9IGNoYXJzLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFycy5sZW5ndGgpKTtcbiAgfVxuICBjb25zdCBiYXNlU3RyaW5nID0gYCR7TWF0aC5mbG9vcih0aW1lc3RhbXApfS0ke3JhbmRvbVN0cmluZ31gO1xuICBjb25zdCBjaGFyQXJyYXkgPSBiYXNlU3RyaW5nLnNwbGl0KCcnKTtcblxuICBmb3IgKGxldCBpID0gY2hhckFycmF5Lmxlbmd0aCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICBjb25zdCBqID0gTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogKGkgKyAxKSk7XG5cbiAgICBbY2hhckFycmF5W2ldLCBjaGFyQXJyYXlbal1dID0gW2NoYXJBcnJheVtqXSwgY2hhckFycmF5W2ldXTtcbiAgfVxuXG4gIGNvbnN0IHNodWZmbGVkU3RyaW5nID0gY2hhckFycmF5LmpvaW4oJycpO1xuXG4gIHJldHVybiBtZDUoc2h1ZmZsZWRTdHJpbmcpO1xufTtcbiJdfQ==
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXVpZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3V1aWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUUvQjs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxHQUFXLEVBQUU7SUFDL0IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztJQUMzQyxNQUFNLEtBQUssR0FBRyw0RkFBNEYsQ0FBQztJQUMzRyxJQUFJLFlBQVksR0FBRyxFQUFFLENBQUM7SUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzNCLFlBQVksSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxFQUFFLENBQUM7SUFDOUQsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV2QyxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM5QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTlDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRCxNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRTFDLE9BQU8sR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1kNSB9IGZyb20gJy4vY3J5cHRvJztcblxuLyoqXG4gKiBU4bqhbyBt4buZdCBjaHXhu5dpIMSR4buLbmggZGFuaCBkdXkgbmjhuqV0IChVbmlxdWUgSUQpIGThu7FhIHRyw6puIHRo4budaSBnaWFuICh0aW1lc3RhbXApIHbDoCBjw6FjIGvDvSB04buxIG5n4bqrdSBuaGnDqm4uXG4gKiBDaHXhu5dpIGvhur90IHF14bqjIMSRxrDhu6NjIHjDoW8gdHLhu5luIHbDoCBixINtIGLhurFuZyBNRDUsIHRy4bqjIHbhu4EgbeG7mXQgY2h14buXaSAzMiBrw70gdOG7sSBhbHBoYW51bWVyaWMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gQ2h14buXaSDEkeG7i25oIGRhbmggZHV5IG5o4bqldCAoTUQ1IGhhc2gpLlxuICovXG5leHBvcnQgY29uc3QgdXVpZCA9ICgpOiBzdHJpbmcgPT4ge1xuICBjb25zdCB0aW1lc3RhbXAgPSBwZXJmb3JtYW5jZS5ub3coKSAqIDEwMDA7XG4gIGNvbnN0IGNoYXJzID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IUAjJCVeJiooKV8rLT1bXXt9fDs6LC48Pj8vfic7XG4gIGxldCByYW5kb21TdHJpbmcgPSAnJztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IDU7IGkrKykge1xuICAgIHJhbmRvbVN0cmluZyArPSBjaGFycy5jaGFyQXQoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogY2hhcnMubGVuZ3RoKSk7XG4gIH1cbiAgY29uc3QgYmFzZVN0cmluZyA9IGAke01hdGguZmxvb3IodGltZXN0YW1wKX0tJHtyYW5kb21TdHJpbmd9YDtcbiAgY29uc3QgY2hhckFycmF5ID0gYmFzZVN0cmluZy5zcGxpdCgnJyk7XG5cbiAgZm9yIChsZXQgaSA9IGNoYXJBcnJheS5sZW5ndGggLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgY29uc3QgaiA9IE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIChpICsgMSkpO1xuXG4gICAgW2NoYXJBcnJheVtpXSwgY2hhckFycmF5W2pdXSA9IFtjaGFyQXJyYXlbal0sIGNoYXJBcnJheVtpXV07XG4gIH1cblxuICBjb25zdCBzaHVmZmxlZFN0cmluZyA9IGNoYXJBcnJheS5qb2luKCcnKTtcblxuICByZXR1cm4gbWQ1KHNodWZmbGVkU3RyaW5nKTtcbn07XG4iXX0=
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHNzLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3hzcy1maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsSUFBSSxpQkFBaUIsR0FBc0IsS0FBSyxFQUFFLEtBQWEsRUFBbUIsRUFBRTtJQUNsRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLENBQUMsY0FBaUMsRUFBRSxFQUFFO0lBQzNFLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztBQUNyQyxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQXNCLEtBQUssRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUNqRSxPQUFPLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy9OT1RFOiBEbyBsw6AgZnVuY3Rpb24gdHJ1eeG7gW4gdOG7qyBiw6puIG5nb8OgaSB2w6BvIG7Dqm4gc+G6vSBraMO0bmcgY8OzIHVuaXQgdGVzdFxuZXhwb3J0IHR5cGUgVFlQRV9GVU5DVElPTl9YU1MgPSAoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz47XG5sZXQgZnVuY3Rpb25Yc3NGaWx0ZXI6IFRZUEVfRlVOQ1RJT05fWFNTID0gYXN5bmMgKHZhbHVlOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gPT4ge1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlRnVuY3Rpb25Yc3NGaWx0ZXIgPSAoZnVuY3Rpb25DdXN0b206IFRZUEVfRlVOQ1RJT05fWFNTKSA9PiB7XG4gIGZ1bmN0aW9uWHNzRmlsdGVyID0gZnVuY3Rpb25DdXN0b207XG59O1xuXG5leHBvcnQgY29uc3QgeHNzRmlsdGVyOiBUWVBFX0ZVTkNUSU9OX1hTUyA9IGFzeW5jIChkYXRhOiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIGF3YWl0IGZ1bmN0aW9uWHNzRmlsdGVyKGRhdGEpO1xufTtcbiJdfQ==
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHNzLWZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYnMtdWkvdXRpbHMvc3JjL3hzcy1maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsSUFBSSxpQkFBaUIsR0FBc0IsS0FBSyxFQUFFLEtBQWEsRUFBbUIsRUFBRTtJQUNsRixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxjQUFpQyxFQUFFLEVBQUU7SUFDM0UsaUJBQWlCLEdBQUcsY0FBYyxDQUFDO0FBQ3JDLENBQUMsQ0FBQztBQUVGOzs7Ozs7R0FNRztBQUNILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBc0IsS0FBSyxFQUFFLElBQVksRUFBRSxFQUFFO0lBQ2pFLE9BQU8sTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvL05PVEU6IERvIGzDoCBmdW5jdGlvbiB0cnV54buBbiB04burIGLDqm4gbmdvw6BpIHbDoG8gbsOqbiBz4bq9IGtow7RuZyBjw7MgdW5pdCB0ZXN0XG5leHBvcnQgdHlwZSBUWVBFX0ZVTkNUSU9OX1hTUyA9IChkYXRhOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcbmxldCBmdW5jdGlvblhzc0ZpbHRlcjogVFlQRV9GVU5DVElPTl9YU1MgPSBhc3luYyAodmFsdWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogQ+G6rXAgbmjhuq10IGjDoG0gbOG7jWMgWFNTLlxuICogQ2hvIHBow6lwIGdoaSDEkcOoIGjDoG0geOG7rSBsw70gWFNTIG3hurdjIMSR4buLbmggKHRy4bqjIHbhu4Egbmd1ecOqbiBn4buRYykgYuG6sW5nIG3hu5l0IGltcGxlbWVudGF0aW9uIGLhuqNvIG3huq10IGRvIHByb2plY3QgY3VuZyBj4bqlcCAodsOtIGThu6U6IGTDuW5nIERPTVB1cmlmeSkuXG4gKlxuICogQHBhcmFtIGZ1bmN0aW9uQ3VzdG9tIEjDoG0geOG7rSBsw70gWFNTIHTDuXkgY2jhu4luaCBj4bqnbiBj4bqtcCBuaOG6rXQuXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVGdW5jdGlvblhzc0ZpbHRlciA9IChmdW5jdGlvbkN1c3RvbTogVFlQRV9GVU5DVElPTl9YU1MpID0+IHtcbiAgZnVuY3Rpb25Yc3NGaWx0ZXIgPSBmdW5jdGlvbkN1c3RvbTtcbn07XG5cbi8qKlxuICogTOG7jWMgZOG7ryBsaeG7h3UgdGjDtG5nIHF1YSBow6BtIGzhu41jIFhTUyDEkcOjIMSRxrDhu6NjIMSR4buLbmggY+G6pXUgaMOsbmguXG4gKiBUaGVvIG3hurdjIMSR4buLbmgsIGjDoG0gbsOgeSBz4bq9IHRy4bqjIGzhuqFpIGNodeG7l2kgYmFuIMSR4bqndS4gTuG6v3UgYuG6oW4gxJHDoyBjdW5nIGPhuqVwIG3hu5l0IGN1c3RvbSBmaWx0ZXIgcXVhIGB1cGRhdGVGdW5jdGlvblhzc0ZpbHRlcmAsIGjDoG0gxJHDsyBz4bq9IMSRxrDhu6NjIHPhu60gZOG7pW5nLlxuICpcbiAqIEBwYXJhbSBkYXRhIENodeG7l2kgZOG7ryBsaeG7h3UgxJHhuqd1IHbDoG8uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBQcm9taXNlIGNo4bupYSBr4bq/dCBxdeG6oyDEkcOjIMSRxrDhu6NjIGzhu41jIFhTUy5cbiAqL1xuZXhwb3J0IGNvbnN0IHhzc0ZpbHRlcjogVFlQRV9GVU5DVElPTl9YU1MgPSBhc3luYyAoZGF0YTogc3RyaW5nKSA9PiB7XG4gIHJldHVybiBhd2FpdCBmdW5jdGlvblhzc0ZpbHRlcihkYXRhKTtcbn07XG4iXX0=