bootstrap-vue-next
Version:
BootstrapVueNext is an early and lovely component library for Vue 3 & Nuxt 3 based on Bootstrap 5 and Typescript.
1 lines • 7.05 kB
Source Map (JSON)
{"version":3,"file":"object-0ALvRU0O.mjs","sources":["../src/utils/object.ts"],"sourcesContent":["/**\n * Removes properties from an object, based on the values in an array, and returns the new object.\n * Equivalent to an object version of TS Omit<>\n */\nexport const omit = <\n A extends Record<PropertyKey, unknown>,\n const B extends ReadonlyArray<PropertyKey>,\n>(\n objToPluck: Readonly<A>,\n keysToPluck: Readonly<B> | readonly (keyof A)[]\n): Omit<A, B[number]> =>\n Object.keys(objToPluck)\n .filter((key) => !keysToPluck.map((el) => el.toString()).includes(key))\n .reduce((result, key) => ({...result, [key]: objToPluck[key]}), {} as Omit<A, B[number]>)\n\n/**\n * Picks properties from an object, base on the values in an array, and returns the new object.\n * Equivalent to an object version of TS Pick<>\n */\nexport const pick = <\n A extends Record<PropertyKey, unknown>,\n const B extends ReadonlyArray<PropertyKey>,\n>(\n objToPluck: Readonly<A>,\n keysToPluck: Readonly<B> | readonly (keyof A)[]\n): Pick<A, B[number]> =>\n [...keysToPluck].reduce(\n (memo, prop) => {\n memo[prop] = objToPluck[prop]\n return memo\n },\n {} as Record<PropertyKey, unknown>\n ) as Pick<A, B[number]>\n\n/**\n * Dynamically get a nested value from an array or\n * object with a string.\n *\n * @example get(person, 'friends[0].name')\n *\n * Thanks to\n * @link https://github.com/rayepps/radash/blob/master/src/object.ts#L214\n */\nexport const get = <TDefault = unknown>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value: any,\n path: string,\n defaultValue?: Readonly<TDefault>\n): TDefault => {\n const segments = path.split(/[.[\\]]/g)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = value\n for (const key of segments) {\n if (current === null) return defaultValue as TDefault\n if (current === undefined) return defaultValue as TDefault\n if (key.trim() === '') continue\n current = current[key]\n }\n if (current === undefined) return defaultValue as TDefault\n return current\n}\n\n/**\n * Opposite of get, dynamically set a nested value into\n * an object using a key path. Does not modify the given\n * initial object.\n *\n * @example\n * set({}, 'name', 'ra') // => { name: 'ra' }\n * set({}, 'cards[0].value', 2) // => { cards: [{ value: 2 }] }\n *\n * Thanks to\n * @link https://github.com/rayepps/radash/blob/master/src/object.ts#L214\n */\nexport const set = <T extends object, K>(initial: T, path: string, value: K): T => {\n const clone = <T>(obj: T): T => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const isPrimitive = (value: any): boolean =>\n value === undefined ||\n value === null ||\n (typeof value !== 'object' && typeof value !== 'function')\n // Primitive values do not need cloning.\n if (isPrimitive(obj)) {\n return obj\n }\n\n if (typeof obj === 'function') {\n return obj.bind({})\n }\n\n const newObj = new ((obj as object).constructor as {new (): T})()\n\n // Assign the props.\n Object.getOwnPropertyNames(obj).forEach((prop) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ;(newObj as any)[prop] = (obj as any)[prop]\n })\n\n return newObj\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const toInt = <T extends number | null = number>(value: any, defaultValue?: T): number | T => {\n const def = defaultValue === undefined ? 0 : defaultValue\n if (value === null || value === undefined) {\n return def\n }\n const result = Number.parseInt(value)\n return Number.isNaN(result) ? def : result\n }\n\n if (!initial) return {} as T\n if (!path || value === undefined) return initial\n const segments = path.split(/[.[\\]]/g).filter((x) => !!x.trim())\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const _set = (node: any) => {\n if (segments.length > 1) {\n const key = segments.shift() as string\n const nextIsNum = toInt(segments[0], null) === null ? false : true\n node[key] = node[key] === undefined ? (nextIsNum ? [] : {}) : node[key]\n _set(node[key])\n } else {\n node[segments[0]] = value\n }\n }\n const cloned = clone(initial)\n _set(cloned)\n return cloned\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const deepEqual = (a: any, b: any): boolean => {\n if (a === b) {\n return true\n }\n\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\n return false\n }\n\n const keysA = Object.keys(a),\n keysB = Object.keys(b)\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n for (const key of keysA) {\n if (!keysB.includes(key) || !deepEqual(a[key], b[key])) {\n return false\n }\n }\n\n return true\n}\n"],"names":["value"],"mappings":"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"}