UNPKG

@techmely/utils

Version:

Collection of helpful JavaScript / TypeScript utils

275 lines (264 loc) 7.54 kB
/*! * @techmely/utils * Copyright(c) 2021-2024 Techmely <techmely.creation@gmail.com> * MIT Licensed */ "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/object.ts var object_exports = {}; __export(object_exports, { deepMerge: () => deepMerge, isKeyOf: () => isKeyOf, objectCamel2Snake: () => objectCamel2Snake, objectEntries: () => objectEntries, objectKeys: () => objectKeys, objectMap: () => objectMap, pick: () => pick, removeEmptyObj: () => removeEmptyObj, removeUndefObj: () => removeUndefObj }); module.exports = __toCommonJS(object_exports); // src/convert.ts function toBoolean(val) { return val ? val !== "false" : false; } // src/env.ts var import_meta = {}; var _envShim = /* @__PURE__ */ Object.create(null); var _getEnv = (useShim) => globalThis.process?.env || // Node.js/Bun import_meta.env || // Vite env globalThis.Deno?.env.toObject() || // Deno env globalThis.__env__ || // Custom env (useShim ? _envShim : globalThis); var envs = new Proxy(_envShim, { get(_, prop) { const env = _getEnv(); return env[prop] ?? _envShim[prop]; }, has(_, prop) { const env = _getEnv(); return prop in env || prop in _envShim; }, set(_, prop, value) { const env = _getEnv(true); env[prop] = value; return true; }, deleteProperty(_, prop) { if (!prop) { return false; } const env = _getEnv(true); delete env[prop]; return true; }, ownKeys() { const env = _getEnv(); return Object.keys(env); } }); var nodeENV = typeof process !== "undefined" && process.env && process.env.NODE_ENV || ""; // src/process.ts var _process = globalThis.process || /* @__PURE__ */ Object.create(null); var processShims = { versions: {} }; var process2 = new Proxy(_process, { get(target, prop) { if (prop === "env") { return envs; } if (prop in target) { return target[prop]; } if (prop in processShims) { return processShims[prop]; } } }); var platform = _process.platform || ""; // src/is.ts function isNotNull(v) { return v !== null; } function isArray(val) { return val && Array.isArray(val); } var isDef = (val) => typeof val !== "undefined"; var isUndef = (val) => !isDef(val); var isString = (val) => typeof val === "string"; var isObject = (val) => toString.call(val) === "[object Object]"; var isBrowser = typeof window !== "undefined"; var isEmptyArr = (array) => array?.length === 0; function isEmpty(val) { if (!val) { return true; } if (isArray(val)) { return isEmptyArr(val); } if (isString(val)) { return val.trim().length === 0; } if (val instanceof Map || val instanceof Set) { return val.size === 0; } if (isObject(val)) { return Object.keys(val).length === 0; } return false; } function isNotEmpty(val) { return !isEmpty(val); } var isAndroid = isBrowser ? /(android)/i.test(navigator.userAgent) : false; var match = isBrowser ? window.matchMedia || window.msMatchMedia : void 0; var isMobile = isBrowser ? match?.("(pointer:coarse)")?.matches : false; var isCrawler = isBrowser && (!("onscroll" in window) || /(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent)); var isCI = toBoolean(envs.CI); var isNodeTest = nodeENV === "test" || toBoolean(envs.TEST); var isWindows = /^win/i.test(platform); var isLinux = /^linux/i.test(platform); var isMacOS = /^darwin/i.test(platform); // src/cache.ts var cacheStringFunction = (fn) => { const cache = /* @__PURE__ */ Object.create(null); return (str) => { const hit = cache[str]; return hit || (cache[str] = fn(str)); }; }; // src/string.ts var camelizeRE = /-(\w)/g; var camelize = cacheStringFunction((str) => { return str.replace(camelizeRE, (_, c) => c ? c.toUpperCase() : ""); }); var hyphenateRE = /\B([A-Z])/g; var hyphenate = cacheStringFunction( (str) => str.replace(hyphenateRE, "-$1").toLowerCase() ); var snake2camel = cacheStringFunction((str) => { return str.replace(/_([a-z])/g, (g) => g[1].toUpperCase()); }); var camel2snake = cacheStringFunction((str) => { return str.replace(/[A-Z0-9]/g, (char) => `_${char.toLocaleLowerCase()}`); }); var capitalizeFirst = cacheStringFunction((value) => { return value.replace(/^./, value[0].toUpperCase()); }); // src/object.ts function deepMerge(target, ...sources) { if (sources.length === 0) { return target; } const source = sources.shift(); if (source === void 0) { return target; } if (isMergeableObject(target) && isMergeableObject(source)) { const sourceKeys = Object.keys(source); for (const key of sourceKeys) { if (isMergeableObject(source[key])) { if (!target[key]) { target[key] = {}; } if (isMergeableObject(target[key])) { deepMerge(target[key], source[key]); } else { target[key] = source[key]; } } else { target[key] = source[key]; } } } return deepMerge(target, ...sources); } function isMergeableObject(item) { return isObject(item) && !isArray(item); } function removeEmptyObj(obj) { return Object.fromEntries( Object.entries(obj).filter(([_, v]) => isNotNull(v) && isDef(v) && isNotEmpty(v)) ); } function removeUndefObj(obj) { const keys = Object.keys(obj); for (const key of keys) { isUndef(obj[key]) ? obj[key] === void 0 : {}; } return obj; } function objectMap(obj, fn) { return Object.fromEntries( // @ts-expect-error ignore type check Object.entries(obj).map(([k, v]) => fn(k, v)).filter(isNotNull) ); } function isKeyOf(obj, k) { return k in obj; } function objectKeys(obj) { return Object.keys(obj); } function objectEntries(obj) { return Object.entries(obj); } function objectCamel2Snake(obj) { return Object.entries(obj).reduce( // biome-ignore lint/performance/noAccumulatingSpread: Ignore here (acc, cur) => ({ ...acc, [camel2snake(cur[0])]: cur[1] }), {} ); } function pick(state, paths) { if (Array.isArray(paths)) { return paths.reduce((acc, path) => { const _paths = path.split("."); return set(acc, _paths, get(state, _paths)); }, {}); } return get(state, paths.split(".")); } function get(state, paths) { return paths.reduce((acc, path) => acc?.[path], state); } var ProtoRE = /^(__proto__)$/; function set(state, paths, val) { const last = paths.at(-1); if (last === void 0) return state; const restPaths = paths.slice(0, -1); const result = restPaths.reduce((obj, p) => ProtoRE.test(p) ? {} : obj[p] ||= {}, state); result[last] = val; return state; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { deepMerge, isKeyOf, objectCamel2Snake, objectEntries, objectKeys, objectMap, pick, removeEmptyObj, removeUndefObj });