expand-value
Version:
Get deeply nested values from an object, like dot-prop and get-value, but with support for advanced features like bracket-notation and more.
1 lines โข 7.49 kB
Source Map (JSON)
{"version":3,"sources":["../src/utils.ts","../src/helpers.ts"],"sourcesContent":["import isNumber from 'is-number';\nimport { Segmenter } from 'intl-segmenter';\nexport { isNumber };\n\nconst { defineProperty } = Reflect;\n\nexport const isObject = val => val && typeof val === 'object' && !Array.isArray(val);\n\nexport const unquote = str => {\n if (!str) return '';\n return str.replace(/^['\"`]|['\"`]$/g, '');\n};\n\nexport const define = (node, key, value) => {\n defineProperty(node, key, {\n configurable: true,\n enumerable: false,\n writable: true,\n value\n });\n};\n\nexport const size = value => {\n if (value == null) return 0;\n if (isNumber(value)) return String(value).length;\n if (isObject(value)) return Object.keys(value).length;\n if (typeof value.length === 'number') return value.length;\n if (typeof value.size === 'number') return value.size;\n return null;\n};\n\nexport const isValidObject = val => {\n return isObject(val) || Array.isArray(val) || typeof val === 'function';\n};\n\nexport const isSafeKey = key => {\n return key !== '__proto__' && key !== 'constructor' && key !== 'prototype';\n};\n\nexport const isValid = (key, data, options) => {\n if (!isSafeKey(key)) {\n return false;\n }\n\n if (typeof options.isValid === 'function') {\n return options.isValid(key, data);\n }\n\n return true;\n};\n\nexport const isArrayLike = obj => {\n return obj != null && typeof obj === 'object' && typeof obj.length === 'number';\n};\n\nexport const toKey = value => {\n if (typeof value === 'symbol') return value;\n if (value === 0 && 1 / value === -Infinity) return '-0';\n return String(value);\n};\n\nexport const findSafeBreakPoint = input => {\n // Work backwards from the end of the input\n for (let i = input.length - 1; i >= 0; i--) {\n // Check for whitespace or simple ASCII characters\n if (/\\s/.test(input[i]) || /^[\\x20-\\x7E]$/.test(input[i])) {\n return i + 1;\n }\n }\n\n // If no safe break points were found, return the full length\n return input.length;\n};\n\nexport const getSegments = (input, language = 'en', granularity) => {\n const segmenter = new Segmenter(language, { granularity, localeMatcher: 'best fit' });\n return Array.from(segmenter.segment(input)).map(segment => segment.segment);\n};\n\nexport const getGraphemes = (input, language = 'en', maxChunkLength = 500) => {\n const graphemes = [];\n let position = 0;\n\n while (position < input.length) {\n const remainingText = input.slice(position);\n const chunkSize = Math.min(maxChunkLength, remainingText.length);\n const potentialChunk = remainingText.slice(0, chunkSize);\n\n // Find a safe position to break the chunk\n const breakPoint = findSafeBreakPoint(potentialChunk);\n const chunk = potentialChunk.slice(0, breakPoint);\n\n // Process the chunk with Intl.Segmenter\n const chunkSegments = getSegments(chunk, language, 'grapheme');\n graphemes.push(...chunkSegments);\n\n position += breakPoint;\n }\n\n return graphemes;\n};\n\n// // // Example usage\n// // const text = \"Hello ๐จโ๐ฉโ๐งโ๐ฆ world! ๐โจ\" + \"a\".repeat(1000);\n// // console.log(getGraphemes(text));\n\n// const start = new Date();\n// // console.log(getGraphemes('a'.repeat(1_000_000)));\n// const text = \"Hello ๐จโ๐ฉโ๐งโ๐ฆ world! ๐โจ a\".repeat(1_000_000);\n// console.log(Buffer.from(text).length.toLocaleString(), 'characters');\n// console.log(getGraphemes(text));\n// console.log(`Time: ${((new Date() - start) / 1000).toFixed(2)}s`);\n","import { getGraphemes, isObject, size as utilsSize } from '~/utils';\n\nexport const first = value => {\n if (!value) return;\n\n if (value instanceof Set || value instanceof Map) {\n value = [...value];\n }\n\n if (isObject(value)) {\n return typeof value.first === 'function' ? value.first() : value.first;\n }\n\n if (Array.isArray(value)) {\n return value[0];\n }\n\n if (typeof value === 'string') {\n const graphemes = getGraphemes(value.slice(0, 20));\n return graphemes[0];\n }\n\n return value[0];\n};\n\nexport const last = value => {\n if (!value) return;\n\n if (value instanceof Set || value instanceof Map) {\n value = [...value];\n }\n\n if (isObject(value)) {\n return typeof value.last === 'function' ? value.last() : value.last;\n }\n\n if (Array.isArray(value)) {\n return value[value.length - 1];\n }\n\n if (typeof value === 'string') {\n const graphemes = getGraphemes(value.slice(-20));\n return graphemes[graphemes.length - 1];\n }\n\n return value[value.length - 1];\n};\n\nexport const length = value => {\n if (typeof value?.length === 'number') {\n return value.length;\n }\n\n if (typeof value?.size === 'number') {\n return value.size;\n }\n\n return size(value);\n};\n\nexport const size = value => {\n if (value === null) {\n return 1;\n }\n\n if (typeof value?.size === 'number') {\n return value.size;\n }\n\n if (typeof value?.length === 'number') {\n return value.length;\n }\n\n return utilsSize(value);\n};\n"],"mappings":"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","names":["size"]}