@ls-stack/utils 1.8.0 → 1.9.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/assertions.js +1 -1
- package/dist/{chunk-5FQYH3ZJ.js → chunk-4QK76IRX.js} +3 -4
- package/dist/{chunk-5FQYH3ZJ.js.map → chunk-4QK76IRX.js.map} +1 -1
- package/dist/{chunk-JT3EBBCA.js → chunk-FYMTZQ42.js} +3 -5
- package/dist/{chunk-JT3EBBCA.js.map → chunk-FYMTZQ42.js.map} +1 -1
- package/dist/{chunk-4DRNU53E.js → chunk-GLZ5MZC5.js} +3 -5
- package/dist/{chunk-4DRNU53E.js.map → chunk-GLZ5MZC5.js.map} +1 -1
- package/dist/{chunk-ENNWIHHG.js → chunk-I7ZDKDUM.js} +4 -5
- package/dist/{chunk-ENNWIHHG.js.map → chunk-I7ZDKDUM.js.map} +1 -1
- package/dist/{chunk-JZUOIOMU.js → chunk-M74KKYE4.js} +12 -22
- package/dist/chunk-M74KKYE4.js.map +1 -0
- package/dist/createThrottleController.js +3 -4
- package/dist/createThrottleController.js.map +1 -1
- package/dist/debounce.js.map +1 -1
- package/dist/deepEqual.d.ts +1 -1
- package/dist/deepEqual.js +1 -1
- package/dist/enhancedMap.js +2 -2
- package/dist/exhaustiveMatch.d.ts +1 -1
- package/dist/interpolate.js +2 -3
- package/dist/interpolate.js.map +1 -1
- package/dist/levenshtein.d.ts +5 -0
- package/dist/levenshtein.js +154 -0
- package/dist/levenshtein.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/parallelAsyncResultCalls.d.ts +2 -2
- package/dist/parallelAsyncResultCalls.js +4 -4
- package/dist/parallelAsyncResultCalls.js.map +1 -1
- package/dist/rsResult.js +3 -3
- package/dist/runShellCmd.js +1 -2
- package/dist/runShellCmd.js.map +1 -1
- package/dist/shallowEqual.js +10 -20
- package/dist/shallowEqual.js.map +1 -1
- package/dist/stringUtils.js +1 -1
- package/dist/testUtils.d.ts +1 -1
- package/dist/testUtils.js +2 -2
- package/dist/yamlStringify.js +2 -2
- package/package.json +24 -15
- package/dist/chunk-JZUOIOMU.js.map +0 -1
package/dist/assertions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isFunction
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-FYMTZQ42.js";
|
|
4
4
|
|
|
5
5
|
// src/enhancedMap.ts
|
|
6
6
|
var enhancedMapReject = Symbol();
|
|
@@ -79,8 +79,7 @@ var EnhancedMap = class _EnhancedMap extends Map {
|
|
|
79
79
|
}
|
|
80
80
|
static from(array, mapFunction) {
|
|
81
81
|
const map = new _EnhancedMap();
|
|
82
|
-
if (!array)
|
|
83
|
-
return map;
|
|
82
|
+
if (!array) return map;
|
|
84
83
|
const isFn = isFunction(mapFunction);
|
|
85
84
|
for (const item of array) {
|
|
86
85
|
if (isFn) {
|
|
@@ -103,4 +102,4 @@ export {
|
|
|
103
102
|
enhancedMapReject,
|
|
104
103
|
EnhancedMap
|
|
105
104
|
};
|
|
106
|
-
//# sourceMappingURL=chunk-
|
|
105
|
+
//# sourceMappingURL=chunk-4QK76IRX.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/enhancedMap.ts"],"sourcesContent":["import { isFunction } from './assertions';\n\nexport const enhancedMapReject = Symbol();\n\nexport class EnhancedMap<K, V> extends Map<K, V> {\n find(\n predicate: (value: V, key: K) => boolean,\n ): { key: K; value: V } | undefined {\n for (const [key, value] of this) {\n if (predicate(value, key)) {\n return { key, value };\n }\n }\n\n return undefined;\n }\n\n setMultiple(values: Record<K & string, V>): this;\n setMultiple(...values: [key: K, value: V][]): this;\n setMultiple(...values: [key: K, value: V][] | [Record<K & string, V>]): this {\n if (Array.isArray(values[0])) {\n for (const [key, value] of values as [key: K, value: V][]) {\n this.set(key, value);\n }\n } else {\n for (const [key, value] of Object.entries(values[0])) {\n this.set(key as K, value as V);\n }\n }\n\n return this;\n }\n\n getOrThrow(key: K): V {\n const value = this.get(key);\n\n if (value === undefined) {\n throw new Error(`Key ${key} not found in EnhancedMap`);\n }\n\n return value;\n }\n\n getOrInsert(key: K, fallback: () => V): V {\n if (!this.has(key)) {\n this.set(key, fallback());\n }\n\n return this.getOrThrow(key);\n }\n\n toFilteredValues(predicate: (value: V, key: K) => boolean): V[] {\n const values: V[] = [];\n\n for (const [key, value] of this) {\n if (predicate(value, key)) {\n values.push(value);\n }\n }\n\n return values;\n }\n\n toMap<T>(\n mapFunction: (\n value: V,\n key: K,\n reject: typeof enhancedMapReject,\n ) => T | typeof enhancedMapReject,\n ): T[] {\n const values: T[] = [];\n\n for (const [key, value] of this) {\n const result = mapFunction(value, key, enhancedMapReject);\n\n if (result !== enhancedMapReject) {\n values.push(result);\n }\n }\n\n return values;\n }\n\n toObjMap<ObjKey extends PropertyKey, ObjValue>(\n mapFunction: (value: V, key: K) => [key: ObjKey, value: ObjValue] | false,\n ): Record<ObjKey, ObjValue> {\n const values: Record<ObjKey, ObjValue> = {} as any;\n\n for (const [key, value] of this) {\n const result = mapFunction(value, key);\n\n if (result) {\n values[result[0]] = result[1];\n }\n }\n\n return values;\n }\n\n toValues(): V[] {\n return [...this.values()];\n }\n\n toKeys(): K[] {\n return [...this.keys()];\n }\n\n /** @deprecated, will be removed in v5 use `from` method instead */\n static fromIterMap<T, K, V>(\n array: T[] | Iterable<T>,\n mapFunction: (item: T) => [key: K, value: V] | false,\n ): EnhancedMap<K, V> {\n return this.from(array, mapFunction);\n }\n\n static from<T extends Record<string, unknown>, K extends keyof T>(\n array: T[] | Iterable<T> | null | undefined,\n key: K,\n ): EnhancedMap<T[K], T>;\n static from<T, K, V>(\n array: T[] | Iterable<T> | null | undefined,\n mapFunction: (item: T) => [key: K, value: V] | false,\n ): EnhancedMap<K, V>;\n static from(\n array: any[] | Iterable<any> | null | undefined,\n mapFunction: ((item: any) => [key: any, value: any] | false) | string,\n ): EnhancedMap<any, any> {\n const map = new EnhancedMap<any, any>();\n\n if (!array) return map;\n\n const isFn = isFunction(mapFunction);\n\n for (const item of array) {\n if (isFn) {\n const result = mapFunction(item);\n\n if (result) {\n map.set(result[0], result[1]);\n }\n } else {\n const key = item[mapFunction];\n\n if (key !== undefined) {\n map.set(key, item);\n }\n }\n }\n\n return map;\n }\n}\n"],"mappings":";;;;;AAEO,IAAM,oBAAoB,OAAO;AAEjC,IAAM,cAAN,MAAM,qBAA0B,IAAU;AAAA,EAC/C,KACE,WACkC;AAClC,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,UAAI,UAAU,OAAO,GAAG,GAAG;AACzB,eAAO,EAAE,KAAK,MAAM;AAAA,MACtB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAIA,eAAe,QAA8D;AAC3E,QAAI,MAAM,QAAQ,OAAO,CAAC,CAAC,GAAG;AAC5B,iBAAW,CAAC,KAAK,KAAK,KAAK,QAAgC;AACzD,aAAK,IAAI,KAAK,KAAK;AAAA,MACrB;AAAA,IACF,OAAO;AACL,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,CAAC,CAAC,GAAG;AACpD,aAAK,IAAI,KAAU,KAAU;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,KAAW;AACpB,UAAM,QAAQ,KAAK,IAAI,GAAG;AAE1B,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,OAAO,GAAG,2BAA2B;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,KAAQ,UAAsB;AACxC,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,KAAK,SAAS,CAAC;AAAA,IAC1B;AAEA,WAAO,KAAK,WAAW,GAAG;AAAA,EAC5B;AAAA,EAEA,iBAAiB,WAA+C;AAC9D,UAAM,SAAc,CAAC;AAErB,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,UAAI,UAAU,OAAO,GAAG,GAAG;AACzB,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MACE,aAKK;AACL,UAAM,SAAc,CAAC;AAErB,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,YAAM,SAAS,YAAY,OAAO,KAAK,iBAAiB;AAExD,UAAI,WAAW,mBAAmB;AAChC,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SACE,aAC0B;AAC1B,UAAM,SAAmC,CAAC;AAE1C,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,YAAM,SAAS,YAAY,OAAO,GAAG;AAErC,UAAI,QAAQ;AACV,eAAO,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAgB;AACd,WAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,EAC1B;AAAA,EAEA,SAAc;AACZ,WAAO,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,EACxB;AAAA;AAAA,EAGA,OAAO,YACL,OACA,aACmB;AACnB,WAAO,KAAK,KAAK,OAAO,WAAW;AAAA,EACrC;AAAA,EAUA,OAAO,KACL,OACA,aACuB;AACvB,UAAM,MAAM,IAAI,aAAsB;AAEtC,QAAI,CAAC
|
|
1
|
+
{"version":3,"sources":["../src/enhancedMap.ts"],"sourcesContent":["import { isFunction } from './assertions';\n\nexport const enhancedMapReject = Symbol();\n\nexport class EnhancedMap<K, V> extends Map<K, V> {\n find(\n predicate: (value: V, key: K) => boolean,\n ): { key: K; value: V } | undefined {\n for (const [key, value] of this) {\n if (predicate(value, key)) {\n return { key, value };\n }\n }\n\n return undefined;\n }\n\n setMultiple(values: Record<K & string, V>): this;\n setMultiple(...values: [key: K, value: V][]): this;\n setMultiple(...values: [key: K, value: V][] | [Record<K & string, V>]): this {\n if (Array.isArray(values[0])) {\n for (const [key, value] of values as [key: K, value: V][]) {\n this.set(key, value);\n }\n } else {\n for (const [key, value] of Object.entries(values[0])) {\n this.set(key as K, value as V);\n }\n }\n\n return this;\n }\n\n getOrThrow(key: K): V {\n const value = this.get(key);\n\n if (value === undefined) {\n throw new Error(`Key ${key} not found in EnhancedMap`);\n }\n\n return value;\n }\n\n getOrInsert(key: K, fallback: () => V): V {\n if (!this.has(key)) {\n this.set(key, fallback());\n }\n\n return this.getOrThrow(key);\n }\n\n toFilteredValues(predicate: (value: V, key: K) => boolean): V[] {\n const values: V[] = [];\n\n for (const [key, value] of this) {\n if (predicate(value, key)) {\n values.push(value);\n }\n }\n\n return values;\n }\n\n toMap<T>(\n mapFunction: (\n value: V,\n key: K,\n reject: typeof enhancedMapReject,\n ) => T | typeof enhancedMapReject,\n ): T[] {\n const values: T[] = [];\n\n for (const [key, value] of this) {\n const result = mapFunction(value, key, enhancedMapReject);\n\n if (result !== enhancedMapReject) {\n values.push(result);\n }\n }\n\n return values;\n }\n\n toObjMap<ObjKey extends PropertyKey, ObjValue>(\n mapFunction: (value: V, key: K) => [key: ObjKey, value: ObjValue] | false,\n ): Record<ObjKey, ObjValue> {\n const values: Record<ObjKey, ObjValue> = {} as any;\n\n for (const [key, value] of this) {\n const result = mapFunction(value, key);\n\n if (result) {\n values[result[0]] = result[1];\n }\n }\n\n return values;\n }\n\n toValues(): V[] {\n return [...this.values()];\n }\n\n toKeys(): K[] {\n return [...this.keys()];\n }\n\n /** @deprecated, will be removed in v5 use `from` method instead */\n static fromIterMap<T, K, V>(\n array: T[] | Iterable<T>,\n mapFunction: (item: T) => [key: K, value: V] | false,\n ): EnhancedMap<K, V> {\n return this.from(array, mapFunction);\n }\n\n static from<T extends Record<string, unknown>, K extends keyof T>(\n array: T[] | Iterable<T> | null | undefined,\n key: K,\n ): EnhancedMap<T[K], T>;\n static from<T, K, V>(\n array: T[] | Iterable<T> | null | undefined,\n mapFunction: (item: T) => [key: K, value: V] | false,\n ): EnhancedMap<K, V>;\n static from(\n array: any[] | Iterable<any> | null | undefined,\n mapFunction: ((item: any) => [key: any, value: any] | false) | string,\n ): EnhancedMap<any, any> {\n const map = new EnhancedMap<any, any>();\n\n if (!array) return map;\n\n const isFn = isFunction(mapFunction);\n\n for (const item of array) {\n if (isFn) {\n const result = mapFunction(item);\n\n if (result) {\n map.set(result[0], result[1]);\n }\n } else {\n const key = item[mapFunction];\n\n if (key !== undefined) {\n map.set(key, item);\n }\n }\n }\n\n return map;\n }\n}\n"],"mappings":";;;;;AAEO,IAAM,oBAAoB,OAAO;AAEjC,IAAM,cAAN,MAAM,qBAA0B,IAAU;AAAA,EAC/C,KACE,WACkC;AAClC,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,UAAI,UAAU,OAAO,GAAG,GAAG;AACzB,eAAO,EAAE,KAAK,MAAM;AAAA,MACtB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAIA,eAAe,QAA8D;AAC3E,QAAI,MAAM,QAAQ,OAAO,CAAC,CAAC,GAAG;AAC5B,iBAAW,CAAC,KAAK,KAAK,KAAK,QAAgC;AACzD,aAAK,IAAI,KAAK,KAAK;AAAA,MACrB;AAAA,IACF,OAAO;AACL,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,OAAO,CAAC,CAAC,GAAG;AACpD,aAAK,IAAI,KAAU,KAAU;AAAA,MAC/B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,KAAW;AACpB,UAAM,QAAQ,KAAK,IAAI,GAAG;AAE1B,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,OAAO,GAAG,2BAA2B;AAAA,IACvD;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,KAAQ,UAAsB;AACxC,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AAClB,WAAK,IAAI,KAAK,SAAS,CAAC;AAAA,IAC1B;AAEA,WAAO,KAAK,WAAW,GAAG;AAAA,EAC5B;AAAA,EAEA,iBAAiB,WAA+C;AAC9D,UAAM,SAAc,CAAC;AAErB,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,UAAI,UAAU,OAAO,GAAG,GAAG;AACzB,eAAO,KAAK,KAAK;AAAA,MACnB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MACE,aAKK;AACL,UAAM,SAAc,CAAC;AAErB,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,YAAM,SAAS,YAAY,OAAO,KAAK,iBAAiB;AAExD,UAAI,WAAW,mBAAmB;AAChC,eAAO,KAAK,MAAM;AAAA,MACpB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,SACE,aAC0B;AAC1B,UAAM,SAAmC,CAAC;AAE1C,eAAW,CAAC,KAAK,KAAK,KAAK,MAAM;AAC/B,YAAM,SAAS,YAAY,OAAO,GAAG;AAErC,UAAI,QAAQ;AACV,eAAO,OAAO,CAAC,CAAC,IAAI,OAAO,CAAC;AAAA,MAC9B;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,WAAgB;AACd,WAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,EAC1B;AAAA,EAEA,SAAc;AACZ,WAAO,CAAC,GAAG,KAAK,KAAK,CAAC;AAAA,EACxB;AAAA;AAAA,EAGA,OAAO,YACL,OACA,aACmB;AACnB,WAAO,KAAK,KAAK,OAAO,WAAW;AAAA,EACrC;AAAA,EAUA,OAAO,KACL,OACA,aACuB;AACvB,UAAM,MAAM,IAAI,aAAsB;AAEtC,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,OAAO,WAAW,WAAW;AAEnC,eAAW,QAAQ,OAAO;AACxB,UAAI,MAAM;AACR,cAAM,SAAS,YAAY,IAAI;AAE/B,YAAI,QAAQ;AACV,cAAI,IAAI,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC;AAAA,QAC9B;AAAA,MACF,OAAO;AACL,cAAM,MAAM,KAAK,WAAW;AAE5B,YAAI,QAAQ,QAAW;AACrB,cAAI,IAAI,KAAK,IAAI;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -41,15 +41,13 @@ function isPromise(value) {
|
|
|
41
41
|
return isObject(value) && "then" in value;
|
|
42
42
|
}
|
|
43
43
|
function isPlainObject(value) {
|
|
44
|
-
if (!value || typeof value !== "object")
|
|
45
|
-
return false;
|
|
44
|
+
if (!value || typeof value !== "object") return false;
|
|
46
45
|
const proto = Object.getPrototypeOf(value);
|
|
47
46
|
if (proto === null) {
|
|
48
47
|
return true;
|
|
49
48
|
}
|
|
50
49
|
const Ctor = Object.hasOwnProperty.call(proto, "constructor") && proto.constructor;
|
|
51
|
-
if (Ctor === Object)
|
|
52
|
-
return true;
|
|
50
|
+
if (Ctor === Object) return true;
|
|
53
51
|
const objectCtorString = Object.prototype.constructor.toString();
|
|
54
52
|
return typeof Ctor == "function" && Function.toString.call(Ctor) === objectCtorString;
|
|
55
53
|
}
|
|
@@ -66,4 +64,4 @@ export {
|
|
|
66
64
|
isPromise,
|
|
67
65
|
isPlainObject
|
|
68
66
|
};
|
|
69
|
-
//# sourceMappingURL=chunk-
|
|
67
|
+
//# sourceMappingURL=chunk-FYMTZQ42.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/assertions.ts"],"sourcesContent":["const undefErrMsg = 'not undefined assertion failed';\nconst nullishErrMsg = 'not nullish assertion failed';\n\ntype NotUndefined<T> = T extends undefined ? never : T;\n\ntype StrictNonUndefined<T, N = unknown> =\n undefined extends T ? NotUndefined<T> : N;\n\nexport function notUndefined<T>(value: T): StrictNonUndefined<T> {\n if (value === undefined) {\n throw new Error(undefErrMsg);\n }\n\n return value as any;\n}\n\ntype StrictNonNullable<T, N = unknown> =\n undefined extends T ? NonNullable<T>\n : null extends T ? NonNullable<T>\n : N;\n\nexport function notNullish<T>(value: T): StrictNonNullable<T> {\n if (value === undefined || value === null) {\n throw new Error(nullishErrMsg);\n }\n\n return value as any;\n}\n\nexport function assertIsNotNullish<T>(\n value: T,\n errorMsg = nullishErrMsg,\n): asserts value is StrictNonNullable<T, never> {\n if (value === undefined || value === null) {\n throw new Error(errorMsg);\n }\n}\n\nexport function assertIsNotUndefined<T>(\n value: T,\n errorMsg = undefErrMsg,\n): asserts value is StrictNonUndefined<T, never> {\n if (value === undefined) {\n throw new Error(errorMsg);\n }\n}\n\n/** Use this function to assert that a certain condition is always true. */\nexport function invariant(\n condition: any,\n errorMsg = 'Invariant violation',\n): asserts condition {\n if (!condition) {\n throw new Error(`Invariant violation: ${errorMsg}`);\n }\n}\n\n/** ensures all type possibilities are being handled */\nexport function exhaustiveCheck<Except = never>(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we use this function only for type checking\n narrowedType: NoInfer<Except>,\n): Error {\n return new Error('This should never happen');\n}\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n\nexport function isPromise(value: unknown): value is Promise<unknown> {\n return isObject(value) && 'then' in value;\n}\n\nexport function isPlainObject(value: any): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) {\n return true;\n }\n const Ctor =\n Object.hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n\n if (Ctor === Object) return true;\n\n const objectCtorString = Object.prototype.constructor.toString();\n\n return (\n typeof Ctor == 'function' &&\n Function.toString.call(Ctor) === objectCtorString\n );\n}\n"],"mappings":";AAAA,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAOf,SAAS,aAAgB,OAAiC;AAC/D,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,WAAW;AAAA,EAC7B;AAEA,SAAO;AACT;AAOO,SAAS,WAAc,OAAgC;AAC5D,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,OACA,WAAW,eACmC;AAC9C,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACF;AAEO,SAAS,qBACd,OACA,WAAW,aACoC;AAC/C,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACF;AAGO,SAAS,UACd,WACA,WAAW,uBACQ;AACnB,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,wBAAwB,QAAQ,EAAE;AAAA,EACpD;AACF;AAGO,SAAS,gBAEd,cACO;AACP,SAAO,IAAI,MAAM,0BAA0B;AAC7C;AAEO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,WAAW,OAAkD;AAC3E,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,UAAU,OAA2C;AACnE,SAAO,SAAS,KAAK,KAAK,UAAU;AACtC;AAEO,SAAS,cAAc,OAA8C;AAC1E,MAAI,CAAC,SAAS,OAAO,UAAU
|
|
1
|
+
{"version":3,"sources":["../src/assertions.ts"],"sourcesContent":["const undefErrMsg = 'not undefined assertion failed';\nconst nullishErrMsg = 'not nullish assertion failed';\n\ntype NotUndefined<T> = T extends undefined ? never : T;\n\ntype StrictNonUndefined<T, N = unknown> =\n undefined extends T ? NotUndefined<T> : N;\n\nexport function notUndefined<T>(value: T): StrictNonUndefined<T> {\n if (value === undefined) {\n throw new Error(undefErrMsg);\n }\n\n return value as any;\n}\n\ntype StrictNonNullable<T, N = unknown> =\n undefined extends T ? NonNullable<T>\n : null extends T ? NonNullable<T>\n : N;\n\nexport function notNullish<T>(value: T): StrictNonNullable<T> {\n if (value === undefined || value === null) {\n throw new Error(nullishErrMsg);\n }\n\n return value as any;\n}\n\nexport function assertIsNotNullish<T>(\n value: T,\n errorMsg = nullishErrMsg,\n): asserts value is StrictNonNullable<T, never> {\n if (value === undefined || value === null) {\n throw new Error(errorMsg);\n }\n}\n\nexport function assertIsNotUndefined<T>(\n value: T,\n errorMsg = undefErrMsg,\n): asserts value is StrictNonUndefined<T, never> {\n if (value === undefined) {\n throw new Error(errorMsg);\n }\n}\n\n/** Use this function to assert that a certain condition is always true. */\nexport function invariant(\n condition: any,\n errorMsg = 'Invariant violation',\n): asserts condition {\n if (!condition) {\n throw new Error(`Invariant violation: ${errorMsg}`);\n }\n}\n\n/** ensures all type possibilities are being handled */\nexport function exhaustiveCheck<Except = never>(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars -- we use this function only for type checking\n narrowedType: NoInfer<Except>,\n): Error {\n return new Error('This should never happen');\n}\n\nexport function isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nexport function isFunction(value: unknown): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n\nexport function isPromise(value: unknown): value is Promise<unknown> {\n return isObject(value) && 'then' in value;\n}\n\nexport function isPlainObject(value: any): value is Record<string, unknown> {\n if (!value || typeof value !== 'object') return false;\n const proto = Object.getPrototypeOf(value);\n if (proto === null) {\n return true;\n }\n const Ctor =\n Object.hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n\n if (Ctor === Object) return true;\n\n const objectCtorString = Object.prototype.constructor.toString();\n\n return (\n typeof Ctor == 'function' &&\n Function.toString.call(Ctor) === objectCtorString\n );\n}\n"],"mappings":";AAAA,IAAM,cAAc;AACpB,IAAM,gBAAgB;AAOf,SAAS,aAAgB,OAAiC;AAC/D,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,WAAW;AAAA,EAC7B;AAEA,SAAO;AACT;AAOO,SAAS,WAAc,OAAgC;AAC5D,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAM,IAAI,MAAM,aAAa;AAAA,EAC/B;AAEA,SAAO;AACT;AAEO,SAAS,mBACd,OACA,WAAW,eACmC;AAC9C,MAAI,UAAU,UAAa,UAAU,MAAM;AACzC,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACF;AAEO,SAAS,qBACd,OACA,WAAW,aACoC;AAC/C,MAAI,UAAU,QAAW;AACvB,UAAM,IAAI,MAAM,QAAQ;AAAA,EAC1B;AACF;AAGO,SAAS,UACd,WACA,WAAW,uBACQ;AACnB,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,wBAAwB,QAAQ,EAAE;AAAA,EACpD;AACF;AAGO,SAAS,gBAEd,cACO;AACP,SAAO,IAAI,MAAM,0BAA0B;AAC7C;AAEO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEO,SAAS,WAAW,OAAkD;AAC3E,SAAO,OAAO,UAAU;AAC1B;AAEO,SAAS,UAAU,OAA2C;AACnE,SAAO,SAAS,KAAK,KAAK,UAAU;AACtC;AAEO,SAAS,cAAc,OAA8C;AAC1E,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,QAAM,OACJ,OAAO,eAAe,KAAK,OAAO,aAAa,KAAK,MAAM;AAE5D,MAAI,SAAS,OAAQ,QAAO;AAE5B,QAAM,mBAAmB,OAAO,UAAU,YAAY,SAAS;AAE/D,SACE,OAAO,QAAQ,cACf,SAAS,SAAS,KAAK,IAAI,MAAM;AAErC;","names":[]}
|
|
@@ -3,8 +3,7 @@ function joinStrings(...args) {
|
|
|
3
3
|
const strings = [];
|
|
4
4
|
for (let i = 0; i < args.length; i++) {
|
|
5
5
|
const arg = args[i];
|
|
6
|
-
if (!arg)
|
|
7
|
-
continue;
|
|
6
|
+
if (!arg) continue;
|
|
8
7
|
if (Array.isArray(arg)) {
|
|
9
8
|
strings.push(joinStrings(...arg));
|
|
10
9
|
continue;
|
|
@@ -54,8 +53,7 @@ function convertToSnakeCase(str) {
|
|
|
54
53
|
return str.replace(/([A-Z])/g, "_$1").replace(/[^a-z0-9_]/g, "").toLowerCase();
|
|
55
54
|
}
|
|
56
55
|
function truncateString(str, length, ellipsis = "\u2026") {
|
|
57
|
-
if (str.length <= length)
|
|
58
|
-
return str;
|
|
56
|
+
if (str.length <= length) return str;
|
|
59
57
|
return str.slice(0, length - 1) + ellipsis;
|
|
60
58
|
}
|
|
61
59
|
|
|
@@ -67,4 +65,4 @@ export {
|
|
|
67
65
|
convertToSnakeCase,
|
|
68
66
|
truncateString
|
|
69
67
|
};
|
|
70
|
-
//# sourceMappingURL=chunk-
|
|
68
|
+
//# sourceMappingURL=chunk-GLZ5MZC5.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stringUtils.ts"],"sourcesContent":["type Arg = string | false | undefined | null;\n\n/**\n * A util to create more legible conditional concatenated strings\n *\n * @example\n * joinStrings('a', 'b', 'c') // 'abc'\n * joinStrings('a', false, 'c') // 'ac'\n * joinStrings('a', addBString ? 'b' : null, 'c') // 'ac' if addBString is false, 'abc' if addBString is true\n */\nexport function joinStrings(...args: (Arg | Arg[])[]) {\n const strings: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (!arg) continue;\n\n if (Array.isArray(arg)) {\n strings.push(joinStrings(...arg));\n continue;\n }\n\n strings.push(arg);\n }\n\n return strings.join('');\n}\n\n// fork of https://github.com/dmnd/dedent\nexport function dedent(strings: string): string;\nexport function dedent(\n strings: TemplateStringsArray,\n ...values: string[]\n): string;\nexport function dedent(\n strings: TemplateStringsArray | string,\n ...values: string[]\n) {\n // $FlowFixMe: Flow doesn't undestand .raw\n const raw = typeof strings === 'string' ? [strings] : strings.raw;\n\n // first, perform interpolation\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n result += raw[i]! // join lines when there is a suppressed newline\n .replace(/\\\\\\n[ \\t]*/g, '')\n // handle escaped backticks\n .replace(/\\\\`/g, '`');\n\n if (i < values.length) {\n result += values[i];\n }\n }\n\n // now strip indentation\n const lines = result.split('\\n');\n let mindent: number | null = null;\n lines.forEach((l) => {\n const m = l.match(/^(\\s+)\\S+/);\n if (m) {\n const indent = m[1]!.length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (mindent !== null) {\n const m = mindent; // appease Flow\n result = lines.map((l) => (l.startsWith(' ') ? l.slice(m) : l)).join('\\n');\n }\n\n return (\n result\n // dedent eats leading and trailing whitespace too\n .trim()\n // handle escaped newlines at the end to ensure they don't get stripped too\n .replace(/\\\\n/g, '\\n')\n );\n}\n\nexport function formatNum(num: number) {\n return num.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nexport function isSnakeCase(str: string) {\n return /^[a-z0-9_]+$/.test(str);\n}\n\nexport function convertToSnakeCase(str: string) {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/[^a-z0-9_]/g, '')\n .toLowerCase();\n}\n\nexport function truncateString(str: string, length: number, ellipsis = '…') {\n if (str.length <= length) return str;\n\n return str.slice(0, length - 1) + ellipsis;\n}\n"],"mappings":";AAUO,SAAS,eAAe,MAAuB;AACpD,QAAM,UAAoB,CAAC;AAE3B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/stringUtils.ts"],"sourcesContent":["type Arg = string | false | undefined | null;\n\n/**\n * A util to create more legible conditional concatenated strings\n *\n * @example\n * joinStrings('a', 'b', 'c') // 'abc'\n * joinStrings('a', false, 'c') // 'ac'\n * joinStrings('a', addBString ? 'b' : null, 'c') // 'ac' if addBString is false, 'abc' if addBString is true\n */\nexport function joinStrings(...args: (Arg | Arg[])[]) {\n const strings: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (!arg) continue;\n\n if (Array.isArray(arg)) {\n strings.push(joinStrings(...arg));\n continue;\n }\n\n strings.push(arg);\n }\n\n return strings.join('');\n}\n\n// fork of https://github.com/dmnd/dedent\nexport function dedent(strings: string): string;\nexport function dedent(\n strings: TemplateStringsArray,\n ...values: string[]\n): string;\nexport function dedent(\n strings: TemplateStringsArray | string,\n ...values: string[]\n) {\n // $FlowFixMe: Flow doesn't undestand .raw\n const raw = typeof strings === 'string' ? [strings] : strings.raw;\n\n // first, perform interpolation\n let result = '';\n for (let i = 0; i < raw.length; i++) {\n result += raw[i]! // join lines when there is a suppressed newline\n .replace(/\\\\\\n[ \\t]*/g, '')\n // handle escaped backticks\n .replace(/\\\\`/g, '`');\n\n if (i < values.length) {\n result += values[i];\n }\n }\n\n // now strip indentation\n const lines = result.split('\\n');\n let mindent: number | null = null;\n lines.forEach((l) => {\n const m = l.match(/^(\\s+)\\S+/);\n if (m) {\n const indent = m[1]!.length;\n if (!mindent) {\n // this is the first indented line\n mindent = indent;\n } else {\n mindent = Math.min(mindent, indent);\n }\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (mindent !== null) {\n const m = mindent; // appease Flow\n result = lines.map((l) => (l.startsWith(' ') ? l.slice(m) : l)).join('\\n');\n }\n\n return (\n result\n // dedent eats leading and trailing whitespace too\n .trim()\n // handle escaped newlines at the end to ensure they don't get stripped too\n .replace(/\\\\n/g, '\\n')\n );\n}\n\nexport function formatNum(num: number) {\n return num.toLocaleString('en-US', {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n}\n\nexport function isSnakeCase(str: string) {\n return /^[a-z0-9_]+$/.test(str);\n}\n\nexport function convertToSnakeCase(str: string) {\n return str\n .replace(/([A-Z])/g, '_$1')\n .replace(/[^a-z0-9_]/g, '')\n .toLowerCase();\n}\n\nexport function truncateString(str: string, length: number, ellipsis = '…') {\n if (str.length <= length) return str;\n\n return str.slice(0, length - 1) + ellipsis;\n}\n"],"mappings":";AAUO,SAAS,eAAe,MAAuB;AACpD,QAAM,UAAoB,CAAC;AAE3B,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAElB,QAAI,CAAC,IAAK;AAEV,QAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,cAAQ,KAAK,YAAY,GAAG,GAAG,CAAC;AAChC;AAAA,IACF;AAEA,YAAQ,KAAK,GAAG;AAAA,EAClB;AAEA,SAAO,QAAQ,KAAK,EAAE;AACxB;AAQO,SAAS,OACd,YACG,QACH;AAEA,QAAM,MAAM,OAAO,YAAY,WAAW,CAAC,OAAO,IAAI,QAAQ;AAG9D,MAAI,SAAS;AACb,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,cAAU,IAAI,CAAC,EACZ,QAAQ,eAAe,EAAE,EAEzB,QAAQ,QAAQ,GAAG;AAEtB,QAAI,IAAI,OAAO,QAAQ;AACrB,gBAAU,OAAO,CAAC;AAAA,IACpB;AAAA,EACF;AAGA,QAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,MAAI,UAAyB;AAC7B,QAAM,QAAQ,CAAC,MAAM;AACnB,UAAM,IAAI,EAAE,MAAM,WAAW;AAC7B,QAAI,GAAG;AACL,YAAM,SAAS,EAAE,CAAC,EAAG;AACrB,UAAI,CAAC,SAAS;AAEZ,kBAAU;AAAA,MACZ,OAAO;AACL,kBAAU,KAAK,IAAI,SAAS,MAAM;AAAA,MACpC;AAAA,IACF;AAAA,EACF,CAAC;AAGD,MAAI,YAAY,MAAM;AACpB,UAAM,IAAI;AACV,aAAS,MAAM,IAAI,CAAC,MAAO,EAAE,WAAW,GAAG,IAAI,EAAE,MAAM,CAAC,IAAI,CAAE,EAAE,KAAK,IAAI;AAAA,EAC3E;AAEA,SACE,OAEG,KAAK,EAEL,QAAQ,QAAQ,IAAI;AAE3B;AAEO,SAAS,UAAU,KAAa;AACrC,SAAO,IAAI,eAAe,SAAS;AAAA,IACjC,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,EACzB,CAAC;AACH;AAEO,SAAS,YAAY,KAAa;AACvC,SAAO,eAAe,KAAK,GAAG;AAChC;AAEO,SAAS,mBAAmB,KAAa;AAC9C,SAAO,IACJ,QAAQ,YAAY,KAAK,EACzB,QAAQ,eAAe,EAAE,EACzB,YAAY;AACjB;AAEO,SAAS,eAAe,KAAa,QAAgB,WAAW,UAAK;AAC1E,MAAI,IAAI,UAAU,OAAQ,QAAO;AAEjC,SAAO,IAAI,MAAM,GAAG,SAAS,CAAC,IAAI;AACpC;","names":[]}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import {
|
|
2
2
|
joinStrings
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GLZ5MZC5.js";
|
|
4
4
|
import {
|
|
5
5
|
isObject
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-FYMTZQ42.js";
|
|
7
7
|
|
|
8
8
|
// src/rsResult.ts
|
|
9
9
|
function okUnwrapOr() {
|
|
@@ -178,8 +178,7 @@ var NormalizedErrorWithMetadata = class extends NormalizedError {
|
|
|
178
178
|
}
|
|
179
179
|
};
|
|
180
180
|
function normalizeError(error) {
|
|
181
|
-
if (error instanceof NormalizedError)
|
|
182
|
-
return error;
|
|
181
|
+
if (error instanceof NormalizedError) return error;
|
|
183
182
|
if (typeof error === "string") {
|
|
184
183
|
return new NormalizedError({
|
|
185
184
|
id: "unknown",
|
|
@@ -215,4 +214,4 @@ export {
|
|
|
215
214
|
NormalizedErrorWithMetadata,
|
|
216
215
|
normalizeError
|
|
217
216
|
};
|
|
218
|
-
//# sourceMappingURL=chunk-
|
|
217
|
+
//# sourceMappingURL=chunk-I7ZDKDUM.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/rsResult.ts"],"sourcesContent":["import { isObject } from './assertions';\nimport { joinStrings } from './stringUtils';\n\ntype Ok<T> = {\n ok: true;\n error: false;\n value: T;\n};\n\ntype NormalizedErrorResultProps = {\n id: string;\n message: string;\n code?: number;\n metadata?: ValidErrorMetadata;\n};\n\ntype IsExactlyAny<T> =\n boolean extends (T extends never ? true : false) ? true : false;\n\ntype Err<E extends ResultValidErrors> = {\n ok: false;\n error: E;\n errorResult: () => Result<any, E>;\n normalizedErrorResult: (\n normalizedErr: E extends NormalizedError ?\n { withMetadata: ValidErrorMetadata } | NormalizedErrorResultProps\n : NormalizedErrorResultProps,\n ) => Result<any, NormalizedError>;\n};\n\ntype Unwrap<E, T> =\n IsExactlyAny<E> extends true ? any\n : E extends Error ? () => T\n : unknown;\n\ntype ResultMethods<T, E> = {\n /** Returns the value if the result is Ok, otherwise returns null */\n unwrapOrNull: () => T | null;\n /** Returns the value if the result is Ok, otherwise returns the provided default value */\n unwrapOr: <R extends T>(defaultValue: R) => T | R;\n unwrap: Unwrap<E, T>;\n};\n\n/**\n * Util for implementing something similar to Result<T, E> in Rust, for better error handling.\n *\n * Usage:\n *\n * @example\n * function doSomething(): Result<string, Error> {\n * if (something) {\n * return ok('success');\n * }\n *\n * return err(new Error('something went wrong'));\n * }\n *\n * const result = doSomething();\n *\n * if (result.ok) {\n * // result.value is a string\n * } else {\n * // result.error is an Error\n * }\n */\nexport type Result<T, E extends ResultValidErrors = NormalizedError> =\n | OkResult<T, E, T>\n | ErrResult<E, T>;\n\nfunction okUnwrapOr<T>(this: Ok<T>) {\n return this.value;\n}\n\ntype OkResult<T, E extends ResultValidErrors, M = any> = Ok<T> &\n ResultMethods<M, E>;\n\ntype ResultValidErrors = Error | Record<string, unknown> | string[];\n\nfunction ok(): OkResult<void, any>;\nfunction ok<T>(value: T): OkResult<T, any>;\nfunction ok(value: any = undefined): OkResult<any, any> {\n return {\n ok: true,\n error: false,\n value,\n unwrapOrNull: okUnwrapOr,\n unwrapOr: okUnwrapOr,\n unwrap: okUnwrapOr,\n };\n}\n\ntype ErrResult<E extends ResultValidErrors, T = any> = Err<E> &\n ResultMethods<T, E>;\n\nfunction err<E extends ResultValidErrors>(error: E): ErrResult<E> {\n return {\n ok: false,\n error,\n unwrapOrNull: () => null,\n unwrapOr: (defaultValue) => defaultValue,\n errorResult() {\n return err(error);\n },\n normalizedErrorResult(normalizedErr) {\n return err(\n 'withMetadata' in normalizedErr && error instanceof NormalizedError ?\n new NormalizedErrorWithMetadata({\n error,\n metadata: {\n ...error.metadata,\n ...normalizedErr.withMetadata,\n },\n })\n : new NormalizedError({\n id: (normalizedErr as NormalizedErrorResultProps).id,\n message: (normalizedErr as NormalizedErrorResultProps).message,\n code: (normalizedErr as NormalizedErrorResultProps).code,\n cause: error instanceof Error ? error : undefined,\n }),\n );\n },\n unwrap: (() => {\n throw error;\n }) as any,\n };\n}\n\nfunction normalizedUnknownErr(error: unknown) {\n return err(normalizeError(error));\n}\n\nfunction normalizedErr(message: string): ErrResult<NormalizedError>;\nfunction normalizedErr<T extends string>(\n id: T,\n message: string,\n): ErrResult<NormalizedError<T>>;\nfunction normalizedErr<T extends string>(errorProps: {\n id: T;\n message: string;\n code?: number;\n cause?: Error;\n metadata?: ValidErrorMetadata;\n}): ErrResult<NormalizedError<T>>;\nfunction normalizedErr(\n idOrMessageOrErr:\n | string\n | {\n id: string;\n message: string;\n code?: number;\n metadata?: ValidErrorMetadata;\n cause?: Error;\n },\n message?: string,\n): ErrResult<NormalizedError> {\n if (typeof idOrMessageOrErr === 'object') {\n return err(\n new NormalizedError({\n id: idOrMessageOrErr.id,\n message: idOrMessageOrErr.message,\n code: idOrMessageOrErr.code,\n cause: idOrMessageOrErr.cause,\n metadata: idOrMessageOrErr.metadata,\n }),\n );\n }\n\n if (message !== undefined) {\n return err(\n new NormalizedError({\n id: idOrMessageOrErr,\n message,\n }),\n );\n }\n\n return err(\n new NormalizedError({\n id: 'unknown',\n message: idOrMessageOrErr,\n }),\n );\n}\n\n/** Unwraps a promise result */\nasync function unwrap<T>(result: Promise<Result<T, Error>>): Promise<T> {\n const unwrapped = await result;\n\n if (unwrapped.ok) {\n return unwrapped.value;\n }\n\n throw unwrapped.error;\n}\n\nexport const Result = {\n ok,\n err,\n normalizedErr,\n normalizedUnknownErr,\n unwrap,\n};\n\n/** transfor a function in a result function */\nexport function resultify<T, E extends ResultValidErrors = NormalizedError>(\n fn: () => T,\n errorNormalizer?: (err: unknown) => E,\n): Result<T, E> {\n try {\n return ok(fn());\n } catch (error) {\n return err(\n errorNormalizer ?\n errorNormalizer(error)\n : (normalizeError(error) as unknown as E),\n );\n }\n}\n\n/** transform a async function in a result function */\nexport async function asyncResultify<T, E extends Error = NormalizedError>(\n fn: () => Promise<T>,\n errorNormalizer?: (err: unknown) => E,\n): Promise<Result<Awaited<T>, E>> {\n try {\n return ok(await fn());\n } catch (error) {\n return err(\n errorNormalizer ?\n errorNormalizer(error)\n : (normalizeError(error) as unknown as E),\n );\n }\n}\n\nexport type ValidErrorMetadata = Record<string, unknown> | undefined;\n\nlet normalizedErrorSideEffects:\n | ((normalizedError: NormalizedError) => void)\n | undefined = undefined;\n\nexport function setNormalizedErrorSideEffects(\n callback: (normalizedError: NormalizedError) => void,\n) {\n normalizedErrorSideEffects = callback;\n}\n\nexport class NormalizedError<T = string> extends Error {\n id: T;\n metadata?: ValidErrorMetadata;\n cause?: Error;\n code: number;\n\n constructor({\n id,\n message,\n metadata,\n cause,\n code = 0,\n }: {\n id: T;\n message: string;\n metadata?: ValidErrorMetadata;\n cause?: Error;\n code?: number;\n }) {\n super(message);\n this.id = id;\n this.name = 'NormalizedError';\n this.metadata = metadata;\n this.cause = cause;\n this.code = code;\n\n setTimeout(() => {\n if (normalizedErrorSideEffects) {\n normalizedErrorSideEffects(this as NormalizedError);\n }\n }, 1);\n }\n\n toString() {\n return joinStrings(\n !!this.code && `${this.code}#`,\n String(this.id),\n `: ${this.message}`,\n !!this.cause && `\\n Caused by: ${this.cause}`,\n !!this.metadata && `\\n Metadata: ${JSON.stringify(this.metadata)}`,\n );\n }\n\n toJSON() {\n return {\n id: this.id,\n message: this.message,\n metadata: this.metadata,\n code: this.code,\n cause:\n this.cause ?\n 'toJSON' in this.cause ?\n this.cause\n : String(this.cause)\n : undefined,\n };\n }\n}\n\nexport class NormalizedErrorWithMetadata<\n M extends ValidErrorMetadata,\n T = string,\n> extends NormalizedError<T> {\n metadata: M;\n\n constructor(\n props:\n | {\n id: T;\n message: string;\n metadata: M;\n cause?: Error;\n }\n | {\n error: NormalizedError<T>;\n metadata: M;\n },\n ) {\n if ('error' in props) {\n super({\n id: props.error.id,\n message: props.error.message,\n cause: props.error.cause,\n });\n this.metadata = props.metadata;\n this.stack = props.error.stack;\n } else {\n super(props);\n this.metadata = props.metadata;\n }\n }\n}\n\nexport function normalizeError(error: unknown): NormalizedError {\n if (error instanceof NormalizedError) return error;\n\n if (typeof error === 'string') {\n return new NormalizedError({\n id: 'unknown',\n message: error,\n });\n }\n\n if (error instanceof Error) {\n return new NormalizedError({\n id: error.name,\n message: error.message,\n cause: error,\n });\n }\n\n if (isObject(error)) {\n return new NormalizedError({\n id: 'id' in error ? String(error.id) : 'unknown',\n message:\n 'message' in error ? String(error.message) : JSON.stringify(error),\n metadata: error,\n });\n }\n\n return new NormalizedError({\n message: JSON.stringify(error),\n id: 'unknown',\n });\n}\n"],"mappings":"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","names":["normalizedErr"]}
|
|
1
|
+
{"version":3,"sources":["../src/rsResult.ts"],"sourcesContent":["import { isObject } from './assertions';\nimport { joinStrings } from './stringUtils';\n\ntype Ok<T> = {\n ok: true;\n error: false;\n value: T;\n};\n\ntype NormalizedErrorResultProps = {\n id: string;\n message: string;\n code?: number;\n metadata?: ValidErrorMetadata;\n};\n\ntype IsExactlyAny<T> =\n boolean extends (T extends never ? true : false) ? true : false;\n\ntype Err<E extends ResultValidErrors> = {\n ok: false;\n error: E;\n errorResult: () => Result<any, E>;\n normalizedErrorResult: (\n normalizedErr: E extends NormalizedError ?\n { withMetadata: ValidErrorMetadata } | NormalizedErrorResultProps\n : NormalizedErrorResultProps,\n ) => Result<any, NormalizedError>;\n};\n\ntype Unwrap<E, T> =\n IsExactlyAny<E> extends true ? any\n : E extends Error ? () => T\n : unknown;\n\ntype ResultMethods<T, E> = {\n /** Returns the value if the result is Ok, otherwise returns null */\n unwrapOrNull: () => T | null;\n /** Returns the value if the result is Ok, otherwise returns the provided default value */\n unwrapOr: <R extends T>(defaultValue: R) => T | R;\n unwrap: Unwrap<E, T>;\n};\n\n/**\n * Util for implementing something similar to Result<T, E> in Rust, for better error handling.\n *\n * Usage:\n *\n * @example\n * function doSomething(): Result<string, Error> {\n * if (something) {\n * return ok('success');\n * }\n *\n * return err(new Error('something went wrong'));\n * }\n *\n * const result = doSomething();\n *\n * if (result.ok) {\n * // result.value is a string\n * } else {\n * // result.error is an Error\n * }\n */\nexport type Result<T, E extends ResultValidErrors = NormalizedError> =\n | OkResult<T, E, T>\n | ErrResult<E, T>;\n\nfunction okUnwrapOr<T>(this: Ok<T>) {\n return this.value;\n}\n\ntype OkResult<T, E extends ResultValidErrors, M = any> = Ok<T> &\n ResultMethods<M, E>;\n\ntype ResultValidErrors = Error | Record<string, unknown> | string[];\n\nfunction ok(): OkResult<void, any>;\nfunction ok<T>(value: T): OkResult<T, any>;\nfunction ok(value: any = undefined): OkResult<any, any> {\n return {\n ok: true,\n error: false,\n value,\n unwrapOrNull: okUnwrapOr,\n unwrapOr: okUnwrapOr,\n unwrap: okUnwrapOr,\n };\n}\n\ntype ErrResult<E extends ResultValidErrors, T = any> = Err<E> &\n ResultMethods<T, E>;\n\nfunction err<E extends ResultValidErrors>(error: E): ErrResult<E> {\n return {\n ok: false,\n error,\n unwrapOrNull: () => null,\n unwrapOr: (defaultValue) => defaultValue,\n errorResult() {\n return err(error);\n },\n normalizedErrorResult(normalizedErr) {\n return err(\n 'withMetadata' in normalizedErr && error instanceof NormalizedError ?\n new NormalizedErrorWithMetadata({\n error,\n metadata: {\n ...error.metadata,\n ...normalizedErr.withMetadata,\n },\n })\n : new NormalizedError({\n id: (normalizedErr as NormalizedErrorResultProps).id,\n message: (normalizedErr as NormalizedErrorResultProps).message,\n code: (normalizedErr as NormalizedErrorResultProps).code,\n cause: error instanceof Error ? error : undefined,\n }),\n );\n },\n unwrap: (() => {\n throw error;\n }) as any,\n };\n}\n\nfunction normalizedUnknownErr(error: unknown) {\n return err(normalizeError(error));\n}\n\nfunction normalizedErr(message: string): ErrResult<NormalizedError>;\nfunction normalizedErr<T extends string>(\n id: T,\n message: string,\n): ErrResult<NormalizedError<T>>;\nfunction normalizedErr<T extends string>(errorProps: {\n id: T;\n message: string;\n code?: number;\n cause?: Error;\n metadata?: ValidErrorMetadata;\n}): ErrResult<NormalizedError<T>>;\nfunction normalizedErr(\n idOrMessageOrErr:\n | string\n | {\n id: string;\n message: string;\n code?: number;\n metadata?: ValidErrorMetadata;\n cause?: Error;\n },\n message?: string,\n): ErrResult<NormalizedError> {\n if (typeof idOrMessageOrErr === 'object') {\n return err(\n new NormalizedError({\n id: idOrMessageOrErr.id,\n message: idOrMessageOrErr.message,\n code: idOrMessageOrErr.code,\n cause: idOrMessageOrErr.cause,\n metadata: idOrMessageOrErr.metadata,\n }),\n );\n }\n\n if (message !== undefined) {\n return err(\n new NormalizedError({\n id: idOrMessageOrErr,\n message,\n }),\n );\n }\n\n return err(\n new NormalizedError({\n id: 'unknown',\n message: idOrMessageOrErr,\n }),\n );\n}\n\n/** Unwraps a promise result */\nasync function unwrap<T>(result: Promise<Result<T, Error>>): Promise<T> {\n const unwrapped = await result;\n\n if (unwrapped.ok) {\n return unwrapped.value;\n }\n\n throw unwrapped.error;\n}\n\nexport const Result = {\n ok,\n err,\n normalizedErr,\n normalizedUnknownErr,\n unwrap,\n};\n\n/** transfor a function in a result function */\nexport function resultify<T, E extends ResultValidErrors = NormalizedError>(\n fn: () => T,\n errorNormalizer?: (err: unknown) => E,\n): Result<T, E> {\n try {\n return ok(fn());\n } catch (error) {\n return err(\n errorNormalizer ?\n errorNormalizer(error)\n : (normalizeError(error) as unknown as E),\n );\n }\n}\n\n/** transform a async function in a result function */\nexport async function asyncResultify<T, E extends Error = NormalizedError>(\n fn: () => Promise<T>,\n errorNormalizer?: (err: unknown) => E,\n): Promise<Result<Awaited<T>, E>> {\n try {\n return ok(await fn());\n } catch (error) {\n return err(\n errorNormalizer ?\n errorNormalizer(error)\n : (normalizeError(error) as unknown as E),\n );\n }\n}\n\nexport type ValidErrorMetadata = Record<string, unknown> | undefined;\n\nlet normalizedErrorSideEffects:\n | ((normalizedError: NormalizedError) => void)\n | undefined = undefined;\n\nexport function setNormalizedErrorSideEffects(\n callback: (normalizedError: NormalizedError) => void,\n) {\n normalizedErrorSideEffects = callback;\n}\n\nexport class NormalizedError<T = string> extends Error {\n id: T;\n metadata?: ValidErrorMetadata;\n cause?: Error;\n code: number;\n\n constructor({\n id,\n message,\n metadata,\n cause,\n code = 0,\n }: {\n id: T;\n message: string;\n metadata?: ValidErrorMetadata;\n cause?: Error;\n code?: number;\n }) {\n super(message);\n this.id = id;\n this.name = 'NormalizedError';\n this.metadata = metadata;\n this.cause = cause;\n this.code = code;\n\n setTimeout(() => {\n if (normalizedErrorSideEffects) {\n normalizedErrorSideEffects(this as NormalizedError);\n }\n }, 1);\n }\n\n toString() {\n return joinStrings(\n !!this.code && `${this.code}#`,\n String(this.id),\n `: ${this.message}`,\n !!this.cause && `\\n Caused by: ${this.cause}`,\n !!this.metadata && `\\n Metadata: ${JSON.stringify(this.metadata)}`,\n );\n }\n\n toJSON() {\n return {\n id: this.id,\n message: this.message,\n metadata: this.metadata,\n code: this.code,\n cause:\n this.cause ?\n 'toJSON' in this.cause ?\n this.cause\n : String(this.cause)\n : undefined,\n };\n }\n}\n\nexport class NormalizedErrorWithMetadata<\n M extends ValidErrorMetadata,\n T = string,\n> extends NormalizedError<T> {\n metadata: M;\n\n constructor(\n props:\n | {\n id: T;\n message: string;\n metadata: M;\n cause?: Error;\n }\n | {\n error: NormalizedError<T>;\n metadata: M;\n },\n ) {\n if ('error' in props) {\n super({\n id: props.error.id,\n message: props.error.message,\n cause: props.error.cause,\n });\n this.metadata = props.metadata;\n this.stack = props.error.stack;\n } else {\n super(props);\n this.metadata = props.metadata;\n }\n }\n}\n\nexport function normalizeError(error: unknown): NormalizedError {\n if (error instanceof NormalizedError) return error;\n\n if (typeof error === 'string') {\n return new NormalizedError({\n id: 'unknown',\n message: error,\n });\n }\n\n if (error instanceof Error) {\n return new NormalizedError({\n id: error.name,\n message: error.message,\n cause: error,\n });\n }\n\n if (isObject(error)) {\n return new NormalizedError({\n id: 'id' in error ? String(error.id) : 'unknown',\n message:\n 'message' in error ? String(error.message) : JSON.stringify(error),\n metadata: error,\n });\n }\n\n return new NormalizedError({\n message: JSON.stringify(error),\n id: 'unknown',\n });\n}\n"],"mappings":"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","names":["normalizedErr"]}
|
|
@@ -2,23 +2,18 @@
|
|
|
2
2
|
var has = Object.prototype.hasOwnProperty;
|
|
3
3
|
function find(iter, tar, key) {
|
|
4
4
|
for (key of iter.keys()) {
|
|
5
|
-
if (deepEqual(key, tar))
|
|
6
|
-
return key;
|
|
5
|
+
if (deepEqual(key, tar)) return key;
|
|
7
6
|
}
|
|
8
7
|
}
|
|
9
8
|
function deepEqual(foo, bar) {
|
|
10
|
-
|
|
11
|
-
if (foo === bar)
|
|
12
|
-
return true;
|
|
9
|
+
let ctor, len, tmp;
|
|
10
|
+
if (foo === bar) return true;
|
|
13
11
|
if (foo && bar && (ctor = foo.constructor) === bar.constructor) {
|
|
14
|
-
if (ctor === Date)
|
|
15
|
-
|
|
16
|
-
if (ctor === RegExp)
|
|
17
|
-
return foo.toString() === bar.toString();
|
|
12
|
+
if (ctor === Date) return deepEqual(foo.getTime(), bar.getTime());
|
|
13
|
+
if (ctor === RegExp) return foo.toString() === bar.toString();
|
|
18
14
|
if (ctor === Array) {
|
|
19
15
|
if ((len = foo.length) === bar.length) {
|
|
20
|
-
while (len-- && deepEqual(foo[len], bar[len]))
|
|
21
|
-
;
|
|
16
|
+
while (len-- && deepEqual(foo[len], bar[len])) ;
|
|
22
17
|
}
|
|
23
18
|
return len === -1;
|
|
24
19
|
}
|
|
@@ -30,11 +25,9 @@ function deepEqual(foo, bar) {
|
|
|
30
25
|
tmp = len;
|
|
31
26
|
if (tmp && typeof tmp === "object") {
|
|
32
27
|
tmp = find(bar, tmp);
|
|
33
|
-
if (!tmp)
|
|
34
|
-
return false;
|
|
28
|
+
if (!tmp) return false;
|
|
35
29
|
}
|
|
36
|
-
if (!bar.has(tmp))
|
|
37
|
-
return false;
|
|
30
|
+
if (!bar.has(tmp)) return false;
|
|
38
31
|
}
|
|
39
32
|
return true;
|
|
40
33
|
}
|
|
@@ -46,8 +39,7 @@ function deepEqual(foo, bar) {
|
|
|
46
39
|
tmp = len[0];
|
|
47
40
|
if (tmp && typeof tmp === "object") {
|
|
48
41
|
tmp = find(bar, tmp);
|
|
49
|
-
if (!tmp)
|
|
50
|
-
return false;
|
|
42
|
+
if (!tmp) return false;
|
|
51
43
|
}
|
|
52
44
|
if (!deepEqual(len[1], bar.get(tmp))) {
|
|
53
45
|
return false;
|
|
@@ -58,10 +50,8 @@ function deepEqual(foo, bar) {
|
|
|
58
50
|
if (!ctor || typeof foo === "object") {
|
|
59
51
|
len = 0;
|
|
60
52
|
for (ctor in foo) {
|
|
61
|
-
if (has.call(foo, ctor) && ++len && !has.call(bar, ctor))
|
|
62
|
-
|
|
63
|
-
if (!(ctor in bar) || !deepEqual(foo[ctor], bar[ctor]))
|
|
64
|
-
return false;
|
|
53
|
+
if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;
|
|
54
|
+
if (!(ctor in bar) || !deepEqual(foo[ctor], bar[ctor])) return false;
|
|
65
55
|
}
|
|
66
56
|
return Object.keys(bar).length === len;
|
|
67
57
|
}
|
|
@@ -72,4 +62,4 @@ function deepEqual(foo, bar) {
|
|
|
72
62
|
export {
|
|
73
63
|
deepEqual
|
|
74
64
|
};
|
|
75
|
-
//# sourceMappingURL=chunk-
|
|
65
|
+
//# sourceMappingURL=chunk-M74KKYE4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/deepEqual.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable no-param-reassign */\n/** forked from https://github.com/lukeed/dequal to consider invalid dates as equal */\n\nconst has = Object.prototype.hasOwnProperty;\n\nfunction find(iter: any[], tar: any, key?: any) {\n for (key of iter.keys()) {\n if (deepEqual(key, tar)) return key;\n }\n}\n\nexport function deepEqual(foo: any, bar: any): boolean {\n let ctor, len, tmp;\n if (foo === bar) return true;\n\n if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n if (ctor === Date) return deepEqual(foo.getTime(), bar.getTime());\n if (ctor === RegExp) return foo.toString() === bar.toString();\n\n if (ctor === Array) {\n if ((len = foo.length) === bar.length) {\n while (len-- && deepEqual(foo[len], bar[len]));\n }\n return len === -1;\n }\n\n if (ctor === Set) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len;\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!bar.has(tmp)) return false;\n }\n return true;\n }\n\n if (ctor === Map) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len[0];\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!deepEqual(len[1], bar.get(tmp))) {\n return false;\n }\n }\n return true;\n }\n\n if (!ctor || typeof foo === 'object') {\n len = 0;\n for (ctor in foo) {\n if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n if (!(ctor in bar) || !deepEqual(foo[ctor], bar[ctor])) return false;\n }\n return Object.keys(bar).length === len;\n }\n }\n\n return foo !== foo && bar !== bar;\n}\n"],"mappings":";AAKA,IAAM,MAAM,OAAO,UAAU;AAE7B,SAAS,KAAK,MAAa,KAAU,KAAW;AAC9C,OAAK,OAAO,KAAK,KAAK,GAAG;AACvB,QAAI,UAAU,KAAK,GAAG,EAAG,QAAO;AAAA,EAClC;AACF;AAEO,SAAS,UAAU,KAAU,KAAmB;AACrD,MAAI,MAAM,KAAK;AACf,MAAI,QAAQ,IAAK,QAAO;AAExB,MAAI,OAAO,QAAQ,OAAO,IAAI,iBAAiB,IAAI,aAAa;AAC9D,QAAI,SAAS,KAAM,QAAO,UAAU,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC;AAChE,QAAI,SAAS,OAAQ,QAAO,IAAI,SAAS,MAAM,IAAI,SAAS;AAE5D,QAAI,SAAS,OAAO;AAClB,WAAK,MAAM,IAAI,YAAY,IAAI,QAAQ;AACrC,eAAO,SAAS,UAAU,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE;AAAA,MAChD;AACA,aAAO,QAAQ;AAAA,IACjB;AAEA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,SAAS,IAAI,MAAM;AACzB,eAAO;AAAA,MACT;AACA,WAAK,OAAO,KAAK;AACf,cAAM;AACN,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,KAAK,KAAK,GAAG;AACnB,cAAI,CAAC,IAAK,QAAO;AAAA,QACnB;AACA,YAAI,CAAC,IAAI,IAAI,GAAG,EAAG,QAAO;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,SAAS,IAAI,MAAM;AACzB,eAAO;AAAA,MACT;AACA,WAAK,OAAO,KAAK;AACf,cAAM,IAAI,CAAC;AACX,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,KAAK,KAAK,GAAG;AACnB,cAAI,CAAC,IAAK,QAAO;AAAA,QACnB;AACA,YAAI,CAAC,UAAU,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG;AACpC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,OAAO,QAAQ,UAAU;AACpC,YAAM;AACN,WAAK,QAAQ,KAAK;AAChB,YAAI,IAAI,KAAK,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,EAAG,QAAO;AACjE,YAAI,EAAE,QAAQ,QAAQ,CAAC,UAAU,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC,EAAG,QAAO;AAAA,MACjE;AACA,aAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,QAAQ,OAAO,QAAQ;AAChC;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
EnhancedMap
|
|
3
|
-
} from "./chunk-
|
|
4
|
-
import "./chunk-
|
|
3
|
+
} from "./chunk-4QK76IRX.js";
|
|
4
|
+
import "./chunk-FYMTZQ42.js";
|
|
5
5
|
|
|
6
6
|
// src/createThrottleController.ts
|
|
7
7
|
function createThrottleController({
|
|
@@ -26,8 +26,7 @@ function createThrottleController({
|
|
|
26
26
|
const windows = new EnhancedMap();
|
|
27
27
|
function cleanup(checkTime) {
|
|
28
28
|
const shouldCleanup = checkTime - lastCleanupCheck > cleanupCheckSecsInterval * 1e3;
|
|
29
|
-
if (!shouldCleanup)
|
|
30
|
-
return;
|
|
29
|
+
if (!shouldCleanup) return;
|
|
31
30
|
setTimeout(() => {
|
|
32
31
|
const now = Date.now();
|
|
33
32
|
lastCleanupCheck = now;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createThrottleController.ts"],"sourcesContent":["import { EnhancedMap } from './enhancedMap';\n\ntype Options = {\n maxCalls: number;\n per: { ms?: number; seconds?: number; minutes?: number; hours?: number };\n cleanupCheckSecsInterval?: number;\n};\n\ntype ThrottleController = {\n shouldSkip: (callId?: string | number | (string | number)[]) => boolean;\n /** @internal */\n _currentWindows: EnhancedMap<\n string,\n { windowStartTime: number; calls: number }\n >;\n};\n\nexport function createThrottleController({\n maxCalls,\n per,\n cleanupCheckSecsInterval = 60 * 30,\n}: Options): ThrottleController {\n let msInterval = 0;\n\n if (per.ms) {\n msInterval = per.ms;\n } else if (per.seconds) {\n msInterval = per.seconds * 1000;\n } else if (per.minutes) {\n msInterval = per.minutes * 1000 * 60;\n } else if (per.hours) {\n msInterval = per.hours * 1000 * 60 * 60;\n }\n\n if (msInterval === 0) {\n throw new Error('Invalid interval');\n }\n\n let lastCleanupCheck = Date.now();\n\n const windows = new EnhancedMap<\n string,\n { windowStartTime: number; calls: number }\n >();\n\n function cleanup(checkTime: number) {\n const shouldCleanup =\n checkTime - lastCleanupCheck > cleanupCheckSecsInterval * 1000;\n\n if (!shouldCleanup) return;\n\n setTimeout(() => {\n const now = Date.now();\n\n lastCleanupCheck = now;\n\n for (const [key, value] of windows) {\n if (now - value.windowStartTime > msInterval) {\n windows.delete(key);\n }\n }\n }, 2);\n }\n\n return {\n shouldSkip(callId = '') {\n const now = Date.now();\n\n const serializedCallId = String(callId);\n\n const window = windows.getOrInsert(serializedCallId, () => ({\n windowStartTime: now,\n calls: 0,\n }));\n\n if (now - window.windowStartTime > msInterval) {\n window.windowStartTime = now;\n window.calls = 0;\n }\n\n window.calls++;\n\n cleanup(now);\n\n if (window.calls > maxCalls) {\n return true;\n }\n\n return false;\n },\n _currentWindows: windows,\n };\n}\n"],"mappings":";;;;;;AAiBO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA,2BAA2B,KAAK;AAClC,GAAgC;AAC9B,MAAI,aAAa;AAEjB,MAAI,IAAI,IAAI;AACV,iBAAa,IAAI;AAAA,EACnB,WAAW,IAAI,SAAS;AACtB,iBAAa,IAAI,UAAU;AAAA,EAC7B,WAAW,IAAI,SAAS;AACtB,iBAAa,IAAI,UAAU,MAAO;AAAA,EACpC,WAAW,IAAI,OAAO;AACpB,iBAAa,IAAI,QAAQ,MAAO,KAAK;AAAA,EACvC;AAEA,MAAI,eAAe,GAAG;AACpB,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,MAAI,mBAAmB,KAAK,IAAI;AAEhC,QAAM,UAAU,IAAI,YAGlB;AAEF,WAAS,QAAQ,WAAmB;AAClC,UAAM,gBACJ,YAAY,mBAAmB,2BAA2B;AAE5D,QAAI,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/createThrottleController.ts"],"sourcesContent":["import { EnhancedMap } from './enhancedMap';\n\ntype Options = {\n maxCalls: number;\n per: { ms?: number; seconds?: number; minutes?: number; hours?: number };\n cleanupCheckSecsInterval?: number;\n};\n\ntype ThrottleController = {\n shouldSkip: (callId?: string | number | (string | number)[]) => boolean;\n /** @internal */\n _currentWindows: EnhancedMap<\n string,\n { windowStartTime: number; calls: number }\n >;\n};\n\nexport function createThrottleController({\n maxCalls,\n per,\n cleanupCheckSecsInterval = 60 * 30,\n}: Options): ThrottleController {\n let msInterval = 0;\n\n if (per.ms) {\n msInterval = per.ms;\n } else if (per.seconds) {\n msInterval = per.seconds * 1000;\n } else if (per.minutes) {\n msInterval = per.minutes * 1000 * 60;\n } else if (per.hours) {\n msInterval = per.hours * 1000 * 60 * 60;\n }\n\n if (msInterval === 0) {\n throw new Error('Invalid interval');\n }\n\n let lastCleanupCheck = Date.now();\n\n const windows = new EnhancedMap<\n string,\n { windowStartTime: number; calls: number }\n >();\n\n function cleanup(checkTime: number) {\n const shouldCleanup =\n checkTime - lastCleanupCheck > cleanupCheckSecsInterval * 1000;\n\n if (!shouldCleanup) return;\n\n setTimeout(() => {\n const now = Date.now();\n\n lastCleanupCheck = now;\n\n for (const [key, value] of windows) {\n if (now - value.windowStartTime > msInterval) {\n windows.delete(key);\n }\n }\n }, 2);\n }\n\n return {\n shouldSkip(callId = '') {\n const now = Date.now();\n\n const serializedCallId = String(callId);\n\n const window = windows.getOrInsert(serializedCallId, () => ({\n windowStartTime: now,\n calls: 0,\n }));\n\n if (now - window.windowStartTime > msInterval) {\n window.windowStartTime = now;\n window.calls = 0;\n }\n\n window.calls++;\n\n cleanup(now);\n\n if (window.calls > maxCalls) {\n return true;\n }\n\n return false;\n },\n _currentWindows: windows,\n };\n}\n"],"mappings":";;;;;;AAiBO,SAAS,yBAAyB;AAAA,EACvC;AAAA,EACA;AAAA,EACA,2BAA2B,KAAK;AAClC,GAAgC;AAC9B,MAAI,aAAa;AAEjB,MAAI,IAAI,IAAI;AACV,iBAAa,IAAI;AAAA,EACnB,WAAW,IAAI,SAAS;AACtB,iBAAa,IAAI,UAAU;AAAA,EAC7B,WAAW,IAAI,SAAS;AACtB,iBAAa,IAAI,UAAU,MAAO;AAAA,EACpC,WAAW,IAAI,OAAO;AACpB,iBAAa,IAAI,QAAQ,MAAO,KAAK;AAAA,EACvC;AAEA,MAAI,eAAe,GAAG;AACpB,UAAM,IAAI,MAAM,kBAAkB;AAAA,EACpC;AAEA,MAAI,mBAAmB,KAAK,IAAI;AAEhC,QAAM,UAAU,IAAI,YAGlB;AAEF,WAAS,QAAQ,WAAmB;AAClC,UAAM,gBACJ,YAAY,mBAAmB,2BAA2B;AAE5D,QAAI,CAAC,cAAe;AAEpB,eAAW,MAAM;AACf,YAAM,MAAM,KAAK,IAAI;AAErB,yBAAmB;AAEnB,iBAAW,CAAC,KAAK,KAAK,KAAK,SAAS;AAClC,YAAI,MAAM,MAAM,kBAAkB,YAAY;AAC5C,kBAAQ,OAAO,GAAG;AAAA,QACpB;AAAA,MACF;AAAA,IACF,GAAG,CAAC;AAAA,EACN;AAEA,SAAO;AAAA,IACL,WAAW,SAAS,IAAI;AACtB,YAAM,MAAM,KAAK,IAAI;AAErB,YAAM,mBAAmB,OAAO,MAAM;AAEtC,YAAM,SAAS,QAAQ,YAAY,kBAAkB,OAAO;AAAA,QAC1D,iBAAiB;AAAA,QACjB,OAAO;AAAA,MACT,EAAE;AAEF,UAAI,MAAM,OAAO,kBAAkB,YAAY;AAC7C,eAAO,kBAAkB;AACzB,eAAO,QAAQ;AAAA,MACjB;AAEA,aAAO;AAEP,cAAQ,GAAG;AAEX,UAAI,OAAO,QAAQ,UAAU;AAC3B,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,EACnB;AACF;","names":[]}
|
package/dist/debounce.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/debounce.ts"],"sourcesContent":["export type DebounceOptions = {\n /**\n * @see _.leading\n */\n leading?: boolean;\n /**\n * @see _.maxWait\n */\n maxWait?: number;\n /**\n * @see _.trailing\n */\n trailing?: boolean;\n};\n\nexport interface DebouncedFunc<T extends (...args: any[]) => void> {\n /**\n * Call the original function, but applying the debounce rules.\n *\n * If the debounced function can be run immediately, this calls it and returns its return\n * value.\n *\n * Otherwise, it returns the return value of the last invocation, or undefined if the debounced\n * function was not invoked yet.\n */\n (...args: Parameters<T>): ReturnType<T> | undefined;\n\n /**\n * Throw away any pending invocation of the debounced function.\n */\n cancel: () => void;\n\n /**\n * If there is a pending invocation of the debounced function, invoke it immediately and return\n * its return value.\n *\n * Otherwise, return the value from the last invocation, or undefined if the debounced function\n * was never invoked.\n */\n flush: () => ReturnType<T> | undefined;\n}\n\n// forked from lodash/debounce\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunc<T> {\n let lastArgs: IArguments | undefined;\n let lastThis: undefined;\n let maxWait: number | undefined;\n let result: any;\n let timerId: NodeJS.Timeout | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n let leading = false;\n let maxing = false;\n let trailing = true;\n\n if (options) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? Math.max(options.maxWait || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time: number) {\n const args = lastArgs;\n const thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result = func.apply(thisArg, args as any);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n const timeSinceLastCall = time - (lastCallTime ?? 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing ?\n Math.min(timeWaiting, (maxWait ?? 0) - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n const timeSinceLastCall = time - (lastCallTime ?? 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (\n lastCallTime === undefined ||\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (maxing && timeSinceLastInvoke >= (maxWait ?? 0))\n );\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: any) {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- this is a forked code, so a refactor is not worth it\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n\n return debounced;\n}\n\nexport function isDebouncedFn<T extends (...args: any[]) => void>(\n fn: T,\n): fn is T & {\n cancel: () => void;\n flush: () => ReturnType<T> | undefined;\n} {\n return typeof fn === 'function' && 'cancel' in fn && 'flush' in fn;\n}\n"],"mappings":";AA2CO,SAAS,SACd,MACA,MACA,SACkB;AAClB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,iBAAiB;AACrB,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAI,WAAW;AAEf,MAAI,SAAS;AACX,cAAU,CAAC,CAAC,QAAQ;AACpB,aAAS,aAAa;AACtB,cAAU,SAAS,KAAK,IAAI,QAAQ,WAAW,GAAG,IAAI,IAAI;AAC1D,eAAW,cAAc,UAAU,CAAC,CAAC,QAAQ,WAAW;AAAA,EAC1D;AAEA,WAAS,WAAW,MAAc;AAChC,UAAM,OAAO;AACb,UAAM,UAAU;AAEhB,eAAW,WAAW;AACtB,qBAAiB;AAEjB,aAAS,KAAK,MAAM,SAAS,IAAW;AACxC,WAAO;AAAA,EACT;AAEA,WAAS,YAAY,MAAc;AAEjC,qBAAiB;AAEjB,cAAU,WAAW,cAAc,IAAI;AAEvC,WAAO,UAAU,WAAW,IAAI,IAAI;AAAA,EACtC;AAEA,WAAS,cAAc,MAAc;AACnC,UAAM,oBAAoB,QAAQ,gBAAgB;AAClD,UAAM,sBAAsB,OAAO;AACnC,UAAM,cAAc,OAAO;AAE3B,WAAO,SACH,KAAK,IAAI,cAAc,WAAW,KAAK,mBAAmB,IAC1D;AAAA,EACN;AAEA,WAAS,aAAa,MAAc;AAClC,UAAM,oBAAoB,QAAQ,gBAAgB;AAClD,UAAM,sBAAsB,OAAO;AAKnC,WACE,iBAAiB,UACjB,qBAAqB,QACrB,oBAAoB,KACnB,UAAU,wBAAwB,WAAW;AAAA,EAElD;AAEA,WAAS,eAAe;AACtB,UAAM,OAAO,KAAK,IAAI;AACtB,QAAI,aAAa,IAAI,GAAG;AACtB,aAAO,aAAa,IAAI;AAAA,IAC1B;AAEA,cAAU,WAAW,cAAc,cAAc,IAAI,CAAC;AAAA,EACxD;AAEA,WAAS,aAAa,MAAc;AAClC,cAAU;AAIV,QAAI,YAAY,UAAU;AACxB,aAAO,WAAW,IAAI;AAAA,IACxB;AACA,eAAW,WAAW;AACtB,WAAO;AAAA,EACT;AAEA,WAAS,SAAS;AAChB,QAAI,YAAY,QAAW;AACzB,mBAAa,OAAO;AAAA,IACtB;AACA,qBAAiB;AACjB,eAAW,eAAe,WAAW,UAAU;AAAA,EACjD;AAEA,WAAS,QAAQ;AACf,WAAO,YAAY,SAAY,SAAS,aAAa,KAAK,IAAI,CAAC;AAAA,EACjE;AAEA,WAAS,YAAqB;AAC5B,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,aAAa,aAAa,IAAI;
|
|
1
|
+
{"version":3,"sources":["../src/debounce.ts"],"sourcesContent":["export type DebounceOptions = {\n /**\n * @see _.leading\n */\n leading?: boolean;\n /**\n * @see _.maxWait\n */\n maxWait?: number;\n /**\n * @see _.trailing\n */\n trailing?: boolean;\n};\n\nexport interface DebouncedFunc<T extends (...args: any[]) => void> {\n /**\n * Call the original function, but applying the debounce rules.\n *\n * If the debounced function can be run immediately, this calls it and returns its return\n * value.\n *\n * Otherwise, it returns the return value of the last invocation, or undefined if the debounced\n * function was not invoked yet.\n */\n (...args: Parameters<T>): ReturnType<T> | undefined;\n\n /**\n * Throw away any pending invocation of the debounced function.\n */\n cancel: () => void;\n\n /**\n * If there is a pending invocation of the debounced function, invoke it immediately and return\n * its return value.\n *\n * Otherwise, return the value from the last invocation, or undefined if the debounced function\n * was never invoked.\n */\n flush: () => ReturnType<T> | undefined;\n}\n\n// forked from lodash/debounce\nexport function debounce<T extends (...args: any[]) => void>(\n func: T,\n wait: number,\n options?: DebounceOptions,\n): DebouncedFunc<T> {\n let lastArgs: IArguments | undefined;\n let lastThis: undefined;\n let maxWait: number | undefined;\n let result: any;\n let timerId: NodeJS.Timeout | undefined;\n let lastCallTime: number | undefined;\n let lastInvokeTime = 0;\n let leading = false;\n let maxing = false;\n let trailing = true;\n\n if (options) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? Math.max(options.maxWait || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time: number) {\n const args = lastArgs;\n const thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument\n result = func.apply(thisArg, args as any);\n return result;\n }\n\n function leadingEdge(time: number) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time: number) {\n const timeSinceLastCall = time - (lastCallTime ?? 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n const timeWaiting = wait - timeSinceLastCall;\n\n return maxing ?\n Math.min(timeWaiting, (maxWait ?? 0) - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time: number) {\n const timeSinceLastCall = time - (lastCallTime ?? 0);\n const timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (\n lastCallTime === undefined ||\n timeSinceLastCall >= wait ||\n timeSinceLastCall < 0 ||\n (maxing && timeSinceLastInvoke >= (maxWait ?? 0))\n );\n }\n\n function timerExpired() {\n const time = Date.now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time: number) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(Date.now());\n }\n\n function debounced(this: any) {\n const time = Date.now();\n const isInvoking = shouldInvoke(time);\n\n // eslint-disable-next-line prefer-rest-params\n lastArgs = arguments;\n // eslint-disable-next-line @typescript-eslint/no-this-alias -- this is a forked code, so a refactor is not worth it\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n\n return debounced;\n}\n\nexport function isDebouncedFn<T extends (...args: any[]) => void>(\n fn: T,\n): fn is T & {\n cancel: () => void;\n flush: () => ReturnType<T> | undefined;\n} {\n return typeof fn === 'function' && 'cancel' in fn && 'flush' in fn;\n}\n"],"mappings":";AA2CO,SAAS,SACd,MACA,MACA,SACkB;AAClB,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI;AACJ,MAAI,iBAAiB;AACrB,MAAI,UAAU;AACd,MAAI,SAAS;AACb,MAAI,WAAW;AAEf,MAAI,SAAS;AACX,cAAU,CAAC,CAAC,QAAQ;AACpB,aAAS,aAAa;AACtB,cAAU,SAAS,KAAK,IAAI,QAAQ,WAAW,GAAG,IAAI,IAAI;AAC1D,eAAW,cAAc,UAAU,CAAC,CAAC,QAAQ,WAAW;AAAA,EAC1D;AAEA,WAAS,WAAW,MAAc;AAChC,UAAM,OAAO;AACb,UAAM,UAAU;AAEhB,eAAW,WAAW;AACtB,qBAAiB;AAEjB,aAAS,KAAK,MAAM,SAAS,IAAW;AACxC,WAAO;AAAA,EACT;AAEA,WAAS,YAAY,MAAc;AAEjC,qBAAiB;AAEjB,cAAU,WAAW,cAAc,IAAI;AAEvC,WAAO,UAAU,WAAW,IAAI,IAAI;AAAA,EACtC;AAEA,WAAS,cAAc,MAAc;AACnC,UAAM,oBAAoB,QAAQ,gBAAgB;AAClD,UAAM,sBAAsB,OAAO;AACnC,UAAM,cAAc,OAAO;AAE3B,WAAO,SACH,KAAK,IAAI,cAAc,WAAW,KAAK,mBAAmB,IAC1D;AAAA,EACN;AAEA,WAAS,aAAa,MAAc;AAClC,UAAM,oBAAoB,QAAQ,gBAAgB;AAClD,UAAM,sBAAsB,OAAO;AAKnC,WACE,iBAAiB,UACjB,qBAAqB,QACrB,oBAAoB,KACnB,UAAU,wBAAwB,WAAW;AAAA,EAElD;AAEA,WAAS,eAAe;AACtB,UAAM,OAAO,KAAK,IAAI;AACtB,QAAI,aAAa,IAAI,GAAG;AACtB,aAAO,aAAa,IAAI;AAAA,IAC1B;AAEA,cAAU,WAAW,cAAc,cAAc,IAAI,CAAC;AAAA,EACxD;AAEA,WAAS,aAAa,MAAc;AAClC,cAAU;AAIV,QAAI,YAAY,UAAU;AACxB,aAAO,WAAW,IAAI;AAAA,IACxB;AACA,eAAW,WAAW;AACtB,WAAO;AAAA,EACT;AAEA,WAAS,SAAS;AAChB,QAAI,YAAY,QAAW;AACzB,mBAAa,OAAO;AAAA,IACtB;AACA,qBAAiB;AACjB,eAAW,eAAe,WAAW,UAAU;AAAA,EACjD;AAEA,WAAS,QAAQ;AACf,WAAO,YAAY,SAAY,SAAS,aAAa,KAAK,IAAI,CAAC;AAAA,EACjE;AAEA,WAAS,YAAqB;AAC5B,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,aAAa,aAAa,IAAI;AAGpC,eAAW;AAEX,eAAW;AACX,mBAAe;AAEf,QAAI,YAAY;AACd,UAAI,YAAY,QAAW;AACzB,eAAO,YAAY,YAAY;AAAA,MACjC;AACA,UAAI,QAAQ;AAEV,qBAAa,OAAO;AACpB,kBAAU,WAAW,cAAc,IAAI;AACvC,eAAO,WAAW,YAAY;AAAA,MAChC;AAAA,IACF;AACA,QAAI,YAAY,QAAW;AACzB,gBAAU,WAAW,cAAc,IAAI;AAAA,IACzC;AACA,WAAO;AAAA,EACT;AACA,YAAU,SAAS;AACnB,YAAU,QAAQ;AAElB,SAAO;AACT;AAEO,SAAS,cACd,IAIA;AACA,SAAO,OAAO,OAAO,cAAc,YAAY,MAAM,WAAW;AAClE;","names":[]}
|
package/dist/deepEqual.d.ts
CHANGED
package/dist/deepEqual.js
CHANGED
package/dist/enhancedMap.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
declare function exhaustiveMatch<T extends string>(value: T): {
|
|
2
2
|
with: <R>(pattern: { [K in T]: "_nxt" | "_never" | (() => R); }) => R;
|
|
3
|
-
withObject: <
|
|
3
|
+
withObject: <R>(pattern: Record<T, R>) => R;
|
|
4
4
|
};
|
|
5
5
|
|
|
6
6
|
export { exhaustiveMatch };
|
package/dist/interpolate.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
} from "./chunk-NKCC3375.js";
|
|
6
6
|
import {
|
|
7
7
|
invariant
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-FYMTZQ42.js";
|
|
9
9
|
|
|
10
10
|
// src/interpolate.ts
|
|
11
11
|
function mod(n, m) {
|
|
@@ -16,8 +16,7 @@ function cyclicLerp(input, [inStart, inEnd], [outStart, outEnd]) {
|
|
|
16
16
|
}
|
|
17
17
|
function findRange(input, inputRange) {
|
|
18
18
|
for (let i = 1; i < inputRange.length - 1; i++) {
|
|
19
|
-
if (inputRange[i] >= input)
|
|
20
|
-
return i - 1;
|
|
19
|
+
if (inputRange[i] >= input) return i - 1;
|
|
21
20
|
}
|
|
22
21
|
return inputRange.length - 2;
|
|
23
22
|
}
|
package/dist/interpolate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interpolate.ts"],"sourcesContent":["import { invariant } from './assertions';\nimport { clampMax, clampMin, clampRange } from './mathUtils';\n\ntype Interval = [number, number];\n\nfunction mod(n: number, m: number) {\n return ((n % m) + m) % m;\n}\n\nexport function cyclicLerp(\n input: number,\n [inStart, inEnd]: Interval,\n [outStart, outEnd]: Interval,\n) {\n return (\n mod((input - inStart) / (inEnd - inStart), 1) * (outEnd - outStart) +\n outStart\n );\n}\n\nfunction findRange(input: number, inputRange: number[]) {\n for (let i = 1; i < inputRange.length - 1; i++) {\n if (inputRange[i]! >= input) return i - 1;\n }\n\n return inputRange.length - 2;\n}\n\ntype InterpolateArgs = {\n input: number;\n in: number[];\n out: number[];\n clamp?: boolean | 'start' | 'end';\n};\n\nexport function interpolate({\n input,\n in: inputRange,\n out,\n clamp = true,\n}: InterpolateArgs): number {\n invariant(\n inputRange.length === out.length,\n 'Ranges must have the same length',\n );\n\n const range = findRange(input, inputRange);\n const inStart = inputRange[range]!;\n const inEnd = inputRange[range + 1]!;\n const outStart = out[range]!;\n const outEnd = out[range + 1]!;\n\n const interpolatedValue =\n ((input - inStart) / (inEnd - inStart)) * (outEnd - outStart) + outStart;\n\n const outputIsAscending = outStart < outEnd;\n\n return (\n clamp === 'start' ?\n outputIsAscending ? clampMin(interpolatedValue, outStart)\n : clampMax(interpolatedValue, outStart)\n : clamp === 'end' ?\n outputIsAscending ? clampMax(interpolatedValue, outEnd)\n : clampMin(interpolatedValue, outEnd)\n : clamp ? clampRange(interpolatedValue, outStart, outEnd)\n : interpolatedValue\n );\n}\n"],"mappings":";;;;;;;;;;AAKA,SAAS,IAAI,GAAW,GAAW;AACjC,UAAS,IAAI,IAAK,KAAK;AACzB;AAEO,SAAS,WACd,OACA,CAAC,SAAS,KAAK,GACf,CAAC,UAAU,MAAM,GACjB;AACA,SACE,KAAK,QAAQ,YAAY,QAAQ,UAAU,CAAC,KAAK,SAAS,YAC1D;AAEJ;AAEA,SAAS,UAAU,OAAe,YAAsB;AACtD,WAAS,IAAI,GAAG,IAAI,WAAW,SAAS,GAAG,KAAK;AAC9C,QAAI,WAAW,CAAC,KAAM
|
|
1
|
+
{"version":3,"sources":["../src/interpolate.ts"],"sourcesContent":["import { invariant } from './assertions';\nimport { clampMax, clampMin, clampRange } from './mathUtils';\n\ntype Interval = [number, number];\n\nfunction mod(n: number, m: number) {\n return ((n % m) + m) % m;\n}\n\nexport function cyclicLerp(\n input: number,\n [inStart, inEnd]: Interval,\n [outStart, outEnd]: Interval,\n) {\n return (\n mod((input - inStart) / (inEnd - inStart), 1) * (outEnd - outStart) +\n outStart\n );\n}\n\nfunction findRange(input: number, inputRange: number[]) {\n for (let i = 1; i < inputRange.length - 1; i++) {\n if (inputRange[i]! >= input) return i - 1;\n }\n\n return inputRange.length - 2;\n}\n\ntype InterpolateArgs = {\n input: number;\n in: number[];\n out: number[];\n clamp?: boolean | 'start' | 'end';\n};\n\nexport function interpolate({\n input,\n in: inputRange,\n out,\n clamp = true,\n}: InterpolateArgs): number {\n invariant(\n inputRange.length === out.length,\n 'Ranges must have the same length',\n );\n\n const range = findRange(input, inputRange);\n const inStart = inputRange[range]!;\n const inEnd = inputRange[range + 1]!;\n const outStart = out[range]!;\n const outEnd = out[range + 1]!;\n\n const interpolatedValue =\n ((input - inStart) / (inEnd - inStart)) * (outEnd - outStart) + outStart;\n\n const outputIsAscending = outStart < outEnd;\n\n return (\n clamp === 'start' ?\n outputIsAscending ? clampMin(interpolatedValue, outStart)\n : clampMax(interpolatedValue, outStart)\n : clamp === 'end' ?\n outputIsAscending ? clampMax(interpolatedValue, outEnd)\n : clampMin(interpolatedValue, outEnd)\n : clamp ? clampRange(interpolatedValue, outStart, outEnd)\n : interpolatedValue\n );\n}\n"],"mappings":";;;;;;;;;;AAKA,SAAS,IAAI,GAAW,GAAW;AACjC,UAAS,IAAI,IAAK,KAAK;AACzB;AAEO,SAAS,WACd,OACA,CAAC,SAAS,KAAK,GACf,CAAC,UAAU,MAAM,GACjB;AACA,SACE,KAAK,QAAQ,YAAY,QAAQ,UAAU,CAAC,KAAK,SAAS,YAC1D;AAEJ;AAEA,SAAS,UAAU,OAAe,YAAsB;AACtD,WAAS,IAAI,GAAG,IAAI,WAAW,SAAS,GAAG,KAAK;AAC9C,QAAI,WAAW,CAAC,KAAM,MAAO,QAAO,IAAI;AAAA,EAC1C;AAEA,SAAO,WAAW,SAAS;AAC7B;AASO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,IAAI;AAAA,EACJ;AAAA,EACA,QAAQ;AACV,GAA4B;AAC1B;AAAA,IACE,WAAW,WAAW,IAAI;AAAA,IAC1B;AAAA,EACF;AAEA,QAAM,QAAQ,UAAU,OAAO,UAAU;AACzC,QAAM,UAAU,WAAW,KAAK;AAChC,QAAM,QAAQ,WAAW,QAAQ,CAAC;AAClC,QAAM,WAAW,IAAI,KAAK;AAC1B,QAAM,SAAS,IAAI,QAAQ,CAAC;AAE5B,QAAM,qBACF,QAAQ,YAAY,QAAQ,YAAa,SAAS,YAAY;AAElE,QAAM,oBAAoB,WAAW;AAErC,SACE,UAAU,UACR,oBAAoB,SAAS,mBAAmB,QAAQ,IACtD,SAAS,mBAAmB,QAAQ,IACtC,UAAU,QACV,oBAAoB,SAAS,mBAAmB,MAAM,IACpD,SAAS,mBAAmB,MAAM,IACpC,QAAQ,WAAW,mBAAmB,UAAU,MAAM,IACtD;AAEN;","names":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
declare function levenshteinDistance(a: string, b: string): number;
|
|
2
|
+
declare function getClosestString(str: string, arr: readonly string[], maxDistance?: number): string | undefined;
|
|
3
|
+
declare function getClosestStringsUpToDist(str: string, arr: readonly string[], maxDistance?: number): string[];
|
|
4
|
+
|
|
5
|
+
export { getClosestString, getClosestStringsUpToDist, levenshteinDistance };
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// src/levenshtein.ts
|
|
2
|
+
var peq = new Uint32Array(65536);
|
|
3
|
+
var myers_32 = (a, b) => {
|
|
4
|
+
const n = a.length;
|
|
5
|
+
const m = b.length;
|
|
6
|
+
const lst = 1 << n - 1;
|
|
7
|
+
let pv = -1;
|
|
8
|
+
let mv = 0;
|
|
9
|
+
let sc = n;
|
|
10
|
+
let i = n;
|
|
11
|
+
while (i--) {
|
|
12
|
+
peq[a.charCodeAt(i)] |= 1 << i;
|
|
13
|
+
}
|
|
14
|
+
for (i = 0; i < m; i++) {
|
|
15
|
+
let eq = peq[b.charCodeAt(i)];
|
|
16
|
+
const xv = eq | mv;
|
|
17
|
+
eq |= (eq & pv) + pv ^ pv;
|
|
18
|
+
mv |= ~(eq | pv);
|
|
19
|
+
pv &= eq;
|
|
20
|
+
if (mv & lst) {
|
|
21
|
+
sc++;
|
|
22
|
+
}
|
|
23
|
+
if (pv & lst) {
|
|
24
|
+
sc--;
|
|
25
|
+
}
|
|
26
|
+
mv = mv << 1 | 1;
|
|
27
|
+
pv = pv << 1 | ~(xv | mv);
|
|
28
|
+
mv &= xv;
|
|
29
|
+
}
|
|
30
|
+
i = n;
|
|
31
|
+
while (i--) {
|
|
32
|
+
peq[a.charCodeAt(i)] = 0;
|
|
33
|
+
}
|
|
34
|
+
return sc;
|
|
35
|
+
};
|
|
36
|
+
var myers_x = (b, a) => {
|
|
37
|
+
const n = a.length;
|
|
38
|
+
const m = b.length;
|
|
39
|
+
const mhc = [];
|
|
40
|
+
const phc = [];
|
|
41
|
+
const hsize = Math.ceil(n / 32);
|
|
42
|
+
const vsize = Math.ceil(m / 32);
|
|
43
|
+
for (let i = 0; i < hsize; i++) {
|
|
44
|
+
phc[i] = -1;
|
|
45
|
+
mhc[i] = 0;
|
|
46
|
+
}
|
|
47
|
+
let j = 0;
|
|
48
|
+
for (; j < vsize - 1; j++) {
|
|
49
|
+
let mv2 = 0;
|
|
50
|
+
let pv2 = -1;
|
|
51
|
+
const start2 = j * 32;
|
|
52
|
+
const vlen2 = Math.min(32, m) + start2;
|
|
53
|
+
for (let k = start2; k < vlen2; k++) {
|
|
54
|
+
peq[b.charCodeAt(k)] |= 1 << k;
|
|
55
|
+
}
|
|
56
|
+
for (let i = 0; i < n; i++) {
|
|
57
|
+
const eq = peq[a.charCodeAt(i)];
|
|
58
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
59
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
60
|
+
const xv = eq | mv2;
|
|
61
|
+
const xh = ((eq | mb) & pv2) + pv2 ^ pv2 | eq | mb;
|
|
62
|
+
let ph = mv2 | ~(xh | pv2);
|
|
63
|
+
let mh = pv2 & xh;
|
|
64
|
+
if (ph >>> 31 ^ pb) {
|
|
65
|
+
phc[i / 32 | 0] ^= 1 << i;
|
|
66
|
+
}
|
|
67
|
+
if (mh >>> 31 ^ mb) {
|
|
68
|
+
mhc[i / 32 | 0] ^= 1 << i;
|
|
69
|
+
}
|
|
70
|
+
ph = ph << 1 | pb;
|
|
71
|
+
mh = mh << 1 | mb;
|
|
72
|
+
pv2 = mh | ~(xv | ph);
|
|
73
|
+
mv2 = ph & xv;
|
|
74
|
+
}
|
|
75
|
+
for (let k = start2; k < vlen2; k++) {
|
|
76
|
+
peq[b.charCodeAt(k)] = 0;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
let mv = 0;
|
|
80
|
+
let pv = -1;
|
|
81
|
+
const start = j * 32;
|
|
82
|
+
const vlen = Math.min(32, m - start) + start;
|
|
83
|
+
for (let k = start; k < vlen; k++) {
|
|
84
|
+
peq[b.charCodeAt(k)] |= 1 << k;
|
|
85
|
+
}
|
|
86
|
+
let score = m;
|
|
87
|
+
for (let i = 0; i < n; i++) {
|
|
88
|
+
const eq = peq[a.charCodeAt(i)];
|
|
89
|
+
const pb = phc[i / 32 | 0] >>> i & 1;
|
|
90
|
+
const mb = mhc[i / 32 | 0] >>> i & 1;
|
|
91
|
+
const xv = eq | mv;
|
|
92
|
+
const xh = ((eq | mb) & pv) + pv ^ pv | eq | mb;
|
|
93
|
+
let ph = mv | ~(xh | pv);
|
|
94
|
+
let mh = pv & xh;
|
|
95
|
+
score += ph >>> m - 1 & 1;
|
|
96
|
+
score -= mh >>> m - 1 & 1;
|
|
97
|
+
if (ph >>> 31 ^ pb) {
|
|
98
|
+
phc[i / 32 | 0] ^= 1 << i;
|
|
99
|
+
}
|
|
100
|
+
if (mh >>> 31 ^ mb) {
|
|
101
|
+
mhc[i / 32 | 0] ^= 1 << i;
|
|
102
|
+
}
|
|
103
|
+
ph = ph << 1 | pb;
|
|
104
|
+
mh = mh << 1 | mb;
|
|
105
|
+
pv = mh | ~(xv | ph);
|
|
106
|
+
mv = ph & xv;
|
|
107
|
+
}
|
|
108
|
+
for (let k = start; k < vlen; k++) {
|
|
109
|
+
peq[b.charCodeAt(k)] = 0;
|
|
110
|
+
}
|
|
111
|
+
return score;
|
|
112
|
+
};
|
|
113
|
+
function levenshteinDistance(a, b) {
|
|
114
|
+
if (a.length < b.length) {
|
|
115
|
+
const tmp = b;
|
|
116
|
+
b = a;
|
|
117
|
+
a = tmp;
|
|
118
|
+
}
|
|
119
|
+
if (b.length === 0) {
|
|
120
|
+
return a.length;
|
|
121
|
+
}
|
|
122
|
+
if (a.length <= 32) {
|
|
123
|
+
return myers_32(a, b);
|
|
124
|
+
}
|
|
125
|
+
return myers_x(a, b);
|
|
126
|
+
}
|
|
127
|
+
function getClosestString(str, arr, maxDistance = 2) {
|
|
128
|
+
let min_distance = Infinity;
|
|
129
|
+
let closestString;
|
|
130
|
+
for (let i = 0; i < arr.length; i++) {
|
|
131
|
+
const dist = levenshteinDistance(str, arr[i]);
|
|
132
|
+
if (dist < min_distance && dist <= maxDistance) {
|
|
133
|
+
min_distance = dist;
|
|
134
|
+
closestString = arr[i];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return closestString;
|
|
138
|
+
}
|
|
139
|
+
function getClosestStringsUpToDist(str, arr, maxDistance = 2) {
|
|
140
|
+
const distanceMap = /* @__PURE__ */ new Map();
|
|
141
|
+
for (const item of arr) {
|
|
142
|
+
const distance = levenshteinDistance(str, item);
|
|
143
|
+
if (distance <= maxDistance) {
|
|
144
|
+
distanceMap.set(item, distance);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return Array.from(distanceMap.entries()).sort((a, b) => a[1] - b[1]).map(([item]) => item);
|
|
148
|
+
}
|
|
149
|
+
export {
|
|
150
|
+
getClosestString,
|
|
151
|
+
getClosestStringsUpToDist,
|
|
152
|
+
levenshteinDistance
|
|
153
|
+
};
|
|
154
|
+
//# sourceMappingURL=levenshtein.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/levenshtein.ts"],"sourcesContent":["/* eslint-disable no-param-reassign */\n// cspell:disable\n// forked from https://github.com/ka-weihe/fastest-levenshtein/blob/master/mod.ts\n\nconst peq = new Uint32Array(0x10000);\n\nconst myers_32 = (a: string, b: string): number => {\n const n = a.length;\n const m = b.length;\n const lst = 1 << (n - 1);\n let pv = -1;\n let mv = 0;\n let sc = n;\n let i = n;\n while (i--) {\n peq[a.charCodeAt(i)]! |= 1 << i;\n }\n for (i = 0; i < m; i++) {\n let eq = peq[b.charCodeAt(i)]!;\n const xv = eq | mv;\n eq |= ((eq & pv) + pv) ^ pv;\n mv |= ~(eq | pv);\n pv &= eq;\n if (mv & lst) {\n sc++;\n }\n if (pv & lst) {\n sc--;\n }\n mv = (mv << 1) | 1;\n pv = (pv << 1) | ~(xv | mv);\n mv &= xv;\n }\n i = n;\n while (i--) {\n peq[a.charCodeAt(i)] = 0;\n }\n return sc;\n};\n\nconst myers_x = (b: string, a: string): number => {\n const n = a.length;\n const m = b.length;\n const mhc = [];\n const phc = [];\n const hsize = Math.ceil(n / 32);\n const vsize = Math.ceil(m / 32);\n for (let i = 0; i < hsize; i++) {\n phc[i] = -1;\n mhc[i] = 0;\n }\n let j = 0;\n for (; j < vsize - 1; j++) {\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)]! |= 1 << k;\n }\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)]!;\n const pb = (phc[(i / 32) | 0]! >>> i) & 1;\n const mb = (mhc[(i / 32) | 0]! >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0]! ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0]! ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n }\n let mv = 0;\n let pv = -1;\n const start = j * 32;\n const vlen = Math.min(32, m - start) + start;\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)]! |= 1 << k;\n }\n let score = m;\n for (let i = 0; i < n; i++) {\n const eq = peq[a.charCodeAt(i)]!;\n const pb = (phc[(i / 32) | 0]! >>> i) & 1;\n const mb = (mhc[(i / 32) | 0]! >>> i) & 1;\n const xv = eq | mv;\n const xh = ((((eq | mb) & pv) + pv) ^ pv) | eq | mb;\n let ph = mv | ~(xh | pv);\n let mh = pv & xh;\n score += (ph >>> (m - 1)) & 1;\n score -= (mh >>> (m - 1)) & 1;\n if ((ph >>> 31) ^ pb) {\n phc[(i / 32) | 0]! ^= 1 << i;\n }\n if ((mh >>> 31) ^ mb) {\n mhc[(i / 32) | 0]! ^= 1 << i;\n }\n ph = (ph << 1) | pb;\n mh = (mh << 1) | mb;\n pv = mh | ~(xv | ph);\n mv = ph & xv;\n }\n for (let k = start; k < vlen; k++) {\n peq[b.charCodeAt(k)] = 0;\n }\n return score;\n};\n\nexport function levenshteinDistance(a: string, b: string): number {\n if (a.length < b.length) {\n const tmp = b;\n b = a;\n a = tmp;\n }\n if (b.length === 0) {\n return a.length;\n }\n if (a.length <= 32) {\n return myers_32(a, b);\n }\n return myers_x(a, b);\n}\n\nexport function getClosestString(\n str: string,\n arr: readonly string[],\n maxDistance = 2,\n): string | undefined {\n let min_distance = Infinity;\n let closestString: string | undefined;\n for (let i = 0; i < arr.length; i++) {\n const dist = levenshteinDistance(str, arr[i]!);\n if (dist < min_distance && dist <= maxDistance) {\n min_distance = dist;\n closestString = arr[i];\n }\n }\n return closestString;\n}\n\nexport function getClosestStringsUpToDist(\n str: string,\n arr: readonly string[],\n maxDistance = 2,\n): string[] {\n const distanceMap = new Map<string, number>();\n\n for (const item of arr) {\n const distance = levenshteinDistance(str, item);\n if (distance <= maxDistance) {\n distanceMap.set(item, distance);\n }\n }\n\n return Array.from(distanceMap.entries())\n .sort((a, b) => a[1] - b[1])\n .map(([item]) => item);\n}\n"],"mappings":"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","names":["mv","pv","start","vlen"]}
|
package/dist/main.d.ts
CHANGED
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
///<reference path="enhancedMap.d.ts" />
|
|
11
11
|
///<reference path="exhaustiveMatch.d.ts" />
|
|
12
12
|
///<reference path="interpolate.d.ts" />
|
|
13
|
+
///<reference path="levenshtein.d.ts" />
|
|
13
14
|
///<reference path="main.d.ts" />
|
|
14
15
|
///<reference path="mathUtils.d.ts" />
|
|
15
16
|
///<reference path="objUtils.d.ts" />
|
|
@@ -37,7 +37,7 @@ declare class ParallelAsyncResultCalls<M extends ValidMetadata | undefined = und
|
|
|
37
37
|
metadata: M;
|
|
38
38
|
fn: () => Promise<Result<R>>;
|
|
39
39
|
}): this;
|
|
40
|
-
/** adds calls return tuples with
|
|
40
|
+
/** adds calls return tuples with inferred results */
|
|
41
41
|
addTuple<T extends (M extends undefined ? () => Promise<Result<R>> : {
|
|
42
42
|
metadata: M;
|
|
43
43
|
fn: () => Promise<Result<R>>;
|
|
@@ -56,7 +56,7 @@ declare class ParallelAsyncResultCalls<M extends ValidMetadata | undefined = und
|
|
|
56
56
|
failed: Failed<M>[];
|
|
57
57
|
succeeded: Succeeded<R, M>[];
|
|
58
58
|
allFailed: boolean;
|
|
59
|
-
results: (
|
|
59
|
+
results: (Failed<M> | Succeeded<R, M>)[];
|
|
60
60
|
}>;
|
|
61
61
|
runAll({ delayStart, }?: {
|
|
62
62
|
delayStart?: (index: number) => number;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Result,
|
|
3
3
|
normalizeError
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-I7ZDKDUM.js";
|
|
5
5
|
import {
|
|
6
6
|
sleep
|
|
7
7
|
} from "./chunk-HLFWWIDK.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-GLZ5MZC5.js";
|
|
9
9
|
import {
|
|
10
10
|
invariant,
|
|
11
11
|
isObject
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-FYMTZQ42.js";
|
|
13
13
|
|
|
14
14
|
// src/parallelAsyncResultCalls.ts
|
|
15
15
|
var ParallelAsyncResultCalls = class {
|
|
@@ -23,7 +23,7 @@ var ParallelAsyncResultCalls = class {
|
|
|
23
23
|
);
|
|
24
24
|
return this;
|
|
25
25
|
}
|
|
26
|
-
/** adds calls return tuples with
|
|
26
|
+
/** adds calls return tuples with inferred results */
|
|
27
27
|
addTuple(...calls) {
|
|
28
28
|
for (const call of calls) {
|
|
29
29
|
this.pendingCalls.push(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parallelAsyncResultCalls.ts"],"sourcesContent":["import { invariant, isObject } from './assertions';\nimport { NormalizedError, Result, normalizeError } from './rsResult';\nimport { sleep } from './sleep';\n\ntype ValidMetadata = string | number | boolean | Record<string, unknown>;\n\ntype TupleRunAllSuccess<T> =\n T extends () => Promise<Result<infer V>> ? Succeeded<V, undefined>\n : T extends { metadata: infer M; fn: () => Promise<Result<infer V>> } ?\n Succeeded<V, M>\n : never;\n\ntype TupleRunAllFailed<T> =\n T extends () => Promise<Result<any>> ?\n { metadata: undefined; error: NormalizedError }\n : T extends { metadata: infer M extends ValidMetadata } ?\n { metadata: M; error: NormalizedError }\n : never;\n\ntype TupleRunAllSettled<T> =\n T extends () => Promise<Result<infer V>> ?\n Succeeded<V, undefined> | Failed<undefined>\n : T extends { metadata: infer M; fn: () => Promise<Result<infer V>> } ?\n Succeeded<V, M> | Failed<M>\n : never;\n\ntype RunProps = {\n delayStart?: (index: number) => number;\n};\n\ntype Failed<M> = {\n metadata: M;\n error: NormalizedError;\n};\ntype Succeeded<R, M> = {\n value: R;\n metadata: M;\n};\n\nclass ParallelAsyncResultCalls<\n M extends ValidMetadata | undefined = undefined,\n R = unknown,\n> {\n private pendingCalls: {\n metadata: M;\n fn: () => Promise<Result<R>>;\n }[] = [];\n alreadyRun = false;\n\n constructor() {}\n\n add(\n call: M extends undefined ? () => Promise<Result<R>>\n : { metadata: M; fn: () => Promise<Result<R>> },\n ) {\n this.pendingCalls.push(\n isObject(call) ? call : { metadata: undefined as any, fn: call },\n );\n\n return this;\n }\n\n /** adds calls return tuples with
|
|
1
|
+
{"version":3,"sources":["../src/parallelAsyncResultCalls.ts"],"sourcesContent":["import { invariant, isObject } from './assertions';\nimport { NormalizedError, Result, normalizeError } from './rsResult';\nimport { sleep } from './sleep';\n\ntype ValidMetadata = string | number | boolean | Record<string, unknown>;\n\ntype TupleRunAllSuccess<T> =\n T extends () => Promise<Result<infer V>> ? Succeeded<V, undefined>\n : T extends { metadata: infer M; fn: () => Promise<Result<infer V>> } ?\n Succeeded<V, M>\n : never;\n\ntype TupleRunAllFailed<T> =\n T extends () => Promise<Result<any>> ?\n { metadata: undefined; error: NormalizedError }\n : T extends { metadata: infer M extends ValidMetadata } ?\n { metadata: M; error: NormalizedError }\n : never;\n\ntype TupleRunAllSettled<T> =\n T extends () => Promise<Result<infer V>> ?\n Succeeded<V, undefined> | Failed<undefined>\n : T extends { metadata: infer M; fn: () => Promise<Result<infer V>> } ?\n Succeeded<V, M> | Failed<M>\n : never;\n\ntype RunProps = {\n delayStart?: (index: number) => number;\n};\n\ntype Failed<M> = {\n metadata: M;\n error: NormalizedError;\n};\ntype Succeeded<R, M> = {\n value: R;\n metadata: M;\n};\n\nclass ParallelAsyncResultCalls<\n M extends ValidMetadata | undefined = undefined,\n R = unknown,\n> {\n private pendingCalls: {\n metadata: M;\n fn: () => Promise<Result<R>>;\n }[] = [];\n alreadyRun = false;\n\n constructor() {}\n\n add(\n call: M extends undefined ? () => Promise<Result<R>>\n : { metadata: M; fn: () => Promise<Result<R>> },\n ) {\n this.pendingCalls.push(\n isObject(call) ? call : { metadata: undefined as any, fn: call },\n );\n\n return this;\n }\n\n /** adds calls return tuples with inferred results */\n addTuple<\n T extends (M extends undefined ? () => Promise<Result<R>>\n : { metadata: M; fn: () => Promise<Result<R>> })[],\n >(\n ...calls: T\n ): {\n runAllSettled: (props?: RunProps) => Promise<{\n results: {\n [I in keyof T]: TupleRunAllSettled<T[I]>;\n };\n allFailed: boolean;\n }>;\n runAll: (props?: RunProps) => Promise<\n Result<\n {\n [I in keyof T]: TupleRunAllSuccess<T[I]>;\n },\n TupleRunAllFailed<T[number]>\n >\n >;\n } {\n for (const call of calls) {\n this.pendingCalls.push(\n isObject(call) ? call : { metadata: undefined as any, fn: call },\n );\n }\n\n return {\n runAll: this.runAll.bind(this) as any,\n runAllSettled: this.runAllSettled.bind(this) as any,\n };\n }\n\n async runAllSettled({ delayStart }: RunProps = {}) {\n invariant(!this.alreadyRun, 'Already run');\n\n const asyncResults = await Promise.allSettled(\n this.pendingCalls.map(async (call, i) => {\n try {\n if (delayStart) {\n await sleep(delayStart(i));\n }\n\n const result = await call.fn();\n\n return { result, callMetadata: call.metadata };\n } catch (exception) {\n return {\n result: Result.normalizedUnknownErr(exception),\n callMetadata: call.metadata,\n };\n }\n }),\n );\n\n const failed: Failed<M>[] = [];\n const succeeded: Succeeded<R, M>[] = [];\n const results: (Failed<M> | Succeeded<R, M>)[] = [];\n\n for (const asyncResult of asyncResults) {\n invariant(asyncResult.status === 'fulfilled');\n\n const { result, callMetadata } = asyncResult.value;\n\n if (result.ok) {\n const success = { value: result.value, metadata: callMetadata };\n results.push(success);\n succeeded.push(success);\n } else {\n const fail = { metadata: callMetadata, error: result.error };\n results.push(fail);\n failed.push(fail);\n }\n }\n\n const allFailed = failed.length === this.pendingCalls.length;\n\n this.alreadyRun = true;\n this.pendingCalls = [];\n\n return {\n failed,\n succeeded,\n allFailed,\n results,\n };\n }\n\n async runAll({\n delayStart,\n }: { delayStart?: (index: number) => number } = {}): Promise<\n Result<\n Succeeded<R, M>[],\n {\n metadata: M;\n error: NormalizedError;\n }\n >\n > {\n invariant(!this.alreadyRun, 'Already run');\n\n try {\n const asyncResults = await Promise.all(\n this.pendingCalls.map(async (call, i) => {\n try {\n if (delayStart) {\n await sleep(delayStart(i));\n }\n\n const result = await call.fn();\n\n if (!result.ok) {\n throw result.error;\n }\n\n return {\n value: result.value,\n metadata: call.metadata,\n };\n } catch (exception) {\n throw {\n metadata: call.metadata,\n error: normalizeError(exception),\n };\n }\n }),\n );\n\n return Result.ok(asyncResults);\n } catch (exception) {\n return Result.err(\n exception as {\n metadata: M;\n error: NormalizedError;\n },\n );\n } finally {\n this.alreadyRun = true;\n this.pendingCalls = [];\n }\n }\n}\n\n/**\n * Executes multiple asynchronous calls in parallel and collects the results in a easier to use format.\n *\n * @template R - The type of the result value.\n * @template M - The type of the call metadata.\n */\nexport function parallelAsyncResultCalls<\n M extends ValidMetadata | undefined = undefined,\n R = unknown,\n>() {\n return new ParallelAsyncResultCalls<M, R>();\n}\n"],"mappings":"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","names":[]}
|
package/dist/rsResult.js
CHANGED
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
normalizeError,
|
|
7
7
|
resultify,
|
|
8
8
|
setNormalizedErrorSideEffects
|
|
9
|
-
} from "./chunk-
|
|
10
|
-
import "./chunk-
|
|
11
|
-
import "./chunk-
|
|
9
|
+
} from "./chunk-I7ZDKDUM.js";
|
|
10
|
+
import "./chunk-GLZ5MZC5.js";
|
|
11
|
+
import "./chunk-FYMTZQ42.js";
|
|
12
12
|
export {
|
|
13
13
|
NormalizedError,
|
|
14
14
|
NormalizedErrorWithMetadata,
|
package/dist/runShellCmd.js
CHANGED
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
import { spawn } from "child_process";
|
|
3
3
|
process.env.FORCE_COLOR = true;
|
|
4
4
|
function runCmd(label, command, { mock, silent, throwOnError, cwd = process.cwd() } = {}) {
|
|
5
|
-
if (mock)
|
|
6
|
-
return Promise.resolve(mock);
|
|
5
|
+
if (mock) return Promise.resolve(mock);
|
|
7
6
|
if (label && (!silent || silent === "timeOnly")) {
|
|
8
7
|
console.log(`----${label}----`);
|
|
9
8
|
console.time("\u2705");
|
package/dist/runShellCmd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runShellCmd.ts"],"sourcesContent":["/* eslint-disable no-console -- we need console here to print errors */\n\ntype CmdResult = {\n label: string | null;\n out: string;\n error: boolean;\n stdout: string;\n stderr: string;\n};\n\nimport { spawn } from 'child_process';\n\n(process.env as any).FORCE_COLOR = true;\n\ntype RunCmdOptions = {\n mock?: CmdResult;\n silent?: boolean | 'timeOnly';\n cwd?: string;\n throwOnError?: boolean;\n};\n\nexport function runCmd(\n label: string | null,\n command: string | string[],\n { mock, silent, throwOnError, cwd = process.cwd() }: RunCmdOptions = {},\n): Promise<CmdResult> {\n if (mock) return Promise.resolve(mock);\n\n if (label && (!silent || silent === 'timeOnly')) {\n console.log(`----${label}----`);\n console.time('✅');\n }\n\n return new Promise((resolve) => {\n const [cmd = '', ...args] =\n Array.isArray(command) ?\n command.flatMap((item) =>\n item.startsWith('$') ? item.replace('$', '').split(' ') : item,\n )\n : command.split(' ');\n const child = spawn(cmd, args, {\n cwd,\n });\n\n let stdout = '';\n let stderr = '';\n let out = '';\n\n child.stdout.on('data', (data) => {\n stdout += String(data);\n out += String(data);\n\n if (!silent) {\n console.log(String(data));\n }\n });\n\n child.stderr.on('data', (data) => {\n stderr += String(data);\n out += String(data);\n\n if (!silent) {\n console.log(String(data));\n }\n });\n\n child.on('close', (code) => {\n const hasError = code !== 0;\n\n if (!silent || silent === 'timeOnly') {\n if (!hasError) {\n console.timeEnd('✅');\n }\n\n console.log('\\n');\n }\n\n if (throwOnError && hasError) {\n if (silent) {\n if (label) {\n console.log(`----${label}----`);\n } else {\n console.trace();\n }\n console.error(stderr);\n }\n\n process.exit(1);\n }\n\n resolve({ label, out, stderr, stdout, error: hasError });\n });\n });\n}\n\nexport async function concurrentCmd(\n label: string,\n cmd: string | string[],\n onResult: (result: CmdResult) => void,\n) {\n const start = Date.now();\n\n const result = await runCmd(label, cmd, { silent: true });\n\n onResult(result);\n\n const elapsedSeconds = (Date.now() - start) / 1000;\n\n console.log(\n `${result.error ? '🔴' : '✅'} ${result.label} (${elapsedSeconds.toFixed(\n 1,\n )}s)`,\n );\n\n return () => {\n if (result.error) {\n console.log(`❌ ${result.label} errors:`);\n console.log(result.out);\n console.log('\\n');\n }\n };\n}\n\nexport async function runCmdUnwrap(\n label: string | null,\n command: string | string[],\n {\n silent,\n }: {\n silent?: boolean | 'timeOnly';\n } = {},\n) {\n return (await runCmd(label, command, { silent, throwOnError: true })).stdout;\n}\n\nexport function runCmdSilent(command: string | string[]) {\n return runCmd(null, command, { silent: true });\n}\n\nexport function runCmdSilentUnwrap(command: string | string[]) {\n return runCmdUnwrap(null, command, { silent: true });\n}\n"],"mappings":";AAUA,SAAS,aAAa;AAErB,QAAQ,IAAY,cAAc;AAS5B,SAAS,OACd,OACA,SACA,EAAE,MAAM,QAAQ,cAAc,MAAM,QAAQ,IAAI,EAAE,IAAmB,CAAC,GAClD;AACpB,MAAI
|
|
1
|
+
{"version":3,"sources":["../src/runShellCmd.ts"],"sourcesContent":["/* eslint-disable no-console -- we need console here to print errors */\n\ntype CmdResult = {\n label: string | null;\n out: string;\n error: boolean;\n stdout: string;\n stderr: string;\n};\n\nimport { spawn } from 'child_process';\n\n(process.env as any).FORCE_COLOR = true;\n\ntype RunCmdOptions = {\n mock?: CmdResult;\n silent?: boolean | 'timeOnly';\n cwd?: string;\n throwOnError?: boolean;\n};\n\nexport function runCmd(\n label: string | null,\n command: string | string[],\n { mock, silent, throwOnError, cwd = process.cwd() }: RunCmdOptions = {},\n): Promise<CmdResult> {\n if (mock) return Promise.resolve(mock);\n\n if (label && (!silent || silent === 'timeOnly')) {\n console.log(`----${label}----`);\n console.time('✅');\n }\n\n return new Promise((resolve) => {\n const [cmd = '', ...args] =\n Array.isArray(command) ?\n command.flatMap((item) =>\n item.startsWith('$') ? item.replace('$', '').split(' ') : item,\n )\n : command.split(' ');\n const child = spawn(cmd, args, {\n cwd,\n });\n\n let stdout = '';\n let stderr = '';\n let out = '';\n\n child.stdout.on('data', (data) => {\n stdout += String(data);\n out += String(data);\n\n if (!silent) {\n console.log(String(data));\n }\n });\n\n child.stderr.on('data', (data) => {\n stderr += String(data);\n out += String(data);\n\n if (!silent) {\n console.log(String(data));\n }\n });\n\n child.on('close', (code) => {\n const hasError = code !== 0;\n\n if (!silent || silent === 'timeOnly') {\n if (!hasError) {\n console.timeEnd('✅');\n }\n\n console.log('\\n');\n }\n\n if (throwOnError && hasError) {\n if (silent) {\n if (label) {\n console.log(`----${label}----`);\n } else {\n console.trace();\n }\n console.error(stderr);\n }\n\n process.exit(1);\n }\n\n resolve({ label, out, stderr, stdout, error: hasError });\n });\n });\n}\n\nexport async function concurrentCmd(\n label: string,\n cmd: string | string[],\n onResult: (result: CmdResult) => void,\n) {\n const start = Date.now();\n\n const result = await runCmd(label, cmd, { silent: true });\n\n onResult(result);\n\n const elapsedSeconds = (Date.now() - start) / 1000;\n\n console.log(\n `${result.error ? '🔴' : '✅'} ${result.label} (${elapsedSeconds.toFixed(\n 1,\n )}s)`,\n );\n\n return () => {\n if (result.error) {\n console.log(`❌ ${result.label} errors:`);\n console.log(result.out);\n console.log('\\n');\n }\n };\n}\n\nexport async function runCmdUnwrap(\n label: string | null,\n command: string | string[],\n {\n silent,\n }: {\n silent?: boolean | 'timeOnly';\n } = {},\n) {\n return (await runCmd(label, command, { silent, throwOnError: true })).stdout;\n}\n\nexport function runCmdSilent(command: string | string[]) {\n return runCmd(null, command, { silent: true });\n}\n\nexport function runCmdSilentUnwrap(command: string | string[]) {\n return runCmdUnwrap(null, command, { silent: true });\n}\n"],"mappings":"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","names":[]}
|
package/dist/shallowEqual.js
CHANGED
|
@@ -2,23 +2,18 @@
|
|
|
2
2
|
var has = Object.prototype.hasOwnProperty;
|
|
3
3
|
function find(iter, tar, key) {
|
|
4
4
|
for (key of iter.keys()) {
|
|
5
|
-
if (key === tar)
|
|
6
|
-
return key;
|
|
5
|
+
if (key === tar) return key;
|
|
7
6
|
}
|
|
8
7
|
}
|
|
9
8
|
function shallowEqual(foo, bar) {
|
|
10
9
|
var ctor, len, tmp;
|
|
11
|
-
if (foo === bar)
|
|
12
|
-
return true;
|
|
10
|
+
if (foo === bar) return true;
|
|
13
11
|
if (foo && bar && (ctor = foo.constructor) === bar.constructor) {
|
|
14
|
-
if (ctor === Date)
|
|
15
|
-
|
|
16
|
-
if (ctor === RegExp)
|
|
17
|
-
return foo.toString() === bar.toString();
|
|
12
|
+
if (ctor === Date) return shallowEqual(foo.getTime(), bar.getTime());
|
|
13
|
+
if (ctor === RegExp) return foo.toString() === bar.toString();
|
|
18
14
|
if (ctor === Array) {
|
|
19
15
|
if ((len = foo.length) === bar.length) {
|
|
20
|
-
while (len-- && foo[len] === bar[len])
|
|
21
|
-
;
|
|
16
|
+
while (len-- && foo[len] === bar[len]) ;
|
|
22
17
|
}
|
|
23
18
|
return len === -1;
|
|
24
19
|
}
|
|
@@ -30,11 +25,9 @@ function shallowEqual(foo, bar) {
|
|
|
30
25
|
tmp = len;
|
|
31
26
|
if (tmp && typeof tmp === "object") {
|
|
32
27
|
tmp = find(bar, tmp);
|
|
33
|
-
if (!tmp)
|
|
34
|
-
return false;
|
|
28
|
+
if (!tmp) return false;
|
|
35
29
|
}
|
|
36
|
-
if (!bar.has(tmp))
|
|
37
|
-
return false;
|
|
30
|
+
if (!bar.has(tmp)) return false;
|
|
38
31
|
}
|
|
39
32
|
return true;
|
|
40
33
|
}
|
|
@@ -46,8 +39,7 @@ function shallowEqual(foo, bar) {
|
|
|
46
39
|
tmp = len[0];
|
|
47
40
|
if (tmp && typeof tmp === "object") {
|
|
48
41
|
tmp = find(bar, tmp);
|
|
49
|
-
if (!tmp)
|
|
50
|
-
return false;
|
|
42
|
+
if (!tmp) return false;
|
|
51
43
|
}
|
|
52
44
|
if (len[1] !== bar.get(tmp)) {
|
|
53
45
|
return false;
|
|
@@ -58,10 +50,8 @@ function shallowEqual(foo, bar) {
|
|
|
58
50
|
if (!ctor || typeof foo === "object") {
|
|
59
51
|
len = 0;
|
|
60
52
|
for (ctor in foo) {
|
|
61
|
-
if (has.call(foo, ctor) && ++len && !has.call(bar, ctor))
|
|
62
|
-
|
|
63
|
-
if (!(ctor in bar) || !(foo[ctor] === bar[ctor]))
|
|
64
|
-
return false;
|
|
53
|
+
if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;
|
|
54
|
+
if (!(ctor in bar) || !(foo[ctor] === bar[ctor])) return false;
|
|
65
55
|
}
|
|
66
56
|
return Object.keys(bar).length === len;
|
|
67
57
|
}
|
package/dist/shallowEqual.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/shallowEqual.ts"],"sourcesContent":["/* eslint-disable */\nvar has = Object.prototype.hasOwnProperty;\n\nfunction find(iter: any[], tar: any, key?: any) {\n for (key of iter.keys()) {\n if (key === tar) return key;\n }\n}\n\n/** shallow equal version of https://github.com/lukeed/dequal */\nexport function shallowEqual(foo: any, bar: any): boolean {\n var ctor, len, tmp;\n if (foo === bar) return true;\n\n if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n if (ctor === Date) return shallowEqual(foo.getTime(), bar.getTime());\n if (ctor === RegExp) return foo.toString() === bar.toString();\n\n if (ctor === Array) {\n if ((len = foo.length) === bar.length) {\n while (len-- && foo[len] === bar[len]);\n }\n return len === -1;\n }\n\n if (ctor === Set) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len;\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!bar.has(tmp)) return false;\n }\n return true;\n }\n\n if (ctor === Map) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len[0];\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (len[1] !== bar.get(tmp)) {\n return false;\n }\n }\n return true;\n }\n\n if (!ctor || typeof foo === 'object') {\n len = 0;\n for (ctor in foo) {\n if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n if (!(ctor in bar) || !(foo[ctor] === bar[ctor])) return false;\n }\n return Object.keys(bar).length === len;\n }\n }\n\n return foo !== foo && bar !== bar;\n}\n"],"mappings":";AACA,IAAI,MAAM,OAAO,UAAU;AAE3B,SAAS,KAAK,MAAa,KAAU,KAAW;AAC9C,OAAK,OAAO,KAAK,KAAK,GAAG;AACvB,QAAI,QAAQ
|
|
1
|
+
{"version":3,"sources":["../src/shallowEqual.ts"],"sourcesContent":["/* eslint-disable */\nvar has = Object.prototype.hasOwnProperty;\n\nfunction find(iter: any[], tar: any, key?: any) {\n for (key of iter.keys()) {\n if (key === tar) return key;\n }\n}\n\n/** shallow equal version of https://github.com/lukeed/dequal */\nexport function shallowEqual(foo: any, bar: any): boolean {\n var ctor, len, tmp;\n if (foo === bar) return true;\n\n if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n if (ctor === Date) return shallowEqual(foo.getTime(), bar.getTime());\n if (ctor === RegExp) return foo.toString() === bar.toString();\n\n if (ctor === Array) {\n if ((len = foo.length) === bar.length) {\n while (len-- && foo[len] === bar[len]);\n }\n return len === -1;\n }\n\n if (ctor === Set) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len;\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!bar.has(tmp)) return false;\n }\n return true;\n }\n\n if (ctor === Map) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len[0];\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (len[1] !== bar.get(tmp)) {\n return false;\n }\n }\n return true;\n }\n\n if (!ctor || typeof foo === 'object') {\n len = 0;\n for (ctor in foo) {\n if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n if (!(ctor in bar) || !(foo[ctor] === bar[ctor])) return false;\n }\n return Object.keys(bar).length === len;\n }\n }\n\n return foo !== foo && bar !== bar;\n}\n"],"mappings":";AACA,IAAI,MAAM,OAAO,UAAU;AAE3B,SAAS,KAAK,MAAa,KAAU,KAAW;AAC9C,OAAK,OAAO,KAAK,KAAK,GAAG;AACvB,QAAI,QAAQ,IAAK,QAAO;AAAA,EAC1B;AACF;AAGO,SAAS,aAAa,KAAU,KAAmB;AACxD,MAAI,MAAM,KAAK;AACf,MAAI,QAAQ,IAAK,QAAO;AAExB,MAAI,OAAO,QAAQ,OAAO,IAAI,iBAAiB,IAAI,aAAa;AAC9D,QAAI,SAAS,KAAM,QAAO,aAAa,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC;AACnE,QAAI,SAAS,OAAQ,QAAO,IAAI,SAAS,MAAM,IAAI,SAAS;AAE5D,QAAI,SAAS,OAAO;AAClB,WAAK,MAAM,IAAI,YAAY,IAAI,QAAQ;AACrC,eAAO,SAAS,IAAI,GAAG,MAAM,IAAI,GAAG,EAAE;AAAA,MACxC;AACA,aAAO,QAAQ;AAAA,IACjB;AAEA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,SAAS,IAAI,MAAM;AACzB,eAAO;AAAA,MACT;AACA,WAAK,OAAO,KAAK;AACf,cAAM;AACN,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,KAAK,KAAK,GAAG;AACnB,cAAI,CAAC,IAAK,QAAO;AAAA,QACnB;AACA,YAAI,CAAC,IAAI,IAAI,GAAG,EAAG,QAAO;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,SAAS,IAAI,MAAM;AACzB,eAAO;AAAA,MACT;AACA,WAAK,OAAO,KAAK;AACf,cAAM,IAAI,CAAC;AACX,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,KAAK,KAAK,GAAG;AACnB,cAAI,CAAC,IAAK,QAAO;AAAA,QACnB;AACA,YAAI,IAAI,CAAC,MAAM,IAAI,IAAI,GAAG,GAAG;AAC3B,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,OAAO,QAAQ,UAAU;AACpC,YAAM;AACN,WAAK,QAAQ,KAAK;AAChB,YAAI,IAAI,KAAK,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,EAAG,QAAO;AACjE,YAAI,EAAE,QAAQ,QAAQ,EAAE,IAAI,IAAI,MAAM,IAAI,IAAI,GAAI,QAAO;AAAA,MAC3D;AACA,aAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,QAAQ,OAAO,QAAQ;AAChC;","names":[]}
|
package/dist/stringUtils.js
CHANGED
package/dist/testUtils.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ declare function createLoggerStore({ filterKeys: defaultFilterKeys, rejectKeys:
|
|
|
5
5
|
add: (render: Record<string, unknown> | readonly Record<string, unknown>[]) => void;
|
|
6
6
|
reset: (keepLastRender?: boolean) => void;
|
|
7
7
|
getSnapshot: ({ arrays, changesOnly, filterKeys, rejectKeys, includeLastSnapshotEndMark, }?: {
|
|
8
|
-
arrays?:
|
|
8
|
+
arrays?: "all" | "firstAndLast" | "length" | {
|
|
9
9
|
firstNItems: number;
|
|
10
10
|
};
|
|
11
11
|
changesOnly?: boolean;
|
package/dist/testUtils.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
deepEqual
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-M74KKYE4.js";
|
|
4
4
|
import {
|
|
5
5
|
clampMin
|
|
6
6
|
} from "./chunk-NKCC3375.js";
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from "./chunk-W7X6NSGR.js";
|
|
15
15
|
import {
|
|
16
16
|
isObject
|
|
17
|
-
} from "./chunk-
|
|
17
|
+
} from "./chunk-FYMTZQ42.js";
|
|
18
18
|
|
|
19
19
|
// src/testUtils.ts
|
|
20
20
|
function createLoggerStore({
|
package/dist/yamlStringify.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
truncateString
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-GLZ5MZC5.js";
|
|
4
4
|
import {
|
|
5
5
|
bytesToHumanReadable
|
|
6
6
|
} from "./chunk-MMKMF4GG.js";
|
|
7
7
|
import {
|
|
8
8
|
isObject,
|
|
9
9
|
isPlainObject
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-FYMTZQ42.js";
|
|
11
11
|
|
|
12
12
|
// src/yamlStringify.ts
|
|
13
13
|
function yamlStringify(obj, {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ls-stack/utils",
|
|
3
3
|
"description": "Typescript utils",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.9.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"repository": "github:lucasols/utils",
|
|
10
10
|
"author": "Lucas Santos",
|
|
11
11
|
"type": "module",
|
|
12
|
+
"sideEffects": false,
|
|
12
13
|
"types": "./dist/main.d.ts",
|
|
13
14
|
"module": "./dist/main.js",
|
|
14
15
|
"exports": {
|
|
@@ -64,6 +65,10 @@
|
|
|
64
65
|
"import": "./dist/interpolate.js",
|
|
65
66
|
"types": "./dist/interpolate.d.ts"
|
|
66
67
|
},
|
|
68
|
+
"./levenshtein": {
|
|
69
|
+
"import": "./dist/levenshtein.js",
|
|
70
|
+
"types": "./dist/levenshtein.d.ts"
|
|
71
|
+
},
|
|
67
72
|
"./main": {
|
|
68
73
|
"import": "./dist/main.js",
|
|
69
74
|
"types": "./dist/main.d.ts"
|
|
@@ -125,27 +130,28 @@
|
|
|
125
130
|
"types": "./dist/yamlStringify.d.ts"
|
|
126
131
|
}
|
|
127
132
|
},
|
|
128
|
-
"sideEffects": false,
|
|
129
133
|
"engines": {
|
|
130
134
|
"node": ">=20.0.0"
|
|
131
135
|
},
|
|
132
136
|
"devDependencies": {
|
|
133
|
-
"@
|
|
134
|
-
"@types/
|
|
137
|
+
"@ls-stack/extended-lint": "^0.2.0",
|
|
138
|
+
"@types/node": "^22.5.5",
|
|
139
|
+
"@typescript-eslint/eslint-plugin": "^8.6.0",
|
|
140
|
+
"@typescript-eslint/parser": "^8.6.0",
|
|
141
|
+
"@vitest/ui": "^2.1.1",
|
|
142
|
+
"eslint": "^9.10.0",
|
|
143
|
+
"@types/eslint": "^9.6.1",
|
|
135
144
|
"@types/eslint__js": "^8.42.3",
|
|
136
|
-
"
|
|
137
|
-
"@typescript-eslint/eslint-plugin": "^7.7.1",
|
|
138
|
-
"@typescript-eslint/parser": "^7.7.1",
|
|
139
|
-
"@vitest/ui": "^1.5.2",
|
|
140
|
-
"eslint": "^8.57.0",
|
|
145
|
+
"eslint-plugin-unicorn": "^55.0.0",
|
|
141
146
|
"eslint-plugin-vitest": "^0.5.4",
|
|
142
|
-
"prettier": "3.
|
|
143
|
-
"prettier-plugin-organize-imports": "^
|
|
147
|
+
"prettier": "3.3.3",
|
|
148
|
+
"prettier-plugin-organize-imports": "^4.0.0",
|
|
144
149
|
"tsm": "^2.3.0",
|
|
145
|
-
"tsup": "^8.0
|
|
146
|
-
"typescript": "^5.
|
|
147
|
-
"
|
|
148
|
-
"
|
|
150
|
+
"tsup": "^8.3.0",
|
|
151
|
+
"typescript": "^5.6.2",
|
|
152
|
+
"typescript-eslint": "^8.6.0",
|
|
153
|
+
"vite": "^5.4.6",
|
|
154
|
+
"vitest": "^2.1.1"
|
|
149
155
|
},
|
|
150
156
|
"typesVersions": {
|
|
151
157
|
"*": {
|
|
@@ -185,6 +191,9 @@
|
|
|
185
191
|
"interpolate": [
|
|
186
192
|
"./dist/interpolate.d.ts"
|
|
187
193
|
],
|
|
194
|
+
"levenshtein": [
|
|
195
|
+
"./dist/levenshtein.d.ts"
|
|
196
|
+
],
|
|
188
197
|
"main": [
|
|
189
198
|
"./dist/main.d.ts"
|
|
190
199
|
],
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/deepEqual.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-argument */\n/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable no-param-reassign */\n/** forked from https://github.com/lukeed/dequal to conside invalid dates as equal */\n\nvar has = Object.prototype.hasOwnProperty;\n\nfunction find(iter: any[], tar: any, key?: any) {\n for (key of iter.keys()) {\n if (deepEqual(key, tar)) return key;\n }\n}\n\nexport function deepEqual(foo: any, bar: any): boolean {\n var ctor, len, tmp;\n if (foo === bar) return true;\n\n if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n if (ctor === Date) return deepEqual(foo.getTime(), bar.getTime());\n if (ctor === RegExp) return foo.toString() === bar.toString();\n\n if (ctor === Array) {\n if ((len = foo.length) === bar.length) {\n while (len-- && deepEqual(foo[len], bar[len]));\n }\n return len === -1;\n }\n\n if (ctor === Set) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len;\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!bar.has(tmp)) return false;\n }\n return true;\n }\n\n if (ctor === Map) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len[0];\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!deepEqual(len[1], bar.get(tmp))) {\n return false;\n }\n }\n return true;\n }\n\n if (!ctor || typeof foo === 'object') {\n len = 0;\n for (ctor in foo) {\n if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n if (!(ctor in bar) || !deepEqual(foo[ctor], bar[ctor])) return false;\n }\n return Object.keys(bar).length === len;\n }\n }\n\n return foo !== foo && bar !== bar;\n}\n"],"mappings":";AAKA,IAAI,MAAM,OAAO,UAAU;AAE3B,SAAS,KAAK,MAAa,KAAU,KAAW;AAC9C,OAAK,OAAO,KAAK,KAAK,GAAG;AACvB,QAAI,UAAU,KAAK,GAAG;AAAG,aAAO;AAAA,EAClC;AACF;AAEO,SAAS,UAAU,KAAU,KAAmB;AACrD,MAAI,MAAM,KAAK;AACf,MAAI,QAAQ;AAAK,WAAO;AAExB,MAAI,OAAO,QAAQ,OAAO,IAAI,iBAAiB,IAAI,aAAa;AAC9D,QAAI,SAAS;AAAM,aAAO,UAAU,IAAI,QAAQ,GAAG,IAAI,QAAQ,CAAC;AAChE,QAAI,SAAS;AAAQ,aAAO,IAAI,SAAS,MAAM,IAAI,SAAS;AAE5D,QAAI,SAAS,OAAO;AAClB,WAAK,MAAM,IAAI,YAAY,IAAI,QAAQ;AACrC,eAAO,SAAS,UAAU,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC;AAAE;AAAA,MAChD;AACA,aAAO,QAAQ;AAAA,IACjB;AAEA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,SAAS,IAAI,MAAM;AACzB,eAAO;AAAA,MACT;AACA,WAAK,OAAO,KAAK;AACf,cAAM;AACN,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,KAAK,KAAK,GAAG;AACnB,cAAI,CAAC;AAAK,mBAAO;AAAA,QACnB;AACA,YAAI,CAAC,IAAI,IAAI,GAAG;AAAG,iBAAO;AAAA,MAC5B;AACA,aAAO;AAAA,IACT;AAEA,QAAI,SAAS,KAAK;AAChB,UAAI,IAAI,SAAS,IAAI,MAAM;AACzB,eAAO;AAAA,MACT;AACA,WAAK,OAAO,KAAK;AACf,cAAM,IAAI,CAAC;AACX,YAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,gBAAM,KAAK,KAAK,GAAG;AACnB,cAAI,CAAC;AAAK,mBAAO;AAAA,QACnB;AACA,YAAI,CAAC,UAAU,IAAI,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,GAAG;AACpC,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,QAAI,CAAC,QAAQ,OAAO,QAAQ,UAAU;AACpC,YAAM;AACN,WAAK,QAAQ,KAAK;AAChB,YAAI,IAAI,KAAK,KAAK,IAAI,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI;AAAG,iBAAO;AACjE,YAAI,EAAE,QAAQ,QAAQ,CAAC,UAAU,IAAI,IAAI,GAAG,IAAI,IAAI,CAAC;AAAG,iBAAO;AAAA,MACjE;AACA,aAAO,OAAO,KAAK,GAAG,EAAE,WAAW;AAAA,IACrC;AAAA,EACF;AAEA,SAAO,QAAQ,OAAO,QAAQ;AAChC;","names":[]}
|