complete-common 2.14.1 → 2.16.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.
@@ -76,7 +76,7 @@ export declare function filterAsync<T>(array: readonly T[], predicate: (element:
76
76
  * This is named `filterMap` after the Rust function:
77
77
  * https://doc.rust-lang.org/std/iter/struct.FilterMap.html
78
78
  */
79
- export declare function filterMap<OldT, NewT>(array: readonly OldT[], func: (element: OldT) => NewT | undefined): readonly NewT[];
79
+ export declare function filterMap<OldT, NewT>(array: readonly OldT[], predicate: (element: OldT) => NewT | undefined): readonly NewT[];
80
80
  /**
81
81
  * Helper function to perform a filter and a map at the same time. Similar to `Array.map`, provide a
82
82
  * function that transforms a value, but return `undefined` if the value should be skipped. (Thus,
@@ -96,7 +96,7 @@ export declare function filterMap<OldT, NewT>(array: readonly OldT[], func: (ele
96
96
  *
97
97
  * (This is an abstraction around `Promise.all`.)
98
98
  */
99
- export declare function filterMapAsync<OldT, NewT>(array: readonly OldT[], func: (element: OldT, index: number, array: readonly OldT[]) => Promise<NewT | undefined>): Promise<readonly NewT[]>;
99
+ export declare function filterMapAsync<OldT, NewT>(array: readonly OldT[], predicate: (element: OldT, index: number, array: readonly OldT[]) => Promise<NewT | undefined>): Promise<readonly NewT[]>;
100
100
  /**
101
101
  * Helper function to get a random element from the provided array.
102
102
  *
@@ -76,7 +76,7 @@ export declare function filterAsync<T>(array: readonly T[], predicate: (element:
76
76
  * This is named `filterMap` after the Rust function:
77
77
  * https://doc.rust-lang.org/std/iter/struct.FilterMap.html
78
78
  */
79
- export declare function filterMap<OldT, NewT>(array: readonly OldT[], func: (element: OldT) => NewT | undefined): readonly NewT[];
79
+ export declare function filterMap<OldT, NewT>(array: readonly OldT[], predicate: (element: OldT) => NewT | undefined): readonly NewT[];
80
80
  /**
81
81
  * Helper function to perform a filter and a map at the same time. Similar to `Array.map`, provide a
82
82
  * function that transforms a value, but return `undefined` if the value should be skipped. (Thus,
@@ -96,7 +96,7 @@ export declare function filterMap<OldT, NewT>(array: readonly OldT[], func: (ele
96
96
  *
97
97
  * (This is an abstraction around `Promise.all`.)
98
98
  */
99
- export declare function filterMapAsync<OldT, NewT>(array: readonly OldT[], func: (element: OldT, index: number, array: readonly OldT[]) => Promise<NewT | undefined>): Promise<readonly NewT[]>;
99
+ export declare function filterMapAsync<OldT, NewT>(array: readonly OldT[], predicate: (element: OldT, index: number, array: readonly OldT[]) => Promise<NewT | undefined>): Promise<readonly NewT[]>;
100
100
  /**
101
101
  * Helper function to get a random element from the provided array.
102
102
  *
@@ -76,7 +76,7 @@ export declare function filterAsync<T>(array: readonly T[], predicate: (element:
76
76
  * This is named `filterMap` after the Rust function:
77
77
  * https://doc.rust-lang.org/std/iter/struct.FilterMap.html
78
78
  */
79
- export declare function filterMap<OldT, NewT>(array: readonly OldT[], func: (element: OldT) => NewT | undefined): readonly NewT[];
79
+ export declare function filterMap<OldT, NewT>(array: readonly OldT[], predicate: (element: OldT) => NewT | undefined): readonly NewT[];
80
80
  /**
81
81
  * Helper function to perform a filter and a map at the same time. Similar to `Array.map`, provide a
82
82
  * function that transforms a value, but return `undefined` if the value should be skipped. (Thus,
@@ -96,7 +96,7 @@ export declare function filterMap<OldT, NewT>(array: readonly OldT[], func: (ele
96
96
  *
97
97
  * (This is an abstraction around `Promise.all`.)
98
98
  */
99
- export declare function filterMapAsync<OldT, NewT>(array: readonly OldT[], func: (element: OldT, index: number, array: readonly OldT[]) => Promise<NewT | undefined>): Promise<readonly NewT[]>;
99
+ export declare function filterMapAsync<OldT, NewT>(array: readonly OldT[], predicate: (element: OldT, index: number, array: readonly OldT[]) => Promise<NewT | undefined>): Promise<readonly NewT[]>;
100
100
  /**
101
101
  * Helper function to get a random element from the provided array.
102
102
  *
@@ -1 +1 @@
1
- {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/functions/array.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../../src/functions/array.ts"],"names":[],"mappings":"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"}
@@ -6,13 +6,18 @@
6
6
  import type { ReadonlyRecord } from "../types/ReadonlyRecord.js";
7
7
  /**
8
8
  * Helper function to get the values in an object that match an arbitrary condition. Similar to the
9
- * `Array.map` method, but works for objects.
9
+ * `Array.filter` method, but works for objects.
10
10
  *
11
11
  * This is efficient such that it avoids converting the object values into an array.
12
12
  */
13
13
  export declare function objectFilter<K extends string | number | symbol, V>(object: ReadonlyRecord<K, V>, predicate: (value: V) => boolean): readonly V[];
14
14
  /**
15
- * Helper function to convert an object to a map.
15
+ * Helper function to map the values in an object to another object with new values. Similar to the
16
+ * `Array.map` method, but works for objects.
17
+ */
18
+ export declare function objectMap<K extends string | number | symbol, V, U>(object: Record<K, V>, callback: (key: K, value: V) => U): ReadonlyRecord<K, U>;
19
+ /**
20
+ * Helper function to convert an object to a `Map`.
16
21
  *
17
22
  * This is useful when you need to construct a type safe object with the `satisfies` operator, but
18
23
  * then later on you need to query it in a way where you expect the return value to be T or
@@ -6,13 +6,18 @@
6
6
  import type { ReadonlyRecord } from "../types/ReadonlyRecord.js";
7
7
  /**
8
8
  * Helper function to get the values in an object that match an arbitrary condition. Similar to the
9
- * `Array.map` method, but works for objects.
9
+ * `Array.filter` method, but works for objects.
10
10
  *
11
11
  * This is efficient such that it avoids converting the object values into an array.
12
12
  */
13
13
  export declare function objectFilter<K extends string | number | symbol, V>(object: ReadonlyRecord<K, V>, predicate: (value: V) => boolean): readonly V[];
14
14
  /**
15
- * Helper function to convert an object to a map.
15
+ * Helper function to map the values in an object to another object with new values. Similar to the
16
+ * `Array.map` method, but works for objects.
17
+ */
18
+ export declare function objectMap<K extends string | number | symbol, V, U>(object: Record<K, V>, callback: (key: K, value: V) => U): ReadonlyRecord<K, U>;
19
+ /**
20
+ * Helper function to convert an object to a `Map`.
16
21
  *
17
22
  * This is useful when you need to construct a type safe object with the `satisfies` operator, but
18
23
  * then later on you need to query it in a way where you expect the return value to be T or
@@ -6,13 +6,18 @@
6
6
  import type { ReadonlyRecord } from "../types/ReadonlyRecord.js";
7
7
  /**
8
8
  * Helper function to get the values in an object that match an arbitrary condition. Similar to the
9
- * `Array.map` method, but works for objects.
9
+ * `Array.filter` method, but works for objects.
10
10
  *
11
11
  * This is efficient such that it avoids converting the object values into an array.
12
12
  */
13
13
  export declare function objectFilter<K extends string | number | symbol, V>(object: ReadonlyRecord<K, V>, predicate: (value: V) => boolean): readonly V[];
14
14
  /**
15
- * Helper function to convert an object to a map.
15
+ * Helper function to map the values in an object to another object with new values. Similar to the
16
+ * `Array.map` method, but works for objects.
17
+ */
18
+ export declare function objectMap<K extends string | number | symbol, V, U>(object: Record<K, V>, callback: (key: K, value: V) => U): ReadonlyRecord<K, U>;
19
+ /**
20
+ * Helper function to convert an object to a `Map`.
16
21
  *
17
22
  * This is useful when you need to construct a type safe object with the `satisfies` operator, but
18
23
  * then later on you need to query it in a way where you expect the return value to be T or
@@ -1 +1 @@
1
- {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/functions/object.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAChE,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC/B,SAAS,CAAC,EAAE,CAad;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAC/D,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAQnB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAClC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAClC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAQzC"}
1
+ {"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../../src/functions/object.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAEjE;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAChE,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAC/B,SAAS,CAAC,EAAE,CAad;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,CAAC,EAChE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EACpB,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,GAChC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAOtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC,EAC/D,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAQnB;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAClC,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,MAAM,EAClC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAQzC"}
@@ -115,6 +115,8 @@ export declare function removeLinesMatching(string: string, match: string): stri
115
115
  export declare function removeNonPrintableCharacters(string: string): string;
116
116
  /** Helper function to remove all whitespace characters from a string. */
117
117
  export declare function removeWhitespace(string: string): string;
118
+ /** Helper function to convert a string from TitleCase (PascalCase) to kebab-case. */
119
+ export declare function titleCaseToKebabCase(string: string): string;
118
120
  /**
119
121
  * Helper function to trim a prefix from a string, if it exists. Returns the trimmed string.
120
122
  *
@@ -115,6 +115,8 @@ export declare function removeLinesMatching(string: string, match: string): stri
115
115
  export declare function removeNonPrintableCharacters(string: string): string;
116
116
  /** Helper function to remove all whitespace characters from a string. */
117
117
  export declare function removeWhitespace(string: string): string;
118
+ /** Helper function to convert a string from TitleCase (PascalCase) to kebab-case. */
119
+ export declare function titleCaseToKebabCase(string: string): string;
118
120
  /**
119
121
  * Helper function to trim a prefix from a string, if it exists. Returns the trimmed string.
120
122
  *
@@ -115,6 +115,8 @@ export declare function removeLinesMatching(string: string, match: string): stri
115
115
  export declare function removeNonPrintableCharacters(string: string): string;
116
116
  /** Helper function to remove all whitespace characters from a string. */
117
117
  export declare function removeWhitespace(string: string): string;
118
+ /** Helper function to convert a string from TitleCase (PascalCase) to kebab-case. */
119
+ export declare function titleCaseToKebabCase(string: string): string;
118
120
  /**
119
121
  * Helper function to trim a prefix from a string, if it exists. Returns the trimmed string.
120
122
  *
@@ -1 +1 @@
1
- {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/functions/string.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAyBH,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqBlE;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GACtD;IACE,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IAErB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IAErB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;CACtB,GACD,SAAS,CAwBZ;AAGD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,MAAM,CAuBR;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,UAAQ,GACd,MAAM,CAWR;AAED,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMxE"}
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../../src/functions/string.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0BH,kEAAkE;AAClE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAU5D;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAqBlE;AAED,6EAA6E;AAC7E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAOpD;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhD;AAED,0FAA0F;AAC1F,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAErD;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAEhE;AAED,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wEAAwE;AACxE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO3D;AAED,yEAAyE;AACzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAG5D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAiBtD;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,aAAa,EAAE,MAAM,GACtD;IACE,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IAErB,wDAAwD;IACxD,YAAY,EAAE,MAAM,CAAC;IAErB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;CACtB,GACD,SAAS,CAwBZ;AAGD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,MAAM,CAuBR;AAED,gGAAgG;AAChG,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED;;;;;GAKG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,UAAQ,GACd,MAAM,CAWR;AAED,gGAAgG;AAChG,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAOjE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAMxE"}
package/dist/index.cjs CHANGED
@@ -194,19 +194,19 @@ async function filterAsync(array, predicate) {
194
194
  );
195
195
  return array.filter((_, index) => results[index] === true);
196
196
  }
197
- function filterMap(array, func) {
197
+ function filterMap(array, predicate) {
198
198
  const filteredArray = [];
199
199
  for (const element of array) {
200
- const newElement = func(element);
200
+ const newElement = predicate(element);
201
201
  if (newElement !== void 0) {
202
202
  filteredArray.push(newElement);
203
203
  }
204
204
  }
205
205
  return filteredArray;
206
206
  }
207
- async function filterMapAsync(array, func) {
207
+ async function filterMapAsync(array, predicate) {
208
208
  const promises = array.map(
209
- async (element, index) => await func(element, index, array)
209
+ async (element, index) => await predicate(element, index, array)
210
210
  );
211
211
  const results = await Promise.all(promises);
212
212
  return results.filter((item) => item !== void 0);
@@ -310,6 +310,14 @@ function objectFilter(object, predicate) {
310
310
  }
311
311
  return array;
312
312
  }
313
+ function objectMap(object, callback) {
314
+ const entries = Object.entries(object);
315
+ const mappedEntries = entries.map(([key, value]) => [
316
+ key,
317
+ callback(key, value)
318
+ ]);
319
+ return Object.fromEntries(mappedEntries);
320
+ }
313
321
  function objectToMap(object) {
314
322
  const map = /* @__PURE__ */ new Map();
315
323
  for (const [key, value] of Object.entries(object)) {
@@ -442,6 +450,7 @@ const FIRST_LETTER_CAPITALIZED_REGEX = /^\p{Lu}/u;
442
450
  const KEBAB_CASE_REGEX = /^[\da-z]+(?:-[\da-z]+)*$/;
443
451
  const SEMANTIC_VERSION_REGEX = /^v*(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/;
444
452
  const WHITESPACE_REGEX = /\s/g;
453
+ const TITLE_CASE_BOUNDARY_REGEX = /(?<=[\da-z])(?=[A-Z])/g;
445
454
  const UPPERCASE_REGEX = /^[A-Z]*$/;
446
455
  const LOWERCASE_REGEX = /^[a-z]*$/;
447
456
  function capitalizeFirstLetter(string) {
@@ -567,6 +576,9 @@ function removeNonPrintableCharacters(string) {
567
576
  function removeWhitespace(string) {
568
577
  return string.replaceAll(WHITESPACE_REGEX, "");
569
578
  }
579
+ function titleCaseToKebabCase(string) {
580
+ return string.replaceAll(TITLE_CASE_BOUNDARY_REGEX, "-").replaceAll(/ +/g, "-").toLowerCase();
581
+ }
570
582
  function trimPrefix(string, prefix, trimAll = false) {
571
583
  if (trimAll) {
572
584
  const regExp = new RegExp(`^${prefix}+`, "g");
@@ -681,6 +693,7 @@ exports.noop = noop;
681
693
  exports.normalizeString = normalizeString;
682
694
  exports.objectFilter = objectFilter;
683
695
  exports.objectKeysToSet = objectKeysToSet;
696
+ exports.objectMap = objectMap;
684
697
  exports.objectToMap = objectToMap;
685
698
  exports.objectToReverseMap = objectToReverseMap;
686
699
  exports.objectValuesToSet = objectValuesToSet;
@@ -696,6 +709,7 @@ exports.setAdd = setAdd;
696
709
  exports.setHas = setHas;
697
710
  exports.sortCaseInsensitive = sortCaseInsensitive;
698
711
  exports.sumArray = sumArray;
712
+ exports.titleCaseToKebabCase = titleCaseToKebabCase;
699
713
  exports.todo = todo;
700
714
  exports.trimPrefix = trimPrefix;
701
715
  exports.trimSuffix = trimSuffix;
package/dist/index.mjs CHANGED
@@ -192,19 +192,19 @@ async function filterAsync(array, predicate) {
192
192
  );
193
193
  return array.filter((_, index) => results[index] === true);
194
194
  }
195
- function filterMap(array, func) {
195
+ function filterMap(array, predicate) {
196
196
  const filteredArray = [];
197
197
  for (const element of array) {
198
- const newElement = func(element);
198
+ const newElement = predicate(element);
199
199
  if (newElement !== void 0) {
200
200
  filteredArray.push(newElement);
201
201
  }
202
202
  }
203
203
  return filteredArray;
204
204
  }
205
- async function filterMapAsync(array, func) {
205
+ async function filterMapAsync(array, predicate) {
206
206
  const promises = array.map(
207
- async (element, index) => await func(element, index, array)
207
+ async (element, index) => await predicate(element, index, array)
208
208
  );
209
209
  const results = await Promise.all(promises);
210
210
  return results.filter((item) => item !== void 0);
@@ -308,6 +308,14 @@ function objectFilter(object, predicate) {
308
308
  }
309
309
  return array;
310
310
  }
311
+ function objectMap(object, callback) {
312
+ const entries = Object.entries(object);
313
+ const mappedEntries = entries.map(([key, value]) => [
314
+ key,
315
+ callback(key, value)
316
+ ]);
317
+ return Object.fromEntries(mappedEntries);
318
+ }
311
319
  function objectToMap(object) {
312
320
  const map = /* @__PURE__ */ new Map();
313
321
  for (const [key, value] of Object.entries(object)) {
@@ -440,6 +448,7 @@ const FIRST_LETTER_CAPITALIZED_REGEX = /^\p{Lu}/u;
440
448
  const KEBAB_CASE_REGEX = /^[\da-z]+(?:-[\da-z]+)*$/;
441
449
  const SEMANTIC_VERSION_REGEX = /^v*(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/;
442
450
  const WHITESPACE_REGEX = /\s/g;
451
+ const TITLE_CASE_BOUNDARY_REGEX = /(?<=[\da-z])(?=[A-Z])/g;
443
452
  const UPPERCASE_REGEX = /^[A-Z]*$/;
444
453
  const LOWERCASE_REGEX = /^[a-z]*$/;
445
454
  function capitalizeFirstLetter(string) {
@@ -565,6 +574,9 @@ function removeNonPrintableCharacters(string) {
565
574
  function removeWhitespace(string) {
566
575
  return string.replaceAll(WHITESPACE_REGEX, "");
567
576
  }
577
+ function titleCaseToKebabCase(string) {
578
+ return string.replaceAll(TITLE_CASE_BOUNDARY_REGEX, "-").replaceAll(/ +/g, "-").toLowerCase();
579
+ }
568
580
  function trimPrefix(string, prefix, trimAll = false) {
569
581
  if (trimAll) {
570
582
  const regExp = new RegExp(`^${prefix}+`, "g");
@@ -605,4 +617,4 @@ function* tupleKeys(tuple) {
605
617
 
606
618
  const ReadonlyMap = Map;
607
619
 
608
- export { HOUR_IN_MILLISECONDS, MINUTE_IN_MILLISECONDS, ReadonlyMap, ReadonlySet, SECOND_IN_MILLISECONDS, addSetsToSet, arrayCopyTwoDimensional, arrayEquals, arrayRemove, arrayRemoveAllInPlace, arrayRemoveInPlace, assertArray, assertArrayBoolean, assertArrayNumber, assertArrayObject, assertArrayString, assertBoolean, assertDefined, assertEnumValue, assertInteger, assertIs, assertNotNull, assertNumber, assertObject, assertString, assertStringNotEmpty, capitalizeFirstLetter, clamp, combineSets, copySet, eRange, emptyArray, escapeHTMLCharacters, filterAsync, filterMap, filterMapAsync, getElapsedSeconds, getEnumEntries, getEnumKeys, getEnumValues, getNumConsecutiveDiacritics, getRandomArrayElement, getRandomArrayIndex, getRandomInt, hasDiacritic, hasEmoji, hasWhitespace, iRange, includes, includesAny, interfaceSatisfiesEnum, isASCII, isArray, isArrayBoolean, isArrayNumber, isArrayString, isEnumValue, isFirstLetterCapitalized, isKebabCase, isKeyOf, isLowerCase, isObject, isSemanticVersion, isUpperCase, kebabCaseToCamelCase, kebabCaseToPascalCase, mapAsync, mapFilter, mapFind, newArray, noop, normalizeString, objectFilter, objectKeysToSet, objectToMap, objectToReverseMap, objectValuesToSet, parseFloatSafe, parseIntSafe, parseSemanticVersion, removeLinesBetweenMarkers, removeLinesMatching, removeNonPrintableCharacters, removeWhitespace, repeat, setAdd, setHas, sortCaseInsensitive, sumArray, todo, trimPrefix, trimSuffix, truncateString, tupleEntries, tupleKeys };
620
+ export { HOUR_IN_MILLISECONDS, MINUTE_IN_MILLISECONDS, ReadonlyMap, ReadonlySet, SECOND_IN_MILLISECONDS, addSetsToSet, arrayCopyTwoDimensional, arrayEquals, arrayRemove, arrayRemoveAllInPlace, arrayRemoveInPlace, assertArray, assertArrayBoolean, assertArrayNumber, assertArrayObject, assertArrayString, assertBoolean, assertDefined, assertEnumValue, assertInteger, assertIs, assertNotNull, assertNumber, assertObject, assertString, assertStringNotEmpty, capitalizeFirstLetter, clamp, combineSets, copySet, eRange, emptyArray, escapeHTMLCharacters, filterAsync, filterMap, filterMapAsync, getElapsedSeconds, getEnumEntries, getEnumKeys, getEnumValues, getNumConsecutiveDiacritics, getRandomArrayElement, getRandomArrayIndex, getRandomInt, hasDiacritic, hasEmoji, hasWhitespace, iRange, includes, includesAny, interfaceSatisfiesEnum, isASCII, isArray, isArrayBoolean, isArrayNumber, isArrayString, isEnumValue, isFirstLetterCapitalized, isKebabCase, isKeyOf, isLowerCase, isObject, isSemanticVersion, isUpperCase, kebabCaseToCamelCase, kebabCaseToPascalCase, mapAsync, mapFilter, mapFind, newArray, noop, normalizeString, objectFilter, objectKeysToSet, objectMap, objectToMap, objectToReverseMap, objectValuesToSet, parseFloatSafe, parseIntSafe, parseSemanticVersion, removeLinesBetweenMarkers, removeLinesMatching, removeNonPrintableCharacters, removeWhitespace, repeat, setAdd, setHas, sortCaseInsensitive, sumArray, titleCaseToKebabCase, todo, trimPrefix, trimSuffix, truncateString, tupleEntries, tupleKeys };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "complete-common",
3
- "version": "2.14.1",
3
+ "version": "2.16.0",
4
4
  "description": "Helper functions for TypeScript projects.",
5
5
  "homepage": "https://complete-ts.github.io/",
6
6
  "bugs": {
@@ -177,12 +177,12 @@ export async function filterAsync<T>(
177
177
  */
178
178
  export function filterMap<OldT, NewT>(
179
179
  array: readonly OldT[],
180
- func: (element: OldT) => NewT | undefined,
180
+ predicate: (element: OldT) => NewT | undefined,
181
181
  ): readonly NewT[] {
182
182
  const filteredArray: NewT[] = [];
183
183
 
184
184
  for (const element of array) {
185
- const newElement = func(element);
185
+ const newElement = predicate(element);
186
186
  if (newElement !== undefined) {
187
187
  filteredArray.push(newElement);
188
188
  }
@@ -212,14 +212,14 @@ export function filterMap<OldT, NewT>(
212
212
  */
213
213
  export async function filterMapAsync<OldT, NewT>(
214
214
  array: readonly OldT[],
215
- func: (
215
+ predicate: (
216
216
  element: OldT,
217
217
  index: number,
218
218
  array: readonly OldT[],
219
219
  ) => Promise<NewT | undefined>,
220
220
  ): Promise<readonly NewT[]> {
221
221
  const promises = array.map(
222
- async (element, index) => await func(element, index, array),
222
+ async (element, index) => await predicate(element, index, array),
223
223
  );
224
224
  const results = await Promise.all(promises);
225
225
  return results.filter((item) => item !== undefined);
@@ -8,7 +8,7 @@ import type { ReadonlyRecord } from "../types/ReadonlyRecord.js";
8
8
 
9
9
  /**
10
10
  * Helper function to get the values in an object that match an arbitrary condition. Similar to the
11
- * `Array.map` method, but works for objects.
11
+ * `Array.filter` method, but works for objects.
12
12
  *
13
13
  * This is efficient such that it avoids converting the object values into an array.
14
14
  */
@@ -31,7 +31,23 @@ export function objectFilter<K extends string | number | symbol, V>(
31
31
  }
32
32
 
33
33
  /**
34
- * Helper function to convert an object to a map.
34
+ * Helper function to map the values in an object to another object with new values. Similar to the
35
+ * `Array.map` method, but works for objects.
36
+ */
37
+ export function objectMap<K extends string | number | symbol, V, U>(
38
+ object: Record<K, V>,
39
+ callback: (key: K, value: V) => U,
40
+ ): ReadonlyRecord<K, U> {
41
+ const entries = Object.entries(object);
42
+ const mappedEntries = entries.map(([key, value]) => [
43
+ key,
44
+ callback(key as K, value as V),
45
+ ]);
46
+ return Object.fromEntries(mappedEntries) as Record<K, U>;
47
+ }
48
+
49
+ /**
50
+ * Helper function to convert an object to a `Map`.
35
51
  *
36
52
  * This is useful when you need to construct a type safe object with the `satisfies` operator, but
37
53
  * then later on you need to query it in a way where you expect the return value to be T or
@@ -4,6 +4,7 @@ import {
4
4
  hasDiacritic,
5
5
  hasEmoji,
6
6
  isKebabCase,
7
+ titleCaseToKebabCase,
7
8
  trimPrefix,
8
9
  trimSuffix,
9
10
  } from "./string.js";
@@ -125,6 +126,40 @@ describe("isKebabCase", () => {
125
126
  });
126
127
  });
127
128
 
129
+ describe("titleCaseToKebabCase", () => {
130
+ test("should convert a single TitleCase word to lowercase", () => {
131
+ equal(titleCaseToKebabCase("Foo"), "foo");
132
+ });
133
+
134
+ test("should convert two TitleCase words to kebab-case", () => {
135
+ equal(titleCaseToKebabCase("FooBar"), "foo-bar");
136
+ });
137
+
138
+ test("should convert multiple TitleCase words to kebab-case", () => {
139
+ equal(titleCaseToKebabCase("FooBarBaz"), "foo-bar-baz");
140
+ });
141
+
142
+ test("should handle an empty string", () => {
143
+ equal(titleCaseToKebabCase(""), "");
144
+ });
145
+
146
+ test("should handle a string that is already lowercase", () => {
147
+ equal(titleCaseToKebabCase("foo"), "foo");
148
+ });
149
+
150
+ test("should handle a string with digits", () => {
151
+ equal(titleCaseToKebabCase("Foo2Bar"), "foo2-bar");
152
+ });
153
+
154
+ test("should handle spaces", () => {
155
+ equal(titleCaseToKebabCase("Foo Bar"), "foo-bar");
156
+ });
157
+
158
+ test("should handle multiple spaces", () => {
159
+ equal(titleCaseToKebabCase("Foo Bar"), "foo-bar");
160
+ });
161
+ });
162
+
128
163
  describe("trimPrefix", () => {
129
164
  test(() => {
130
165
  equal(trimPrefix("foo", ""), "foo");
@@ -24,6 +24,7 @@ const FIRST_LETTER_CAPITALIZED_REGEX = /^\p{Lu}/u;
24
24
  const KEBAB_CASE_REGEX = /^[\da-z]+(?:-[\da-z]+)*$/;
25
25
  const SEMANTIC_VERSION_REGEX = /^v*(?<major>\d+)\.(?<minor>\d+)\.(?<patch>\d+)/;
26
26
  const WHITESPACE_REGEX = /\s/g;
27
+ const TITLE_CASE_BOUNDARY_REGEX = /(?<=[\da-z])(?=[A-Z])/g;
27
28
  const UPPERCASE_REGEX = /^[A-Z]*$/;
28
29
  const LOWERCASE_REGEX = /^[a-z]*$/;
29
30
 
@@ -311,6 +312,14 @@ export function removeWhitespace(string: string): string {
311
312
  return string.replaceAll(WHITESPACE_REGEX, "");
312
313
  }
313
314
 
315
+ /** Helper function to convert a string from TitleCase (PascalCase) to kebab-case. */
316
+ export function titleCaseToKebabCase(string: string): string {
317
+ return string
318
+ .replaceAll(TITLE_CASE_BOUNDARY_REGEX, "-")
319
+ .replaceAll(/ +/g, "-")
320
+ .toLowerCase();
321
+ }
322
+
314
323
  /**
315
324
  * Helper function to trim a prefix from a string, if it exists. Returns the trimmed string.
316
325
  *