New:Socket for Asana Is Now Available.Learn more
Get Started

@zenstackhq/common-helpers

Package Overview
Dependencies
Maintainers
2
Versions
123
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@zenstackhq/common-helpers - npm Package Compare versions

Comparing version
3.9.0-beta.1
to
3.9.0
+1
-1
dist/index.cjs.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.cjs","names":[],"sources":["../src/is-plain-object.ts","../src/clone.ts","../src/enumerable.ts","../src/lower-case-first.ts","../src/param-case.ts","../src/safe-json-stringify.ts","../src/single-debounce.ts","../src/sleep.ts","../src/tiny-invariant.ts","../src/upper-case-first.ts","../src/zip.ts"],"sourcesContent":["function isObject(o: unknown) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: unknown) {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = (o as { constructor: unknown }).constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = (ctor as { prototype: unknown }).prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import { isPlainObject } from './is-plain-object';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","export function lowerCaseFirst(input: string) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n","const DEFAULT_SPLIT_REGEXP_1 = /([a-z0-9])([A-Z])/g;\nconst DEFAULT_SPLIT_REGEXP_2 = /([A-Z])([A-Z][a-z])/g;\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\nexport function paramCase(input: string) {\n const result = input\n .replace(DEFAULT_SPLIT_REGEXP_1, '$1\\0$2')\n .replace(DEFAULT_SPLIT_REGEXP_2, '$1\\0$2')\n .replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n while (result.charAt(start) === '\\0') start++;\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result\n .slice(start, end)\n .split('\\0')\n .map((str) => str.toLowerCase())\n .join('-');\n}\n","/**\n * A safe JSON stringify that handles bigint values.\n */\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n","export function singleDebounce(cb: () => void | PromiseLike<void>, debounceMc: number, reRunOnInProgressCall: boolean = false) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let inProgress = false;\n let pendingInProgress = false;\n\n const run = async () => {\n if (inProgress) {\n if (reRunOnInProgressCall) {\n pendingInProgress = true;\n }\n\n return;\n }\n\n inProgress = true;\n pendingInProgress = false;\n\n try {\n await cb();\n } finally {\n inProgress = false;\n\n if (pendingInProgress) {\n await run();\n }\n }\n };\n\n return () => {\n clearTimeout(timeout);\n\n timeout = setTimeout(run, debounceMc);\n }\n}\n","export function sleep(timeout: number) {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), timeout);\n });\n}\n","const isProduction = typeof process !== 'undefined' && process.env['NODE_ENV'] === 'production';\nconst prefix = 'Invariant failed';\n\nexport function invariant(condition: unknown, message?: string): asserts condition {\n if (condition) {\n return;\n }\n\n if (isProduction) {\n throw new Error(prefix);\n }\n\n throw new Error(message ? `${prefix}: ${message}` : prefix);\n}\n","export function upperCaseFirst(input: string) {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n","/**\n * Zips two arrays into an array of tuples.\n */\nexport function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]> {\n const length = Math.min(arr1.length, arr2.length);\n const result: Array<[T, U]> = [];\n for (let i = 0; i < length; i++) {\n result.push([arr1[i]!, arr2[i]!]);\n }\n return result;\n}\n"],"mappings":"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"}
{"version":3,"file":"index.cjs","names":[],"sources":["../src/is-plain-object.ts","../src/clone.ts","../src/enumerable.ts","../src/lower-case-first.ts","../src/param-case.ts","../src/safe-json-stringify.ts","../src/single-debounce.ts","../src/sleep.ts","../src/tiny-invariant.ts","../src/upper-case-first.ts","../src/zip.ts"],"sourcesContent":["function isObject(o: unknown) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: unknown) {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = (o as { constructor: unknown }).constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = (ctor as { prototype: unknown }).prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import { isPlainObject } from './is-plain-object';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","export function lowerCaseFirst(input: string) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n","const DEFAULT_SPLIT_REGEXP_1 = /([a-z0-9])([A-Z])/g;\nconst DEFAULT_SPLIT_REGEXP_2 = /([A-Z])([A-Z][a-z])/g;\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\nexport function paramCase(input: string) {\n const result = input\n .replace(DEFAULT_SPLIT_REGEXP_1, '$1\\0$2')\n .replace(DEFAULT_SPLIT_REGEXP_2, '$1\\0$2')\n .replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n while (result.charAt(start) === '\\0') start++;\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result\n .slice(start, end)\n .split('\\0')\n .map((str) => str.toLowerCase())\n .join('-');\n}\n","/**\n * A safe JSON stringify that handles bigint values.\n */\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n","export function singleDebounce(\n cb: () => void | PromiseLike<void>,\n debounceMc: number,\n reRunOnInProgressCall: boolean = false,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let inProgress = false;\n let pendingInProgress = false;\n\n const run = async () => {\n if (inProgress) {\n if (reRunOnInProgressCall) {\n pendingInProgress = true;\n }\n\n return;\n }\n\n inProgress = true;\n pendingInProgress = false;\n\n try {\n await cb();\n } finally {\n inProgress = false;\n\n if (pendingInProgress) {\n await run();\n }\n }\n };\n\n return () => {\n clearTimeout(timeout);\n\n timeout = setTimeout(run, debounceMc);\n };\n}\n","export function sleep(timeout: number) {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), timeout);\n });\n}\n","const isProduction = typeof process !== 'undefined' && process.env['NODE_ENV'] === 'production';\nconst prefix = 'Invariant failed';\n\nexport function invariant(condition: unknown, message?: string): asserts condition {\n if (condition) {\n return;\n }\n\n if (isProduction) {\n throw new Error(prefix);\n }\n\n throw new Error(message ? `${prefix}: ${message}` : prefix);\n}\n","export function upperCaseFirst(input: string) {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n","/**\n * Zips two arrays into an array of tuples.\n */\nexport function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]> {\n const length = Math.min(arr1.length, arr2.length);\n const result: Array<[T, U]> = [];\n for (let i = 0; i < length; i++) {\n result.push([arr1[i]!, arr2[i]!]);\n }\n return result;\n}\n"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"index.mjs","names":[],"sources":["../src/is-plain-object.ts","../src/clone.ts","../src/enumerable.ts","../src/lower-case-first.ts","../src/param-case.ts","../src/safe-json-stringify.ts","../src/single-debounce.ts","../src/sleep.ts","../src/tiny-invariant.ts","../src/upper-case-first.ts","../src/zip.ts"],"sourcesContent":["function isObject(o: unknown) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: unknown) {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = (o as { constructor: unknown }).constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = (ctor as { prototype: unknown }).prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import { isPlainObject } from './is-plain-object';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","export function lowerCaseFirst(input: string) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n","const DEFAULT_SPLIT_REGEXP_1 = /([a-z0-9])([A-Z])/g;\nconst DEFAULT_SPLIT_REGEXP_2 = /([A-Z])([A-Z][a-z])/g;\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\nexport function paramCase(input: string) {\n const result = input\n .replace(DEFAULT_SPLIT_REGEXP_1, '$1\\0$2')\n .replace(DEFAULT_SPLIT_REGEXP_2, '$1\\0$2')\n .replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n while (result.charAt(start) === '\\0') start++;\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result\n .slice(start, end)\n .split('\\0')\n .map((str) => str.toLowerCase())\n .join('-');\n}\n","/**\n * A safe JSON stringify that handles bigint values.\n */\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n","export function singleDebounce(cb: () => void | PromiseLike<void>, debounceMc: number, reRunOnInProgressCall: boolean = false) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let inProgress = false;\n let pendingInProgress = false;\n\n const run = async () => {\n if (inProgress) {\n if (reRunOnInProgressCall) {\n pendingInProgress = true;\n }\n\n return;\n }\n\n inProgress = true;\n pendingInProgress = false;\n\n try {\n await cb();\n } finally {\n inProgress = false;\n\n if (pendingInProgress) {\n await run();\n }\n }\n };\n\n return () => {\n clearTimeout(timeout);\n\n timeout = setTimeout(run, debounceMc);\n }\n}\n","export function sleep(timeout: number) {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), timeout);\n });\n}\n","const isProduction = typeof process !== 'undefined' && process.env['NODE_ENV'] === 'production';\nconst prefix = 'Invariant failed';\n\nexport function invariant(condition: unknown, message?: string): asserts condition {\n if (condition) {\n return;\n }\n\n if (isProduction) {\n throw new Error(prefix);\n }\n\n throw new Error(message ? `${prefix}: ${message}` : prefix);\n}\n","export function upperCaseFirst(input: string) {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n","/**\n * Zips two arrays into an array of tuples.\n */\nexport function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]> {\n const length = Math.min(arr1.length, arr2.length);\n const result: Array<[T, U]> = [];\n for (let i = 0; i < length; i++) {\n result.push([arr1[i]!, arr2[i]!]);\n }\n return result;\n}\n"],"mappings":"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"}
{"version":3,"file":"index.mjs","names":[],"sources":["../src/is-plain-object.ts","../src/clone.ts","../src/enumerable.ts","../src/lower-case-first.ts","../src/param-case.ts","../src/safe-json-stringify.ts","../src/single-debounce.ts","../src/sleep.ts","../src/tiny-invariant.ts","../src/upper-case-first.ts","../src/zip.ts"],"sourcesContent":["function isObject(o: unknown) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isPlainObject(o: unknown) {\n if (isObject(o) === false) return false;\n\n // If has modified constructor\n const ctor = (o as { constructor: unknown }).constructor;\n if (ctor === undefined) return true;\n\n // If has modified prototype\n const prot = (ctor as { prototype: unknown }).prototype;\n if (isObject(prot) === false) return false;\n\n // If constructor does not have an Object-specific method\n if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) {\n return false;\n }\n\n // Most likely a plain Object\n return true;\n}\n","import { isPlainObject } from './is-plain-object';\n\n/**\n * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is.\n */\nexport function clone<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => clone(v)) as T;\n }\n\n if (typeof value === 'object') {\n if (!value || !isPlainObject(value)) {\n return value;\n }\n\n const result: any = {};\n for (const key of Object.keys(value)) {\n result[key] = clone(value[key as keyof T]);\n }\n return result;\n }\n\n return value;\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","export function lowerCaseFirst(input: string) {\n return input.charAt(0).toLowerCase() + input.slice(1);\n}\n","const DEFAULT_SPLIT_REGEXP_1 = /([a-z0-9])([A-Z])/g;\nconst DEFAULT_SPLIT_REGEXP_2 = /([A-Z])([A-Z][a-z])/g;\nconst DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi;\n\nexport function paramCase(input: string) {\n const result = input\n .replace(DEFAULT_SPLIT_REGEXP_1, '$1\\0$2')\n .replace(DEFAULT_SPLIT_REGEXP_2, '$1\\0$2')\n .replace(DEFAULT_STRIP_REGEXP, '\\0');\n\n let start = 0;\n let end = result.length;\n\n while (result.charAt(start) === '\\0') start++;\n while (result.charAt(end - 1) === '\\0') end--;\n\n return result\n .slice(start, end)\n .split('\\0')\n .map((str) => str.toLowerCase())\n .join('-');\n}\n","/**\n * A safe JSON stringify that handles bigint values.\n */\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n","export function singleDebounce(\n cb: () => void | PromiseLike<void>,\n debounceMc: number,\n reRunOnInProgressCall: boolean = false,\n) {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n let inProgress = false;\n let pendingInProgress = false;\n\n const run = async () => {\n if (inProgress) {\n if (reRunOnInProgressCall) {\n pendingInProgress = true;\n }\n\n return;\n }\n\n inProgress = true;\n pendingInProgress = false;\n\n try {\n await cb();\n } finally {\n inProgress = false;\n\n if (pendingInProgress) {\n await run();\n }\n }\n };\n\n return () => {\n clearTimeout(timeout);\n\n timeout = setTimeout(run, debounceMc);\n };\n}\n","export function sleep(timeout: number) {\n return new Promise<void>((resolve) => {\n setTimeout(() => resolve(), timeout);\n });\n}\n","const isProduction = typeof process !== 'undefined' && process.env['NODE_ENV'] === 'production';\nconst prefix = 'Invariant failed';\n\nexport function invariant(condition: unknown, message?: string): asserts condition {\n if (condition) {\n return;\n }\n\n if (isProduction) {\n throw new Error(prefix);\n }\n\n throw new Error(message ? `${prefix}: ${message}` : prefix);\n}\n","export function upperCaseFirst(input: string) {\n return input.charAt(0).toUpperCase() + input.slice(1);\n}\n","/**\n * Zips two arrays into an array of tuples.\n */\nexport function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]> {\n const length = Math.min(arr1.length, arr2.length);\n const result: Array<[T, U]> = [];\n for (let i = 0; i < length; i++) {\n result.push([arr1[i]!, arr2[i]!]);\n }\n return result;\n}\n"],"mappings":"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"}

@@ -5,3 +5,3 @@ {

"description": "ZenStack Common Helpers",
"version": "3.9.0-beta.1",
"version": "3.9.0",
"type": "module",

@@ -36,6 +36,6 @@ "author": {

"@types/node": "^20.19.0",
"@zenstackhq/eslint-config": "3.9.0-beta.1",
"@zenstackhq/typescript-config": "3.9.0-beta.1",
"@zenstackhq/tsdown-config": "3.9.0-beta.1",
"@zenstackhq/vitest-config": "3.9.0-beta.1"
"@zenstackhq/eslint-config": "3.9.0",
"@zenstackhq/tsdown-config": "3.9.0",
"@zenstackhq/vitest-config": "3.9.0",
"@zenstackhq/typescript-config": "3.9.0"
},

@@ -42,0 +42,0 @@ "funding": "https://github.com/sponsors/zenstackhq",