@augment-vir/common 30.0.0 → 30.0.2

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.
Files changed (174) hide show
  1. package/README.md +11 -0
  2. package/dist/augments/array/array-map.d.ts +29 -1
  3. package/dist/augments/array/array-map.js +29 -1
  4. package/dist/augments/array/array-to-object.d.ts +27 -9
  5. package/dist/augments/array/array-to-object.js +96 -12
  6. package/dist/augments/array/awaited/awaited-filter.d.ts +29 -0
  7. package/dist/augments/array/awaited/awaited-filter.js +29 -0
  8. package/dist/augments/array/awaited/awaited-for-each.d.ts +28 -3
  9. package/dist/augments/array/awaited/awaited-for-each.js +28 -3
  10. package/dist/augments/array/awaited/awaited-map.d.ts +32 -0
  11. package/dist/augments/array/awaited/awaited-map.js +32 -0
  12. package/dist/augments/array/filter.d.ts +29 -0
  13. package/dist/augments/array/filter.js +61 -0
  14. package/dist/augments/array/remove-duplicates.d.ts +60 -1
  15. package/dist/augments/array/remove-duplicates.js +61 -2
  16. package/dist/augments/array/repeat-array.d.ts +22 -0
  17. package/dist/augments/array/repeat-array.js +22 -0
  18. package/dist/augments/array/shuffle-array.d.ts +8 -1
  19. package/dist/augments/array/shuffle-array.js +8 -1
  20. package/dist/augments/array/string-array.d.ts +8 -0
  21. package/dist/augments/array/string-array.js +8 -0
  22. package/dist/augments/enum/enum-value-check.d.ts +30 -0
  23. package/dist/augments/enum/enum-value-check.js +30 -0
  24. package/dist/augments/error/combine-errors.d.ts +24 -3
  25. package/dist/augments/error/combine-errors.js +26 -4
  26. package/dist/augments/function/call-asynchronously.d.ts +19 -0
  27. package/dist/augments/function/call-asynchronously.js +19 -0
  28. package/dist/augments/function/call-with-retries.d.ts +23 -3
  29. package/dist/augments/function/call-with-retries.js +23 -0
  30. package/dist/augments/function/debounce.d.ts +71 -4
  31. package/dist/augments/function/debounce.js +66 -4
  32. package/dist/augments/function/execution-duration.d.ts +17 -5
  33. package/dist/augments/function/execution-duration.js +16 -3
  34. package/dist/augments/function/if-truthy.d.ts +28 -0
  35. package/dist/augments/function/if-truthy.js +35 -0
  36. package/dist/augments/function/wrap-in-try.d.ts +12 -4
  37. package/dist/augments/function/wrap-in-try.js +64 -0
  38. package/dist/augments/json/append-json.d.ts +3 -3
  39. package/dist/augments/json/append-json.js +33 -0
  40. package/dist/augments/json/copy-through-json.d.ts +32 -1
  41. package/dist/augments/json/copy-through-json.js +32 -1
  42. package/dist/augments/json/json-compatible.d.ts +37 -9
  43. package/dist/augments/json/jsonify.d.ts +30 -1
  44. package/dist/augments/json/jsonify.js +31 -2
  45. package/dist/augments/log/log-colors.d.ts +41 -0
  46. package/dist/augments/log/log-colors.js +43 -2
  47. package/dist/augments/log/log-string.d.ts +21 -0
  48. package/dist/augments/log/log-string.js +9 -2
  49. package/dist/augments/log/log-writer.d.ts +22 -0
  50. package/dist/augments/log/log.d.ts +44 -1
  51. package/dist/augments/log/log.js +46 -3
  52. package/dist/augments/log/logger.d.ts +49 -0
  53. package/dist/augments/log/logger.js +21 -0
  54. package/dist/augments/number/clamp.d.ts +13 -2
  55. package/dist/augments/number/clamp.js +12 -1
  56. package/dist/augments/number/coords.d.ts +6 -2
  57. package/dist/augments/number/digit.d.ts +7 -0
  58. package/dist/augments/number/dimensions.d.ts +6 -2
  59. package/dist/augments/number/min-max.d.ts +9 -2
  60. package/dist/augments/number/min-max.js +4 -2
  61. package/dist/augments/number/number-conversion.d.ts +9 -3
  62. package/dist/augments/number/number-conversion.js +10 -4
  63. package/dist/augments/number/round.d.ts +19 -0
  64. package/dist/augments/number/round.js +19 -0
  65. package/dist/augments/number/scientific.d.ts +18 -1
  66. package/dist/augments/number/scientific.js +18 -1
  67. package/dist/augments/number/truncate-number.d.ts +24 -3
  68. package/dist/augments/number/truncate-number.js +28 -8
  69. package/dist/augments/number/wrap-number.d.ts +9 -3
  70. package/dist/augments/number/wrap-number.js +8 -2
  71. package/dist/augments/object/diff.d.ts +27 -5
  72. package/dist/augments/object/diff.js +20 -4
  73. package/dist/augments/object/empty.d.ts +7 -1
  74. package/dist/augments/object/get-or-set.d.ts +6 -27
  75. package/dist/augments/object/get-or-set.js +66 -4
  76. package/dist/augments/object/key-count.d.ts +4 -0
  77. package/dist/augments/object/map-entries.js +23 -0
  78. package/dist/augments/object/map-enum.d.ts +7 -0
  79. package/dist/augments/object/map-enum.js +24 -0
  80. package/dist/augments/object/map-values.d.ts +25 -13
  81. package/dist/augments/object/map-values.js +29 -21
  82. package/dist/augments/object/merge-deep.d.ts +4 -0
  83. package/dist/augments/object/merge-deep.js +4 -0
  84. package/dist/augments/object/merge-defined-properties.d.ts +13 -0
  85. package/dist/augments/object/merge-defined-properties.js +13 -0
  86. package/dist/augments/object/merge-property-arrays.d.ts +28 -0
  87. package/dist/augments/object/merge-property-arrays.js +28 -0
  88. package/dist/augments/object/object-entries.d.ts +27 -0
  89. package/dist/augments/object/object-entries.js +27 -0
  90. package/dist/augments/object/object-filter.d.ts +20 -0
  91. package/dist/augments/object/object-filter.js +20 -0
  92. package/dist/augments/object/object-keys.d.ts +32 -0
  93. package/dist/augments/object/object-keys.js +32 -0
  94. package/dist/augments/object/object-values.d.ts +9 -0
  95. package/dist/augments/object/object-values.js +9 -0
  96. package/dist/augments/path/esm-path.d.ts +26 -0
  97. package/dist/augments/path/esm-path.js +31 -0
  98. package/dist/augments/prisma/base-prisma-types.d.ts +38 -0
  99. package/dist/augments/prisma/prisma-basic-model.d.ts +29 -0
  100. package/dist/augments/prisma/prisma-basic-model.js +1 -0
  101. package/dist/augments/prisma/prisma-full-model.d.ts +37 -0
  102. package/dist/augments/prisma/prisma-full-model.js +1 -0
  103. package/dist/augments/prisma/prisma-model-create.d.ts +159 -0
  104. package/dist/augments/prisma/prisma-model-create.js +58 -0
  105. package/dist/augments/prisma/prisma-model-name.d.ts +18 -0
  106. package/dist/augments/prisma/prisma-model-name.js +1 -0
  107. package/dist/augments/promise/timed-promise.d.ts +15 -0
  108. package/dist/augments/promise/timed-promise.js +15 -0
  109. package/dist/augments/random/random-boolean.d.ts +6 -0
  110. package/dist/augments/random/random-boolean.js +6 -0
  111. package/dist/augments/random/random-integer.d.ts +3 -1
  112. package/dist/augments/random/random-integer.js +3 -1
  113. package/dist/augments/random/random-string.d.ts +6 -2
  114. package/dist/augments/random/random-string.js +6 -2
  115. package/dist/augments/regexp/match.d.ts +10 -0
  116. package/dist/augments/regexp/match.js +13 -0
  117. package/dist/augments/regexp/regexp-flags.d.ts +56 -3
  118. package/dist/augments/regexp/regexp-flags.js +71 -14
  119. package/dist/augments/regexp/regexp-string.d.ts +4 -0
  120. package/dist/augments/regexp/regexp-string.js +5 -1
  121. package/dist/augments/selection-set/select-collapsed.d.ts +46 -3
  122. package/dist/augments/selection-set/select-collapsed.js +40 -2
  123. package/dist/augments/selection-set/select-from.d.ts +47 -2
  124. package/dist/augments/selection-set/select-from.js +48 -1
  125. package/dist/augments/selection-set/selection-set.d.ts +26 -7
  126. package/dist/augments/selection-set/selection-set.js +1 -4
  127. package/dist/augments/string/casing/capitalization.d.ts +15 -1
  128. package/dist/augments/string/casing/capitalization.js +14 -0
  129. package/dist/augments/string/casing/casing.d.ts +53 -7
  130. package/dist/augments/string/casing/casing.js +36 -11
  131. package/dist/augments/string/casing/kebab-and-camel.d.ts +14 -0
  132. package/dist/augments/string/casing/kebab-and-camel.js +20 -5
  133. package/dist/augments/string/comma.d.ts +26 -0
  134. package/dist/augments/string/{commas.js → comma.js} +21 -2
  135. package/dist/augments/string/join.d.ts +15 -4
  136. package/dist/augments/string/join.js +15 -4
  137. package/dist/augments/string/prefix.d.ts +6 -0
  138. package/dist/augments/string/prefix.js +4 -0
  139. package/dist/augments/string/remove-duplicate-characters.d.ts +17 -0
  140. package/dist/augments/string/remove-duplicate-characters.js +22 -0
  141. package/dist/augments/string/replace.d.ts +17 -0
  142. package/dist/augments/string/replace.js +17 -0
  143. package/dist/augments/string/split.d.ts +29 -2
  144. package/dist/augments/string/split.js +32 -7
  145. package/dist/augments/string/substring-index.d.ts +11 -5
  146. package/dist/augments/string/substring-index.js +12 -3
  147. package/dist/augments/string/suffix.d.ts +22 -0
  148. package/dist/augments/string/suffix.js +16 -0
  149. package/dist/augments/string/white-space.d.ts +8 -1
  150. package/dist/augments/string/white-space.js +8 -1
  151. package/dist/augments/string/wrap-string.d.ts +15 -0
  152. package/dist/augments/string/wrap-string.js +15 -0
  153. package/dist/augments/type/ensure-type.d.ts +4 -0
  154. package/dist/augments/type/ensure-type.js +4 -0
  155. package/dist/augments/type/readonly.d.ts +7 -0
  156. package/dist/augments/type/readonly.js +7 -0
  157. package/dist/augments/type/type-recursion.d.ts +93 -1
  158. package/dist/augments/type/union.d.ts +1 -0
  159. package/dist/augments/type/union.js +1 -0
  160. package/dist/augments/type/void-type.d.ts +6 -2
  161. package/dist/augments/type/writable.d.ts +7 -0
  162. package/dist/augments/type/writable.js +7 -0
  163. package/dist/index.d.ts +11 -5
  164. package/dist/index.js +11 -5
  165. package/package.json +19 -9
  166. package/dist/augments/boolean/if-truthy.d.ts +0 -2
  167. package/dist/augments/boolean/if-truthy.js +0 -9
  168. package/dist/augments/file/esm-path.d.ts +0 -4
  169. package/dist/augments/file/esm-path.js +0 -8
  170. package/dist/augments/prisma/prisma-models.d.ts +0 -106
  171. package/dist/augments/regexp/safe-match.d.ts +0 -1
  172. package/dist/augments/regexp/safe-match.js +0 -4
  173. package/dist/augments/string/commas.d.ts +0 -7
  174. /package/dist/augments/prisma/{prisma-models.js → base-prisma-types.js} +0 -0
@@ -4,7 +4,9 @@
4
4
  *
5
5
  * This function uses cryptographically secure randomness.
6
6
  *
7
- * @category Random:Common
7
+ * @category Random
8
+ * @category Package : @augment-vir/common
9
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
8
10
  */
9
11
  export declare function randomInteger({ min: rawMin, max: rawMax }: {
10
12
  min: number;
@@ -5,7 +5,9 @@ import { ensureMinMax } from '../number/min-max.js';
5
5
  *
6
6
  * This function uses cryptographically secure randomness.
7
7
  *
8
- * @category Random:Common
8
+ * @category Random
9
+ * @category Package : @augment-vir/common
10
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
9
11
  */
10
12
  export function randomInteger({ min: rawMin, max: rawMax }) {
11
13
  const { min, max } = ensureMinMax({ min: Math.floor(rawMin), max: Math.floor(rawMax) });
@@ -1,7 +1,9 @@
1
1
  /**
2
2
  * All letters allowed in {@link randomString}.
3
3
  *
4
- * @category Random:Common
4
+ * @category Random : Util
5
+ * @category Package : @augment-vir/common
6
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
5
7
  */
6
8
  export declare const allowedRandomStringLetters: ReadonlyArray<string>;
7
9
  /**
@@ -9,6 +11,8 @@ export declare const allowedRandomStringLetters: ReadonlyArray<string>;
9
11
  *
10
12
  * This function uses cryptographically secure randomness.
11
13
  *
12
- * @category Random:Common
14
+ * @category Random
15
+ * @category Package : @augment-vir/common
16
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
13
17
  */
14
18
  export declare function randomString(generatedStringLength?: number): string;
@@ -2,7 +2,9 @@ import { randomInteger } from './random-integer.js';
2
2
  /**
3
3
  * All letters allowed in {@link randomString}.
4
4
  *
5
- * @category Random:Common
5
+ * @category Random : Util
6
+ * @category Package : @augment-vir/common
7
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
6
8
  */
7
9
  export const allowedRandomStringLetters = [
8
10
  'a',
@@ -47,7 +49,9 @@ export const allowedRandomStringLetters = [
47
49
  *
48
50
  * This function uses cryptographically secure randomness.
49
51
  *
50
- * @category Random:Common
52
+ * @category Random
53
+ * @category Package : @augment-vir/common
54
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
51
55
  */
52
56
  export function randomString(generatedStringLength = 16) {
53
57
  let stringBuilder = '';
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Performs
3
+ * [`''.match`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/match)
4
+ * but falls back to an empty array if no match was found.
5
+ *
6
+ * @category RegExp
7
+ * @category Package : @augment-vir/common
8
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
9
+ */
10
+ export declare function safeMatch(input: string, regExp: RegExp): string[];
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Performs
3
+ * [`''.match`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String/match)
4
+ * but falls back to an empty array if no match was found.
5
+ *
6
+ * @category RegExp
7
+ * @category Package : @augment-vir/common
8
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
9
+ */
10
+ export function safeMatch(input, regExp) {
11
+ const match = input.match(regExp);
12
+ return match ?? [];
13
+ }
@@ -1,3 +1,56 @@
1
- export declare function deDupeRegExFlags(flags: string): string;
2
- export declare function addRegExpFlags(originalRegExp: RegExp, flags: string): RegExp;
3
- export declare function makeCaseInsensitiveRegExp(searchForInput: string | RegExp, caseSensitive: boolean): RegExp;
1
+ /**
2
+ * Creates a new RegExp by adding the given `flags` to the original RegExp.
3
+ *
4
+ * @category RegExp
5
+ * @category Package : @augment-vir/common
6
+ * @example
7
+ *
8
+ * ```ts
9
+ * import {addRegExpFlags} from '@augment-vir/common';
10
+ *
11
+ * addRegExpFlags(/a/i, 'gm');
12
+ * // output is `/a/igm`
13
+ * ```
14
+ *
15
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
16
+ */
17
+ export declare function addRegExpFlags(originalRegExpOrString: RegExp | string, flags: string): RegExp;
18
+ /**
19
+ * Creates a new RegExp with the given `flags`.
20
+ *
21
+ * @category RegExp
22
+ * @category Package : @augment-vir/common
23
+ * @example
24
+ *
25
+ * ```ts
26
+ * import {setRegExpFlags} from '@augment-vir/common';
27
+ *
28
+ * setRegExpFlags(/a/i, 'gm');
29
+ * // output is `/a/gm`
30
+ * ```
31
+ *
32
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
33
+ */
34
+ export declare function setRegExpFlags(originalRegExpOrString: RegExp | string, flags: string): RegExp;
35
+ /**
36
+ * Creates a new RegExp by adding or removing the case insensitivity flag `'i'`, based on the given
37
+ * `caseSensitive` input. The first input can also be a string and it will be converted into a
38
+ * RegExp.
39
+ *
40
+ * @category RegExp
41
+ * @category Package : @augment-vir/common
42
+ * @example
43
+ *
44
+ * ```ts
45
+ * import {setRegExpCaseSensitivity} from '@augment-vir/common';
46
+ *
47
+ * setRegExpCaseSensitivity(/abc/i, {caseSensitive: true}); // output is `/abc/`
48
+ * setRegExpCaseSensitivity(/abc/, {caseSensitive: false}); // output is `/abc/i`
49
+ * setRegExpCaseSensitivity('abc', {caseSensitive: true}); // output is `/abc/i`
50
+ * ```
51
+ *
52
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
53
+ */
54
+ export declare function setRegExpCaseSensitivity(originalRegExpOrString: string | RegExp, { caseSensitive }: {
55
+ caseSensitive: boolean;
56
+ }): RegExp;
@@ -1,18 +1,75 @@
1
+ import { removeDuplicateCharacters } from '../string/remove-duplicate-characters.js';
1
2
  import { escapeStringForRegExp } from './regexp-string.js';
2
- export function deDupeRegExFlags(flags) {
3
- const deDuped = new Set(Array.from(flags.toLowerCase()));
4
- return Array.from(deDuped).join('');
5
- }
6
- export function addRegExpFlags(originalRegExp, flags) {
7
- return new RegExp(originalRegExp.source, deDupeRegExFlags([
8
- originalRegExp.flags,
3
+ /**
4
+ * Creates a new RegExp by adding the given `flags` to the original RegExp.
5
+ *
6
+ * @category RegExp
7
+ * @category Package : @augment-vir/common
8
+ * @example
9
+ *
10
+ * ```ts
11
+ * import {addRegExpFlags} from '@augment-vir/common';
12
+ *
13
+ * addRegExpFlags(/a/i, 'gm');
14
+ * // output is `/a/igm`
15
+ * ```
16
+ *
17
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
18
+ */
19
+ export function addRegExpFlags(originalRegExpOrString, flags) {
20
+ const allFlags = removeDuplicateCharacters([
21
+ typeof originalRegExpOrString === 'string' ? '' : originalRegExpOrString.flags,
9
22
  flags,
10
- ].join('')));
23
+ ]
24
+ .join('')
25
+ .toLowerCase());
26
+ return setRegExpFlags(originalRegExpOrString, allFlags);
27
+ }
28
+ /**
29
+ * Creates a new RegExp with the given `flags`.
30
+ *
31
+ * @category RegExp
32
+ * @category Package : @augment-vir/common
33
+ * @example
34
+ *
35
+ * ```ts
36
+ * import {setRegExpFlags} from '@augment-vir/common';
37
+ *
38
+ * setRegExpFlags(/a/i, 'gm');
39
+ * // output is `/a/gm`
40
+ * ```
41
+ *
42
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
43
+ */
44
+ export function setRegExpFlags(originalRegExpOrString, flags) {
45
+ const allFlags = removeDuplicateCharacters(flags);
46
+ if (typeof originalRegExpOrString === 'string') {
47
+ return new RegExp(escapeStringForRegExp(originalRegExpOrString), allFlags);
48
+ }
49
+ else {
50
+ return new RegExp(originalRegExpOrString.source, allFlags);
51
+ }
11
52
  }
12
- export function makeCaseInsensitiveRegExp(searchForInput, caseSensitive) {
13
- const regExpFlags = `g${!caseSensitive && typeof searchForInput === 'string' ? 'i' : ''}`;
14
- const searchFor = searchForInput instanceof RegExp
15
- ? new RegExp(searchForInput.source, deDupeRegExFlags(`${searchForInput.flags}${regExpFlags}`))
16
- : new RegExp(escapeStringForRegExp(searchForInput), regExpFlags);
17
- return searchFor;
53
+ /**
54
+ * Creates a new RegExp by adding or removing the case insensitivity flag `'i'`, based on the given
55
+ * `caseSensitive` input. The first input can also be a string and it will be converted into a
56
+ * RegExp.
57
+ *
58
+ * @category RegExp
59
+ * @category Package : @augment-vir/common
60
+ * @example
61
+ *
62
+ * ```ts
63
+ * import {setRegExpCaseSensitivity} from '@augment-vir/common';
64
+ *
65
+ * setRegExpCaseSensitivity(/abc/i, {caseSensitive: true}); // output is `/abc/`
66
+ * setRegExpCaseSensitivity(/abc/, {caseSensitive: false}); // output is `/abc/i`
67
+ * setRegExpCaseSensitivity('abc', {caseSensitive: true}); // output is `/abc/i`
68
+ * ```
69
+ *
70
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
71
+ */
72
+ export function setRegExpCaseSensitivity(originalRegExpOrString, { caseSensitive }) {
73
+ const caseSensitivityFlag = caseSensitive ? '' : 'i';
74
+ return addRegExpFlags(originalRegExpOrString, caseSensitivityFlag);
18
75
  }
@@ -1,5 +1,9 @@
1
1
  /**
2
2
  * Escapes characters from the given string so that it can be used within a RegExp without being
3
3
  * parsed as RegExp syntax.
4
+ *
5
+ * @category RegExp
6
+ * @category Package : @augment-vir/common
7
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
4
8
  */
5
9
  export declare function escapeStringForRegExp(input: string): string;
@@ -1,7 +1,11 @@
1
1
  /**
2
2
  * Escapes characters from the given string so that it can be used within a RegExp without being
3
3
  * parsed as RegExp syntax.
4
+ *
5
+ * @category RegExp
6
+ * @category Package : @augment-vir/common
7
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
4
8
  */
5
9
  export function escapeStringForRegExp(input) {
6
- return input.replace(/[\^$\\.*+?()[\]{}|]/g, String.raw `\$&`);
10
+ return input.replaceAll(/[\^$\\.*+?()[\]{}|]/g, String.raw `\$&`);
7
11
  }
@@ -2,10 +2,53 @@ import type { AnyObject, Values } from '@augment-vir/core';
2
2
  import { ExcludeEmpty } from '../object/empty.js';
3
3
  import { KeyCount } from '../object/key-count.js';
4
4
  import { TsRecurse, TsRecursionStart, TsRecursionTracker, TsTooMuchRecursion } from '../type/type-recursion.js';
5
- import { GenericSelectionSet, PickSelection, SelectionSet } from './selection-set.js';
5
+ import { GenericSelectionSet, SelectFrom, SelectionSet } from './selection-set.js';
6
+ /**
7
+ * The same as {@link selectFrom} except that the final output is collapsed until the first nested
8
+ * value that has more than 1 key or that is not an object.
9
+ *
10
+ * @category Selection
11
+ * @category Package : @augment-vir/common
12
+ * @example
13
+ *
14
+ * ```ts
15
+ * import {selectCollapsedFrom} from '@augment-vir/common';
16
+ *
17
+ * selectCollapsedFrom(
18
+ * [
19
+ * {
20
+ * child: {
21
+ * grandChild: 'hi',
22
+ * grandChild2: 3,
23
+ * grandChild3: /something/,
24
+ * },
25
+ * },
26
+ * {
27
+ * child: {
28
+ * grandChild: 'hi',
29
+ * grandChild2: 4,
30
+ * grandChild3: /something/,
31
+ * },
32
+ * },
33
+ * ],
34
+ * {
35
+ * child: {
36
+ * grandChild2: true,
37
+ * },
38
+ * },
39
+ * );
40
+ * // output is `[3, 4]`
41
+ * ```
42
+ *
43
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
44
+ */
6
45
  export declare function selectCollapsedFrom<Full extends AnyObject, const Selection extends SelectionSet<NoInfer<Full>>>(originalObject: Readonly<Full>, selectionSet: Readonly<Selection>): PickCollapsedSelection<Full, Selection>;
7
46
  /**
8
47
  * Collapses a selected value to the first part of the selection that contains more than 1 key or
9
- * that is not an object.
48
+ * that is not an object. This produces the output type for {@link selectCollapsedFrom}.
49
+ *
50
+ * @category Selection
51
+ * @category Package : @augment-vir/common
52
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
10
53
  */
11
- export type PickCollapsedSelection<Full extends Readonly<AnyObject>, Selection extends SelectionSet<Full>, Depth extends TsRecursionTracker = TsRecursionStart> = Depth extends TsTooMuchRecursion ? 'Error: recursive object depth is too deep.' : KeyCount<ExcludeEmpty<NonNullable<PickSelection<Full, Selection, Depth>>>> extends 1 ? Selection[keyof PickSelection<Full, Selection, Depth>] extends GenericSelectionSet ? PickCollapsedSelection<NonNullable<Full[keyof PickSelection<Full, Selection, Depth>]>, Selection[keyof PickSelection<Full, Selection, Depth>], TsRecurse<Depth>> | Extract<Full[keyof PickSelection<Full, Selection, Depth>], undefined | null> : Values<PickSelection<Full, Selection, Depth>> : PickSelection<Full, Selection, Depth>;
54
+ export type PickCollapsedSelection<Full extends Readonly<AnyObject>, Selection extends SelectionSet<Full>, Depth extends TsRecursionTracker = TsRecursionStart> = Depth extends TsTooMuchRecursion ? 'Error: recursive object depth is too deep.' : KeyCount<ExcludeEmpty<NonNullable<SelectFrom<Full, Selection, Depth>>>> extends 1 ? Selection[keyof SelectFrom<Full, Selection, Depth>] extends GenericSelectionSet ? PickCollapsedSelection<NonNullable<Full[keyof SelectFrom<Full, Selection, Depth>]>, Selection[keyof SelectFrom<Full, Selection, Depth>], TsRecurse<Depth>> | Extract<Full[keyof SelectFrom<Full, Selection, Depth>], undefined | null> : Values<SelectFrom<Full, Selection, Depth>> : SelectFrom<Full, Selection, Depth>;
@@ -1,6 +1,44 @@
1
1
  import { check } from '@augment-vir/assert';
2
- import { selectFrom } from './select-from.js';
3
- import { shouldPreserveInSelectionSet, } from './selection-set.js';
2
+ import { selectFrom, shouldPreserveInSelectionSet } from './select-from.js';
3
+ /**
4
+ * The same as {@link selectFrom} except that the final output is collapsed until the first nested
5
+ * value that has more than 1 key or that is not an object.
6
+ *
7
+ * @category Selection
8
+ * @category Package : @augment-vir/common
9
+ * @example
10
+ *
11
+ * ```ts
12
+ * import {selectCollapsedFrom} from '@augment-vir/common';
13
+ *
14
+ * selectCollapsedFrom(
15
+ * [
16
+ * {
17
+ * child: {
18
+ * grandChild: 'hi',
19
+ * grandChild2: 3,
20
+ * grandChild3: /something/,
21
+ * },
22
+ * },
23
+ * {
24
+ * child: {
25
+ * grandChild: 'hi',
26
+ * grandChild2: 4,
27
+ * grandChild3: /something/,
28
+ * },
29
+ * },
30
+ * ],
31
+ * {
32
+ * child: {
33
+ * grandChild2: true,
34
+ * },
35
+ * },
36
+ * );
37
+ * // output is `[3, 4]`
38
+ * ```
39
+ *
40
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
41
+ */
4
42
  export function selectCollapsedFrom(originalObject, selectionSet) {
5
43
  const selected = selectFrom(originalObject, selectionSet);
6
44
  return collapseObject(selected, selectionSet);
@@ -1,3 +1,48 @@
1
1
  import type { AnyObject } from '@augment-vir/core';
2
- import { PickSelection, SelectionSet } from './selection-set.js';
3
- export declare function selectFrom<Full extends AnyObject, const Selection extends SelectionSet<NoInfer<Full>>>(originalObject: Readonly<Full>, selectionSet: Readonly<Selection>): PickSelection<Full, Selection>;
2
+ import { SelectFrom, SelectionSet } from './selection-set.js';
3
+ /**
4
+ * Determine if the given input should be preserved in the selection output, meaning it won't be
5
+ * recursed into.
6
+ *
7
+ * @ignore
8
+ */
9
+ export declare function shouldPreserveInSelectionSet(input: unknown): boolean;
10
+ /**
11
+ * Performs a SQL-like nested selection on an object, extracting the selected values.
12
+ *
13
+ * @category Selection
14
+ * @category Package : @augment-vir/common
15
+ * @example
16
+ *
17
+ * ```ts
18
+ * import {selectFrom} from '@augment-vir/common';
19
+ *
20
+ * selectFrom(
21
+ * [
22
+ * {
23
+ * child: {
24
+ * grandChild: 'hi',
25
+ * grandChild2: 3,
26
+ * grandChild3: /something/,
27
+ * },
28
+ * },
29
+ * {
30
+ * child: {
31
+ * grandChild: 'hi',
32
+ * grandChild2: 4,
33
+ * grandChild3: /something/,
34
+ * },
35
+ * },
36
+ * ],
37
+ * {
38
+ * child: {
39
+ * grandChild2: true,
40
+ * },
41
+ * },
42
+ * );
43
+ * // output is `[{child: {grandChild2: 3}}, {child: {grandChild2: 4}}]`
44
+ * ```
45
+ *
46
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
47
+ */
48
+ export declare function selectFrom<Full extends AnyObject, const Selection extends SelectionSet<NoInfer<Full>>>(originalObject: Readonly<Full>, selectionSet: Readonly<Selection>): SelectFrom<Full, Selection>;
@@ -1,6 +1,53 @@
1
+ import { check } from '@augment-vir/assert';
1
2
  import { mapObjectValues } from '../object/map-values.js';
2
3
  import { omitObjectKeys } from '../object/object-keys.js';
3
- import { shouldPreserveInSelectionSet } from './selection-set.js';
4
+ /**
5
+ * Determine if the given input should be preserved in the selection output, meaning it won't be
6
+ * recursed into.
7
+ *
8
+ * @ignore
9
+ */
10
+ export function shouldPreserveInSelectionSet(input) {
11
+ return check.isPrimitive(input) || input instanceof RegExp || input instanceof Promise;
12
+ }
13
+ /**
14
+ * Performs a SQL-like nested selection on an object, extracting the selected values.
15
+ *
16
+ * @category Selection
17
+ * @category Package : @augment-vir/common
18
+ * @example
19
+ *
20
+ * ```ts
21
+ * import {selectFrom} from '@augment-vir/common';
22
+ *
23
+ * selectFrom(
24
+ * [
25
+ * {
26
+ * child: {
27
+ * grandChild: 'hi',
28
+ * grandChild2: 3,
29
+ * grandChild3: /something/,
30
+ * },
31
+ * },
32
+ * {
33
+ * child: {
34
+ * grandChild: 'hi',
35
+ * grandChild2: 4,
36
+ * grandChild3: /something/,
37
+ * },
38
+ * },
39
+ * ],
40
+ * {
41
+ * child: {
42
+ * grandChild2: true,
43
+ * },
44
+ * },
45
+ * );
46
+ * // output is `[{child: {grandChild2: 3}}, {child: {grandChild2: 4}}]`
47
+ * ```
48
+ *
49
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
50
+ */
4
51
  export function selectFrom(originalObject, selectionSet) {
5
52
  if (Array.isArray(originalObject)) {
6
53
  return originalObject.map((originalEntry) => selectFrom(originalEntry, selectionSet));
@@ -1,18 +1,37 @@
1
1
  import type { AnyObject } from '@augment-vir/core';
2
2
  import { IsAny, IsNever, Primitive, UnionToIntersection } from 'type-fest';
3
3
  import { TsRecurse, TsRecursionStart, TsRecursionTracker, TsTooMuchRecursion } from '../type/type-recursion.js';
4
- export declare function shouldPreserveInSelectionSet(input: unknown): input is SelectionTypesToPreserve;
5
4
  /** All types that won't be recursed into when defining a {@link SelectionSet}. */
6
- export type SelectionTypesToPreserve = Primitive | RegExp | Promise<any>;
7
- /** A generic selection set without specific keys. */
5
+ type SelectionTypesToPreserve = Primitive | RegExp | Promise<any>;
6
+ /**
7
+ * A generic selection set without specific keys. Useful for type parameter baselines.
8
+ *
9
+ * @category Selection
10
+ * @category Package : @augment-vir/common
11
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
12
+ */
8
13
  export type GenericSelectionSet = {
9
14
  [Key in PropertyKey]: unknown;
10
15
  };
11
- /** Masks an object value with the given {@link SelectionSet}. */
12
- export type PickSelection<Full extends Readonly<AnyObject>, Selection extends SelectionSet<Full>, Depth extends TsRecursionTracker = TsRecursionStart> = Depth extends TsTooMuchRecursion ? ['Error: recursive object depth is too deep.'] : Full extends ReadonlyArray<infer Element extends any> ? (PickSelection<Extract<Element, AnyObject>, Selection, TsRecurse<Depth>> | Exclude<Element, AnyObject>)[] : {
13
- -readonly [Key in keyof Selection as Selection[Key] extends false ? never : Key extends keyof Full ? Key : never]: (Selection[Key] extends GenericSelectionSet ? PickSelection<NonNullable<Extract<Full[Key], AnyObject>>, Selection[Key], TsRecurse<Depth>> : Full[Key]) | Exclude<Full[Key], AnyObject>;
16
+ /**
17
+ * Performs a SQL-like nested selection on an object, extracting the selected values. This produces
18
+ * the output type for `selectFrom`.
19
+ *
20
+ * @category Selection
21
+ * @category Package : @augment-vir/common
22
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
23
+ */
24
+ export type SelectFrom<Full extends Readonly<AnyObject>, Selection extends SelectionSet<Full>, Depth extends TsRecursionTracker = TsRecursionStart> = Depth extends TsTooMuchRecursion ? ['Error: recursive object depth is too deep.'] : Full extends ReadonlyArray<infer Element extends any> ? (SelectFrom<Extract<Element, AnyObject>, Selection, TsRecurse<Depth>> | Exclude<Element, AnyObject>)[] : {
25
+ -readonly [Key in keyof Selection as Selection[Key] extends false ? never : Key extends keyof Full ? Key : never]: (Selection[Key] extends GenericSelectionSet ? SelectFrom<NonNullable<Extract<Full[Key], AnyObject>>, Selection[Key], TsRecurse<Depth>> : Full[Key]) | Exclude<Full[Key], AnyObject>;
14
26
  };
15
- /** Defines a selection set for the given object. */
27
+ /**
28
+ * Defines a selection set for a given object type. This is used in {@link SelectFrom}.
29
+ *
30
+ * @category Selection
31
+ * @category Package : @augment-vir/common
32
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
33
+ */
16
34
  export type SelectionSet<Full extends Readonly<AnyObject>, Depth extends TsRecursionTracker = TsRecursionStart> = IsAny<Full> extends true ? any : Depth extends TsTooMuchRecursion ? boolean : Full extends ReadonlyArray<infer FullChild extends AnyObject> ? SelectionSet<FullChild, TsRecurse<Depth>> : Partial<{
17
35
  [Key in keyof Full]: IsNever<Exclude<Full[Key], SelectionTypesToPreserve>> extends true ? boolean : UnionToIntersection<SelectionSet<NonNullable<Required<Full>[Key]>, TsRecurse<Depth>>> | boolean;
18
36
  }>;
37
+ export {};
@@ -1,4 +1 @@
1
- import { check } from '@augment-vir/assert';
2
- export function shouldPreserveInSelectionSet(input) {
3
- return check.isPrimitive(input) || input instanceof RegExp || input instanceof Promise;
4
- }
1
+ export {};
@@ -1,3 +1,17 @@
1
1
  import { CasingOptions } from './casing.js';
2
- export declare function maybeCapitalize(input: string, casingOptions: Partial<CasingOptions>): string;
2
+ /**
3
+ * Capitalize the first letter of the input _only if_ the given options specifies doing so.
4
+ *
5
+ * @category String
6
+ * @category Package : @augment-vir/common
7
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
8
+ */
9
+ export declare function maybeCapitalize(input: string, casingOptions: Pick<CasingOptions, 'capitalizeFirstLetter'>): string;
10
+ /**
11
+ * Capitalize the first letter of the input.
12
+ *
13
+ * @category String
14
+ * @category Package : @augment-vir/common
15
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
16
+ */
3
17
  export declare function capitalizeFirstLetter<InputGeneric extends string>(input: InputGeneric): Capitalize<InputGeneric>;
@@ -1,6 +1,20 @@
1
+ /**
2
+ * Capitalize the first letter of the input _only if_ the given options specifies doing so.
3
+ *
4
+ * @category String
5
+ * @category Package : @augment-vir/common
6
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
7
+ */
1
8
  export function maybeCapitalize(input, casingOptions) {
2
9
  return casingOptions.capitalizeFirstLetter ? capitalizeFirstLetter(input) : input;
3
10
  }
11
+ /**
12
+ * Capitalize the first letter of the input.
13
+ *
14
+ * @category String
15
+ * @category Package : @augment-vir/common
16
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
17
+ */
4
18
  export function capitalizeFirstLetter(input) {
5
19
  if (!input.length) {
6
20
  return '';
@@ -1,20 +1,62 @@
1
1
  import { PartialWithUndefined } from '@augment-vir/core';
2
+ /**
3
+ * Options for casing functions in `@augment-vir/common`.
4
+ *
5
+ * @category String
6
+ * @category Package : @augment-vir/common
7
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
8
+ */
2
9
  export type CasingOptions = {
10
+ /**
11
+ * Capitalize the first letter of the string.
12
+ *
13
+ * @default false
14
+ */
3
15
  capitalizeFirstLetter: boolean;
4
16
  };
17
+ /**
18
+ * Default options for {@link CasingOptions}.
19
+ *
20
+ * @category String
21
+ * @category Package : @augment-vir/common
22
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
23
+ */
5
24
  export declare const defaultCasingOptions: Required<CasingOptions>;
6
- export declare enum StringCaseEnum {
25
+ /**
26
+ * The different string cases.
27
+ *
28
+ * @category String
29
+ * @category Package : @augment-vir/common
30
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
31
+ */
32
+ export declare enum StringCase {
7
33
  Upper = "upper",
8
34
  Lower = "lower"
9
35
  }
10
- /** Indicates whether the given string has different lower and upper case variants. */
36
+ /**
37
+ * Indicates whether the given string has different lower and upper case variants. (Some strings
38
+ * don't, such as all numbers or `'√'`.)
39
+ *
40
+ * @category String
41
+ * @category Package : @augment-vir/common
42
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
43
+ */
11
44
  export declare function hasCase(input: string): boolean;
45
+ /**
46
+ * Options for {@link isCase}.
47
+ *
48
+ * @category String
49
+ * @category Package : @augment-vir/common
50
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
51
+ */
12
52
  export type IsCaseOptions = {
13
53
  /**
14
- * Fail on characters that don't have different upper and lower case versions (such as
15
- * punctuation, like `'.'` or symbols, like `'√'`).
54
+ * Set to `true` to fail on characters that don't have different upper and lower case versions
55
+ * (such as punctuation, like `'.'` or symbols, like `'√'`).
56
+ *
57
+ * @default false
16
58
  */
17
- failOnNoCaseCharacters: boolean;
59
+ rejectNoCaseCharacters: boolean;
18
60
  };
19
61
  /**
20
62
  * Checks if the given string is exclusively of the specific case.
@@ -22,6 +64,10 @@ export type IsCaseOptions = {
22
64
  * Note that some characters have no casing, such as punctuation (they have no difference between
23
65
  * upper and lower casings). By default, those letters always return `true` for this function,
24
66
  * regardless of which `caseType` is provided. To instead return `false` for any such characters,
25
- * pass in an options object and set blockNoCaseCharacters to true.
67
+ * pass in an options object and set `rejectNoCaseCharacters` to true.
68
+ *
69
+ * @category String
70
+ * @category Package : @augment-vir/common
71
+ * @package [`@augment-vir/common`](https://www.npmjs.com/package/@augment-vir/common)
26
72
  */
27
- export declare function isCase(input: string, caseType: StringCaseEnum, options?: PartialWithUndefined<IsCaseOptions>): boolean;
73
+ export declare function isCase(input: string, caseType: StringCase, options?: PartialWithUndefined<IsCaseOptions>): boolean;