@rebasepro/utils 0.2.1 → 0.2.4

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/index.d.ts CHANGED
@@ -6,6 +6,5 @@ export * from "./hash";
6
6
  export * from "./regexp";
7
7
  export * from "./flatten_object";
8
8
  export * from "./plurals";
9
- export * from "./os";
10
9
  export * from "./names";
11
10
  export * from "./fields";
package/dist/index.es.js CHANGED
@@ -157,6 +157,9 @@ function mergeDeep(target, source, ignoreUndefined = false) {
157
157
  return output;
158
158
  }
159
159
  for (const key in source) {
160
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
161
+ continue;
162
+ }
160
163
  if (Object.prototype.hasOwnProperty.call(source, key)) {
161
164
  const sourceValue = source[key];
162
165
  const outputValue = output[key];
@@ -225,16 +228,22 @@ function getValueInPath(o, path) {
225
228
  return void 0;
226
229
  }
227
230
  function removeInPath(o, path) {
228
- let currentObject = {
229
- ...o
230
- };
231
+ const res = clone(o);
232
+ let current = res;
231
233
  const parts = path.split(".");
232
234
  const last = parts.pop();
233
235
  for (const part of parts) {
234
- currentObject = currentObject[part];
236
+ if (part in current && current[part] !== null && typeof current[part] === "object") {
237
+ current[part] = clone(current[part]);
238
+ current = current[part];
239
+ } else {
240
+ return res;
241
+ }
242
+ }
243
+ if (last && current && typeof current === "object") {
244
+ delete current[last];
235
245
  }
236
- if (last) delete currentObject[last];
237
- return currentObject;
246
+ return res;
238
247
  }
239
248
  function removeFunctions(o) {
240
249
  if (o === void 0) return void 0;
@@ -397,7 +406,11 @@ function flattenObject(obj, parentKey = "") {
397
406
  if (typeof obj[key] === "object" && obj[key] !== null) {
398
407
  if (Array.isArray(obj[key])) {
399
408
  obj[key].forEach((item, index) => {
400
- Object.assign(flatObj, flattenObject(item, `${newKey}[${index}]`));
409
+ if (typeof item === "object" && item !== null) {
410
+ Object.assign(flatObj, flattenObject(item, `${newKey}[${index}]`));
411
+ } else {
412
+ flatObj[`${newKey}[${index}]`] = item;
413
+ }
401
414
  });
402
415
  } else {
403
416
  Object.assign(flatObj, flattenObject(obj[key], newKey));
@@ -540,18 +553,6 @@ function singular(word, amount) {
540
553
  }
541
554
  return word;
542
555
  }
543
- function getOS() {
544
- let OS = "Unknown";
545
- if (navigator.userAgent.indexOf("Win") !== -1) OS = "Windows";
546
- if (navigator.userAgent.indexOf("Mac") !== -1) OS = "MacOS";
547
- if (navigator.userAgent.indexOf("X11") !== -1) OS = "UNIX";
548
- if (navigator.userAgent.indexOf("Linux") !== -1) OS = "Linux";
549
- return OS;
550
- }
551
- function getAltSymbol() {
552
- if (getOS() === "MacOS") return "⌥";
553
- return "Alt";
554
- }
555
556
  function generateForeignKeyName(name) {
556
557
  const snakeCaseName = toSnakeCase(name);
557
558
  const singularName = snakeCaseName.endsWith("s") ? snakeCaseName.slice(0, -1) : snakeCaseName;
@@ -567,11 +568,9 @@ export {
567
568
  defaultDateFormat,
568
569
  flattenObject,
569
570
  generateForeignKeyName,
570
- getAltSymbol,
571
571
  getArrayValuesCount,
572
572
  getHashValue,
573
573
  getIn,
574
- getOS,
575
574
  getValueInPath,
576
575
  hashString,
577
576
  hydrateRegExp,
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/strings.ts","../src/objects.ts","../src/arrays.ts","../src/dates.ts","../src/hash.ts","../src/regexp.ts","../src/flatten_object.ts","../src/plurals.ts","../src/os.ts","../src/names.ts","../src/fields.ts"],"sourcesContent":["const tokenizeRegex = /[A-Z]{2,}(?=[A-Z][a-z]|\\b)|[A-Z]?[a-z]+|[0-9]+(?:[a-z](?![a-z]))?|[A-Z]/g;\n\nexport const toKebabCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(tokenizeRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = tokenizeRegex;\n\nexport const toSnakeCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function camelCase(str: string): string {\n if (!str) return \"\";\n if (str.length === 1) return str.toLowerCase();\n\n // Split by hyphens, underscores, or spaces and filter out empty strings\n const parts = str.split(/[-_ ]+/).filter(Boolean);\n\n if (parts.length === 0) return \"\";\n\n // Start with first part in lowercase\n return parts[0].toLowerCase() +\n // Transform remaining parts to have first letter uppercase\n parts.slice(1)\n .map(part => part.charAt(0).toUpperCase() + part.substring(1).toLowerCase())\n .join(\"\");\n}\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\")\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator); // Replace multiple separators with single one\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug?: string): string {\n if (!slug) return \"\";\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substring(1);\n }).trim();\n } else {\n return slug.trim();\n }\n}\n\nexport function prettifyIdentifier(input: string) {\n if (!input) return \"\";\n\n let text = input;\n\n // 1. Handle camelCase and Acronyms\n // Group 1 ($1 $2): Lowercase followed by Uppercase (e.g., imageURL -> image URL)\n // Group 2 ($3 $4): Uppercase followed by Uppercase+lowercase (e.g., XMLParser -> XML Parser)\n text = text.replace(/([a-z])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3 $2$4\");\n\n // 2. Replace hyphens/underscores with spaces\n text = text.replace(/[_-]+/g, \" \");\n\n // 3. Capitalize first letter of each word (Title Case)\n const s = text\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n return s;\n}\n","import hash from \"object-hash\";\nimport { GeoPoint } from \"@rebasepro/types\";\n\n/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: unknown): obj is (...args: unknown[]) => unknown =>\n typeof obj === \"function\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === String(obj);\n\n/** @private is the given object a NaN? */\n\nexport const isNaN = (obj: unknown): boolean => obj !== obj;\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: Record<string, unknown> | unknown[] | unknown,\n key: string | string[],\n def?: unknown,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = (obj as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn<T>(obj: T, path: string, value: unknown): T {\n const res = clone(obj) as Record<string, unknown>;\n let resVal: Record<string, unknown> = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj = getIn(obj as Record<string, unknown>, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj as Record<string, unknown> : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res as T;\n}\n\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return [...value] as T;\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value } as T;\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\n/**\n * Deep clone a value, preserving function references and class instances.\n * Unlike structuredClone, this handles objects that contain functions\n * (e.g. EntityCollection with target(), childCollections(), callbacks).\n */\nexport function deepClone<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value === \"function\") return value;\n if (typeof value !== \"object\") return value;\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // Preserve class instances (Date, GeoPoint, etc.) — don't recurse\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n\n\nexport const pick: <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => Partial<T> = <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => ({\n ...args.reduce<Record<string, unknown>>((res, key) => ({\n ...res,\n [key as string]: obj[key as string]\n }), {})\n}) as Partial<T>;\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return !!item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n // 1. Rule out non-objects, null, and arrays\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return false;\n }\n\n // 2. Get the object's direct prototype\n const proto = Object.getPrototypeOf(obj);\n\n // 3. A plain object's direct prototype is Object.prototype\n return proto === Object.prototype;\n}\n\nexport function mergeDeep<T extends object, U extends object>(\n target: T,\n source: U,\n ignoreUndefined = false\n): T & U {\n // If target is not a true object (e.g., null, array, primitive), return target itself.\n if (!isObject(target)) {\n return target as T & U;\n }\n\n // Create a shallow copy of the target to avoid modifying the original object.\n const output = { ...target };\n\n // If source is not a true object, there's nothing to merge from it.\n // Return the shallow copy of target.\n if (!isObject(source)) {\n return output as T & U;\n }\n\n // Iterate over keys in the source object.\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const outputValue = (output as Record<string, unknown>)[key]; // Current value in our merged object (originating from target)\n\n // Skip if source value is undefined and ignoreUndefined is true.\n // This handles both not adding new undefined properties and not overwriting existing properties with undefined.\n if (ignoreUndefined && sourceValue === undefined) {\n continue;\n }\n\n if (sourceValue instanceof Date) {\n // If source value is a Date, create a new Date instance.\n (output as Record<string, unknown>)[key] = new Date(sourceValue.getTime());\n } else if (Array.isArray(sourceValue)) {\n if (Array.isArray(outputValue)) {\n const newArray = [];\n const maxLength = Math.max(outputValue.length, sourceValue.length);\n for (let i = 0; i < maxLength; i++) {\n const sourceItem = sourceValue[i];\n const targetItem = outputValue[i];\n\n if (i >= sourceValue.length) { // source is shorter\n newArray[i] = targetItem;\n } else if (i >= outputValue.length) { // target is shorter\n newArray[i] = sourceItem;\n } else if (sourceItem === null) {\n newArray[i] = targetItem;\n } else if (isPlainObject(sourceItem) && isPlainObject(targetItem)) {\n // Only recursively merge plain objects, preserve class instances\n newArray[i] = mergeDeep(targetItem, sourceItem, ignoreUndefined);\n } else {\n // For class instances and primitives, use source directly\n newArray[i] = sourceItem;\n }\n }\n (output as Record<string, unknown>)[key] = newArray;\n } else {\n // If output's value (from target) is not an array,\n // overwrite with a shallow copy of the source array.\n (output as Record<string, unknown>)[key] = [...sourceValue];\n }\n } else if (isPlainObject(sourceValue)) {\n // If source value is a plain object (not a class instance like EntityReference, GeoPoint, etc.):\n if (isPlainObject(outputValue)) {\n // If the corresponding value in output (from target) is also a plain object, recurse.\n // Ensure the ignoreUndefined flag is passed down.\n (output as Record<string, unknown>)[key] = mergeDeep(outputValue as Record<string, unknown>, sourceValue, ignoreUndefined);\n } else {\n // If output's value (from target) is not a plain object (e.g., null, primitive, class instance, or key didn't exist in original target),\n // overwrite with the source object.\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n } else if (isObject(sourceValue)) {\n // If source value is a class instance (not a plain object), use it directly to preserve prototype\n (output as Record<string, unknown>)[key] = sourceValue;\n } else {\n // If source value is a primitive, null, or undefined (and not ignored).\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return output as T & U;\n}\n\nexport function getValueInPath(o: object | undefined, path: string): unknown {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as Record<string, unknown>)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as Record<string, unknown>)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? ((o as Record<string, unknown>)[firstSegment] as unknown[])[parseInt(pathSegments[1])]\n : (o as Record<string, unknown>)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject as object | undefined, nextPath);\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n let currentObject = { ...o };\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n currentObject = (currentObject as Record<string, unknown>)[part] as Record<string, unknown>;\n }\n if (last)\n delete (currentObject as Record<string, unknown>)[last];\n return currentObject;\n}\n\nexport function removeFunctions(o: unknown): unknown {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n // Handle arrays first - map over them recursively\n if (Array.isArray(o)) {\n return o.map(v => removeFunctions(v));\n }\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(o)) {\n return o;\n }\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T): string | null {\n if (!v) return null;\n if (typeof v === \"object\" && v !== null) {\n if (\"id\" in v)\n return String((v as Record<string, unknown>).id);\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as Record<string, unknown>);\n }\n return hash(v as object, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: unknown, removeEmptyStrings?: boolean): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value as object)) {\n const childRes = removeUndefined((value as Record<string, unknown>)[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes as object) && shouldKeepIfString)\n res[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function removeNulls(value: unknown): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeNulls(v));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n const obj = value as Record<string, unknown>;\n Object.keys(obj).forEach((key) => {\n if (obj[key] !== null)\n res[key] = removeNulls(obj[key]);\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: Record<string, unknown> | unknown[], comparison: Record<string, unknown> | unknown[]) {\n const isObject = (val: unknown): val is Record<string, unknown> => typeof val === \"object\" && val !== null;\n const isArray = (val: unknown): val is unknown[] => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n if (isArray(res)) {\n for (let i = res.length - 1; i >= 0; i--) {\n if (res[i] === comparison[i]) {\n res.splice(i, 1);\n } else if (isObject(res[i]) && isObject(comparison[i])) {\n res[i] = removePropsIfExisting(res[i] as unknown as Record<string, unknown>, (comparison as unknown as unknown[])[i] as Record<string, unknown>);\n }\n }\n } else {\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n delete res[key];\n }\n }\n });\n }\n\n return res;\n}\n","export function toArray<T>(input?: T | T[]): T[] {\n return Array.isArray(input) ? input : (input ? [input] : []);\n}\n","export const defaultDateFormat = \"MMMM dd, yyyy, HH:mm:ss\";\n","export function hashString(str: string): number {\n if (!str) return 0;\n let hash = 0;\n let i;\n let chr;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n","export function serializeRegExp(input: RegExp): string {\n if (!input) return \"\";\n // const fragments = input.toString().match(/\\/(.*?)\\/([a-z]*)?$/i);\n // if (fragments) {\n // if (fragments[2])\n // return input.toString();\n // return fragments[1];\n // }\n return input.toString();\n}\n\n/**\n * Get a RegExp out of a serialized string\n * @param input\n */\nexport function hydrateRegExp(input?: string): RegExp | undefined {\n if (!input) return undefined;\n const fragments = input.match(/\\/(.*?)\\/([a-z]*)?$/i);\n if (fragments) {\n return new RegExp(fragments[1], fragments[2] || \"\");\n } else {\n return new RegExp(input, \"\");\n }\n}\n\nexport function isValidRegExp(input: string): boolean {\n const fullRegexp = input.match(/\\/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)\\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/);\n if (fullRegexp)\n return true;\n const simpleRegexp = input.match(/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)/);\n return !!simpleRegexp;\n}\n","export function flattenObject(obj: Record<string, unknown>, parentKey = \"\") {\n if (!obj) return obj;\n return Object.keys(obj).reduce((flatObj, key) => {\n const newKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n obj[key].forEach((item: unknown, index: number) => {\n Object.assign(flatObj, flattenObject(item as Record<string, unknown>, `${newKey}[${index}]`));\n });\n } else {\n Object.assign(flatObj, flattenObject(obj[key] as Record<string, unknown>, newKey));\n }\n } else {\n flatObj[newKey] = obj[key];\n }\n\n return flatObj;\n }, {} as { [key: string]: unknown });\n}\n\n\n// map from nested property key like \"a.b.c\" to the maximum array count found in a list of objects for that array\nexport type ArrayValuesCount = Record<string, number>;\n\nexport function getArrayValuesCount(array: Record<string, unknown>[]): ArrayValuesCount {\n return array.reduce((acc: ArrayValuesCount, obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n // proceed only if value is an array\n if (Array.isArray(value)) {\n acc[key] = Math.max(acc[key] || 0, value.length);\n }\n\n // handle nested object\n if (typeof value === \"object\" && value !== null) {\n const nested = getArrayValuesCount([value as Record<string, unknown>]);\n Object.entries(nested).forEach(([nestedKey, nestedCount]) => {\n const compoundKey = `${key}.${nestedKey}`;\n acc[compoundKey] = Math.max(acc[compoundKey] || 0, nestedCount);\n });\n }\n });\n return acc;\n }, {});\n}\n","/**\n * Returns the plural of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function plural(word: string, amount?: number): string {\n if (amount !== undefined && amount === 1) {\n return word\n }\n const plurals: { [key: string]: string } = {\n \"(quiz)$\": \"$1zes\",\n \"^(ox)$\": \"$1en\",\n \"([m|l])ouse$\": \"$1ice\",\n \"(matr|vert|ind)ix|ex$\": \"$1ices\",\n \"(x|ch|ss|sh)$\": \"$1es\",\n \"([^aeiouy]|qu)y$\": \"$1ies\",\n \"(hive)$\": \"$1s\",\n \"(?:([^f])fe|([lr])f)$\": \"$1$2ves\",\n \"(shea|lea|loa|thie)f$\": \"$1ves\",\n sis$: \"ses\",\n \"([ti])um$\": \"$1a\",\n \"(tomat|potat|ech|her|vet)o$\": \"$1oes\",\n \"(bu)s$\": \"$1ses\",\n \"(alias)$\": \"$1es\",\n \"(octop)us$\": \"$1i\",\n \"(ax|test)is$\": \"$1es\",\n \"(us)$\": \"$1es\",\n \"([^s]+)$\": \"$1s\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${w}$`, \"i\")\n const replace = irregular[w]\n if (pattern.test(word)) {\n return word.replace(pattern, replace);\n }\n }\n // check for matches using regular expressions\n for (const reg in plurals) {\n const pattern = new RegExp(reg, \"i\")\n if (pattern.test(word)) {\n return word.replace(pattern, plurals[reg])\n }\n }\n return word;\n}\n\n/**\n * Returns the singular of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function singular(word: string, amount?: number): string {\n if (amount !== undefined && amount !== 1) {\n return word;\n }\n const singulars: { [key: string]: string } = {\n \"(quiz)zes$\": \"$1\",\n \"(matr)ices$\": \"$1ix\",\n \"(vert|ind)ices$\": \"$1ex\",\n \"^(ox)en$\": \"$1\",\n \"(alias)es$\": \"$1\",\n \"(octop|vir)i$\": \"$1us\",\n \"(cris|ax|test)es$\": \"$1is\",\n \"(shoe)s$\": \"$1\",\n \"(o)es$\": \"$1\",\n \"(bus)es$\": \"$1\",\n \"([m|l])ice$\": \"$1ouse\",\n \"(x|ch|ss|sh)es$\": \"$1\",\n \"(m)ovies$\": \"$1ovie\",\n \"(s)eries$\": \"$1eries\",\n \"([^aeiouy]|qu)ies$\": \"$1y\",\n \"([lr])ves$\": \"$1f\",\n \"(tive)s$\": \"$1\",\n \"(hive)s$\": \"$1\",\n \"(li|wi|kni)ves$\": \"$1fe\",\n \"(shea|loa|lea|thie)ves$\": \"$1f\",\n \"(^analy)ses$\": \"$1sis\",\n \"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$\": \"$1$2sis\",\n \"([ti])a$\": \"$1um\",\n \"(n)ews$\": \"$1ews\",\n \"(h|bl)ouses$\": \"$1ouse\",\n \"(corpse)s$\": \"$1\",\n \"(us)es$\": \"$1\",\n s$: \"\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${irregular[w]}$`, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, w);\n }\n }\n // check for matches using regular expressions\n for (const reg in singulars) {\n const pattern = new RegExp(reg, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, singulars[reg]);\n }\n }\n return word;\n}\n","export function getOS() {\n let OS = \"Unknown\";\n if (navigator.userAgent.indexOf(\"Win\") !== -1) OS = \"Windows\";\n if (navigator.userAgent.indexOf(\"Mac\") !== -1) OS = \"MacOS\";\n if (navigator.userAgent.indexOf(\"X11\") !== -1) OS = \"UNIX\";\n if (navigator.userAgent.indexOf(\"Linux\") !== -1) OS = \"Linux\";\n return OS;\n}\n\nexport function getAltSymbol() {\n if (getOS() === \"MacOS\") return \"⌥\";\n return \"Alt\";\n}\n","import { toSnakeCase } from \"./strings\";\n\n/**\n * Generates a foreign key column name from a given string, typically a collection slug or name.\n * It converts the name to snake_case, attempts to singularize it by removing a trailing 's'\n * (a common convention for collection names), and appends '_id'.\n *\n * @param name The base name to convert to a foreign key.\n * @returns A foreign key name in the format 'singular_name_id'.\n *\n * @example\n * // returns \"user_id\"\n * generateForeignKeyName(\"users\")\n *\n * @example\n * // returns \"post_id\"\n * generateForeignKeyName(\"posts\")\n *\n * @example\n * // returns \"product_id\"\n * generateForeignKeyName(\"Product\")\n *\n */\nexport function generateForeignKeyName(name: string): string {\n const snakeCaseName = toSnakeCase(name);\n // A simple heuristic to singularize a plural name, which is a common convention.\n const singularName = snakeCaseName.endsWith(\"s\") ? snakeCaseName.slice(0, -1) : snakeCaseName;\n return `${singularName}_id`;\n}\n\n","\n\nexport function isDefaultFieldConfigId(id: string): boolean {\n return [\"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"switch\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference_as_string\",\n \"reference\",\n \"multi_references\",\n \"relation\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"custom_array\",\n \"block\"\n ].includes(id);\n}\n"],"names":["tokenizeRegex","toKebabCase","str","regExpMatchArray","match","map","x","toLowerCase","join","snakeCaseRegex","toSnakeCase","camelCase","length","parts","split","filter","Boolean","slice","part","charAt","toUpperCase","substring","randomString","strLength","Math","random","toString","randomColor","floor","slugify","text","separator","lowercase","from","to","i","l","replace","RegExp","trim","unslugify","slug","includes","result","txt","prettifyIdentifier","input","s","char","isEmptyArray","value","Array","isArray","isFunction","obj","isInteger","String","Number","isNaN","getIn","key","def","p","path","toPath","undefined","setIn","res","clone","resVal","pathArray","currentPath","currentObj","isObject","nextPath","deepClone","item","Object","getPrototypeOf","prototype","keys","pick","args","reduce","isPlainObject","proto","mergeDeep","target","source","ignoreUndefined","output","hasOwnProperty","call","sourceValue","outputValue","Date","getTime","newArray","maxLength","max","sourceItem","targetItem","getValueInPath","o","pathSegments","segment","firstSegment","isArrayAndIndexExists","parseInt","nextObject","removeInPath","currentObject","last","pop","removeFunctions","v","entries","_","a","b","getHashValue","id","toLocaleString","GeoPoint","hash","ignoreUnknown","removeUndefined","removeEmptyStrings","forEach","isEmptyObject","childRes","isString","shouldKeepIfString","removeNulls","removePropsIfExisting","comparison","val","splice","toArray","defaultDateFormat","hashString","chr","charCodeAt","abs","serializeRegExp","hydrateRegExp","fragments","isValidRegExp","fullRegexp","simpleRegexp","flattenObject","parentKey","flatObj","newKey","index","assign","getArrayValuesCount","array","acc","nested","nestedKey","nestedCount","compoundKey","plural","word","amount","plurals","sis$","irregular","move","foot","goose","sex","child","man","tooth","person","uncountable","indexOf","w","pattern","test","reg","singular","singulars","s$","getOS","OS","navigator","userAgent","getAltSymbol","generateForeignKeyName","name","snakeCaseName","singularName","endsWith","isDefaultFieldConfigId"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/strings.ts","../src/objects.ts","../src/arrays.ts","../src/dates.ts","../src/hash.ts","../src/regexp.ts","../src/flatten_object.ts","../src/plurals.ts","../src/names.ts","../src/fields.ts"],"sourcesContent":["const tokenizeRegex = /[A-Z]{2,}(?=[A-Z][a-z]|\\b)|[A-Z]?[a-z]+|[0-9]+(?:[a-z](?![a-z]))?|[A-Z]/g;\n\nexport const toKebabCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(tokenizeRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = tokenizeRegex;\n\nexport const toSnakeCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function camelCase(str: string): string {\n if (!str) return \"\";\n if (str.length === 1) return str.toLowerCase();\n\n // Split by hyphens, underscores, or spaces and filter out empty strings\n const parts = str.split(/[-_ ]+/).filter(Boolean);\n\n if (parts.length === 0) return \"\";\n\n // Start with first part in lowercase\n return parts[0].toLowerCase() +\n // Transform remaining parts to have first letter uppercase\n parts.slice(1)\n .map(part => part.charAt(0).toUpperCase() + part.substring(1).toLowerCase())\n .join(\"\");\n}\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\")\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator); // Replace multiple separators with single one\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug?: string): string {\n if (!slug) return \"\";\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substring(1);\n }).trim();\n } else {\n return slug.trim();\n }\n}\n\nexport function prettifyIdentifier(input: string) {\n if (!input) return \"\";\n\n let text = input;\n\n // 1. Handle camelCase and Acronyms\n // Group 1 ($1 $2): Lowercase followed by Uppercase (e.g., imageURL -> image URL)\n // Group 2 ($3 $4): Uppercase followed by Uppercase+lowercase (e.g., XMLParser -> XML Parser)\n text = text.replace(/([a-z])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3 $2$4\");\n\n // 2. Replace hyphens/underscores with spaces\n text = text.replace(/[_-]+/g, \" \");\n\n // 3. Capitalize first letter of each word (Title Case)\n const s = text\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n return s;\n}\n","import hash from \"object-hash\";\nimport { GeoPoint } from \"@rebasepro/types\";\n\n/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: unknown): obj is (...args: unknown[]) => unknown =>\n typeof obj === \"function\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === String(obj);\n\n/** @private is the given object a NaN? */\n\nexport const isNaN = (obj: unknown): boolean => obj !== obj;\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: Record<string, unknown> | unknown[] | unknown,\n key: string | string[],\n def?: unknown,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = (obj as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn<T>(obj: T, path: string, value: unknown): T {\n const res = clone(obj) as Record<string, unknown>;\n let resVal: Record<string, unknown> = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj = getIn(obj as Record<string, unknown>, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj as Record<string, unknown> : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res as T;\n}\n\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return [...value] as T;\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value } as T;\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\n/**\n * Deep clone a value, preserving function references and class instances.\n * Unlike structuredClone, this handles objects that contain functions\n * (e.g. EntityCollection with target(), childCollections(), callbacks).\n */\nexport function deepClone<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value === \"function\") return value;\n if (typeof value !== \"object\") return value;\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // Preserve class instances (Date, GeoPoint, etc.) — don't recurse\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n\n\nexport const pick: <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => Partial<T> = <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => ({\n ...args.reduce<Record<string, unknown>>((res, key) => ({\n ...res,\n [key as string]: obj[key as string]\n }), {})\n}) as Partial<T>;\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return !!item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n // 1. Rule out non-objects, null, and arrays\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return false;\n }\n\n // 2. Get the object's direct prototype\n const proto = Object.getPrototypeOf(obj);\n\n // 3. A plain object's direct prototype is Object.prototype\n return proto === Object.prototype;\n}\n\nexport function mergeDeep<T extends object, U extends object>(\n target: T,\n source: U,\n ignoreUndefined = false\n): T & U {\n // If target is not a true object (e.g., null, array, primitive), return target itself.\n if (!isObject(target)) {\n return target as T & U;\n }\n\n // Create a shallow copy of the target to avoid modifying the original object.\n const output = { ...target };\n\n // If source is not a true object, there's nothing to merge from it.\n // Return the shallow copy of target.\n if (!isObject(source)) {\n return output as T & U;\n }\n\n // Iterate over keys in the source object.\n for (const key in source) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const outputValue = (output as Record<string, unknown>)[key]; // Current value in our merged object (originating from target)\n\n // Skip if source value is undefined and ignoreUndefined is true.\n // This handles both not adding new undefined properties and not overwriting existing properties with undefined.\n if (ignoreUndefined && sourceValue === undefined) {\n continue;\n }\n\n if (sourceValue instanceof Date) {\n // If source value is a Date, create a new Date instance.\n (output as Record<string, unknown>)[key] = new Date(sourceValue.getTime());\n } else if (Array.isArray(sourceValue)) {\n if (Array.isArray(outputValue)) {\n const newArray = [];\n const maxLength = Math.max(outputValue.length, sourceValue.length);\n for (let i = 0; i < maxLength; i++) {\n const sourceItem = sourceValue[i];\n const targetItem = outputValue[i];\n\n if (i >= sourceValue.length) { // source is shorter\n newArray[i] = targetItem;\n } else if (i >= outputValue.length) { // target is shorter\n newArray[i] = sourceItem;\n } else if (sourceItem === null) {\n newArray[i] = targetItem;\n } else if (isPlainObject(sourceItem) && isPlainObject(targetItem)) {\n // Only recursively merge plain objects, preserve class instances\n newArray[i] = mergeDeep(targetItem, sourceItem, ignoreUndefined);\n } else {\n // For class instances and primitives, use source directly\n newArray[i] = sourceItem;\n }\n }\n (output as Record<string, unknown>)[key] = newArray;\n } else {\n // If output's value (from target) is not an array,\n // overwrite with a shallow copy of the source array.\n (output as Record<string, unknown>)[key] = [...sourceValue];\n }\n } else if (isPlainObject(sourceValue)) {\n // If source value is a plain object (not a class instance like EntityReference, GeoPoint, etc.):\n if (isPlainObject(outputValue)) {\n // If the corresponding value in output (from target) is also a plain object, recurse.\n // Ensure the ignoreUndefined flag is passed down.\n (output as Record<string, unknown>)[key] = mergeDeep(outputValue as Record<string, unknown>, sourceValue, ignoreUndefined);\n } else {\n // If output's value (from target) is not a plain object (e.g., null, primitive, class instance, or key didn't exist in original target),\n // overwrite with the source object.\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n } else if (isObject(sourceValue)) {\n // If source value is a class instance (not a plain object), use it directly to preserve prototype\n (output as Record<string, unknown>)[key] = sourceValue;\n } else {\n // If source value is a primitive, null, or undefined (and not ignored).\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return output as T & U;\n}\n\nexport function getValueInPath(o: object | undefined, path: string): unknown {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as Record<string, unknown>)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as Record<string, unknown>)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? ((o as Record<string, unknown>)[firstSegment] as unknown[])[parseInt(pathSegments[1])]\n : (o as Record<string, unknown>)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject as object | undefined, nextPath);\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n const res = clone(o) as Record<string, unknown>;\n let current = res;\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n if (part in current && current[part] !== null && typeof current[part] === \"object\") {\n current[part] = clone(current[part]) as Record<string, unknown>;\n current = current[part] as Record<string, unknown>;\n } else {\n return res;\n }\n }\n if (last && current && typeof current === \"object\") {\n delete current[last];\n }\n return res;\n}\n\nexport function removeFunctions(o: unknown): unknown {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n // Handle arrays first - map over them recursively\n if (Array.isArray(o)) {\n return o.map(v => removeFunctions(v));\n }\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(o)) {\n return o;\n }\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T): string | null {\n if (!v) return null;\n if (typeof v === \"object\" && v !== null) {\n if (\"id\" in v)\n return String((v as Record<string, unknown>).id);\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as Record<string, unknown>);\n }\n return hash(v as object, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: unknown, removeEmptyStrings?: boolean): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value as object)) {\n const childRes = removeUndefined((value as Record<string, unknown>)[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes as object) && shouldKeepIfString)\n res[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function removeNulls(value: unknown): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeNulls(v));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n const obj = value as Record<string, unknown>;\n Object.keys(obj).forEach((key) => {\n if (obj[key] !== null)\n res[key] = removeNulls(obj[key]);\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: Record<string, unknown> | unknown[], comparison: Record<string, unknown> | unknown[]) {\n const isObject = (val: unknown): val is Record<string, unknown> => typeof val === \"object\" && val !== null;\n const isArray = (val: unknown): val is unknown[] => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n if (isArray(res)) {\n for (let i = res.length - 1; i >= 0; i--) {\n if (res[i] === comparison[i]) {\n res.splice(i, 1);\n } else if (isObject(res[i]) && isObject(comparison[i])) {\n res[i] = removePropsIfExisting(res[i] as unknown as Record<string, unknown>, (comparison as unknown as unknown[])[i] as Record<string, unknown>);\n }\n }\n } else {\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n delete res[key];\n }\n }\n });\n }\n\n return res;\n}\n","export function toArray<T>(input?: T | T[]): T[] {\n return Array.isArray(input) ? input : (input ? [input] : []);\n}\n","export const defaultDateFormat = \"MMMM dd, yyyy, HH:mm:ss\";\n","export function hashString(str: string): number {\n if (!str) return 0;\n let hash = 0;\n let i;\n let chr;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n","export function serializeRegExp(input: RegExp): string {\n if (!input) return \"\";\n // const fragments = input.toString().match(/\\/(.*?)\\/([a-z]*)?$/i);\n // if (fragments) {\n // if (fragments[2])\n // return input.toString();\n // return fragments[1];\n // }\n return input.toString();\n}\n\n/**\n * Get a RegExp out of a serialized string\n * @param input\n */\nexport function hydrateRegExp(input?: string): RegExp | undefined {\n if (!input) return undefined;\n const fragments = input.match(/\\/(.*?)\\/([a-z]*)?$/i);\n if (fragments) {\n return new RegExp(fragments[1], fragments[2] || \"\");\n } else {\n return new RegExp(input, \"\");\n }\n}\n\nexport function isValidRegExp(input: string): boolean {\n const fullRegexp = input.match(/\\/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)\\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/);\n if (fullRegexp)\n return true;\n const simpleRegexp = input.match(/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)/);\n return !!simpleRegexp;\n}\n","export function flattenObject(obj: Record<string, unknown>, parentKey = \"\") {\n if (!obj) return obj;\n return Object.keys(obj).reduce((flatObj, key) => {\n const newKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n obj[key].forEach((item: unknown, index: number) => {\n if (typeof item === \"object\" && item !== null) {\n Object.assign(flatObj, flattenObject(item as Record<string, unknown>, `${newKey}[${index}]`));\n } else {\n flatObj[`${newKey}[${index}]`] = item;\n }\n });\n } else {\n Object.assign(flatObj, flattenObject(obj[key] as Record<string, unknown>, newKey));\n }\n } else {\n flatObj[newKey] = obj[key];\n }\n\n return flatObj;\n }, {} as { [key: string]: unknown });\n}\n\n\n// map from nested property key like \"a.b.c\" to the maximum array count found in a list of objects for that array\nexport type ArrayValuesCount = Record<string, number>;\n\nexport function getArrayValuesCount(array: Record<string, unknown>[]): ArrayValuesCount {\n return array.reduce((acc: ArrayValuesCount, obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n // proceed only if value is an array\n if (Array.isArray(value)) {\n acc[key] = Math.max(acc[key] || 0, value.length);\n }\n\n // handle nested object\n if (typeof value === \"object\" && value !== null) {\n const nested = getArrayValuesCount([value as Record<string, unknown>]);\n Object.entries(nested).forEach(([nestedKey, nestedCount]) => {\n const compoundKey = `${key}.${nestedKey}`;\n acc[compoundKey] = Math.max(acc[compoundKey] || 0, nestedCount);\n });\n }\n });\n return acc;\n }, {});\n}\n","/**\n * Returns the plural of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function plural(word: string, amount?: number): string {\n if (amount !== undefined && amount === 1) {\n return word\n }\n const plurals: { [key: string]: string } = {\n \"(quiz)$\": \"$1zes\",\n \"^(ox)$\": \"$1en\",\n \"([m|l])ouse$\": \"$1ice\",\n \"(matr|vert|ind)ix|ex$\": \"$1ices\",\n \"(x|ch|ss|sh)$\": \"$1es\",\n \"([^aeiouy]|qu)y$\": \"$1ies\",\n \"(hive)$\": \"$1s\",\n \"(?:([^f])fe|([lr])f)$\": \"$1$2ves\",\n \"(shea|lea|loa|thie)f$\": \"$1ves\",\n sis$: \"ses\",\n \"([ti])um$\": \"$1a\",\n \"(tomat|potat|ech|her|vet)o$\": \"$1oes\",\n \"(bu)s$\": \"$1ses\",\n \"(alias)$\": \"$1es\",\n \"(octop)us$\": \"$1i\",\n \"(ax|test)is$\": \"$1es\",\n \"(us)$\": \"$1es\",\n \"([^s]+)$\": \"$1s\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${w}$`, \"i\")\n const replace = irregular[w]\n if (pattern.test(word)) {\n return word.replace(pattern, replace);\n }\n }\n // check for matches using regular expressions\n for (const reg in plurals) {\n const pattern = new RegExp(reg, \"i\")\n if (pattern.test(word)) {\n return word.replace(pattern, plurals[reg])\n }\n }\n return word;\n}\n\n/**\n * Returns the singular of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function singular(word: string, amount?: number): string {\n if (amount !== undefined && amount !== 1) {\n return word;\n }\n const singulars: { [key: string]: string } = {\n \"(quiz)zes$\": \"$1\",\n \"(matr)ices$\": \"$1ix\",\n \"(vert|ind)ices$\": \"$1ex\",\n \"^(ox)en$\": \"$1\",\n \"(alias)es$\": \"$1\",\n \"(octop|vir)i$\": \"$1us\",\n \"(cris|ax|test)es$\": \"$1is\",\n \"(shoe)s$\": \"$1\",\n \"(o)es$\": \"$1\",\n \"(bus)es$\": \"$1\",\n \"([m|l])ice$\": \"$1ouse\",\n \"(x|ch|ss|sh)es$\": \"$1\",\n \"(m)ovies$\": \"$1ovie\",\n \"(s)eries$\": \"$1eries\",\n \"([^aeiouy]|qu)ies$\": \"$1y\",\n \"([lr])ves$\": \"$1f\",\n \"(tive)s$\": \"$1\",\n \"(hive)s$\": \"$1\",\n \"(li|wi|kni)ves$\": \"$1fe\",\n \"(shea|loa|lea|thie)ves$\": \"$1f\",\n \"(^analy)ses$\": \"$1sis\",\n \"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$\": \"$1$2sis\",\n \"([ti])a$\": \"$1um\",\n \"(n)ews$\": \"$1ews\",\n \"(h|bl)ouses$\": \"$1ouse\",\n \"(corpse)s$\": \"$1\",\n \"(us)es$\": \"$1\",\n s$: \"\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${irregular[w]}$`, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, w);\n }\n }\n // check for matches using regular expressions\n for (const reg in singulars) {\n const pattern = new RegExp(reg, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, singulars[reg]);\n }\n }\n return word;\n}\n","import { toSnakeCase } from \"./strings\";\n\n/**\n * Generates a foreign key column name from a given string, typically a collection slug or name.\n * It converts the name to snake_case, attempts to singularize it by removing a trailing 's'\n * (a common convention for collection names), and appends '_id'.\n *\n * @param name The base name to convert to a foreign key.\n * @returns A foreign key name in the format 'singular_name_id'.\n *\n * @example\n * // returns \"user_id\"\n * generateForeignKeyName(\"users\")\n *\n * @example\n * // returns \"post_id\"\n * generateForeignKeyName(\"posts\")\n *\n * @example\n * // returns \"product_id\"\n * generateForeignKeyName(\"Product\")\n *\n */\nexport function generateForeignKeyName(name: string): string {\n const snakeCaseName = toSnakeCase(name);\n // A simple heuristic to singularize a plural name, which is a common convention.\n const singularName = snakeCaseName.endsWith(\"s\") ? snakeCaseName.slice(0, -1) : snakeCaseName;\n return `${singularName}_id`;\n}\n\n","\n\nexport function isDefaultFieldConfigId(id: string): boolean {\n return [\"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"switch\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference_as_string\",\n \"reference\",\n \"multi_references\",\n \"relation\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"custom_array\",\n \"block\"\n ].includes(id);\n}\n"],"names":["tokenizeRegex","toKebabCase","str","regExpMatchArray","match","map","x","toLowerCase","join","snakeCaseRegex","toSnakeCase","camelCase","length","parts","split","filter","Boolean","slice","part","charAt","toUpperCase","substring","randomString","strLength","Math","random","toString","randomColor","floor","slugify","text","separator","lowercase","from","to","i","l","replace","RegExp","trim","unslugify","slug","includes","result","txt","prettifyIdentifier","input","s","char","isEmptyArray","value","Array","isArray","isFunction","obj","isInteger","String","Number","isNaN","getIn","key","def","p","path","toPath","undefined","setIn","res","clone","resVal","pathArray","currentPath","currentObj","isObject","nextPath","deepClone","item","Object","getPrototypeOf","prototype","keys","pick","args","reduce","isPlainObject","proto","mergeDeep","target","source","ignoreUndefined","output","hasOwnProperty","call","sourceValue","outputValue","Date","getTime","newArray","maxLength","max","sourceItem","targetItem","getValueInPath","o","pathSegments","segment","firstSegment","isArrayAndIndexExists","parseInt","nextObject","removeInPath","current","last","pop","removeFunctions","v","entries","_","a","b","getHashValue","id","toLocaleString","GeoPoint","hash","ignoreUnknown","removeUndefined","removeEmptyStrings","forEach","isEmptyObject","childRes","isString","shouldKeepIfString","removeNulls","removePropsIfExisting","comparison","val","splice","toArray","defaultDateFormat","hashString","chr","charCodeAt","abs","serializeRegExp","hydrateRegExp","fragments","isValidRegExp","fullRegexp","simpleRegexp","flattenObject","parentKey","flatObj","newKey","index","assign","getArrayValuesCount","array","acc","nested","nestedKey","nestedCount","compoundKey","plural","word","amount","plurals","sis$","irregular","move","foot","goose","sex","child","man","tooth","person","uncountable","indexOf","w","pattern","test","reg","singular","singulars","s$","generateForeignKeyName","name","snakeCaseName","singularName","endsWith","isDefaultFieldConfigId"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -159,6 +159,9 @@
159
159
  return output;
160
160
  }
161
161
  for (const key in source) {
162
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
163
+ continue;
164
+ }
162
165
  if (Object.prototype.hasOwnProperty.call(source, key)) {
163
166
  const sourceValue = source[key];
164
167
  const outputValue = output[key];
@@ -227,16 +230,22 @@
227
230
  return void 0;
228
231
  }
229
232
  function removeInPath(o, path) {
230
- let currentObject = {
231
- ...o
232
- };
233
+ const res = clone(o);
234
+ let current = res;
233
235
  const parts = path.split(".");
234
236
  const last = parts.pop();
235
237
  for (const part of parts) {
236
- currentObject = currentObject[part];
238
+ if (part in current && current[part] !== null && typeof current[part] === "object") {
239
+ current[part] = clone(current[part]);
240
+ current = current[part];
241
+ } else {
242
+ return res;
243
+ }
244
+ }
245
+ if (last && current && typeof current === "object") {
246
+ delete current[last];
237
247
  }
238
- if (last) delete currentObject[last];
239
- return currentObject;
248
+ return res;
240
249
  }
241
250
  function removeFunctions(o) {
242
251
  if (o === void 0) return void 0;
@@ -399,7 +408,11 @@
399
408
  if (typeof obj[key] === "object" && obj[key] !== null) {
400
409
  if (Array.isArray(obj[key])) {
401
410
  obj[key].forEach((item, index) => {
402
- Object.assign(flatObj, flattenObject(item, `${newKey}[${index}]`));
411
+ if (typeof item === "object" && item !== null) {
412
+ Object.assign(flatObj, flattenObject(item, `${newKey}[${index}]`));
413
+ } else {
414
+ flatObj[`${newKey}[${index}]`] = item;
415
+ }
403
416
  });
404
417
  } else {
405
418
  Object.assign(flatObj, flattenObject(obj[key], newKey));
@@ -542,18 +555,6 @@
542
555
  }
543
556
  return word;
544
557
  }
545
- function getOS() {
546
- let OS = "Unknown";
547
- if (navigator.userAgent.indexOf("Win") !== -1) OS = "Windows";
548
- if (navigator.userAgent.indexOf("Mac") !== -1) OS = "MacOS";
549
- if (navigator.userAgent.indexOf("X11") !== -1) OS = "UNIX";
550
- if (navigator.userAgent.indexOf("Linux") !== -1) OS = "Linux";
551
- return OS;
552
- }
553
- function getAltSymbol() {
554
- if (getOS() === "MacOS") return "⌥";
555
- return "Alt";
556
- }
557
558
  function generateForeignKeyName(name) {
558
559
  const snakeCaseName = toSnakeCase(name);
559
560
  const singularName = snakeCaseName.endsWith("s") ? snakeCaseName.slice(0, -1) : snakeCaseName;
@@ -568,11 +569,9 @@
568
569
  exports2.defaultDateFormat = defaultDateFormat;
569
570
  exports2.flattenObject = flattenObject;
570
571
  exports2.generateForeignKeyName = generateForeignKeyName;
571
- exports2.getAltSymbol = getAltSymbol;
572
572
  exports2.getArrayValuesCount = getArrayValuesCount;
573
573
  exports2.getHashValue = getHashValue;
574
574
  exports2.getIn = getIn;
575
- exports2.getOS = getOS;
576
575
  exports2.getValueInPath = getValueInPath;
577
576
  exports2.hashString = hashString;
578
577
  exports2.hydrateRegExp = hydrateRegExp;
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/strings.ts","../src/objects.ts","../src/arrays.ts","../src/dates.ts","../src/hash.ts","../src/regexp.ts","../src/flatten_object.ts","../src/plurals.ts","../src/os.ts","../src/names.ts","../src/fields.ts"],"sourcesContent":["const tokenizeRegex = /[A-Z]{2,}(?=[A-Z][a-z]|\\b)|[A-Z]?[a-z]+|[0-9]+(?:[a-z](?![a-z]))?|[A-Z]/g;\n\nexport const toKebabCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(tokenizeRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = tokenizeRegex;\n\nexport const toSnakeCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function camelCase(str: string): string {\n if (!str) return \"\";\n if (str.length === 1) return str.toLowerCase();\n\n // Split by hyphens, underscores, or spaces and filter out empty strings\n const parts = str.split(/[-_ ]+/).filter(Boolean);\n\n if (parts.length === 0) return \"\";\n\n // Start with first part in lowercase\n return parts[0].toLowerCase() +\n // Transform remaining parts to have first letter uppercase\n parts.slice(1)\n .map(part => part.charAt(0).toUpperCase() + part.substring(1).toLowerCase())\n .join(\"\");\n}\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\")\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator); // Replace multiple separators with single one\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug?: string): string {\n if (!slug) return \"\";\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substring(1);\n }).trim();\n } else {\n return slug.trim();\n }\n}\n\nexport function prettifyIdentifier(input: string) {\n if (!input) return \"\";\n\n let text = input;\n\n // 1. Handle camelCase and Acronyms\n // Group 1 ($1 $2): Lowercase followed by Uppercase (e.g., imageURL -> image URL)\n // Group 2 ($3 $4): Uppercase followed by Uppercase+lowercase (e.g., XMLParser -> XML Parser)\n text = text.replace(/([a-z])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3 $2$4\");\n\n // 2. Replace hyphens/underscores with spaces\n text = text.replace(/[_-]+/g, \" \");\n\n // 3. Capitalize first letter of each word (Title Case)\n const s = text\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n return s;\n}\n","import hash from \"object-hash\";\nimport { GeoPoint } from \"@rebasepro/types\";\n\n/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: unknown): obj is (...args: unknown[]) => unknown =>\n typeof obj === \"function\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === String(obj);\n\n/** @private is the given object a NaN? */\n\nexport const isNaN = (obj: unknown): boolean => obj !== obj;\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: Record<string, unknown> | unknown[] | unknown,\n key: string | string[],\n def?: unknown,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = (obj as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn<T>(obj: T, path: string, value: unknown): T {\n const res = clone(obj) as Record<string, unknown>;\n let resVal: Record<string, unknown> = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj = getIn(obj as Record<string, unknown>, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj as Record<string, unknown> : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res as T;\n}\n\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return [...value] as T;\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value } as T;\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\n/**\n * Deep clone a value, preserving function references and class instances.\n * Unlike structuredClone, this handles objects that contain functions\n * (e.g. EntityCollection with target(), childCollections(), callbacks).\n */\nexport function deepClone<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value === \"function\") return value;\n if (typeof value !== \"object\") return value;\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // Preserve class instances (Date, GeoPoint, etc.) — don't recurse\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n\n\nexport const pick: <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => Partial<T> = <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => ({\n ...args.reduce<Record<string, unknown>>((res, key) => ({\n ...res,\n [key as string]: obj[key as string]\n }), {})\n}) as Partial<T>;\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return !!item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n // 1. Rule out non-objects, null, and arrays\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return false;\n }\n\n // 2. Get the object's direct prototype\n const proto = Object.getPrototypeOf(obj);\n\n // 3. A plain object's direct prototype is Object.prototype\n return proto === Object.prototype;\n}\n\nexport function mergeDeep<T extends object, U extends object>(\n target: T,\n source: U,\n ignoreUndefined = false\n): T & U {\n // If target is not a true object (e.g., null, array, primitive), return target itself.\n if (!isObject(target)) {\n return target as T & U;\n }\n\n // Create a shallow copy of the target to avoid modifying the original object.\n const output = { ...target };\n\n // If source is not a true object, there's nothing to merge from it.\n // Return the shallow copy of target.\n if (!isObject(source)) {\n return output as T & U;\n }\n\n // Iterate over keys in the source object.\n for (const key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const outputValue = (output as Record<string, unknown>)[key]; // Current value in our merged object (originating from target)\n\n // Skip if source value is undefined and ignoreUndefined is true.\n // This handles both not adding new undefined properties and not overwriting existing properties with undefined.\n if (ignoreUndefined && sourceValue === undefined) {\n continue;\n }\n\n if (sourceValue instanceof Date) {\n // If source value is a Date, create a new Date instance.\n (output as Record<string, unknown>)[key] = new Date(sourceValue.getTime());\n } else if (Array.isArray(sourceValue)) {\n if (Array.isArray(outputValue)) {\n const newArray = [];\n const maxLength = Math.max(outputValue.length, sourceValue.length);\n for (let i = 0; i < maxLength; i++) {\n const sourceItem = sourceValue[i];\n const targetItem = outputValue[i];\n\n if (i >= sourceValue.length) { // source is shorter\n newArray[i] = targetItem;\n } else if (i >= outputValue.length) { // target is shorter\n newArray[i] = sourceItem;\n } else if (sourceItem === null) {\n newArray[i] = targetItem;\n } else if (isPlainObject(sourceItem) && isPlainObject(targetItem)) {\n // Only recursively merge plain objects, preserve class instances\n newArray[i] = mergeDeep(targetItem, sourceItem, ignoreUndefined);\n } else {\n // For class instances and primitives, use source directly\n newArray[i] = sourceItem;\n }\n }\n (output as Record<string, unknown>)[key] = newArray;\n } else {\n // If output's value (from target) is not an array,\n // overwrite with a shallow copy of the source array.\n (output as Record<string, unknown>)[key] = [...sourceValue];\n }\n } else if (isPlainObject(sourceValue)) {\n // If source value is a plain object (not a class instance like EntityReference, GeoPoint, etc.):\n if (isPlainObject(outputValue)) {\n // If the corresponding value in output (from target) is also a plain object, recurse.\n // Ensure the ignoreUndefined flag is passed down.\n (output as Record<string, unknown>)[key] = mergeDeep(outputValue as Record<string, unknown>, sourceValue, ignoreUndefined);\n } else {\n // If output's value (from target) is not a plain object (e.g., null, primitive, class instance, or key didn't exist in original target),\n // overwrite with the source object.\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n } else if (isObject(sourceValue)) {\n // If source value is a class instance (not a plain object), use it directly to preserve prototype\n (output as Record<string, unknown>)[key] = sourceValue;\n } else {\n // If source value is a primitive, null, or undefined (and not ignored).\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return output as T & U;\n}\n\nexport function getValueInPath(o: object | undefined, path: string): unknown {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as Record<string, unknown>)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as Record<string, unknown>)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? ((o as Record<string, unknown>)[firstSegment] as unknown[])[parseInt(pathSegments[1])]\n : (o as Record<string, unknown>)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject as object | undefined, nextPath);\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n let currentObject = { ...o };\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n currentObject = (currentObject as Record<string, unknown>)[part] as Record<string, unknown>;\n }\n if (last)\n delete (currentObject as Record<string, unknown>)[last];\n return currentObject;\n}\n\nexport function removeFunctions(o: unknown): unknown {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n // Handle arrays first - map over them recursively\n if (Array.isArray(o)) {\n return o.map(v => removeFunctions(v));\n }\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(o)) {\n return o;\n }\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T): string | null {\n if (!v) return null;\n if (typeof v === \"object\" && v !== null) {\n if (\"id\" in v)\n return String((v as Record<string, unknown>).id);\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as Record<string, unknown>);\n }\n return hash(v as object, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: unknown, removeEmptyStrings?: boolean): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value as object)) {\n const childRes = removeUndefined((value as Record<string, unknown>)[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes as object) && shouldKeepIfString)\n res[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function removeNulls(value: unknown): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeNulls(v));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n const obj = value as Record<string, unknown>;\n Object.keys(obj).forEach((key) => {\n if (obj[key] !== null)\n res[key] = removeNulls(obj[key]);\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: Record<string, unknown> | unknown[], comparison: Record<string, unknown> | unknown[]) {\n const isObject = (val: unknown): val is Record<string, unknown> => typeof val === \"object\" && val !== null;\n const isArray = (val: unknown): val is unknown[] => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n if (isArray(res)) {\n for (let i = res.length - 1; i >= 0; i--) {\n if (res[i] === comparison[i]) {\n res.splice(i, 1);\n } else if (isObject(res[i]) && isObject(comparison[i])) {\n res[i] = removePropsIfExisting(res[i] as unknown as Record<string, unknown>, (comparison as unknown as unknown[])[i] as Record<string, unknown>);\n }\n }\n } else {\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n delete res[key];\n }\n }\n });\n }\n\n return res;\n}\n","export function toArray<T>(input?: T | T[]): T[] {\n return Array.isArray(input) ? input : (input ? [input] : []);\n}\n","export const defaultDateFormat = \"MMMM dd, yyyy, HH:mm:ss\";\n","export function hashString(str: string): number {\n if (!str) return 0;\n let hash = 0;\n let i;\n let chr;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n","export function serializeRegExp(input: RegExp): string {\n if (!input) return \"\";\n // const fragments = input.toString().match(/\\/(.*?)\\/([a-z]*)?$/i);\n // if (fragments) {\n // if (fragments[2])\n // return input.toString();\n // return fragments[1];\n // }\n return input.toString();\n}\n\n/**\n * Get a RegExp out of a serialized string\n * @param input\n */\nexport function hydrateRegExp(input?: string): RegExp | undefined {\n if (!input) return undefined;\n const fragments = input.match(/\\/(.*?)\\/([a-z]*)?$/i);\n if (fragments) {\n return new RegExp(fragments[1], fragments[2] || \"\");\n } else {\n return new RegExp(input, \"\");\n }\n}\n\nexport function isValidRegExp(input: string): boolean {\n const fullRegexp = input.match(/\\/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)\\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/);\n if (fullRegexp)\n return true;\n const simpleRegexp = input.match(/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)/);\n return !!simpleRegexp;\n}\n","export function flattenObject(obj: Record<string, unknown>, parentKey = \"\") {\n if (!obj) return obj;\n return Object.keys(obj).reduce((flatObj, key) => {\n const newKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n obj[key].forEach((item: unknown, index: number) => {\n Object.assign(flatObj, flattenObject(item as Record<string, unknown>, `${newKey}[${index}]`));\n });\n } else {\n Object.assign(flatObj, flattenObject(obj[key] as Record<string, unknown>, newKey));\n }\n } else {\n flatObj[newKey] = obj[key];\n }\n\n return flatObj;\n }, {} as { [key: string]: unknown });\n}\n\n\n// map from nested property key like \"a.b.c\" to the maximum array count found in a list of objects for that array\nexport type ArrayValuesCount = Record<string, number>;\n\nexport function getArrayValuesCount(array: Record<string, unknown>[]): ArrayValuesCount {\n return array.reduce((acc: ArrayValuesCount, obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n // proceed only if value is an array\n if (Array.isArray(value)) {\n acc[key] = Math.max(acc[key] || 0, value.length);\n }\n\n // handle nested object\n if (typeof value === \"object\" && value !== null) {\n const nested = getArrayValuesCount([value as Record<string, unknown>]);\n Object.entries(nested).forEach(([nestedKey, nestedCount]) => {\n const compoundKey = `${key}.${nestedKey}`;\n acc[compoundKey] = Math.max(acc[compoundKey] || 0, nestedCount);\n });\n }\n });\n return acc;\n }, {});\n}\n","/**\n * Returns the plural of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function plural(word: string, amount?: number): string {\n if (amount !== undefined && amount === 1) {\n return word\n }\n const plurals: { [key: string]: string } = {\n \"(quiz)$\": \"$1zes\",\n \"^(ox)$\": \"$1en\",\n \"([m|l])ouse$\": \"$1ice\",\n \"(matr|vert|ind)ix|ex$\": \"$1ices\",\n \"(x|ch|ss|sh)$\": \"$1es\",\n \"([^aeiouy]|qu)y$\": \"$1ies\",\n \"(hive)$\": \"$1s\",\n \"(?:([^f])fe|([lr])f)$\": \"$1$2ves\",\n \"(shea|lea|loa|thie)f$\": \"$1ves\",\n sis$: \"ses\",\n \"([ti])um$\": \"$1a\",\n \"(tomat|potat|ech|her|vet)o$\": \"$1oes\",\n \"(bu)s$\": \"$1ses\",\n \"(alias)$\": \"$1es\",\n \"(octop)us$\": \"$1i\",\n \"(ax|test)is$\": \"$1es\",\n \"(us)$\": \"$1es\",\n \"([^s]+)$\": \"$1s\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${w}$`, \"i\")\n const replace = irregular[w]\n if (pattern.test(word)) {\n return word.replace(pattern, replace);\n }\n }\n // check for matches using regular expressions\n for (const reg in plurals) {\n const pattern = new RegExp(reg, \"i\")\n if (pattern.test(word)) {\n return word.replace(pattern, plurals[reg])\n }\n }\n return word;\n}\n\n/**\n * Returns the singular of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function singular(word: string, amount?: number): string {\n if (amount !== undefined && amount !== 1) {\n return word;\n }\n const singulars: { [key: string]: string } = {\n \"(quiz)zes$\": \"$1\",\n \"(matr)ices$\": \"$1ix\",\n \"(vert|ind)ices$\": \"$1ex\",\n \"^(ox)en$\": \"$1\",\n \"(alias)es$\": \"$1\",\n \"(octop|vir)i$\": \"$1us\",\n \"(cris|ax|test)es$\": \"$1is\",\n \"(shoe)s$\": \"$1\",\n \"(o)es$\": \"$1\",\n \"(bus)es$\": \"$1\",\n \"([m|l])ice$\": \"$1ouse\",\n \"(x|ch|ss|sh)es$\": \"$1\",\n \"(m)ovies$\": \"$1ovie\",\n \"(s)eries$\": \"$1eries\",\n \"([^aeiouy]|qu)ies$\": \"$1y\",\n \"([lr])ves$\": \"$1f\",\n \"(tive)s$\": \"$1\",\n \"(hive)s$\": \"$1\",\n \"(li|wi|kni)ves$\": \"$1fe\",\n \"(shea|loa|lea|thie)ves$\": \"$1f\",\n \"(^analy)ses$\": \"$1sis\",\n \"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$\": \"$1$2sis\",\n \"([ti])a$\": \"$1um\",\n \"(n)ews$\": \"$1ews\",\n \"(h|bl)ouses$\": \"$1ouse\",\n \"(corpse)s$\": \"$1\",\n \"(us)es$\": \"$1\",\n s$: \"\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${irregular[w]}$`, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, w);\n }\n }\n // check for matches using regular expressions\n for (const reg in singulars) {\n const pattern = new RegExp(reg, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, singulars[reg]);\n }\n }\n return word;\n}\n","export function getOS() {\n let OS = \"Unknown\";\n if (navigator.userAgent.indexOf(\"Win\") !== -1) OS = \"Windows\";\n if (navigator.userAgent.indexOf(\"Mac\") !== -1) OS = \"MacOS\";\n if (navigator.userAgent.indexOf(\"X11\") !== -1) OS = \"UNIX\";\n if (navigator.userAgent.indexOf(\"Linux\") !== -1) OS = \"Linux\";\n return OS;\n}\n\nexport function getAltSymbol() {\n if (getOS() === \"MacOS\") return \"⌥\";\n return \"Alt\";\n}\n","import { toSnakeCase } from \"./strings\";\n\n/**\n * Generates a foreign key column name from a given string, typically a collection slug or name.\n * It converts the name to snake_case, attempts to singularize it by removing a trailing 's'\n * (a common convention for collection names), and appends '_id'.\n *\n * @param name The base name to convert to a foreign key.\n * @returns A foreign key name in the format 'singular_name_id'.\n *\n * @example\n * // returns \"user_id\"\n * generateForeignKeyName(\"users\")\n *\n * @example\n * // returns \"post_id\"\n * generateForeignKeyName(\"posts\")\n *\n * @example\n * // returns \"product_id\"\n * generateForeignKeyName(\"Product\")\n *\n */\nexport function generateForeignKeyName(name: string): string {\n const snakeCaseName = toSnakeCase(name);\n // A simple heuristic to singularize a plural name, which is a common convention.\n const singularName = snakeCaseName.endsWith(\"s\") ? snakeCaseName.slice(0, -1) : snakeCaseName;\n return `${singularName}_id`;\n}\n\n","\n\nexport function isDefaultFieldConfigId(id: string): boolean {\n return [\"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"switch\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference_as_string\",\n \"reference\",\n \"multi_references\",\n \"relation\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"custom_array\",\n \"block\"\n ].includes(id);\n}\n"],"names":["tokenizeRegex","toKebabCase","str","regExpMatchArray","match","map","x","toLowerCase","join","snakeCaseRegex","toSnakeCase","camelCase","length","parts","split","filter","Boolean","slice","part","charAt","toUpperCase","substring","randomString","strLength","Math","random","toString","randomColor","floor","slugify","text","separator","lowercase","from","to","i","l","replace","RegExp","trim","unslugify","slug","includes","result","txt","prettifyIdentifier","input","s","char","isEmptyArray","value","Array","isArray","isFunction","obj","isInteger","String","Number","isNaN","getIn","key","def","p","path","toPath","undefined","setIn","res","clone","resVal","pathArray","currentPath","currentObj","isObject","nextPath","deepClone","item","Object","getPrototypeOf","prototype","keys","pick","args","reduce","isPlainObject","proto","mergeDeep","target","source","ignoreUndefined","output","hasOwnProperty","call","sourceValue","outputValue","Date","getTime","newArray","maxLength","max","sourceItem","targetItem","getValueInPath","o","pathSegments","segment","firstSegment","isArrayAndIndexExists","parseInt","nextObject","removeInPath","currentObject","last","pop","removeFunctions","v","entries","_","a","b","getHashValue","id","toLocaleString","GeoPoint","hash","ignoreUnknown","removeUndefined","removeEmptyStrings","forEach","isEmptyObject","childRes","isString","shouldKeepIfString","removeNulls","removePropsIfExisting","comparison","val","splice","toArray","defaultDateFormat","hashString","chr","charCodeAt","abs","serializeRegExp","hydrateRegExp","fragments","isValidRegExp","fullRegexp","simpleRegexp","flattenObject","parentKey","flatObj","newKey","index","assign","getArrayValuesCount","array","acc","nested","nestedKey","nestedCount","compoundKey","plural","word","amount","plurals","sis$","irregular","move","foot","goose","sex","child","man","tooth","person","uncountable","indexOf","w","pattern","test","reg","singular","singulars","s$","getOS","OS","navigator","userAgent","getAltSymbol","generateForeignKeyName","name","snakeCaseName","singularName","endsWith","isDefaultFieldConfigId"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/strings.ts","../src/objects.ts","../src/arrays.ts","../src/dates.ts","../src/hash.ts","../src/regexp.ts","../src/flatten_object.ts","../src/plurals.ts","../src/names.ts","../src/fields.ts"],"sourcesContent":["const tokenizeRegex = /[A-Z]{2,}(?=[A-Z][a-z]|\\b)|[A-Z]?[a-z]+|[0-9]+(?:[a-z](?![a-z]))?|[A-Z]/g;\n\nexport const toKebabCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(tokenizeRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"-\");\n};\n\nconst snakeCaseRegex = tokenizeRegex;\n\nexport const toSnakeCase = (str?: string) => {\n if (!str || typeof str !== \"string\") return \"\";\n const regExpMatchArray = str.match(snakeCaseRegex);\n if (!regExpMatchArray) return \"\";\n return regExpMatchArray\n .map(x => x.toLowerCase())\n .join(\"_\");\n};\n\nexport function camelCase(str: string): string {\n if (!str) return \"\";\n if (str.length === 1) return str.toLowerCase();\n\n // Split by hyphens, underscores, or spaces and filter out empty strings\n const parts = str.split(/[-_ ]+/).filter(Boolean);\n\n if (parts.length === 0) return \"\";\n\n // Start with first part in lowercase\n return parts[0].toLowerCase() +\n // Transform remaining parts to have first letter uppercase\n parts.slice(1)\n .map(part => part.charAt(0).toUpperCase() + part.substring(1).toLowerCase())\n .join(\"\");\n}\n\nexport function randomString(strLength = 5) {\n return Math.random().toString(36).slice(2, 2 + strLength);\n}\n\nexport function randomColor() {\n return Math.floor(Math.random() * 16777215).toString(16);\n}\n\nexport function slugify(text?: string, separator = \"_\", lowercase = true) {\n if (!text) return \"\";\n const from = \"ãàáäâẽèéëêìíïîõòóöôùúüûñç·/_,:;-\"\n const to = `aaaaaeeeeeiiiiooooouuuunc${separator}${separator}${separator}${separator}${separator}${separator}${separator}`;\n\n for (let i = 0, l = from.length; i < l; i++) {\n text = text.replace(new RegExp(from.charAt(i), \"g\"), to.charAt(i));\n }\n\n text = text\n .toString() // Cast to string\n .trim() // Remove whitespace from both sides of a string\n .replace(/^\\s+|\\s+$/g, \"\")\n .replace(/\\s+/g, separator) // Replace spaces with separator\n .replace(/&/g, separator) // Replace & with separator\n .replace(/[^\\w\\\\-]+/g, \"\") // Remove all non-word chars\n .replace(new RegExp(\"\\\\\" + separator + \"\\\\\" + separator + \"+\", \"g\"),\n separator); // Replace multiple separators with single one\n\n return lowercase\n ? text.toLowerCase() // Convert the string to lowercase letters\n : text;\n}\n\nexport function unslugify(slug?: string): string {\n if (!slug) return \"\";\n if (slug.includes(\"-\") || slug.includes(\"_\") || !slug.includes(\" \")) {\n const result = slug.replace(/[-_]/g, \" \");\n return result.replace(/\\w\\S*/g, function (txt) {\n return txt.charAt(0).toUpperCase() + txt.substring(1);\n }).trim();\n } else {\n return slug.trim();\n }\n}\n\nexport function prettifyIdentifier(input: string) {\n if (!input) return \"\";\n\n let text = input;\n\n // 1. Handle camelCase and Acronyms\n // Group 1 ($1 $2): Lowercase followed by Uppercase (e.g., imageURL -> image URL)\n // Group 2 ($3 $4): Uppercase followed by Uppercase+lowercase (e.g., XMLParser -> XML Parser)\n text = text.replace(/([a-z])([A-Z])|([A-Z])([A-Z][a-z])/g, \"$1$3 $2$4\");\n\n // 2. Replace hyphens/underscores with spaces\n text = text.replace(/[_-]+/g, \" \");\n\n // 3. Capitalize first letter of each word (Title Case)\n const s = text\n .trim()\n .replace(/\\b\\w/g, (char) => char.toUpperCase());\n return s;\n}\n","import hash from \"object-hash\";\nimport { GeoPoint } from \"@rebasepro/types\";\n\n/** @private is the value an empty array? */\nexport const isEmptyArray = (value?: unknown) =>\n Array.isArray(value) && value.length === 0;\n\n/** @private is the given object a Function? */\nexport const isFunction = (obj: unknown): obj is (...args: unknown[]) => unknown =>\n typeof obj === \"function\";\n\n/** @private is the given object an integer? */\nexport const isInteger = (obj: unknown): boolean =>\n String(Math.floor(Number(obj))) === String(obj);\n\n/** @private is the given object a NaN? */\n\nexport const isNaN = (obj: unknown): boolean => obj !== obj;\n\n/**\n * Deeply get a value from an object via its path.\n */\nexport function getIn(\n obj: Record<string, unknown> | unknown[] | unknown,\n key: string | string[],\n def?: unknown,\n p = 0\n) {\n const path = toPath(key);\n while (obj && p < path.length) {\n obj = (obj as Record<string, unknown>)[path[p++]];\n }\n\n // check if path is not in the end\n if (p !== path.length && !obj) {\n return def;\n }\n\n return obj === undefined ? def : obj;\n}\n\nexport function setIn<T>(obj: T, path: string, value: unknown): T {\n const res = clone(obj) as Record<string, unknown>;\n let resVal: Record<string, unknown> = res;\n let i = 0;\n const pathArray = toPath(path);\n\n for (; i < pathArray.length - 1; i++) {\n const currentPath: string = pathArray[i];\n const currentObj = getIn(obj as Record<string, unknown>, pathArray.slice(0, i + 1));\n\n if (currentObj && (isObject(currentObj) || Array.isArray(currentObj))) {\n resVal = resVal[currentPath] = clone(currentObj) as Record<string, unknown>;\n } else {\n const nextPath: string = pathArray[i + 1];\n resVal = resVal[currentPath] =\n (isInteger(nextPath) && Number(nextPath) >= 0 ? [] : {}) as Record<string, unknown>;\n }\n }\n\n // Return original object if new value is the same as current\n if ((i === 0 ? obj as Record<string, unknown> : resVal)[pathArray[i]] === value) {\n return obj;\n }\n\n if (value === undefined) {\n delete resVal[pathArray[i]];\n } else {\n resVal[pathArray[i]] = value;\n }\n\n // If the path array has a single element, the loop did not run.\n // Deleting on `resVal` had no effect in this scenario, so we delete on the result instead.\n if (i === 0 && value === undefined) {\n delete res[pathArray[i]];\n }\n\n return res as T;\n}\n\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return [...value] as T;\n } else if (typeof value === \"object\" && value !== null) {\n return { ...value } as T;\n } else {\n return value; // This is for primitive types which do not need cloning.\n }\n}\n\n/**\n * Deep clone a value, preserving function references and class instances.\n * Unlike structuredClone, this handles objects that contain functions\n * (e.g. EntityCollection with target(), childCollections(), callbacks).\n */\nexport function deepClone<T>(value: T): T {\n if (value === null || value === undefined) return value;\n if (typeof value === \"function\") return value;\n if (typeof value !== \"object\") return value;\n\n if (Array.isArray(value)) {\n return value.map(item => deepClone(item)) as T;\n }\n\n // Preserve class instances (Date, GeoPoint, etc.) — don't recurse\n if (Object.getPrototypeOf(value) !== Object.prototype) {\n return value;\n }\n\n const result: Record<string, unknown> = {};\n for (const key of Object.keys(value)) {\n result[key] = deepClone((value as Record<string, unknown>)[key]);\n }\n return result as T;\n}\n\nfunction toPath(value: string | string[]) {\n if (Array.isArray(value)) return value; // Already in path array form.\n // Replace brackets with dots, remove leading/trailing dots, then split by dot.\n return value.replace(/\\[(\\d+)]/g, \".$1\").replace(/^\\./, \"\").replace(/\\.$/, \"\").split(\".\");\n}\n\n\nexport const pick: <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => Partial<T> = <T extends Record<string, unknown>>(obj: T, ...args: (keyof T)[]) => ({\n ...args.reduce<Record<string, unknown>>((res, key) => ({\n ...res,\n [key as string]: obj[key as string]\n }), {})\n}) as Partial<T>;\n\nexport function isObject(item: unknown): item is Record<string, unknown> {\n return !!item && typeof item === \"object\" && !Array.isArray(item);\n}\n\nexport function isPlainObject(obj: unknown): obj is Record<string, unknown> {\n // 1. Rule out non-objects, null, and arrays\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return false;\n }\n\n // 2. Get the object's direct prototype\n const proto = Object.getPrototypeOf(obj);\n\n // 3. A plain object's direct prototype is Object.prototype\n return proto === Object.prototype;\n}\n\nexport function mergeDeep<T extends object, U extends object>(\n target: T,\n source: U,\n ignoreUndefined = false\n): T & U {\n // If target is not a true object (e.g., null, array, primitive), return target itself.\n if (!isObject(target)) {\n return target as T & U;\n }\n\n // Create a shallow copy of the target to avoid modifying the original object.\n const output = { ...target };\n\n // If source is not a true object, there's nothing to merge from it.\n // Return the shallow copy of target.\n if (!isObject(source)) {\n return output as T & U;\n }\n\n // Iterate over keys in the source object.\n for (const key in source) {\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n const sourceValue = source[key];\n const outputValue = (output as Record<string, unknown>)[key]; // Current value in our merged object (originating from target)\n\n // Skip if source value is undefined and ignoreUndefined is true.\n // This handles both not adding new undefined properties and not overwriting existing properties with undefined.\n if (ignoreUndefined && sourceValue === undefined) {\n continue;\n }\n\n if (sourceValue instanceof Date) {\n // If source value is a Date, create a new Date instance.\n (output as Record<string, unknown>)[key] = new Date(sourceValue.getTime());\n } else if (Array.isArray(sourceValue)) {\n if (Array.isArray(outputValue)) {\n const newArray = [];\n const maxLength = Math.max(outputValue.length, sourceValue.length);\n for (let i = 0; i < maxLength; i++) {\n const sourceItem = sourceValue[i];\n const targetItem = outputValue[i];\n\n if (i >= sourceValue.length) { // source is shorter\n newArray[i] = targetItem;\n } else if (i >= outputValue.length) { // target is shorter\n newArray[i] = sourceItem;\n } else if (sourceItem === null) {\n newArray[i] = targetItem;\n } else if (isPlainObject(sourceItem) && isPlainObject(targetItem)) {\n // Only recursively merge plain objects, preserve class instances\n newArray[i] = mergeDeep(targetItem, sourceItem, ignoreUndefined);\n } else {\n // For class instances and primitives, use source directly\n newArray[i] = sourceItem;\n }\n }\n (output as Record<string, unknown>)[key] = newArray;\n } else {\n // If output's value (from target) is not an array,\n // overwrite with a shallow copy of the source array.\n (output as Record<string, unknown>)[key] = [...sourceValue];\n }\n } else if (isPlainObject(sourceValue)) {\n // If source value is a plain object (not a class instance like EntityReference, GeoPoint, etc.):\n if (isPlainObject(outputValue)) {\n // If the corresponding value in output (from target) is also a plain object, recurse.\n // Ensure the ignoreUndefined flag is passed down.\n (output as Record<string, unknown>)[key] = mergeDeep(outputValue as Record<string, unknown>, sourceValue, ignoreUndefined);\n } else {\n // If output's value (from target) is not a plain object (e.g., null, primitive, class instance, or key didn't exist in original target),\n // overwrite with the source object.\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n } else if (isObject(sourceValue)) {\n // If source value is a class instance (not a plain object), use it directly to preserve prototype\n (output as Record<string, unknown>)[key] = sourceValue;\n } else {\n // If source value is a primitive, null, or undefined (and not ignored).\n (output as Record<string, unknown>)[key] = sourceValue;\n }\n }\n }\n\n return output as T & U;\n}\n\nexport function getValueInPath(o: object | undefined, path: string): unknown {\n if (!o) return undefined;\n if (typeof o === \"object\") {\n if (path in o) {\n return (o as Record<string, unknown>)[path];\n }\n if (path.includes(\".\") || path.includes(\"[\")) {\n let pathSegments = path.split(/[.[]/);\n if (path.includes(\"[\")) {\n pathSegments = pathSegments.map(segment => segment.replace(\"]\", \"\"));\n }\n const firstSegment = pathSegments[0];\n const isArrayAndIndexExists = Array.isArray((o as Record<string, unknown>)[firstSegment]) && !isNaN(parseInt(pathSegments[1]));\n const nextObject = isArrayAndIndexExists\n ? ((o as Record<string, unknown>)[firstSegment] as unknown[])[parseInt(pathSegments[1])]\n : (o as Record<string, unknown>)[firstSegment];\n\n const nextPath = pathSegments.slice(isArrayAndIndexExists ? 2 : 1).join(\".\");\n if (nextPath === \"\")\n return nextObject;\n return getValueInPath(nextObject as object | undefined, nextPath);\n }\n }\n return undefined;\n}\n\nexport function removeInPath(o: object, path: string): object | undefined {\n const res = clone(o) as Record<string, unknown>;\n let current = res;\n const parts = path.split(\".\");\n const last = parts.pop();\n for (const part of parts) {\n if (part in current && current[part] !== null && typeof current[part] === \"object\") {\n current[part] = clone(current[part]) as Record<string, unknown>;\n current = current[part] as Record<string, unknown>;\n } else {\n return res;\n }\n }\n if (last && current && typeof current === \"object\") {\n delete current[last];\n }\n return res;\n}\n\nexport function removeFunctions(o: unknown): unknown {\n if (o === undefined) return undefined;\n if (o === null) return null;\n if (typeof o === \"object\") {\n // Handle arrays first - map over them recursively\n if (Array.isArray(o)) {\n return o.map(v => removeFunctions(v));\n }\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(o)) {\n return o;\n }\n return Object.entries(o)\n .filter(([_, value]) => typeof value !== \"function\")\n .map(([key, value]) => {\n if (Array.isArray(value)) {\n return { [key]: value.map(v => removeFunctions(v)) };\n } else if (typeof value === \"object\") {\n return { [key]: removeFunctions(value) };\n } else return { [key]: value };\n })\n .reduce((a, b) => ({ ...a,\n...b }), {});\n }\n return o;\n}\n\nexport function getHashValue<T>(v: T): string | null {\n if (!v) return null;\n if (typeof v === \"object\" && v !== null) {\n if (\"id\" in v)\n return String((v as Record<string, unknown>).id);\n else if (v instanceof Date)\n return v.toLocaleString();\n else if (v instanceof GeoPoint)\n return hash(v as Record<string, unknown>);\n }\n return hash(v as object, { ignoreUnknown: true });\n}\n\nexport function removeUndefined(value: unknown, removeEmptyStrings?: boolean): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeUndefined(v, removeEmptyStrings));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n Object.keys(value).forEach((key) => {\n if (!isEmptyObject(value as object)) {\n const childRes = removeUndefined((value as Record<string, unknown>)[key], removeEmptyStrings);\n const isString = typeof childRes === \"string\";\n const shouldKeepIfString = !removeEmptyStrings || (removeEmptyStrings && !isString) || (removeEmptyStrings && isString && childRes !== \"\");\n if (childRes !== undefined && !isEmptyObject(childRes as object) && shouldKeepIfString)\n res[key] = childRes;\n }\n });\n return res;\n }\n return value;\n}\n\nexport function removeNulls(value: unknown): unknown {\n if (typeof value === \"function\") {\n return value;\n }\n if (Array.isArray(value)) {\n return value.map((v: unknown) => removeNulls(v));\n }\n if (typeof value === \"object\") {\n if (value === null)\n return value;\n // Preserve class instances (EntityReference, GeoPoint, etc.) - don't recurse into them\n if (!isPlainObject(value)) {\n return value;\n }\n const res: Record<string, unknown> = {};\n const obj = value as Record<string, unknown>;\n Object.keys(obj).forEach((key) => {\n if (obj[key] !== null)\n res[key] = removeNulls(obj[key]);\n });\n return res;\n }\n return value;\n}\n\nexport function isEmptyObject(obj: object) {\n return obj &&\n Object.getPrototypeOf(obj) === Object.prototype &&\n Object.keys(obj).length === 0\n}\n\nexport function removePropsIfExisting(source: Record<string, unknown> | unknown[], comparison: Record<string, unknown> | unknown[]) {\n const isObject = (val: unknown): val is Record<string, unknown> => typeof val === \"object\" && val !== null;\n const isArray = (val: unknown): val is unknown[] => Array.isArray(val);\n\n if (!isObject(source) || !isObject(comparison)) {\n return source;\n }\n\n const res = isArray(source) ? [...source] : { ...source };\n\n if (isArray(res)) {\n for (let i = res.length - 1; i >= 0; i--) {\n if (res[i] === comparison[i]) {\n res.splice(i, 1);\n } else if (isObject(res[i]) && isObject(comparison[i])) {\n res[i] = removePropsIfExisting(res[i] as unknown as Record<string, unknown>, (comparison as unknown as unknown[])[i] as Record<string, unknown>);\n }\n }\n } else {\n Object.keys(comparison).forEach(key => {\n if (key in res) {\n if (isObject(res[key]) && isObject(comparison[key])) {\n res[key] = removePropsIfExisting(res[key], comparison[key]);\n } else if (res[key] === comparison[key]) {\n delete res[key];\n }\n }\n });\n }\n\n return res;\n}\n","export function toArray<T>(input?: T | T[]): T[] {\n return Array.isArray(input) ? input : (input ? [input] : []);\n}\n","export const defaultDateFormat = \"MMMM dd, yyyy, HH:mm:ss\";\n","export function hashString(str: string): number {\n if (!str) return 0;\n let hash = 0;\n let i;\n let chr;\n for (i = 0; i < str.length; i++) {\n chr = str.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return Math.abs(hash);\n}\n","export function serializeRegExp(input: RegExp): string {\n if (!input) return \"\";\n // const fragments = input.toString().match(/\\/(.*?)\\/([a-z]*)?$/i);\n // if (fragments) {\n // if (fragments[2])\n // return input.toString();\n // return fragments[1];\n // }\n return input.toString();\n}\n\n/**\n * Get a RegExp out of a serialized string\n * @param input\n */\nexport function hydrateRegExp(input?: string): RegExp | undefined {\n if (!input) return undefined;\n const fragments = input.match(/\\/(.*?)\\/([a-z]*)?$/i);\n if (fragments) {\n return new RegExp(fragments[1], fragments[2] || \"\");\n } else {\n return new RegExp(input, \"\");\n }\n}\n\nexport function isValidRegExp(input: string): boolean {\n const fullRegexp = input.match(/\\/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)\\/((?:g(?:im?|mi?)?|i(?:gm?|mg?)?|m(?:gi?|ig?)?)?)/);\n if (fullRegexp)\n return true;\n const simpleRegexp = input.match(/((?![*+?])(?:[^\\r\\n[/\\\\]|\\\\.|\\[(?:[^\\r\\n\\]\\\\]|\\\\.)*])+)/);\n return !!simpleRegexp;\n}\n","export function flattenObject(obj: Record<string, unknown>, parentKey = \"\") {\n if (!obj) return obj;\n return Object.keys(obj).reduce((flatObj, key) => {\n const newKey = parentKey ? `${parentKey}.${key}` : key;\n\n if (typeof obj[key] === \"object\" && obj[key] !== null) {\n if (Array.isArray(obj[key])) {\n obj[key].forEach((item: unknown, index: number) => {\n if (typeof item === \"object\" && item !== null) {\n Object.assign(flatObj, flattenObject(item as Record<string, unknown>, `${newKey}[${index}]`));\n } else {\n flatObj[`${newKey}[${index}]`] = item;\n }\n });\n } else {\n Object.assign(flatObj, flattenObject(obj[key] as Record<string, unknown>, newKey));\n }\n } else {\n flatObj[newKey] = obj[key];\n }\n\n return flatObj;\n }, {} as { [key: string]: unknown });\n}\n\n\n// map from nested property key like \"a.b.c\" to the maximum array count found in a list of objects for that array\nexport type ArrayValuesCount = Record<string, number>;\n\nexport function getArrayValuesCount(array: Record<string, unknown>[]): ArrayValuesCount {\n return array.reduce((acc: ArrayValuesCount, obj: Record<string, unknown>) => {\n Object.entries(obj).forEach(([key, value]) => {\n // proceed only if value is an array\n if (Array.isArray(value)) {\n acc[key] = Math.max(acc[key] || 0, value.length);\n }\n\n // handle nested object\n if (typeof value === \"object\" && value !== null) {\n const nested = getArrayValuesCount([value as Record<string, unknown>]);\n Object.entries(nested).forEach(([nestedKey, nestedCount]) => {\n const compoundKey = `${key}.${nestedKey}`;\n acc[compoundKey] = Math.max(acc[compoundKey] || 0, nestedCount);\n });\n }\n });\n return acc;\n }, {});\n}\n","/**\n * Returns the plural of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function plural(word: string, amount?: number): string {\n if (amount !== undefined && amount === 1) {\n return word\n }\n const plurals: { [key: string]: string } = {\n \"(quiz)$\": \"$1zes\",\n \"^(ox)$\": \"$1en\",\n \"([m|l])ouse$\": \"$1ice\",\n \"(matr|vert|ind)ix|ex$\": \"$1ices\",\n \"(x|ch|ss|sh)$\": \"$1es\",\n \"([^aeiouy]|qu)y$\": \"$1ies\",\n \"(hive)$\": \"$1s\",\n \"(?:([^f])fe|([lr])f)$\": \"$1$2ves\",\n \"(shea|lea|loa|thie)f$\": \"$1ves\",\n sis$: \"ses\",\n \"([ti])um$\": \"$1a\",\n \"(tomat|potat|ech|her|vet)o$\": \"$1oes\",\n \"(bu)s$\": \"$1ses\",\n \"(alias)$\": \"$1es\",\n \"(octop)us$\": \"$1i\",\n \"(ax|test)is$\": \"$1es\",\n \"(us)$\": \"$1es\",\n \"([^s]+)$\": \"$1s\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${w}$`, \"i\")\n const replace = irregular[w]\n if (pattern.test(word)) {\n return word.replace(pattern, replace);\n }\n }\n // check for matches using regular expressions\n for (const reg in plurals) {\n const pattern = new RegExp(reg, \"i\")\n if (pattern.test(word)) {\n return word.replace(pattern, plurals[reg])\n }\n }\n return word;\n}\n\n/**\n * Returns the singular of an English word.\n *\n * @param {string} word\n * @param {number} [amount]\n * @returns {string}\n */\nexport function singular(word: string, amount?: number): string {\n if (amount !== undefined && amount !== 1) {\n return word;\n }\n const singulars: { [key: string]: string } = {\n \"(quiz)zes$\": \"$1\",\n \"(matr)ices$\": \"$1ix\",\n \"(vert|ind)ices$\": \"$1ex\",\n \"^(ox)en$\": \"$1\",\n \"(alias)es$\": \"$1\",\n \"(octop|vir)i$\": \"$1us\",\n \"(cris|ax|test)es$\": \"$1is\",\n \"(shoe)s$\": \"$1\",\n \"(o)es$\": \"$1\",\n \"(bus)es$\": \"$1\",\n \"([m|l])ice$\": \"$1ouse\",\n \"(x|ch|ss|sh)es$\": \"$1\",\n \"(m)ovies$\": \"$1ovie\",\n \"(s)eries$\": \"$1eries\",\n \"([^aeiouy]|qu)ies$\": \"$1y\",\n \"([lr])ves$\": \"$1f\",\n \"(tive)s$\": \"$1\",\n \"(hive)s$\": \"$1\",\n \"(li|wi|kni)ves$\": \"$1fe\",\n \"(shea|loa|lea|thie)ves$\": \"$1f\",\n \"(^analy)ses$\": \"$1sis\",\n \"((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$\": \"$1$2sis\",\n \"([ti])a$\": \"$1um\",\n \"(n)ews$\": \"$1ews\",\n \"(h|bl)ouses$\": \"$1ouse\",\n \"(corpse)s$\": \"$1\",\n \"(us)es$\": \"$1\",\n s$: \"\"\n }\n const irregular: { [key: string]: string } = {\n move: \"moves\",\n foot: \"feet\",\n goose: \"geese\",\n sex: \"sexes\",\n child: \"children\",\n man: \"men\",\n tooth: \"teeth\",\n person: \"people\"\n }\n const uncountable: string[] = [\n \"sheep\",\n \"fish\",\n \"deer\",\n \"moose\",\n \"series\",\n \"species\",\n \"money\",\n \"rice\",\n \"information\",\n \"equipment\",\n \"bison\",\n \"cod\",\n \"offspring\",\n \"pike\",\n \"salmon\",\n \"shrimp\",\n \"swine\",\n \"trout\",\n \"aircraft\",\n \"hovercraft\",\n \"spacecraft\",\n \"sugar\",\n \"tuna\",\n \"you\",\n \"wood\"\n ]\n // save some time in the case that singular and plural are the same\n if (uncountable.indexOf(word.toLowerCase()) >= 0) {\n return word;\n }\n // check for irregular forms\n for (const w in irregular) {\n const pattern = new RegExp(`${irregular[w]}$`, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, w);\n }\n }\n // check for matches using regular expressions\n for (const reg in singulars) {\n const pattern = new RegExp(reg, \"i\");\n if (pattern.test(word)) {\n return word.replace(pattern, singulars[reg]);\n }\n }\n return word;\n}\n","import { toSnakeCase } from \"./strings\";\n\n/**\n * Generates a foreign key column name from a given string, typically a collection slug or name.\n * It converts the name to snake_case, attempts to singularize it by removing a trailing 's'\n * (a common convention for collection names), and appends '_id'.\n *\n * @param name The base name to convert to a foreign key.\n * @returns A foreign key name in the format 'singular_name_id'.\n *\n * @example\n * // returns \"user_id\"\n * generateForeignKeyName(\"users\")\n *\n * @example\n * // returns \"post_id\"\n * generateForeignKeyName(\"posts\")\n *\n * @example\n * // returns \"product_id\"\n * generateForeignKeyName(\"Product\")\n *\n */\nexport function generateForeignKeyName(name: string): string {\n const snakeCaseName = toSnakeCase(name);\n // A simple heuristic to singularize a plural name, which is a common convention.\n const singularName = snakeCaseName.endsWith(\"s\") ? snakeCaseName.slice(0, -1) : snakeCaseName;\n return `${singularName}_id`;\n}\n\n","\n\nexport function isDefaultFieldConfigId(id: string): boolean {\n return [\"text_field\",\n \"multiline\",\n \"markdown\",\n \"url\",\n \"email\",\n \"switch\",\n \"select\",\n \"multi_select\",\n \"number_input\",\n \"number_select\",\n \"multi_number_select\",\n \"file_upload\",\n \"multi_file_upload\",\n \"reference_as_string\",\n \"reference\",\n \"multi_references\",\n \"relation\",\n \"date_time\",\n \"group\",\n \"key_value\",\n \"repeat\",\n \"custom_array\",\n \"block\"\n ].includes(id);\n}\n"],"names":["tokenizeRegex","toKebabCase","str","regExpMatchArray","match","map","x","toLowerCase","join","snakeCaseRegex","toSnakeCase","camelCase","length","parts","split","filter","Boolean","slice","part","charAt","toUpperCase","substring","randomString","strLength","Math","random","toString","randomColor","floor","slugify","text","separator","lowercase","from","to","i","l","replace","RegExp","trim","unslugify","slug","includes","result","txt","prettifyIdentifier","input","s","char","isEmptyArray","value","Array","isArray","isFunction","obj","isInteger","String","Number","isNaN","getIn","key","def","p","path","toPath","undefined","setIn","res","clone","resVal","pathArray","currentPath","currentObj","isObject","nextPath","deepClone","item","Object","getPrototypeOf","prototype","keys","pick","args","reduce","isPlainObject","proto","mergeDeep","target","source","ignoreUndefined","output","hasOwnProperty","call","sourceValue","outputValue","Date","getTime","newArray","maxLength","max","sourceItem","targetItem","getValueInPath","o","pathSegments","segment","firstSegment","isArrayAndIndexExists","parseInt","nextObject","removeInPath","current","last","pop","removeFunctions","v","entries","_","a","b","getHashValue","id","toLocaleString","GeoPoint","hash","ignoreUnknown","removeUndefined","removeEmptyStrings","forEach","isEmptyObject","childRes","isString","shouldKeepIfString","removeNulls","removePropsIfExisting","comparison","val","splice","toArray","defaultDateFormat","hashString","chr","charCodeAt","abs","serializeRegExp","hydrateRegExp","fragments","isValidRegExp","fullRegexp","simpleRegexp","flattenObject","parentKey","flatObj","newKey","index","assign","getArrayValuesCount","array","acc","nested","nestedKey","nestedCount","compoundKey","plural","word","amount","plurals","sis$","irregular","move","foot","goose","sex","child","man","tooth","person","uncountable","indexOf","w","pattern","test","reg","singular","singulars","s$","generateForeignKeyName","name","snakeCaseName","singularName","endsWith","isDefaultFieldConfigId"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@rebasepro/utils",
3
3
  "type": "module",
4
- "version": "0.2.1",
4
+ "version": "0.2.4",
5
5
  "description": "Utility functions for Rebase",
6
6
  "funding": {
7
7
  "url": "https://github.com/sponsors/rebaseco"
@@ -11,7 +11,7 @@
11
11
  "repository": {
12
12
  "type": "git",
13
13
  "url": "https://github.com/rebasepro/rebase.git",
14
- "directory": "packages/common"
14
+ "directory": "packages/utils"
15
15
  },
16
16
  "main": "./dist/index.umd.js",
17
17
  "module": "./dist/index.es.js",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "object-hash": "^3.0.0",
43
- "@rebasepro/types": "0.2.1"
43
+ "@rebasepro/types": "0.2.4"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@jest/globals": "^29.7.0",
@@ -6,7 +6,11 @@ export function flattenObject(obj: Record<string, unknown>, parentKey = "") {
6
6
  if (typeof obj[key] === "object" && obj[key] !== null) {
7
7
  if (Array.isArray(obj[key])) {
8
8
  obj[key].forEach((item: unknown, index: number) => {
9
- Object.assign(flatObj, flattenObject(item as Record<string, unknown>, `${newKey}[${index}]`));
9
+ if (typeof item === "object" && item !== null) {
10
+ Object.assign(flatObj, flattenObject(item as Record<string, unknown>, `${newKey}[${index}]`));
11
+ } else {
12
+ flatObj[`${newKey}[${index}]`] = item;
13
+ }
10
14
  });
11
15
  } else {
12
16
  Object.assign(flatObj, flattenObject(obj[key] as Record<string, unknown>, newKey));
package/src/index.ts CHANGED
@@ -6,6 +6,5 @@ export * from "./hash";
6
6
  export * from "./regexp";
7
7
  export * from "./flatten_object";
8
8
  export * from "./plurals";
9
- export * from "./os";
10
9
  export * from "./names";
11
10
  export * from "./fields";
package/src/objects.ts CHANGED
@@ -166,6 +166,9 @@ export function mergeDeep<T extends object, U extends object>(
166
166
 
167
167
  // Iterate over keys in the source object.
168
168
  for (const key in source) {
169
+ if (key === "__proto__" || key === "constructor" || key === "prototype") {
170
+ continue;
171
+ }
169
172
  if (Object.prototype.hasOwnProperty.call(source, key)) {
170
173
  const sourceValue = source[key];
171
174
  const outputValue = (output as Record<string, unknown>)[key]; // Current value in our merged object (originating from target)
@@ -258,15 +261,22 @@ export function getValueInPath(o: object | undefined, path: string): unknown {
258
261
  }
259
262
 
260
263
  export function removeInPath(o: object, path: string): object | undefined {
261
- let currentObject = { ...o };
264
+ const res = clone(o) as Record<string, unknown>;
265
+ let current = res;
262
266
  const parts = path.split(".");
263
267
  const last = parts.pop();
264
268
  for (const part of parts) {
265
- currentObject = (currentObject as Record<string, unknown>)[part] as Record<string, unknown>;
269
+ if (part in current && current[part] !== null && typeof current[part] === "object") {
270
+ current[part] = clone(current[part]) as Record<string, unknown>;
271
+ current = current[part] as Record<string, unknown>;
272
+ } else {
273
+ return res;
274
+ }
266
275
  }
267
- if (last)
268
- delete (currentObject as Record<string, unknown>)[last];
269
- return currentObject;
276
+ if (last && current && typeof current === "object") {
277
+ delete current[last];
278
+ }
279
+ return res;
270
280
  }
271
281
 
272
282
  export function removeFunctions(o: unknown): unknown {