ayiin 2.0.14 → 2.0.15

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.
@@ -1,24 +1,67 @@
1
1
  declare class Tools {
2
2
  /**
3
- * Format money
4
- * @returns {string}
3
+ * Format money ke string sesuai locale
5
4
  * @memberof Tools
6
- * @param {number} amount
7
- * */
5
+ * @param {number} amount - jumlah uang
6
+ * @param {Intl.LocalesArgument} locales - default "id-ID"
7
+ * @param {Intl.NumberFormatOptions} options - default currency IDR
8
+ * @returns {string} string
9
+ */
8
10
  formatMoney: (amount: number, locales?: Intl.LocalesArgument, options?: Intl.NumberFormatOptions) => string;
9
11
  /**
10
- * Generate a random string
12
+ * Generate unique ID dengan pilihan tipe
13
+ * @param {"number"|"string"|"mixed"} type - tipe ID (angka, string, atau campuran)
14
+ * @param {number} length - panjang ID (default 8)
15
+ * @returns {string} ID unik acak
16
+ */
17
+ uniqueId: ({ type, length, prefix, }: {
18
+ type?: "number" | "string" | "mixed";
19
+ length?: number;
20
+ prefix?: string;
21
+ }) => string;
22
+ /**
23
+ * Generate UUID v4 sederhana
11
24
  * @returns {string}
12
- * @memberof Tools
13
- * @param {number} length
14
- * */
15
- randomString: (length: number | string, prefix?: string) => string;
25
+ */
26
+ randomUuid: () => string;
16
27
  /**
17
28
  * Pick a random from array
18
29
  * @param {T[]} array
19
30
  * @memberof Tools
20
- * @returns {T}
21
- * */
31
+ * @returns {T} item acak dari array
32
+ */
22
33
  randomItem: <T>(array: T[]) => T | undefined;
34
+ /**
35
+ * Ambil beberapa item acak unik dari array
36
+ * @param {T[]} array
37
+ * @param {number} count - jumlah item
38
+ * @returns {T[]} array item acak unik dari array
39
+ */
40
+ randomMany: <T>(array: T[], count: number) => T[];
41
+ /**
42
+ * Validasi apakah string adalah email
43
+ * @param {string} str
44
+ * @returns {boolean} true jika string adalah email, false jika bukan
45
+ */
46
+ isEmail: (str: string) => boolean;
47
+ /**
48
+ * Validasi apakah string adalah URL
49
+ * @param {string} str
50
+ * @returns {boolean} true jika string adalah URL, false jika bukan
51
+ */
52
+ isUrl: (str: string) => boolean;
53
+ /**
54
+ * Format tanggal ke string sesuai locale
55
+ * @param {Date} date
56
+ * @param {Intl.LocalesArgument} locales - default "id-ID"
57
+ * @returns {string} string
58
+ */
59
+ formatDate: (date: Date, locales?: Intl.LocalesArgument) => string;
60
+ /**
61
+ * Hitung waktu relatif (misalnya "5 menit lalu")
62
+ * @param {Date} date
63
+ * @returns {string} string
64
+ */
65
+ timeAgo: (date: Date) => string;
23
66
  }
24
67
  export default Tools;
package/methods/tools.js CHANGED
@@ -2,11 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  class Tools {
4
4
  /**
5
- * Format money
6
- * @returns {string}
5
+ * Format money ke string sesuai locale
7
6
  * @memberof Tools
8
- * @param {number} amount
9
- * */
7
+ * @param {number} amount - jumlah uang
8
+ * @param {Intl.LocalesArgument} locales - default "id-ID"
9
+ * @param {Intl.NumberFormatOptions} options - default currency IDR
10
+ * @returns {string} string
11
+ */
10
12
  formatMoney = (amount, locales = "id-ID", options = {
11
13
  style: "currency",
12
14
  currency: "IDR",
@@ -15,27 +17,115 @@ class Tools {
15
17
  return new Intl.NumberFormat(locales, options).format(amount);
16
18
  };
17
19
  /**
18
- * Generate a random string
19
- * @returns {string}
20
- * @memberof Tools
21
- * @param {number} length
22
- * */
23
- randomString = (length, prefix) => {
24
- const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
25
- let random = "";
26
- for (let i = 0; i < Number(length); i++) {
27
- random += alphabet[Math.floor(Math.random() * alphabet.length)];
20
+ * Generate unique ID dengan pilihan tipe
21
+ * @param {"number"|"string"|"mixed"} type - tipe ID (angka, string, atau campuran)
22
+ * @param {number} length - panjang ID (default 8)
23
+ * @returns {string} ID unik acak
24
+ */
25
+ uniqueId = ({ type = "mixed", length = 8, prefix, }) => {
26
+ let chars;
27
+ switch (type) {
28
+ case "number":
29
+ chars = "0123456789";
30
+ break;
31
+ case "string":
32
+ chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
33
+ break;
34
+ default:
35
+ chars =
36
+ "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
28
37
  }
29
- return prefix ? prefix + random : random;
38
+ let id = "";
39
+ for (let i = 0; i < length; i++) {
40
+ id += chars[Math.floor(Math.random() * chars.length)];
41
+ }
42
+ return prefix ? prefix + id : id;
43
+ };
44
+ /**
45
+ * Generate UUID v4 sederhana
46
+ * @returns {string}
47
+ */
48
+ randomUuid = () => {
49
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
50
+ const r = (Math.random() * 16) | 0;
51
+ const v = c === "x" ? r : (r & 0x3) | 0x8;
52
+ return v.toString(16);
53
+ });
30
54
  };
31
55
  /**
32
56
  * Pick a random from array
33
57
  * @param {T[]} array
34
58
  * @memberof Tools
35
- * @returns {T}
36
- * */
59
+ * @returns {T} item acak dari array
60
+ */
37
61
  randomItem = (array) => {
38
62
  return array[Math.floor(Math.random() * array.length)];
39
63
  };
64
+ /**
65
+ * Ambil beberapa item acak unik dari array
66
+ * @param {T[]} array
67
+ * @param {number} count - jumlah item
68
+ * @returns {T[]} array item acak unik dari array
69
+ */
70
+ randomMany = (array, count) => {
71
+ const copy = [...array];
72
+ for (let i = copy.length - 1; i > 0; i--) {
73
+ const j = Math.floor(Math.random() * (i + 1));
74
+ [copy[i], copy[j]] = [copy[j], copy[i]];
75
+ }
76
+ return copy.slice(0, count);
77
+ };
78
+ /**
79
+ * Validasi apakah string adalah email
80
+ * @param {string} str
81
+ * @returns {boolean} true jika string adalah email, false jika bukan
82
+ */
83
+ isEmail = (str) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(str);
84
+ /**
85
+ * Validasi apakah string adalah URL
86
+ * @param {string} str
87
+ * @returns {boolean} true jika string adalah URL, false jika bukan
88
+ */
89
+ isUrl = (str) => {
90
+ try {
91
+ new URL(str);
92
+ return true;
93
+ }
94
+ catch {
95
+ return false;
96
+ }
97
+ };
98
+ /**
99
+ * Format tanggal ke string sesuai locale
100
+ * @param {Date} date
101
+ * @param {Intl.LocalesArgument} locales - default "id-ID"
102
+ * @returns {string} string
103
+ */
104
+ formatDate = (date, locales = "id-ID") => new Intl.DateTimeFormat(locales, {
105
+ year: "numeric",
106
+ month: "long",
107
+ day: "numeric",
108
+ hour: "2-digit",
109
+ minute: "2-digit",
110
+ }).format(date);
111
+ /**
112
+ * Hitung waktu relatif (misalnya "5 menit lalu")
113
+ * @param {Date} date
114
+ * @returns {string} string
115
+ */
116
+ timeAgo = (date) => {
117
+ const diff = Date.now() - date.getTime();
118
+ const seconds = Math.floor(diff / 1000);
119
+ if (seconds < 60)
120
+ return `${seconds} detik lalu`;
121
+ const minutes = Math.floor(seconds / 60);
122
+ if (minutes < 60)
123
+ return `${minutes} menit lalu`;
124
+ const hours = Math.floor(minutes / 60);
125
+ if (hours < 24)
126
+ return `${hours} jam lalu`;
127
+ const days = Math.floor(hours / 24);
128
+ return `${days} hari lalu`;
129
+ };
40
130
  }
41
131
  exports.default = Tools;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ayiin",
3
- "version": "2.0.14",
3
+ "version": "2.0.15",
4
4
  "description": "Library Pribadi Yang Gak Ada Isinya",
5
5
  "main": "index.js",
6
6
  "bin": {