@ezez/utils 4.7.1 → 4.8.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.
Files changed (174) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +1 -0
  3. package/dist/formatHash.d.ts +3 -0
  4. package/dist/formatHash.d.ts.map +1 -0
  5. package/dist/formatHash.js +14 -0
  6. package/dist/formatHash.js.map +1 -0
  7. package/dist/getMultiple.d.ts +1 -1
  8. package/dist/getMultiple.d.ts.map +1 -1
  9. package/dist/getMultiple.js.map +1 -1
  10. package/dist/index.d.ts +1 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/insertSeparator.d.ts +1 -1
  15. package/dist/insertSeparator.d.ts.map +1 -1
  16. package/dist/insertSeparator.js.map +1 -1
  17. package/dist/mapValues.js.map +1 -1
  18. package/dist/sample.d.ts +1 -1
  19. package/dist/sample.d.ts.map +1 -1
  20. package/dist/seq.d.ts +1 -1
  21. package/dist/seq.d.ts.map +1 -1
  22. package/dist/seq.js.map +1 -1
  23. package/dist/serializeToBuffer/serializeToBuffer.d.ts.map +1 -1
  24. package/dist/serializeToBuffer/serializeToBuffer.js +5 -2
  25. package/dist/serializeToBuffer/serializeToBuffer.js.map +1 -1
  26. package/dist/setImmutable.d.ts +1 -1
  27. package/dist/setImmutable.d.ts.map +1 -1
  28. package/dist/sortByMultiple.d.ts +1 -1
  29. package/dist/sortByMultiple.d.ts.map +1 -1
  30. package/docs/assets/navigation.js +1 -1
  31. package/docs/assets/search.js +1 -1
  32. package/docs/documents/Changelog.html +71 -65
  33. package/docs/functions/index.assertProps.html +2 -2
  34. package/docs/functions/index.cap.html +2 -2
  35. package/docs/functions/index.capitalize.html +2 -2
  36. package/docs/functions/index.coalesce.html +2 -2
  37. package/docs/functions/index.compareArrays.html +2 -2
  38. package/docs/functions/index.compareProps.html +2 -2
  39. package/docs/functions/index.deserialize.html +2 -2
  40. package/docs/functions/index.ensureArray.html +2 -2
  41. package/docs/functions/index.ensureDate.html +2 -2
  42. package/docs/functions/index.ensureError.html +2 -2
  43. package/docs/functions/index.ensurePrefix.html +2 -2
  44. package/docs/functions/index.ensureSuffix.html +2 -2
  45. package/docs/functions/index.ensureTimestamp.html +2 -2
  46. package/docs/functions/index.escapeRegExp.html +2 -2
  47. package/docs/functions/index.formatDate.html +2 -2
  48. package/docs/functions/index.formatHash.html +6 -0
  49. package/docs/functions/index.get.html +2 -2
  50. package/docs/functions/index.getMultiple.html +2 -2
  51. package/docs/functions/index.hasProps.html +2 -2
  52. package/docs/functions/index.ignore.html +2 -2
  53. package/docs/functions/index.insertSeparator.html +2 -2
  54. package/docs/functions/index.isEmpty.html +2 -2
  55. package/docs/functions/index.isNumericString.html +2 -2
  56. package/docs/functions/index.isPlainObject.html +2 -2
  57. package/docs/functions/index.last.html +2 -2
  58. package/docs/functions/index.later-1.html +2 -2
  59. package/docs/functions/index.mapAsync.html +2 -2
  60. package/docs/functions/index.mapValues.html +2 -2
  61. package/docs/functions/index.match.html +2 -2
  62. package/docs/functions/index.memoize.html +2 -2
  63. package/docs/functions/index.merge.html +2 -2
  64. package/docs/functions/index.mostFrequent.html +2 -2
  65. package/docs/functions/index.noop.html +2 -2
  66. package/docs/functions/index.occurrences.html +2 -2
  67. package/docs/functions/index.omit.html +2 -2
  68. package/docs/functions/index.pick.html +2 -2
  69. package/docs/functions/index.pull.html +2 -2
  70. package/docs/functions/index.race.html +2 -2
  71. package/docs/functions/index.remove.html +2 -2
  72. package/docs/functions/index.removeCommonProperties.html +2 -2
  73. package/docs/functions/index.replace.html +2 -2
  74. package/docs/functions/index.replaceDeep.html +2 -2
  75. package/docs/functions/index.rethrow.html +2 -2
  76. package/docs/functions/index.retry.html +2 -2
  77. package/docs/functions/index.round.html +2 -2
  78. package/docs/functions/index.safe.html +2 -2
  79. package/docs/functions/index.sample.html +2 -2
  80. package/docs/functions/index.samples.html +2 -2
  81. package/docs/functions/index.scale.html +2 -2
  82. package/docs/functions/index.seq.html +2 -2
  83. package/docs/functions/index.seqEarlyBreak.html +2 -2
  84. package/docs/functions/index.serialize.html +2 -2
  85. package/docs/functions/index.serializeToBuffer.html +2 -2
  86. package/docs/functions/index.set.html +2 -2
  87. package/docs/functions/index.setImmutable.html +2 -2
  88. package/docs/functions/index.shuffle.html +2 -2
  89. package/docs/functions/index.sortBy.html +2 -2
  90. package/docs/functions/index.sortByMultiple.html +2 -2
  91. package/docs/functions/index.sortProps.html +2 -2
  92. package/docs/functions/index.stripPrefix.html +2 -2
  93. package/docs/functions/index.stripSuffix.html +2 -2
  94. package/docs/functions/index.throttle.html +2 -2
  95. package/docs/functions/index.toggle.html +2 -2
  96. package/docs/functions/index.trim.html +2 -2
  97. package/docs/functions/index.trimEnd.html +2 -2
  98. package/docs/functions/index.trimStart.html +2 -2
  99. package/docs/functions/index.truthy.html +2 -2
  100. package/docs/functions/index.unique.html +2 -2
  101. package/docs/functions/index.unserializeFromBuffer.html +2 -2
  102. package/docs/functions/index.wait.html +2 -2
  103. package/docs/functions/index.waitFor.html +2 -2
  104. package/docs/functions/index.waitSync.html +2 -2
  105. package/docs/index.html +3 -2
  106. package/docs/interfaces/index.ComparePropsOptions.html +3 -3
  107. package/docs/interfaces/index.GetMultipleSource.html +2 -2
  108. package/docs/interfaces/index.GetSource.html +2 -2
  109. package/docs/interfaces/index.IsNumericStringOptions.html +2 -2
  110. package/docs/interfaces/index.OccurencesOptions.html +2 -2
  111. package/docs/interfaces/index.SetImmutableSource.html +2 -2
  112. package/docs/interfaces/index.SetSource.html +2 -2
  113. package/docs/interfaces/index.ThrottleOptions.html +3 -3
  114. package/docs/interfaces/index.ThrottledFunctionExtras.html +3 -3
  115. package/docs/modules/index.html +1 -1
  116. package/docs/modules.html +1 -1
  117. package/docs/types/index.CustomDeserializers.html +1 -1
  118. package/docs/types/index.CustomSerializers.html +1 -1
  119. package/docs/types/index.Later.html +2 -2
  120. package/docs/types/index.MapValuesFn.html +2 -2
  121. package/docs/types/index.MatchCallback.html +1 -1
  122. package/docs/types/index.MergeTwo.html +2 -2
  123. package/docs/types/index.SeqEarlyBreaker.html +2 -2
  124. package/docs/types/index.SeqFn.html +2 -2
  125. package/docs/types/index.SeqFunctions.html +2 -2
  126. package/docs/types/index.SetImmutablePath.html +2 -2
  127. package/docs/types/index.ThrottledFunction.html +1 -1
  128. package/docs/variables/index.mapValuesUNSET.html +2 -2
  129. package/docs/variables/index.mergeUNSET.html +2 -2
  130. package/esm/formatHash.d.ts +3 -0
  131. package/esm/formatHash.d.ts.map +1 -0
  132. package/esm/formatHash.js +11 -0
  133. package/esm/formatHash.js.map +1 -0
  134. package/esm/getMultiple.d.ts +1 -1
  135. package/esm/getMultiple.d.ts.map +1 -1
  136. package/esm/getMultiple.js.map +1 -1
  137. package/esm/index.d.ts +1 -0
  138. package/esm/index.d.ts.map +1 -1
  139. package/esm/index.js +1 -0
  140. package/esm/index.js.map +1 -1
  141. package/esm/insertSeparator.d.ts +1 -1
  142. package/esm/insertSeparator.d.ts.map +1 -1
  143. package/esm/insertSeparator.js.map +1 -1
  144. package/esm/mapValues.js.map +1 -1
  145. package/esm/sample.d.ts +1 -1
  146. package/esm/sample.d.ts.map +1 -1
  147. package/esm/seq.d.ts +1 -1
  148. package/esm/seq.d.ts.map +1 -1
  149. package/esm/seq.js.map +1 -1
  150. package/esm/serializeToBuffer/serializeToBuffer.d.ts.map +1 -1
  151. package/esm/serializeToBuffer/serializeToBuffer.js +5 -2
  152. package/esm/serializeToBuffer/serializeToBuffer.js.map +1 -1
  153. package/esm/setImmutable.d.ts +1 -1
  154. package/esm/setImmutable.d.ts.map +1 -1
  155. package/esm/sortByMultiple.d.ts +1 -1
  156. package/esm/sortByMultiple.d.ts.map +1 -1
  157. package/package.json +2 -2
  158. package/src/formatHash.spec.ts +32 -0
  159. package/src/formatHash.ts +24 -0
  160. package/src/getMultiple.ts +1 -1
  161. package/src/ignore.spec.ts +1 -1
  162. package/src/index.ts +1 -0
  163. package/src/insertSeparator.ts +2 -2
  164. package/src/mapValues.ts +1 -1
  165. package/src/memoize.spec.ts +1 -1
  166. package/src/remove.spec.ts +1 -1
  167. package/src/safe.ts +1 -1
  168. package/src/sample.ts +2 -2
  169. package/src/seq.ts +3 -3
  170. package/src/serializeToBuffer/serializeToBuffer.spec.ts +28 -0
  171. package/src/serializeToBuffer/serializeToBuffer.ts +6 -2
  172. package/src/setImmutable.ts +1 -1
  173. package/src/sortByMultiple.ts +1 -1
  174. package/src/waitFor.spec.ts +2 -3
@@ -1,7 +1,7 @@
1
1
  // eslint-disable-next-line @typescript-eslint/no-shadow
2
2
  import must from "must";
3
3
 
4
- // @ts-ignore
4
+ // @ts-expect-error Complaining about root dir
5
5
  import createSpy from "../test/createSpy";
6
6
  import { ignore } from "./ignore";
7
7
  import { wait } from "./wait";
package/src/index.ts CHANGED
@@ -16,6 +16,7 @@ export * from "./ensureError.js";
16
16
  export * from "./ensureTimestamp.js";
17
17
  export * from "./escapeRegExp.js";
18
18
  export * from "./formatDate.js";
19
+ export * from "./formatHash.js";
19
20
  export * from "./get.js";
20
21
  export * from "./getMultiple.js";
21
22
  export * from "./hasProps.js";
@@ -5,14 +5,14 @@
5
5
  * @param {*} separator - separator to inset
6
6
  * @returns {Array} - new array with separator items added or same array if there isn't enough items to put separator
7
7
  */
8
- const insertSeparator = <T, S>(source: T[], separator: S): (T | S)[] => {
8
+ const insertSeparator = <T, S>(source: T[], separator: S): Array<T | S> => {
9
9
  if (!Array.isArray(source)) {
10
10
  throw new TypeError("Source must be an array");
11
11
  }
12
12
  if (source.length <= 1) {
13
13
  return source;
14
14
  }
15
- const result: (T | S)[] = [...source];
15
+ const result: Array<T | S> = [...source];
16
16
  for (let i = result.length - 1; i > 0; i--) {
17
17
  result.splice(i, 0, separator);
18
18
  }
package/src/mapValues.ts CHANGED
@@ -35,7 +35,7 @@ type MapValuesFn<S, R> = (value: S[keyof S], key: keyof S) => R;
35
35
  const mapValues = <SourceObject extends Record<string, unknown>, PossibleReturnValues>(
36
36
  source: SourceObject, fn: MapValuesFn<SourceObject, PossibleReturnValues>,
37
37
  ): { [P in keyof SourceObject]: PossibleReturnValues } => {
38
- const keys = Object.keys(source) as (keyof SourceObject)[];
38
+ const keys = Object.keys(source) as Array<keyof SourceObject>;
39
39
 
40
40
  // @ts-expect-error TypeScript doesn't work well with this type with reduce
41
41
  // @TODO check with ts 5+ or something
@@ -1,7 +1,7 @@
1
1
  // eslint-disable-next-line @typescript-eslint/no-shadow
2
2
  import must from "must";
3
3
 
4
- // @ts-ignore
4
+ // @ts-expect-error Complaining about root dir
5
5
  import createSpy from "../test/createSpy";
6
6
  import { memoize } from "./memoize";
7
7
 
@@ -1,6 +1,6 @@
1
1
  import { remove as _remove } from "lodash";
2
2
 
3
- // @ts-ignore
3
+ // @ts-expect-error Complaining about root dir
4
4
  import createSpy from "../test/createSpy.js";
5
5
  import { remove } from "./remove.js";
6
6
 
package/src/safe.ts CHANGED
@@ -15,7 +15,7 @@ function safe<T, Y>(fn: () => T, def?: Y): T | (Y extends undefined ? undefined
15
15
  return fn();
16
16
  }
17
17
  catch {
18
- // @ts-ignore ts can't do conditional returns in runtime
18
+ // @ts-expect-error ts can't do conditional returns in runtime
19
19
  return def;
20
20
  }
21
21
  }
package/src/sample.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
2
2
  type IsTuple<T> = T extends readonly [infer A, ...(infer B)] ? true : false;
3
3
  type MaybeTupleReturn<T> = IsTuple<T> extends true
4
- ? (T extends readonly (infer U)[] ? U : never)
5
- : (T extends (infer U)[] ? U | undefined : never);
4
+ ? (T extends ReadonlyArray<infer U> ? U : never)
5
+ : (T extends Array<infer U> ? U | undefined : never);
6
6
 
7
7
  /**
8
8
  * Picks a random element from an array.
package/src/seq.ts CHANGED
@@ -15,7 +15,7 @@ type Fn<T> = () => T;
15
15
  *
16
16
  * @see {@link seq}
17
17
  */
18
- type Functions<T> = Fn<T>[] | [Fn<T>[]];
18
+ type Functions<T> = Array<Fn<T>> | [Array<Fn<T>>];
19
19
 
20
20
  /**
21
21
  * A function that decides if the sequential run should be early stopped.
@@ -25,7 +25,7 @@ type Functions<T> = Fn<T>[] | [Fn<T>[]];
25
25
  */
26
26
  type EarlyBreaker = (e: unknown) => boolean;
27
27
 
28
- const run = <T>(list: Fn<T>[], earlyBreaker?: EarlyBreaker): Promise<T> => {
28
+ const run = <T>(list: Array<Fn<T>>, earlyBreaker?: EarlyBreaker): Promise<T> => {
29
29
  if (!list.length) {
30
30
  return fail();
31
31
  }
@@ -81,7 +81,7 @@ const seqEarlyBreak = <T>(earlyBreaker: EarlyBreaker | undefined, ...args: Funct
81
81
  if (args.length === 1) {
82
82
  return run(Array.isArray(args[0]) ? args[0] : [args[0]], earlyBreaker);
83
83
  }
84
- return run(args as Fn<T>[], earlyBreaker);
84
+ return run(args as Array<Fn<T>>, earlyBreaker);
85
85
  };
86
86
 
87
87
  /**
@@ -1,8 +1,10 @@
1
1
  import must from "must"; // eslint-disable-line @typescript-eslint/no-shadow
2
2
 
3
3
  import { serializeToBuffer } from "./serializeToBuffer";
4
+ import { unserializeFromBuffer } from "./unserializeFromBuffer";
4
5
 
5
6
  const serialize = serializeToBuffer.bind(null, Buffer, []);
7
+ const unserialize = unserializeFromBuffer.bind(null, Buffer, []);
6
8
 
7
9
  describe("serialize", () => {
8
10
  it("serializes basic string", async () => {
@@ -40,4 +42,30 @@ describe("serialize", () => {
40
42
  must(serialize(1).toString("hex")).equal("356a00226e3a312200");
41
43
  });
42
44
  // TODO more tests
45
+
46
+ it("serializes-deserializes to the same value", async () => {
47
+ justString: {
48
+ const input = "Hello";
49
+ const serialized = serialize(input);
50
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
51
+ const [deserialized] = unserialize(serialized);
52
+ must(deserialized).eql(input);
53
+ }
54
+
55
+ unicodeString: {
56
+ const input = "Hejżeśświat!";
57
+ const serialized = serialize(input);
58
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
59
+ const [deserialized] = unserialize(serialized);
60
+ must(deserialized).eql(input);
61
+ }
62
+
63
+ emojiString: {
64
+ const input = "Hello 👋 World 🌍 🎉";
65
+ const serialized = serialize(input);
66
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
67
+ const [deserialized] = unserialize(serialized);
68
+ must(deserialized).eql(input);
69
+ }
70
+ });
43
71
  });
@@ -70,7 +70,11 @@ const serializeToBuffer = (
70
70
  const dataToSend: Buffer[] = [];
71
71
  let totalLength = 0;
72
72
  convertedArgs.forEach((arg) => {
73
- const len = String(arg.data.length) + arg.mark;
73
+ // For strings and JSON, we need byte length, not character length
74
+ const dataByteLength = arg.mark === BINARY_MARK_BIN
75
+ ? arg.data.length
76
+ : BufferImplementation.byteLength(arg.data, "utf-8");
77
+ const len = String(dataByteLength) + arg.mark;
74
78
 
75
79
  dataToSend.push(BufferImplementation.from(len, "utf-8"));
76
80
  dataToSend.push(separator);
@@ -78,7 +82,7 @@ const serializeToBuffer = (
78
82
  dataToSend.push(arg.mark === BINARY_MARK_BIN ? arg.data : BufferImplementation.from(arg.data, "utf-8"));
79
83
  dataToSend.push(separator);
80
84
 
81
- totalLength += len.length + separator.length + arg.data.length + separator.length;
85
+ totalLength += len.length + separator.length + dataByteLength + separator.length;
82
86
  });
83
87
 
84
88
  return BufferImplementation.concat(dataToSend, totalLength);
@@ -30,7 +30,7 @@ const hasOnlyValidPathParts = (array: unknown[]) => {
30
30
  * Path to store value in. Can be a dot-separated string or an array of strings.
31
31
  * Numbers are allowed for convenience.
32
32
  */
33
- type Path = number | string | (number | string)[];
33
+ type Path = number | string | Array<number | string>;
34
34
 
35
35
  const getPathParts = (path: Path) => {
36
36
  if (typeof path === "number") {
@@ -30,7 +30,7 @@
30
30
  const sortByMultiple = <
31
31
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
32
  T extends Record<string | number | symbol, any>,
33
- K extends (keyof T)[],
33
+ K extends Array<keyof T>,
34
34
  >(
35
35
  propertyNames: K,
36
36
  ascending: boolean | Record<K[number], boolean> = true,
@@ -1,7 +1,7 @@
1
1
  // eslint-disable-next-line @typescript-eslint/no-shadow
2
2
  import must from "must";
3
3
 
4
- // @ts-ignore
4
+ // @ts-expect-error Complaining about root dir
5
5
  import createSpy from "../test/createSpy";
6
6
  import { wait } from "./wait";
7
7
  import { waitFor } from "./waitFor";
@@ -91,8 +91,7 @@ describe("waitFor", () => {
91
91
 
92
92
  it("crashes if check function crashes", async () => {
93
93
  await waitFor(() => {
94
- // @ts-ignore
95
- throw new Error(5);
94
+ throw new Error("5");
96
95
  }, { interval: 40 }).then(() => {
97
96
  throw new Error("Should not resolve");
98
97
  }, (e: unknown) => {