objectools
Advanced tools
+69
-57
@@ -5,12 +5,10 @@ /** | ||
| */ | ||
| export declare class O<K extends Key, V> { | ||
| export declare class O<Obj extends object, K extends Key = keyof Obj, V = Obj[keyof Obj]> { | ||
| entries: [K, V][]; | ||
| constructor(object: { | ||
| [P in K]?: V; | ||
| }); | ||
| get o(): { [P in K]: V; }; | ||
| constructor(object: Obj); | ||
| get o(): Obj; | ||
| get keys(): Set<K>; | ||
| get values(): V[]; | ||
| get length(): number; | ||
| static oFromKeys<K extends Key, V>(keys: K[], value: V | ((key: K, index: number) => V)): O<K, V>; | ||
| static oFromKeys<K extends Key, V>(keys: K[], value: V | ((key: K, index: number) => V)): O<{ [P in K]: V; }, K, { [P in K]: V; }[K]>; | ||
| static fromKeys<V, K extends Key = string>(keys: K[], value: V | ((key: K, index: number) => V)): { [P in K]: V; }; | ||
@@ -21,13 +19,33 @@ /** | ||
| */ | ||
| oFilter<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): O<P, U>; | ||
| oFilter<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): O<{ | ||
| [K in P]: U; | ||
| }>; | ||
| oFilter<P extends K = never, U extends V = never>(predicate: (value: V, key: K, index: number) => unknown): O<{ | ||
| [K in P]: U; | ||
| }>; | ||
| filter<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): { | ||
| [K in P]: U; | ||
| }; | ||
| filter<P extends K = never, U extends V = never>(predicate: (value: V, key: K, index: number) => unknown): { | ||
| [K in P]: U; | ||
| }; | ||
| /** | ||
| * Filter the object by keys and values. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter | ||
| * Map the object by keys and values (chainable). | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map | ||
| */ | ||
| filter<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): { [P_1 in P]: U; }; | ||
| oMap<P extends Key = K, U = V>(mapper: (value: V, key: K, index: number) => U): O<{ [K_1 in P]: U; }, P, { [K_1 in P]: U; }[P]>; | ||
| /** | ||
| * Map the object by keys and values. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map | ||
| */ | ||
| map<P extends Key = K, U = V>(mapper: (value: V, key: K, index: number) => U): { [K_1 in P]: U; }; | ||
| /** | ||
| * Map the object by keys and values (chainable). | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map | ||
| */ | ||
| oMap<P extends Key = K, U = V>(mapper: (value: V, key: K, index: number) => U | [P, U]): O<P, U>; | ||
| oMapKeyValue<P extends Key = K, U = V>(mapper: (value: V, key: K, index: number) => [P, U]): O<{ [K_1 in P]: U; }, P, { [K_1 in P]: U; }[P]>; | ||
| /** | ||
@@ -37,3 +55,3 @@ * Map the object by keys and values. | ||
| */ | ||
| map<P extends Key = K, U = V>(mapper: (value: V, key: K, index: number) => U | [P, U]): { [P_1 in P]: U; }; | ||
| mapKeyValue<P extends Key = K, U = V>(mapper: (value: V, key: K, index: number) => [P, U]): { [K_1 in P]: U; }; | ||
| /** | ||
@@ -48,3 +66,3 @@ * `forEach`-loop method for objects. | ||
| */ | ||
| some(predicateFn: (value: V, key: K, index: number) => unknown): boolean; | ||
| some(predicate: (value: V, key: K, index: number) => unknown): boolean; | ||
| /** | ||
@@ -54,3 +72,3 @@ * `every` method for objects. | ||
| */ | ||
| every(predicateFn: (value: V, key: K, index: number) => unknown): boolean; | ||
| every(predicate: (value: V, key: K, index: number) => unknown): boolean; | ||
| /** | ||
@@ -67,43 +85,37 @@ * `indexOf` method for objects. | ||
| lastIndexOf(value: V): number; | ||
| find<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): [P, U] | undefined; | ||
| find(predicate: (value: V, key: K, index: number) => unknown): [K, V] | undefined; | ||
| /** | ||
| * Find matched entry (`[key, value]`) in the object. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find | ||
| */ | ||
| find<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): readonly [P, U] | undefined; | ||
| /** | ||
| * Find matched index in the object. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex | ||
| */ | ||
| findIndex<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): number; | ||
| findIndex(predicate: (value: V, key: K, index: number) => unknown): number; | ||
| findKey<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): P | undefined; | ||
| findKey(predicate: (value: V, key: K, index: number) => unknown): K | undefined; | ||
| findValue<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): U | undefined; | ||
| findValue(predicate: (value: V, key: K, index: number) => unknown): V | undefined; | ||
| findLast<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): [P, U] | undefined; | ||
| findLast(predicate: (value: V, key: K, index: number) => unknown): [K, V] | undefined; | ||
| /** | ||
| * Find matched index in the object. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findIndex | ||
| */ | ||
| findKey<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): K | undefined; | ||
| /** | ||
| * Similar to `find()` method. But returns only the `value` (instead of `[key, value]`). | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find | ||
| */ | ||
| findValue<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): V | undefined; | ||
| /** | ||
| * Find the last matched entry (`[key, value]`) in the object. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast | ||
| */ | ||
| findLast<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): readonly [P, U] | undefined; | ||
| /** | ||
| * Find the last matched index in the object. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLastIndex | ||
| */ | ||
| findLastIndex<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): number; | ||
| findLastIndex(predicate: (value: V, key: K, index: number) => unknown): number; | ||
| findLastKey<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): P | undefined; | ||
| findLastKey(predicate: (value: V, key: K, index: number) => unknown): K | undefined; | ||
| findLastValue<P extends K, U extends V>(predicate: (value: V, key: K, index: number) => this is O<{ | ||
| [K in P]: U; | ||
| }>): U | undefined; | ||
| findLastValue(predicate: (value: V, key: K, index: number) => unknown): V | undefined; | ||
| /** | ||
| * Find the last matched key in the object. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLastIndex | ||
| */ | ||
| findLastKey<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): K | undefined; | ||
| /** | ||
| * Similar to `findLast()` method. But returns only the `value` (instead of `[key, value]`). | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/findLast | ||
| */ | ||
| findLastValue<P extends K, U extends V>(predicateFn: (value: V, key: K, index: number) => this is O<P, U>): V | undefined; | ||
| /** | ||
| * NOT [IN-PLACE](https://en.wikipedia.org/wiki/In-place_algorithm) sort the object by keys and values (and return a | ||
@@ -119,7 +131,7 @@ * NEW object) (chainable). | ||
| */ | ||
| sort(compareFn?: (a: [K, V], b: [K, V]) => number): { [P in K]: V; }; | ||
| sort(compareFn?: (a: [K, V], b: [K, V]) => number): Obj; | ||
| /** Filter out given key(s) from the object. */ | ||
| omit<P extends K>(...keys: P[]): { [Key_1 in Exclude<K, P>]: V; }; | ||
| omit<P extends K>(...keys: P[]): { [Q in Exclude<K, P>]: V; }; | ||
| /** Filter out given key(s) from the object. (chainable) */ | ||
| oOmit<P extends K>(...keys: P[]): O<Exclude<K, P>, V>; | ||
| oOmit<P extends K>(...keys: P[]): O<{ [Q in Exclude<K, P>]: V; }, Exclude<K, P>, { [Q in Exclude<K, P>]: V; }[Exclude<K, P>]>; | ||
| /** | ||
@@ -134,3 +146,3 @@ * Similar to `oSort()` method. But operates based on the `value`s only (instead of `[key, value]`s). | ||
| */ | ||
| sortByValues(compareFn?: (v1: V, v2: V) => number): { [P in K]: V; }; | ||
| sortByValues(compareFn?: (v1: V, v2: V) => number): Obj; | ||
| shallowEqual(object: Record<K, any>): boolean; | ||
@@ -142,3 +154,3 @@ /** | ||
| */ | ||
| oFlip(): O<V extends string ? V : never, K>; | ||
| oFlip(): O<{ [K_1 in V extends Key ? V : never]: K_1; }>; | ||
| /** | ||
@@ -149,3 +161,3 @@ * Swap (mirror) key-value pairs. | ||
| */ | ||
| flip(): { [P in V extends string ? V : never]: K; }; | ||
| flip(): { [K_1 in V extends string | number | symbol ? V : never]: K_1; }; | ||
| /** | ||
@@ -165,3 +177,3 @@ * NOT [IN-PLACE](https://en.wikipedia.org/wiki/In-place_algorithm) reverse the object (and return a NEW object) | ||
| */ | ||
| reverse(): { [P in K]: V; }; | ||
| reverse(): Obj; | ||
| /** | ||
@@ -180,3 +192,3 @@ * **`O.fromKeys(o(this.values[0]).keys, k1 => O.fromKeys(this.keys, k2 => this.o[k2][k1]))`** | ||
| */ | ||
| oTranspose(): this | O<V extends object ? keyof V extends string ? keyof V : never : never, Record<K, any>>; | ||
| oTranspose(): O<{ [VK in V extends object ? keyof V : never]: { [P in K]: V[keyof V]; }; }, V extends object ? keyof V : never, { [VK in V extends object ? keyof V : never]: { [P in K]: V[keyof V]; }; }[V extends object ? keyof V : never]>; | ||
| /** | ||
@@ -193,3 +205,3 @@ * @example | ||
| */ | ||
| transpose(): { [P in K]: V; } | { [P_1 in V extends object ? keyof V extends string ? keyof V : never : never]: Record<K, any>; }; | ||
| transpose(): { [VK in V extends object ? keyof V : never]: { [P in K]: V[keyof V]; }; }; | ||
| } | ||
@@ -208,4 +220,4 @@ /** | ||
| */ | ||
| declare const o: <K extends string, V>(object: { [P in K]?: V | undefined; }) => O<K, V>; | ||
| declare const o: <Obj extends object, K extends Key = keyof Obj, V = Obj[keyof Obj]>(object: Obj) => O<Obj, K, V>; | ||
| export default o; | ||
| type Key = string; | ||
| type Key = keyof any; |
+46
-39
@@ -34,8 +34,4 @@ /** | ||
| } | ||
| /** | ||
| * Filter the object by keys and values (chainable). | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter | ||
| */ | ||
| oFilter(predicateFn) { | ||
| this.entries = this.entries.filter(([k, v], i) => predicateFn(v, k, i)); | ||
| oFilter(predicate) { | ||
| this.entries = this.entries.filter(([k, v], i) => predicate(v, k, i)); | ||
| return this; | ||
@@ -47,4 +43,4 @@ } | ||
| */ | ||
| filter(predicateFn) { | ||
| return this.oFilter(predicateFn).o; | ||
| filter(predicate) { | ||
| return this.oFilter(predicate).o; | ||
| } | ||
@@ -57,12 +53,4 @@ /** | ||
| if (!this.entries.length) | ||
| return this; | ||
| const [firstKey, firstValue] = this.entries[0]; | ||
| const testReturnType = mapper(firstValue, firstKey, 0); | ||
| // @ts-expect-error | ||
| this.entries = | ||
| testReturnType instanceof Array && | ||
| testReturnType.length === 2 && | ||
| ['string', 'number', 'symbol'].includes(typeof testReturnType[0]) | ||
| ? this.entries.map(([k, v], i) => mapper(v, k, i)) | ||
| : this.entries.map(([k, v], i) => [k, mapper(v, k, i)]); | ||
| return this; // @ts-expect-error | ||
| this.entries = this.entries.map(([k, v], i) => [k, mapper(v, k, i)]); | ||
| return this; | ||
@@ -78,2 +66,19 @@ } | ||
| /** | ||
| * Map the object by keys and values (chainable). | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map | ||
| */ | ||
| oMapKeyValue(mapper) { | ||
| if (!this.entries.length) | ||
| return this; // @ts-expect-error | ||
| this.entries = this.entries.map(([k, v], i) => mapper(v, k, i)); | ||
| return this; | ||
| } | ||
| /** | ||
| * Map the object by keys and values. | ||
| * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map | ||
| */ | ||
| mapKeyValue(mapper) { | ||
| return this.oMapKeyValue(mapper).o; | ||
| } | ||
| /** | ||
| * `forEach`-loop method for objects. | ||
@@ -91,4 +96,4 @@ * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach | ||
| */ | ||
| some(predicateFn) { | ||
| return this.entries.some(([k, v], i) => predicateFn(v, k, i)); | ||
| some(predicate) { | ||
| return this.entries.some(([k, v], i) => predicate(v, k, i)); | ||
| } | ||
@@ -99,4 +104,4 @@ /** | ||
| */ | ||
| every(predicateFn) { | ||
| return this.entries.every(([k, v], i) => predicateFn(v, k, i)); | ||
| every(predicate) { | ||
| return this.entries.every(([k, v], i) => predicate(v, k, i)); | ||
| } | ||
@@ -124,4 +129,4 @@ /** | ||
| */ | ||
| find(predicateFn) { | ||
| const found = this.entries.find(([k, v], i) => predicateFn(v, k, i)); | ||
| find(predicate) { | ||
| const found = this.entries.find(([k, v], i) => predicate(v, k, i)); | ||
| return found && [found[0], found[1]]; | ||
@@ -133,4 +138,4 @@ } | ||
| */ | ||
| findIndex(predicateFn) { | ||
| return this.entries.findIndex(([k, v], i) => predicateFn(v, k, i)); | ||
| findIndex(predicate) { | ||
| return this.entries.findIndex(([k, v], i) => predicate(v, k, i)); | ||
| } | ||
@@ -141,4 +146,4 @@ /** | ||
| */ | ||
| findKey(predicateFn) { | ||
| return this.entries.find(([k, v], i) => predicateFn(v, k, i))?.[0]; | ||
| findKey(predicate) { | ||
| return this.entries.find(([k, v], i) => predicate(v, k, i))?.[0]; | ||
| } | ||
@@ -149,4 +154,4 @@ /** | ||
| */ | ||
| findValue(predicateFn) { | ||
| return this.entries.find(([k, v], i) => predicateFn(v, k, i))?.[1]; | ||
| findValue(predicate) { | ||
| return this.entries.find(([k, v], i) => predicate(v, k, i))?.[1]; | ||
| } | ||
@@ -157,4 +162,4 @@ /** | ||
| */ | ||
| findLast(predicateFn) { | ||
| const found = this.entries.findLast(([k, v], i) => predicateFn(v, k, i)); | ||
| findLast(predicate) { | ||
| const found = this.entries.findLast(([k, v], i) => predicate(v, k, i)); | ||
| return found && [found[0], found[1]]; | ||
@@ -166,4 +171,4 @@ } | ||
| */ | ||
| findLastIndex(predicateFn) { | ||
| return this.entries.findLastIndex(([k, v], i) => predicateFn(v, k, i)); | ||
| findLastIndex(predicate) { | ||
| return this.entries.findLastIndex(([k, v], i) => predicate(v, k, i)); | ||
| } | ||
@@ -174,4 +179,4 @@ /** | ||
| */ | ||
| findLastKey(predicateFn) { | ||
| return this.entries.findLast(([k, v], i) => predicateFn(v, k, i))?.[0]; | ||
| findLastKey(predicate) { | ||
| return this.entries.findLast(([k, v], i) => predicate(v, k, i))?.[0]; | ||
| } | ||
@@ -182,4 +187,4 @@ /** | ||
| */ | ||
| findLastValue(predicateFn) { | ||
| return this.entries.findLast(([k, v], i) => predicateFn(v, k, i))?.[1]; | ||
| findLastValue(predicate) { | ||
| return this.entries.findLast(([k, v], i) => predicate(v, k, i))?.[1]; | ||
| } | ||
@@ -299,3 +304,3 @@ /** | ||
| Object.fromEntries(this.entries.map(([key2, value2]) => [ | ||
| key2, | ||
| key2, // The magic: | ||
| // @ts-expect-error | ||
@@ -336,1 +341,3 @@ value2[key1], // === `this.o[key2][key1]` (Swap `key1` and `key2`)! | ||
| export default o; | ||
| const obj = { a: 1, b: 2, c: 3 }; | ||
| o(obj).filter((value) => value > 1); |
+3
-3
| { | ||
| "name": "objectools", | ||
| "version": "3.1.0", | ||
| "version": "4.0.0", | ||
| "description": "Useful easy-to-use utilities for JavaScript objects", | ||
@@ -45,3 +45,3 @@ "keywords": [ | ||
| "prettier.format": "prettier --write .", | ||
| "build": "tsc --project tsconfig.build.json", | ||
| "build": "rm -rf dist tsconfig.tsbuildinfo && tsc --project tsconfig.build.json", | ||
| "prepublishOnly": "npm run prettier.format & npm run build", | ||
@@ -58,3 +58,3 @@ "patch-version": "npm version patch --no-git-tag-version", | ||
| "@types/node": "^20.5.9", | ||
| "typescript": "~5.2.2" | ||
| "typescript": "~5.5.4" | ||
| }, | ||
@@ -61,0 +61,0 @@ "engines": { |
+3
-3
@@ -19,3 +19,3 @@ # ObjecTools | ||
| - [`.filter()`](#filter) | ||
| - [`.map()`](#map) | ||
| - [`.map()`, `.mapKeyValue`](#map) | ||
| - [`.keys`, `.values`, `.entries`, `.length`](#keys-values-entries-length) | ||
@@ -40,3 +40,3 @@ - [`.find()`, `.findIndex()`, `.findKey()`, `.findValue()`](#find-findindex-findkey-findvalue) | ||
| - [`filter()`](#filter) | ||
| - [`map()`](#map), `forEach()` | ||
| - [`map() & mapKeyValue()`](#map), `forEach()` | ||
| - [`find()`](#find-findindex-findkey-findvalue), [`findIndex()`](#find-findindex-findkey-findvalue), [`findLast()`](#findlast-findlastindex-findlastkey-findlastvalue), [`findLastIndex()`](<(#findlast-findlastindex-findlastkey-findlastvalue)>) | ||
@@ -101,3 +101,3 @@ - [`indexOf()`, `lastIndexOf()`, `indexOfKey()`](<(#indexof-lastindexof-indexofkey)>) | ||
| o({a: 1, b: 2, c: 3}).map((value) => value * 2) // {a: 2, b: 4, c: 6} | ||
| o({a: 1, b: 2, c: 3}).map((value, key) => [key.toUpperCase(), value - 1]) // {A: 0, B: 1, C: 2} | ||
| o({a: 1, b: 2, c: 3}).mapKeyValue((value, key) => [key.toUpperCase(), value - 1]) // {A: 0, B: 1, C: 2} | ||
| ``` | ||
@@ -104,0 +104,0 @@ |
AI-detected possible typosquat
Supply chain riskAI has identified this package as a potential typosquat of a more popular package. This suggests that the package may be intentionally mimicking another package's name, description, or other metadata.
Found 1 instance in 1 package
32223
1.98%536
3.68%1
Infinity%