@koloseum/utils 0.2.4 → 0.2.7

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/dist/utils.d.ts CHANGED
@@ -85,24 +85,37 @@ export declare const Utility: {
85
85
  formatSocialMediaPlatform: (platform: SocialMediaPlatform) => string;
86
86
  /**
87
87
  * Returns an age in years given a birth date.
88
- * @param {string} dateOfBirth - The date of birth as a string, e.g. `DD-MM-YYYY`
88
+ * @param {Date | string | number | null} dateOfBirth - The date of birth
89
89
  * @returns The age in years, or `NaN` if the input is invalid
90
90
  */
91
- getAge: (dateOfBirth: string) => number;
91
+ getAge: (dateOfBirth: Date | string | number | null) => number;
92
92
  /**
93
93
  * Formats a date as a locale-specific string.
94
- * @param {Date | string} date - Date to be formatted
94
+ * @param {Date | string | number | null} date - Date to be formatted
95
95
  * @param {boolean} withTime - Specify whether the date should include time; defaults to `false`
96
96
  * @param {string} timeZone - The time zone to use for formatting; defaults to `Africa/Nairobi`
97
- * @returns The formatted date string, or `null` if invalid input
97
+ * @returns The formatted date string, or an empty string if invalid input
98
98
  */
99
- getDateString: (date: Date | string | null, withTime?: boolean, timeZone?: string) => string | null;
99
+ getDateString: (date: Date | string | number | null, withTime?: boolean, timeZone?: string) => string;
100
100
  /**
101
101
  * Formats an identity type for display.
102
102
  * @param {IdentityType} identityType - The identity type to be formatted
103
103
  * @returns The formatted identity type string
104
104
  */
105
105
  getIdentityTypeString: (identityType: IdentityType) => string;
106
+ /**
107
+ * Returns the URL for a menu item based on the slug.
108
+ * @param {string} base - The base URL
109
+ * @param {string} slug - The slug of the menu item
110
+ * @returns {string} The URL for the menu item
111
+ */
112
+ getMenuItemUrl: (base: string, slug: string | undefined) => string;
113
+ /**
114
+ * Returns the parent URL for a given base URL.
115
+ * @param {string} base - The base URL
116
+ * @returns {string} The parent URL
117
+ */
118
+ getParentUrl: (base: string) => string;
106
119
  /**
107
120
  * Returns a pronoun given pronouns and a type.
108
121
  * @param {PronounsItem | null} pronouns - The pronouns to be formatted
package/dist/utils.js CHANGED
@@ -230,44 +230,77 @@ export const Utility = {
230
230
  },
231
231
  /**
232
232
  * Returns an age in years given a birth date.
233
- * @param {string} dateOfBirth - The date of birth as a string, e.g. `DD-MM-YYYY`
233
+ * @param {Date | string | number | null} dateOfBirth - The date of birth
234
234
  * @returns The age in years, or `NaN` if the input is invalid
235
235
  */
236
236
  getAge: (dateOfBirth) => {
237
- if (dateOfBirth === "" || typeof dateOfBirth !== "string")
237
+ // Return NaN if no date is provided
238
+ if (!dateOfBirth)
238
239
  return NaN;
239
- dateOfBirth = Utility.formatDate(dateOfBirth, true);
240
- const birthDate = new Date(dateOfBirth);
240
+ // Validate and process date of birth
241
+ let birthDate;
242
+ if (dateOfBirth instanceof Date) {
243
+ if (isNaN(dateOfBirth.getTime()))
244
+ return NaN;
245
+ birthDate = dateOfBirth;
246
+ }
247
+ else if (typeof dateOfBirth === "string") {
248
+ if (dateOfBirth === "" || isNaN(Date.parse(dateOfBirth)))
249
+ return NaN;
250
+ // Format date of birth if it's a string
251
+ const formattedDate = Utility.formatDate(dateOfBirth, true);
252
+ if (!formattedDate)
253
+ return NaN;
254
+ birthDate = new Date(formattedDate);
255
+ }
256
+ else if (typeof dateOfBirth === "number") {
257
+ if (isNaN(dateOfBirth))
258
+ return NaN;
259
+ birthDate = new Date(dateOfBirth);
260
+ }
261
+ else {
262
+ return NaN;
263
+ }
264
+ // Validate the final date object
265
+ if (isNaN(birthDate.getTime()))
266
+ return NaN;
267
+ // Calculate age
241
268
  const currentDate = new Date();
242
- let age = currentDate.getFullYear() - birthDate.getFullYear();
243
269
  const monthDiff = currentDate.getMonth() - birthDate.getMonth();
270
+ let age = currentDate.getFullYear() - birthDate.getFullYear();
271
+ // Return age
244
272
  return monthDiff < 0 || (monthDiff === 0 && currentDate.getDate() < birthDate.getDate()) ? --age : age;
245
273
  },
246
274
  /**
247
275
  * Formats a date as a locale-specific string.
248
- * @param {Date | string} date - Date to be formatted
276
+ * @param {Date | string | number | null} date - Date to be formatted
249
277
  * @param {boolean} withTime - Specify whether the date should include time; defaults to `false`
250
278
  * @param {string} timeZone - The time zone to use for formatting; defaults to `Africa/Nairobi`
251
- * @returns The formatted date string, or `null` if invalid input
279
+ * @returns The formatted date string, or an empty string if invalid input
252
280
  */
253
281
  getDateString: (date, withTime = false, timeZone = "Africa/Nairobi") => {
254
- // Return null if no date is provided
282
+ // Return empty string if no date is provided
255
283
  if (!date)
256
- return null;
284
+ return "";
257
285
  // Validate date to format
258
286
  let dateToFormat;
259
- if (typeof date === "string") {
260
- if (date === "" || isNaN(Date.parse(date)))
261
- return null;
262
- dateToFormat = new Date(date);
263
- }
264
- else if (date instanceof Date) {
287
+ if (date instanceof Date) {
265
288
  if (isNaN(date.getTime()))
266
- return null;
289
+ return "";
267
290
  dateToFormat = date;
268
291
  }
292
+ else if (typeof date === "string" || typeof date === "number") {
293
+ if (typeof date === "string" && (date === "" || isNaN(Date.parse(date))))
294
+ return "";
295
+ if (typeof date === "number" && isNaN(date))
296
+ return "";
297
+ dateToFormat = new Date(date);
298
+ }
269
299
  else
270
- return null;
300
+ return "";
301
+ // Validate the final date object
302
+ if (isNaN(dateToFormat.getTime()))
303
+ return "";
271
304
  // Format date
272
305
  return dateToFormat.toLocaleString("en-KE", {
273
306
  timeZone,
@@ -295,6 +328,31 @@ export const Utility = {
295
328
  return "Driver's licence";
296
329
  return "";
297
330
  },
331
+ /**
332
+ * Returns the URL for a menu item based on the slug.
333
+ * @param {string} base - The base URL
334
+ * @param {string} slug - The slug of the menu item
335
+ * @returns {string} The URL for the menu item
336
+ */
337
+ getMenuItemUrl: (base, slug) => {
338
+ // Validate base URL
339
+ if (base === "" || typeof base !== "string")
340
+ return "";
341
+ // Return URL
342
+ return `${base}${slug && typeof slug === "string" ? `/${slug}` : ""}`;
343
+ },
344
+ /**
345
+ * Returns the parent URL for a given base URL.
346
+ * @param {string} base - The base URL
347
+ * @returns {string} The parent URL
348
+ */
349
+ getParentUrl: (base) => {
350
+ // Validate input
351
+ if (base === "" || typeof base !== "string")
352
+ return "";
353
+ // Return parent URL
354
+ return base.replace(/\/$/, "").split("/").slice(0, -1).join("/") || "/";
355
+ },
298
356
  /**
299
357
  * Returns a pronoun given pronouns and a type.
300
358
  * @param {PronounsItem | null} pronouns - The pronouns to be formatted
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@koloseum/utils",
3
- "version": "0.2.4",
3
+ "version": "0.2.7",
4
4
  "author": "Koloseum Technologies Limited",
5
5
  "type": "module",
6
6
  "description": "Utility logic for use across Koloseum web apps (TypeScript)",