@guillaume-docquier/tools-ts 5.1.1 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -109,12 +109,23 @@ consistent.
109
109
  | `asyncNoop` | Asynchronous no-op function. | You need a safe default async callback or hook that resolves immediately. |
110
110
  | `omit` | Runtime equivalent of `Omit<TType, TKey>`. | You need to remove keys from an object. |
111
111
 
112
- ### Measurement
112
+ ### Profiling
113
113
 
114
- Use these helpers for lightweight operational visibility, not for rigorous
115
- benchmarking.
114
+ Use these helpers for quick profiling.
116
115
 
117
116
  | Export | What it is | Use it when |
118
117
  | ----------------------- | ----------------------------------------------- | ------------------------------------------------------------------------------------ |
119
- | `Measure.executionTime` | Wraps sync or async work and logs elapsed time. | You need quick timing instrumentation around a named operation. |
120
- | `Measure.memoryUsage` | Logs process memory usage in megabytes. | You need a snapshot of Node.js process memory for diagnostics or runtime visibility. |
118
+ | `Profile.executionTime` | Wraps sync or async work and logs elapsed time. | You need quick timing instrumentation around a named operation. |
119
+ | `Profile.memoryUsage` | Logs process memory usage in megabytes. | You need a snapshot of Node.js process memory for diagnostics or runtime visibility. |
120
+
121
+ ### Measurements
122
+
123
+ | Export | What it is | Use it when |
124
+ | ------ | ------------------------------------------------------------------- | ------------------------------------------------------------ |
125
+ | `Time` | Represent a time value with a unit and contains conversion methods. | You want to represent time and abstract away the units used. |
126
+
127
+ ### Date manipulations
128
+
129
+ | Export | What it is | Use it when |
130
+ | -------------------- | ------------------------------------------ | --------------------------------------------------------------------- |
131
+ | `Datetime.increment` | Increments a date by a set amount of Time. | You need to increment time. Plays nicely with the `Time` measurement. |
@@ -0,0 +1,11 @@
1
+ import { Time } from "./measurements/Time.js";
2
+ export declare const Datetime: {
3
+ /**
4
+ * Increments a date by x seconds
5
+ * A unit agnostic utility would be useful here
6
+ */
7
+ increment: ({ date, time }: {
8
+ date: Date;
9
+ time: Time;
10
+ }) => Date;
11
+ };
@@ -0,0 +1,11 @@
1
+ import { Time, UnitOfTime } from "./measurements/Time.js";
2
+ export const Datetime = {
3
+ /**
4
+ * Increments a date by x seconds
5
+ * A unit agnostic utility would be useful here
6
+ */
7
+ increment: ({ date, time }) => {
8
+ return new Date(date.getTime() + Time.in(time, UnitOfTime.MILLISECONDS));
9
+ },
10
+ };
11
+ //# sourceMappingURL=Datetime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Datetime.js","sourceRoot":"","sources":["../src/Datetime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEzD,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB;;;OAGG;IACH,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAA8B,EAAQ,EAAE;QAC9D,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAA;IAC1E,CAAC;CACF,CAAA"}
@@ -1,7 +1,7 @@
1
1
  type BasicLogger = {
2
2
  info: (message: string, context?: Record<string, unknown>) => void;
3
3
  };
4
- export declare const Measure: {
4
+ export declare const Profile: {
5
5
  executionTime: typeof executionTime;
6
6
  /**
7
7
  * Prints the current memory usage using {@link https://nodejs.org/api/process.html#processmemoryusage process.memoryUsage()}.
@@ -1,4 +1,4 @@
1
- export const Measure = {
1
+ export const Profile = {
2
2
  // You can't overload while defining object properties, which is why the function implementation is not inlined
3
3
  executionTime,
4
4
  /**
@@ -50,4 +50,4 @@ function logExecutionTime(label, startedAt, logger) {
50
50
  function bytesToMb(bytes) {
51
51
  return `${Math.round(bytes / 1024 / 1024).toFixed(2)} MB`;
52
52
  }
53
- //# sourceMappingURL=Measure.js.map
53
+ //# sourceMappingURL=Profile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Measure.js","sourceRoot":"","sources":["../src/Measure.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,+GAA+G;IAC/G,aAAa;IAEb;;OAEG;IACH,WAAW,CAAC,SAAsB,OAAO;QACvC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA,CAAC,gBAAgB;QAE1D,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC1B;;;;;eAKG;YACH,GAAG,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;YAC/B;;eAEG;YACH,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;YAC3C;;eAEG;YACH,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC;YACzC;;eAEG;YACH,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC;YACzC;;eAEG;YACH,YAAY,EAAE,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;SAClD,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAYD,SAAS,aAAa,CAAI,KAAa,EAAE,MAAsC,EAAE,SAAsB,OAAO;IAC5G,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;IACvB,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YACzB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAAiB,EAAE,MAAmB;IAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AAC3D,CAAC"}
1
+ {"version":3,"file":"Profile.js","sourceRoot":"","sources":["../src/Profile.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,+GAA+G;IAC/G,aAAa;IAEb;;OAEG;IACH,WAAW,CAAC,SAAsB,OAAO;QACvC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,EAAE,CAAA,CAAC,gBAAgB;QAE1D,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE;YAC1B;;;;;eAKG;YACH,GAAG,EAAE,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC;YAC/B;;eAEG;YACH,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;YAC3C;;eAEG;YACH,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC;YACzC;;eAEG;YACH,QAAQ,EAAE,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC;YACzC;;eAEG;YACH,YAAY,EAAE,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;SAClD,CAAC,CAAA;IACJ,CAAC;CACF,CAAA;AAYD,SAAS,aAAa,CAAI,KAAa,EAAE,MAAsC,EAAE,SAAsB,OAAO;IAC5G,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IACnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA;IACvB,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YACzB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAC5C,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IAC1C,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,gBAAgB,CAAC,KAAa,EAAE,SAAiB,EAAE,MAAmB;IAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;AAC3D,CAAC"}
@@ -9,7 +9,7 @@ export { asArray } from "./asArray.js";
9
9
  export { omit } from "./omit.js";
10
10
  export { Assert } from "./Assert.js";
11
11
  export { Result, type Success, type Failure } from "./Result.js";
12
- export { Measure } from "./Measure.js";
12
+ export { Profile } from "./Profile.js";
13
13
  export { Range } from "./Range.js";
14
14
  export { TypeGuard } from "./TypeGuard.js";
15
15
  export { setTimeoutAsync } from "./setTimeoutAsync.js";
@@ -27,3 +27,5 @@ export { debounce } from "./debounce.js";
27
27
  export { Sort } from "./Sort.js";
28
28
  export { createRng, type Rng, type Generator } from "./rng/rng.js";
29
29
  export { mulberry32Prng } from "./rng/mulberry32prng.js";
30
+ export { Datetime } from "./Datetime.js";
31
+ export { Time, UnitOfTime } from "./measurements/Time.js";
@@ -8,7 +8,7 @@ export { asArray } from "./asArray.js";
8
8
  export { omit } from "./omit.js";
9
9
  export { Assert } from "./Assert.js";
10
10
  export { Result } from "./Result.js";
11
- export { Measure } from "./Measure.js";
11
+ export { Profile } from "./Profile.js";
12
12
  export { Range } from "./Range.js";
13
13
  export { TypeGuard } from "./TypeGuard.js";
14
14
  export { setTimeoutAsync } from "./setTimeoutAsync.js";
@@ -22,4 +22,6 @@ export { debounce } from "./debounce.js";
22
22
  export { Sort } from "./Sort.js";
23
23
  export { createRng } from "./rng/rng.js";
24
24
  export { mulberry32Prng } from "./rng/mulberry32prng.js";
25
+ export { Datetime } from "./Datetime.js";
26
+ export { Time, UnitOfTime } from "./measurements/Time.js";
25
27
  //# sourceMappingURL=entry.tools-ts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry.tools-ts.js","sourceRoot":"","sources":["../src/entry.tools-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAA4B,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA"}
1
+ {"version":3,"file":"entry.tools-ts.js","sourceRoot":"","sources":["../src/entry.tools-ts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAI5C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,MAAM,EAA8B,MAAM,aAAa,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAE3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAA;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAA;AAEtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAA;AAKvE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,SAAS,EAA4B,MAAM,cAAc,CAAA;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Represents a measure with its unit
3
+ */
4
+ export interface Measurement<TMeasurementUnit> {
5
+ value: number;
6
+ unit: TMeasurementUnit;
7
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Measurement.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Measurement.js","sourceRoot":"","sources":["../../src/measurements/Measurement.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { Measurement } from "./Measurement.js";
2
+ /**
3
+ * Represents the possible units to define time.
4
+ */
5
+ export declare enum UnitOfTime {
6
+ MILLISECONDS = "milliseconds",
7
+ SECONDS = "seconds",
8
+ MINUTES = "minutes",
9
+ HOURS = "hours"
10
+ }
11
+ /**
12
+ * Represents a time with its unit
13
+ */
14
+ export type Time = Measurement<UnitOfTime>;
15
+ /**
16
+ * A set of functions to work with Times.
17
+ */
18
+ export declare const Time: {
19
+ create: (value: number, unit: UnitOfTime) => {
20
+ value: number;
21
+ unit: UnitOfTime;
22
+ };
23
+ /**
24
+ * Converts a time to another unit of time.
25
+ * The provided time is left untouched.
26
+ * @param time The time to convert.
27
+ * @param newUnit The new unit to convert to.
28
+ * @returns A new Time with the requested unit of time.
29
+ */
30
+ convert(time: Time, newUnit: UnitOfTime): Time;
31
+ /**
32
+ * Returns the value of the time in the given unit of time.
33
+ * @param time The time to get the value of.
34
+ * @param newUnit The unit of time to get the value of the time in.
35
+ */
36
+ in(time: Time, newUnit: UnitOfTime): number;
37
+ };
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Represents the possible units to define time.
3
+ */
4
+ export var UnitOfTime;
5
+ (function (UnitOfTime) {
6
+ UnitOfTime["MILLISECONDS"] = "milliseconds";
7
+ UnitOfTime["SECONDS"] = "seconds";
8
+ UnitOfTime["MINUTES"] = "minutes";
9
+ UnitOfTime["HOURS"] = "hours";
10
+ })(UnitOfTime || (UnitOfTime = {}));
11
+ /**
12
+ * The definition of factors of time, where the base unit is the second.
13
+ * 1 minute is 1/60th of a second.
14
+ */
15
+ const TIME_PER_SECONDS = {
16
+ [UnitOfTime.MILLISECONDS]: 1000,
17
+ [UnitOfTime.SECONDS]: 1,
18
+ [UnitOfTime.MINUTES]: 1 / 60,
19
+ [UnitOfTime.HOURS]: 1 / 60 / 60,
20
+ };
21
+ /**
22
+ * A set of functions to work with Times.
23
+ */
24
+ export const Time = {
25
+ create: (value, unit) => {
26
+ return {
27
+ value,
28
+ unit,
29
+ };
30
+ },
31
+ /**
32
+ * Converts a time to another unit of time.
33
+ * The provided time is left untouched.
34
+ * @param time The time to convert.
35
+ * @param newUnit The new unit to convert to.
36
+ * @returns A new Time with the requested unit of time.
37
+ */
38
+ convert(time, newUnit) {
39
+ return {
40
+ value: Time.in(time, newUnit),
41
+ unit: newUnit,
42
+ };
43
+ },
44
+ /**
45
+ * Returns the value of the time in the given unit of time.
46
+ * @param time The time to get the value of.
47
+ * @param newUnit The unit of time to get the value of the time in.
48
+ */
49
+ in(time, newUnit) {
50
+ return (time.value * TIME_PER_SECONDS[newUnit]) / TIME_PER_SECONDS[time.unit];
51
+ },
52
+ };
53
+ //# sourceMappingURL=Time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Time.js","sourceRoot":"","sources":["../../src/measurements/Time.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,CAAN,IAAY,UAKX;AALD,WAAY,UAAU;IACpB,2CAA6B,CAAA;IAC7B,iCAAmB,CAAA;IACnB,iCAAmB,CAAA;IACnB,6BAAe,CAAA;AACjB,CAAC,EALW,UAAU,KAAV,UAAU,QAKrB;AAED;;;GAGG;AACH,MAAM,gBAAgB,GAA+B;IACnD,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,IAAI;IAC/B,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACvB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE;IAC5B,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE;CAChC,CAAA;AAOD;;GAEG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,MAAM,EAAE,CAAC,KAAa,EAAE,IAAgB,EAAE,EAAE;QAC1C,OAAO;YACL,KAAK;YACL,IAAI;SACL,CAAA;IACH,CAAC;IAED;;;;;;OAMG;IACH,OAAO,CAAC,IAAU,EAAE,OAAmB;QACrC,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC;YAC7B,IAAI,EAAE,OAAO;SACd,CAAA;IACH,CAAC;IAED;;;;OAIG;IACH,EAAE,CAAC,IAAU,EAAE,OAAmB;QAChC,OAAO,CAAC,IAAI,CAAC,KAAK,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC/E,CAAC;CACF,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@guillaume-docquier/tools-ts",
3
- "version": "5.1.1",
3
+ "version": "6.0.0",
4
4
  "description": "My personal collection of typescript tools",
5
5
  "homepage": "https://github.com/Guillaume-Docquier/tools-ts",
6
6
  "license": "MIT",