UNPKG

core-ts-utils

Version:
690 lines (654 loc) 18.8 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { camelCase: () => camelCase_default, capitalize: () => capitalize_default, chunk: () => chunk_default, compose: () => compose_default, cookies: () => cookies_default, curry: () => curry_default, debounce: () => debounce_default, deepClone: () => deepClone_default, flatten: () => flatten_default, groupBy: () => groupBy_default, isEmail: () => isEmail_default, isEmpty: () => isEmpty_default, isNumeric: () => isNumeric_default, isURL: () => isURL_default, kebabCase: () => kebabCase_default, memoize: () => memoize_default, merge: () => merge_default, omit: () => omit_default, once: () => once_default, parallel: () => parallel_default, partial: () => partial_default, pick: () => pick_default, pipe: () => pipe_default, promisify: () => promisisfy_default, queryParams: () => queryParams_default, randomId: () => randomId_default, retry: () => retry_default, sleep: () => sleep_default, snakeCase: () => snakeCase_default, storage: () => storage_default, template: () => template_default, throttle: () => throttle_default, truncate: () => truncate_default, uniqueBy: () => uniqueBy_default }); module.exports = __toCommonJS(index_exports); // src/debounce.ts function debounce(func, delay = 300) { let timer; return function(...args) { clearTimeout(timer); timer = setTimeout(() => func.apply(this, args), delay); }; } var debounce_default = debounce; // src/throttle.ts function throttle(func, limit) { let lastExecuted = 0; let timeout = null; return function(...args) { const context = this; const now = Date.now(); if (now - lastExecuted >= limit) { func.apply(context, args); lastExecuted = now; } else if (!timeout) { timeout = setTimeout(() => { func.apply(context, args); lastExecuted = Date.now(); timeout = null; }, limit - (now - lastExecuted)); } }; } var throttle_default = throttle; // src/curry.ts function curry(fn) { return function curried(...args) { if (args.length >= fn.length) { return fn.apply(this, args); } return (...nextArgs) => curried.apply(this, [...args, ...nextArgs]); }; } var curry_default = curry; // src/memoize.ts function memoize(fn) { const cache = /* @__PURE__ */ new Map(); return function(...args) { const key = JSON.stringify(args); if (cache.has(key)) { return cache.get(key); } const result = fn.apply(this, args); cache.set(key, result); return result; }; } var memoize_default = memoize; // src/once.ts function once(fn) { let called = false; let result; return function(...args) { if (!called) { called = true; result = fn.apply(this, args); } return result; }; } var once_default = once; // src/deepClone.ts function deepClone(obj) { return JSON.parse(JSON.stringify(obj)); } var deepClone_default = deepClone; // src/randomId.ts function randomId(length = 16) { const id1 = Date.now().toString(); const id2 = Math.random().toString(36).substr(2); const shuffled = (id1 + id2).split("").sort(() => Math.random() - 0.5).join(""); return shuffled.slice(0, length); } var randomId_default = randomId; // src/sleep.ts function sleep(ms = 1e3) { return new Promise((resolve) => setTimeout(resolve, ms)); } var sleep_default = sleep; // src/flatten.ts function flatten(arr) { return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []); } var flatten_default = flatten; // src/capitalize.ts function capitalize(str) { return str.charAt(0).toUpperCase() + str.slice(1); } var capitalize_default = capitalize; // src/isEmpty.ts function isEmpty(obj) { return obj === "" || obj === null || obj === void 0 || typeof obj === "object" && !Array.isArray(obj) && Object.keys(obj).length === 0 || Array.isArray(obj) && obj.length === 0; } var isEmpty_default = isEmpty; // src/chunk.ts function chunk(array, size = 1) { if (!Array.isArray(array)) { throw new TypeError("Expected an array as the first argument"); } if (size <= 0) { throw new Error("Chunk size must be greater than 0"); } const result = []; for (let i = 0; i < array.length; i += size) { result.push(array.slice(i, i + size)); } return result; } var chunk_default = chunk; // src/groupBy.ts function groupBy(array, iteratee) { if (!Array.isArray(array)) { throw new TypeError("Expected an array as the first argument"); } const result = {}; const callback = typeof iteratee === "function" ? iteratee : (item) => item[iteratee]; for (const item of array) { const key = callback(item).toString(); if (!result[key]) { result[key] = []; } result[key].push(item); } return result; } var groupBy_default = groupBy; // src/omit.ts function omit(object, paths) { if (typeof object !== "object" || object === null) { throw new TypeError("Expected an object as the first argument"); } const result = { ...object }; const keysToOmit = Array.isArray(paths) ? paths : [paths]; for (const key of keysToOmit) { delete result[key]; } return result; } var omit_default = omit; // src/pick.ts function pick(object, paths) { if (typeof object !== "object" || object === null) { throw new TypeError("Expected an object as the first argument"); } const result = {}; const keysToPick = Array.isArray(paths) ? paths : [paths]; for (const key of keysToPick) { if (Object.prototype.hasOwnProperty.call(object, key)) { result[key] = object[key]; } } return result; } var pick_default = pick; // src/merge.ts function merge(...objects) { return objects.reduce((result, current) => { if (!current) return result; Object.keys(current).forEach((key) => { const resultValue = result[key]; const currentValue = current[key]; if (Array.isArray(resultValue) && Array.isArray(currentValue)) { result[key] = [...resultValue, ...currentValue]; } else if (resultValue && currentValue && typeof resultValue === "object" && typeof currentValue === "object" && !Array.isArray(resultValue) && !Array.isArray(currentValue)) { result[key] = merge(resultValue, currentValue); } else { result[key] = currentValue; } }); return result; }, {}); } var merge_default = merge; // src/uniqueBy.ts function uniqueBy(array, iteratee) { if (!Array.isArray(array)) { throw new TypeError("Expected an array as the first argument"); } const seen = /* @__PURE__ */ new Set(); const callback = typeof iteratee === "function" ? iteratee : (item) => item[iteratee]; return array.filter((item) => { const key = callback(item); if (seen.has(key)) { return false; } seen.add(key); return true; }); } var uniqueBy_default = uniqueBy; // src/camelCase.ts function camelCase(str) { if (typeof str !== "string") { throw new TypeError("Expected a string as argument"); } return str.replace(/[\s_-]+(.)?/g, (_, char) => char ? char.toUpperCase() : "").replace(/^([A-Z])/, (match) => match.toLowerCase()); } var camelCase_default = camelCase; // src/kebabCase.ts function kebabCase(str) { if (typeof str !== "string") { throw new TypeError("Expected a string as argument"); } return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").toLowerCase(); } var kebabCase_default = kebabCase; // src/snakeCase.ts function snakeCase(str) { if (typeof str !== "string") { throw new TypeError("Expected a string as argument"); } return str.replace(/([a-z])([A-Z])/g, "$1_$2").replace(/[\s-]+/g, "_").toLowerCase(); } var snakeCase_default = snakeCase; // src/truncate.ts function truncate(str, maxLength, suffix = "...") { if (typeof str !== "string") { throw new TypeError("Expected a string as first argument"); } if (str.length <= maxLength) { return str; } const truncatedLength = maxLength - suffix.length; return truncatedLength <= 0 ? suffix : str.slice(0, truncatedLength) + suffix; } var truncate_default = truncate; // src/template.ts function template(template2, data) { if (typeof template2 !== "string") { throw new TypeError("Expected a string as first argument"); } return template2.replace(/{([^{}]*)}/g, (match, key) => { const value = key.split(".").reduce((obj, prop) => { return obj && obj[prop] !== void 0 ? obj[prop] : void 0; }, data); return value !== void 0 ? String(value) : match; }); } var template_default = template; // src/compose.ts function compose(...fns) { if (fns.length === 0) { return (x) => x; } if (fns.length === 1) { return fns[0]; } return fns.reduce((a, b) => (arg) => a(b(arg))); } var compose_default = compose; // src/pipe.ts function pipe(...fns) { if (fns.length === 0) { return (x) => x; } if (fns.length === 1) { return fns[0]; } return (x) => fns.reduce((acc, fn) => fn(acc), x); } var pipe_default = pipe; // src/partial.ts function partial(fn, ...args) { return (...remainingArgs) => fn(...args, ...remainingArgs); } var partial_default = partial; // src/isEmail.ts function isEmail(value) { if (typeof value !== "string") { return false; } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; return emailRegex.test(value); } var isEmail_default = isEmail; // src/isURL.ts function isURL(value) { if (typeof value !== "string") { return false; } try { const url = new URL(value); return url.protocol === "http:" || url.protocol === "https:"; } catch { return false; } } var isURL_default = isURL; // src/isNumeric.ts function isNumeric(value) { if (typeof value === "number") { return !isNaN(value) && isFinite(value); } if (typeof value !== "string") { return false; } return !isNaN(Number(value)) && isFinite(Number(value)); } var isNumeric_default = isNumeric; // src/cookies.ts var cookies = { /** * Get cookie value by name * @param name - Cookie name * @returns Cookie value or null if not found */ get(name) { if (typeof document === "undefined") { throw new Error("cookies.get() requires a browser environment"); } const matches = document.cookie.match(new RegExp(`(?:^|; )${name.replace(/([.$?*|{}()[\]\\/+^])/g, "\\$1")}=([^;]*)`)); return matches ? decodeURIComponent(matches[1]) : null; }, /** * Set a cookie * @param name - Cookie name * @param value - Cookie value * @param options - Cookie options */ set(name, value, options = {}) { if (typeof document === "undefined") { throw new Error("cookies.set() requires a browser environment"); } const optionsWithDefaults = { path: "/", ...options }; if (optionsWithDefaults.expires instanceof Date) { optionsWithDefaults.expires = optionsWithDefaults.expires.toUTCString(); } else if (typeof optionsWithDefaults.expires === "number") { const days = optionsWithDefaults.expires; const t = optionsWithDefaults.expires = /* @__PURE__ */ new Date(); t.setTime(t.getTime() + days * 864e5); optionsWithDefaults.expires = t.toUTCString(); } let updatedCookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`; for (const [key, val] of Object.entries(optionsWithDefaults)) { if (val === true) { updatedCookie += `; ${key}`; } else if (val !== false) { updatedCookie += `; ${key}=${val}`; } } document.cookie = updatedCookie; }, /** * Delete a cookie * @param name - Cookie name * @param options - Cookie options */ delete(name, options = {}) { this.set(name, "", { ...options, expires: -1 }); } }; var cookies_default = cookies; // src/storage.ts var storage = { /** * Set a value in localStorage with optional expiration * @param key - Storage key * @param value - Value to store * @param expiresInMs - Milliseconds until expiration (optional) */ set(key, value, expiresInMs) { if (typeof localStorage === "undefined") { throw new Error("storage.set() requires a browser environment"); } const item = { value, expires: expiresInMs ? Date.now() + expiresInMs : null }; localStorage.setItem(key, JSON.stringify(item)); }, /** * Get a value from localStorage * @param key - Storage key * @param defaultValue - Default value if not found or expired * @returns Stored value or defaultValue */ get(key, defaultValue = null) { if (typeof localStorage === "undefined") { throw new Error("storage.get() requires a browser environment"); } const itemStr = localStorage.getItem(key); if (!itemStr) { return defaultValue; } try { const item = JSON.parse(itemStr); if (item.expires && Date.now() > item.expires) { localStorage.removeItem(key); return defaultValue; } return item.value; } catch (e) { return defaultValue; } }, /** * Remove a value from localStorage * @param key - Storage key */ remove(key) { if (typeof localStorage === "undefined") { throw new Error("storage.remove() requires a browser environment"); } localStorage.removeItem(key); }, /** * Clear all values in localStorage */ clear() { if (typeof localStorage === "undefined") { throw new Error("storage.clear() requires a browser environment"); } localStorage.clear(); } }; var storage_default = storage; // src/queryParams.ts var queryParams = { /** * Get all query parameters as an object * @param url - URL to parse (defaults to current URL) * @returns Object with all query parameters */ getAll(url) { const searchParams = new URLSearchParams(url ? new URL(url).search : typeof window !== "undefined" ? window.location.search : ""); const params = {}; searchParams.forEach((value, key) => { params[key] = value; }); return params; }, /** * Get a specific query parameter * @param name - Parameter name * @param url - URL to parse (defaults to current URL) * @returns Parameter value or null if not found */ get(name, url) { const searchParams = new URLSearchParams(url ? new URL(url).search : typeof window !== "undefined" ? window.location.search : ""); return searchParams.get(name); }, /** * Set query parameters and return the new URL * @param params - Parameters to set * @param url - Base URL (defaults to current URL) * @returns New URL with updated parameters */ set(params, url) { const baseUrl = url || (typeof window !== "undefined" ? window.location.href : ""); const urlObj = new URL(baseUrl); Object.entries(params).forEach(([key, value]) => { urlObj.searchParams.set(key, value); }); return urlObj.toString(); }, /** * Remove query parameters and return the new URL * @param paramNames - Parameter names to remove * @param url - Base URL (defaults to current URL) * @returns New URL with parameters removed */ remove(paramNames, url) { const baseUrl = url || (typeof window !== "undefined" ? window.location.href : ""); const urlObj = new URL(baseUrl); const paramsToRemove = Array.isArray(paramNames) ? paramNames : [paramNames]; paramsToRemove.forEach((name) => { urlObj.searchParams.delete(name); }); return urlObj.toString(); } }; var queryParams_default = queryParams; // src/retry.ts async function retry(fn, options = {}) { const { maxAttempts = 5, initialDelay = 100, maxDelay = 1e4, factor = 2, onRetry = () => { } } = options; let attempt = 0; let delay = initialDelay; while (true) { try { return await fn(); } catch (error) { attempt++; if (attempt >= maxAttempts) { throw error; } if (error instanceof Error) { onRetry(error, attempt); } delay = Math.min(delay * factor, maxDelay); await new Promise((resolve) => setTimeout(resolve, delay)); } } } var retry_default = retry; // src/promisisfy.ts function promisify(fn) { return (...args) => { return new Promise((resolve, reject) => { fn(...args, (error, result) => { if (error) { reject(error); } else { resolve(result); } }); }); }; } var promisisfy_default = promisify; // src/parallel.ts async function parallel(tasks, concurrency = Infinity) { if (!Array.isArray(tasks)) { throw new TypeError("Expected tasks to be an array of functions"); } if (tasks.length === 0) { return []; } const results = new Array(tasks.length); const runningTasks = /* @__PURE__ */ new Set(); let nextIndex = 0; return new Promise((resolve, reject) => { const startNext = () => { if (nextIndex >= tasks.length) { if (runningTasks.size === 0) { resolve(results); } return; } const index = nextIndex++; const task = tasks[index](); const runningTask = task.then((result) => { results[index] = result; runningTasks.delete(runningTask); startNext(); }).catch((error) => { reject(error); }); runningTasks.add(runningTask); if (runningTasks.size < concurrency) { startNext(); } }; for (let i = 0; i < Math.min(concurrency, tasks.length); i++) { startNext(); } }); } var parallel_default = parallel; // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { camelCase, capitalize, chunk, compose, cookies, curry, debounce, deepClone, flatten, groupBy, isEmail, isEmpty, isNumeric, isURL, kebabCase, memoize, merge, omit, once, parallel, partial, pick, pipe, promisify, queryParams, randomId, retry, sleep, snakeCase, storage, template, throttle, truncate, uniqueBy });