@zenstackhq/common-helpers 3.1.0 → 3.2.0
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.cjs +32 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.cjs
CHANGED
|
@@ -28,6 +28,7 @@ __export(src_exports, {
|
|
|
28
28
|
lowerCaseFirst: () => lowerCaseFirst,
|
|
29
29
|
paramCase: () => paramCase,
|
|
30
30
|
safeJSONStringify: () => safeJSONStringify,
|
|
31
|
+
singleDebounce: () => singleDebounce,
|
|
31
32
|
sleep: () => sleep,
|
|
32
33
|
upperCaseFirst: () => upperCaseFirst,
|
|
33
34
|
zip: () => zip
|
|
@@ -117,6 +118,36 @@ function safeJSONStringify(value) {
|
|
|
117
118
|
}
|
|
118
119
|
__name(safeJSONStringify, "safeJSONStringify");
|
|
119
120
|
|
|
121
|
+
// src/single-debounce.ts
|
|
122
|
+
function singleDebounce(cb, debounceMc, reRunOnInProgressCall = false) {
|
|
123
|
+
let timeout;
|
|
124
|
+
let inProgress = false;
|
|
125
|
+
let pendingInProgress = false;
|
|
126
|
+
const run = /* @__PURE__ */ __name(async () => {
|
|
127
|
+
if (inProgress) {
|
|
128
|
+
if (reRunOnInProgressCall) {
|
|
129
|
+
pendingInProgress = true;
|
|
130
|
+
}
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
inProgress = true;
|
|
134
|
+
pendingInProgress = false;
|
|
135
|
+
try {
|
|
136
|
+
await cb();
|
|
137
|
+
} finally {
|
|
138
|
+
inProgress = false;
|
|
139
|
+
if (pendingInProgress) {
|
|
140
|
+
await run();
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}, "run");
|
|
144
|
+
return () => {
|
|
145
|
+
clearTimeout(timeout);
|
|
146
|
+
timeout = setTimeout(run, debounceMc);
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
__name(singleDebounce, "singleDebounce");
|
|
150
|
+
|
|
120
151
|
// src/sleep.ts
|
|
121
152
|
function sleep(timeout) {
|
|
122
153
|
return new Promise((resolve) => {
|
|
@@ -167,6 +198,7 @@ __name(zip, "zip");
|
|
|
167
198
|
lowerCaseFirst,
|
|
168
199
|
paramCase,
|
|
169
200
|
safeJSONStringify,
|
|
201
|
+
singleDebounce,
|
|
170
202
|
sleep,
|
|
171
203
|
upperCaseFirst,
|
|
172
204
|
zip
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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/sleep.ts","../src/tiny-invariant.ts","../src/upper-case-first.ts","../src/zip.ts"],"sourcesContent":["export * from './clone';\nexport * from './enumerable';\nexport * from './is-plain-object';\nexport * from './lower-case-first';\nexport * from './param-case';\nexport * from './safe-json-stringify';\nexport * from './sleep';\nexport * from './tiny-invariant';\nexport * from './upper-case-first';\nexport * from './zip';\n","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 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":";;;;;;;;;;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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":["export * from './clone';\nexport * from './enumerable';\nexport * from './is-plain-object';\nexport * from './lower-case-first';\nexport * from './param-case';\nexport * from './safe-json-stringify';\nexport * from './single-debounce';\nexport * from './sleep';\nexport * from './tiny-invariant';\nexport * from './upper-case-first';\nexport * from './zip';\n","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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","names":["isObject","o","Object","prototype","toString","call","isPlainObject","ctor","undefined","prot","hasOwnProperty","clone","value","Array","isArray","map","v","isPlainObject","result","key","Object","keys","enumerate","x","undefined","Array","isArray","lowerCaseFirst","input","charAt","toLowerCase","slice","DEFAULT_SPLIT_REGEXP_1","DEFAULT_SPLIT_REGEXP_2","DEFAULT_STRIP_REGEXP","paramCase","input","result","replace","start","end","length","charAt","slice","split","map","str","toLowerCase","join","safeJSONStringify","value","JSON","stringify","_","v","toString","singleDebounce","cb","debounceMc","reRunOnInProgressCall","timeout","inProgress","pendingInProgress","run","clearTimeout","setTimeout","sleep","timeout","Promise","resolve","setTimeout","isProduction","process","env","prefix","invariant","condition","message","Error","upperCaseFirst","input","charAt","toUpperCase","slice","zip","arr1","arr2","length","Math","min","result","i","push"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -23,6 +23,8 @@ declare function paramCase(input: string): string;
|
|
|
23
23
|
*/
|
|
24
24
|
declare function safeJSONStringify(value: unknown): string;
|
|
25
25
|
|
|
26
|
+
declare function singleDebounce(cb: () => void | PromiseLike<void>, debounceMc: number, reRunOnInProgressCall?: boolean): () => void;
|
|
27
|
+
|
|
26
28
|
declare function sleep(timeout: number): Promise<void>;
|
|
27
29
|
|
|
28
30
|
declare function invariant(condition: unknown, message?: string): asserts condition;
|
|
@@ -34,4 +36,4 @@ declare function upperCaseFirst(input: string): string;
|
|
|
34
36
|
*/
|
|
35
37
|
declare function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]>;
|
|
36
38
|
|
|
37
|
-
export { type Enumerable, clone, enumerate, invariant, isPlainObject, lowerCaseFirst, paramCase, safeJSONStringify, sleep, upperCaseFirst, zip };
|
|
39
|
+
export { type Enumerable, clone, enumerate, invariant, isPlainObject, lowerCaseFirst, paramCase, safeJSONStringify, singleDebounce, sleep, upperCaseFirst, zip };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ declare function paramCase(input: string): string;
|
|
|
23
23
|
*/
|
|
24
24
|
declare function safeJSONStringify(value: unknown): string;
|
|
25
25
|
|
|
26
|
+
declare function singleDebounce(cb: () => void | PromiseLike<void>, debounceMc: number, reRunOnInProgressCall?: boolean): () => void;
|
|
27
|
+
|
|
26
28
|
declare function sleep(timeout: number): Promise<void>;
|
|
27
29
|
|
|
28
30
|
declare function invariant(condition: unknown, message?: string): asserts condition;
|
|
@@ -34,4 +36,4 @@ declare function upperCaseFirst(input: string): string;
|
|
|
34
36
|
*/
|
|
35
37
|
declare function zip<T, U>(arr1: readonly T[], arr2: readonly U[]): Array<[T, U]>;
|
|
36
38
|
|
|
37
|
-
export { type Enumerable, clone, enumerate, invariant, isPlainObject, lowerCaseFirst, paramCase, safeJSONStringify, sleep, upperCaseFirst, zip };
|
|
39
|
+
export { type Enumerable, clone, enumerate, invariant, isPlainObject, lowerCaseFirst, paramCase, safeJSONStringify, singleDebounce, sleep, upperCaseFirst, zip };
|
package/dist/index.js
CHANGED
|
@@ -84,6 +84,36 @@ function safeJSONStringify(value) {
|
|
|
84
84
|
}
|
|
85
85
|
__name(safeJSONStringify, "safeJSONStringify");
|
|
86
86
|
|
|
87
|
+
// src/single-debounce.ts
|
|
88
|
+
function singleDebounce(cb, debounceMc, reRunOnInProgressCall = false) {
|
|
89
|
+
let timeout;
|
|
90
|
+
let inProgress = false;
|
|
91
|
+
let pendingInProgress = false;
|
|
92
|
+
const run = /* @__PURE__ */ __name(async () => {
|
|
93
|
+
if (inProgress) {
|
|
94
|
+
if (reRunOnInProgressCall) {
|
|
95
|
+
pendingInProgress = true;
|
|
96
|
+
}
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
inProgress = true;
|
|
100
|
+
pendingInProgress = false;
|
|
101
|
+
try {
|
|
102
|
+
await cb();
|
|
103
|
+
} finally {
|
|
104
|
+
inProgress = false;
|
|
105
|
+
if (pendingInProgress) {
|
|
106
|
+
await run();
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}, "run");
|
|
110
|
+
return () => {
|
|
111
|
+
clearTimeout(timeout);
|
|
112
|
+
timeout = setTimeout(run, debounceMc);
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
__name(singleDebounce, "singleDebounce");
|
|
116
|
+
|
|
87
117
|
// src/sleep.ts
|
|
88
118
|
function sleep(timeout) {
|
|
89
119
|
return new Promise((resolve) => {
|
|
@@ -133,6 +163,7 @@ export {
|
|
|
133
163
|
lowerCaseFirst,
|
|
134
164
|
paramCase,
|
|
135
165
|
safeJSONStringify,
|
|
166
|
+
singleDebounce,
|
|
136
167
|
sleep,
|
|
137
168
|
upperCaseFirst,
|
|
138
169
|
zip
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"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/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 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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","names":["isObject","o","Object","prototype","toString","call","isPlainObject","ctor","undefined","prot","hasOwnProperty","clone","value","Array","isArray","map","v","isPlainObject","result","key","Object","keys","enumerate","x","undefined","Array","isArray","lowerCaseFirst","input","charAt","toLowerCase","slice","DEFAULT_SPLIT_REGEXP_1","DEFAULT_SPLIT_REGEXP_2","DEFAULT_STRIP_REGEXP","paramCase","input","result","replace","start","end","length","charAt","slice","split","map","str","toLowerCase","join","safeJSONStringify","value","JSON","stringify","_","v","toString","sleep","timeout","Promise","resolve","setTimeout","isProduction","process","env","prefix","invariant","condition","message","Error","upperCaseFirst","input","charAt","toUpperCase","slice","zip","arr1","arr2","length","Math","min","result","i","push"]}
|
|
1
|
+
{"version":3,"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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","names":["isObject","o","Object","prototype","toString","call","isPlainObject","ctor","undefined","prot","hasOwnProperty","clone","value","Array","isArray","map","v","isPlainObject","result","key","Object","keys","enumerate","x","undefined","Array","isArray","lowerCaseFirst","input","charAt","toLowerCase","slice","DEFAULT_SPLIT_REGEXP_1","DEFAULT_SPLIT_REGEXP_2","DEFAULT_STRIP_REGEXP","paramCase","input","result","replace","start","end","length","charAt","slice","split","map","str","toLowerCase","join","safeJSONStringify","value","JSON","stringify","_","v","toString","singleDebounce","cb","debounceMc","reRunOnInProgressCall","timeout","inProgress","pendingInProgress","run","clearTimeout","setTimeout","sleep","timeout","Promise","resolve","setTimeout","isProduction","process","env","prefix","invariant","condition","message","Error","upperCaseFirst","input","charAt","toUpperCase","slice","zip","arr1","arr2","length","Math","min","result","i","push"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenstackhq/common-helpers",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.2.0",
|
|
4
4
|
"description": "ZenStack Common Helpers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
|
-
"@zenstackhq/typescript-config": "3.
|
|
26
|
-
"@zenstackhq/
|
|
27
|
-
"@zenstackhq/
|
|
25
|
+
"@zenstackhq/typescript-config": "3.2.0",
|
|
26
|
+
"@zenstackhq/eslint-config": "3.2.0",
|
|
27
|
+
"@zenstackhq/vitest-config": "3.2.0"
|
|
28
28
|
},
|
|
29
29
|
"scripts": {
|
|
30
30
|
"build": "tsc --noEmit && tsup-node",
|