@kikiutils/shared 20.1.0 → 20.1.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 (41) hide show
  1. package/dist/classes/path.d.ts.map +1 -1
  2. package/dist/classes/path.js +30 -30
  3. package/dist/classes/path.js.map +1 -1
  4. package/dist/classes/precision-number.js.map +1 -1
  5. package/dist/enum.d.ts +4 -3
  6. package/dist/enum.d.ts.map +1 -1
  7. package/dist/enum.js +3 -2
  8. package/dist/enum.js.map +1 -1
  9. package/dist/env.js.map +1 -1
  10. package/dist/event-awaiter.d.ts.map +1 -1
  11. package/dist/event-awaiter.js +6 -6
  12. package/dist/event-awaiter.js.map +1 -1
  13. package/dist/general.d.ts +3 -2
  14. package/dist/general.d.ts.map +1 -1
  15. package/dist/general.js.map +1 -1
  16. package/dist/logger/_internals/logger.d.ts.map +1 -1
  17. package/dist/logger/_internals/logger.js +3 -2
  18. package/dist/logger/_internals/logger.js.map +1 -1
  19. package/dist/logger/node/_internals/file-writer.js +7 -7
  20. package/dist/logger/node/_internals/file-writer.js.map +1 -1
  21. package/dist/logger/node/index.js +8 -8
  22. package/dist/logger/node/index.js.map +1 -1
  23. package/dist/storages/redis/keyed-store.d.ts.map +1 -1
  24. package/dist/storages/redis/keyed-store.js +10 -10
  25. package/dist/storages/redis/keyed-store.js.map +1 -1
  26. package/dist/storages/redis/msgpack.js +2 -2
  27. package/dist/storages/redis/msgpack.js.map +1 -1
  28. package/dist/time.d.ts.map +1 -1
  29. package/dist/time.js +4 -4
  30. package/dist/time.js.map +1 -1
  31. package/package.json +46 -26
  32. package/src/classes/path.ts +30 -30
  33. package/src/enum.ts +11 -5
  34. package/src/event-awaiter.ts +6 -6
  35. package/src/general.ts +5 -3
  36. package/src/logger/_internals/logger.ts +7 -2
  37. package/src/logger/node/_internals/file-writer.ts +7 -7
  38. package/src/logger/node/index.ts +9 -9
  39. package/src/storages/redis/keyed-store.ts +10 -10
  40. package/src/storages/redis/msgpack.ts +2 -2
  41. package/src/time.ts +4 -4
@@ -241,8 +241,8 @@ export class Path {
241
241
  *
242
242
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.access}
243
243
  */
244
- access(...args: DropFirstParameters<typeof fsp.access>) {
245
- return fsp.access(this.#value, ...args);
244
+ async access(...args: DropFirstParameters<typeof fsp.access>) {
245
+ return await fsp.access(this.#value, ...args);
246
246
  }
247
247
 
248
248
  /**
@@ -253,8 +253,8 @@ export class Path {
253
253
  *
254
254
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.appendFile}
255
255
  */
256
- appendFile(...args: DropFirstParameters<typeof fsp.appendFile>) {
257
- return fsp.appendFile(this.#value, ...args);
256
+ async appendFile(...args: DropFirstParameters<typeof fsp.appendFile>) {
257
+ return await fsp.appendFile(this.#value, ...args);
258
258
  }
259
259
 
260
260
  /**
@@ -265,8 +265,8 @@ export class Path {
265
265
  *
266
266
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.chmod}
267
267
  */
268
- chmod(...args: DropFirstParameters<typeof fsp.chmod>) {
269
- return fsp.chmod(this.#value, ...args);
268
+ async chmod(...args: DropFirstParameters<typeof fsp.chmod>) {
269
+ return await fsp.chmod(this.#value, ...args);
270
270
  }
271
271
 
272
272
  /**
@@ -277,8 +277,8 @@ export class Path {
277
277
  *
278
278
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.chown}
279
279
  */
280
- chown(...args: DropFirstParameters<typeof fsp.chown>) {
281
- return fsp.chown(this.#value, ...args);
280
+ async chown(...args: DropFirstParameters<typeof fsp.chown>) {
281
+ return await fsp.chown(this.#value, ...args);
282
282
  }
283
283
 
284
284
  /**
@@ -289,8 +289,8 @@ export class Path {
289
289
  *
290
290
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.copyFile}
291
291
  */
292
- copyFile(...args: DropFirstParameters<typeof fsp.copyFile>) {
293
- return fsp.copyFile(this.#value, ...args);
292
+ async copyFile(...args: DropFirstParameters<typeof fsp.copyFile>) {
293
+ return await fsp.copyFile(this.#value, ...args);
294
294
  }
295
295
 
296
296
  /**
@@ -310,8 +310,8 @@ export class Path {
310
310
  | null,
311
311
  ): Promise<void>;
312
312
  mkdir(options?: fs.MakeDirectoryOptions | fs.Mode | null): Promise<string | undefined>;
313
- mkdir(...args: any): any {
314
- return fsp.mkdir(this.#value, ...args);
313
+ async mkdir(...args: any): Promise<any> {
314
+ return await fsp.mkdir(this.#value, ...args);
315
315
  }
316
316
 
317
317
  /**
@@ -322,8 +322,8 @@ export class Path {
322
322
  *
323
323
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.open}
324
324
  */
325
- open(...args: DropFirstParameters<typeof fsp.open>) {
326
- return fsp.open(this.#value, ...args);
325
+ async open(...args: DropFirstParameters<typeof fsp.open>) {
326
+ return await fsp.open(this.#value, ...args);
327
327
  }
328
328
 
329
329
  /**
@@ -374,8 +374,8 @@ export class Path {
374
374
  withFileTypes: true;
375
375
  },
376
376
  ): Promise<Array<fs.Dirent<Buffer>>>;
377
- readdir(...args: any): any {
378
- return fsp.readdir(this.#value, ...args);
377
+ async readdir(...args: any): Promise<any> {
378
+ return await fsp.readdir(this.#value, ...args);
379
379
  }
380
380
 
381
381
  /**
@@ -412,8 +412,8 @@ export class Path {
412
412
  | BufferEncoding
413
413
  | null,
414
414
  ): Promise<Buffer | string>;
415
- readFile(...args: any): any {
416
- return fsp.readFile(this.#value, ...args);
415
+ async readFile(...args: any): Promise<any> {
416
+ return await fsp.readFile(this.#value, ...args);
417
417
  }
418
418
 
419
419
  /**
@@ -426,8 +426,8 @@ export class Path {
426
426
  *
427
427
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.rename}
428
428
  */
429
- rename(newPath: PathLike) {
430
- return fsp.rename(this.#value, newPath.toString());
429
+ async rename(newPath: PathLike) {
430
+ return await fsp.rename(this.#value, newPath.toString());
431
431
  }
432
432
 
433
433
  /**
@@ -438,8 +438,8 @@ export class Path {
438
438
  *
439
439
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.rm}
440
440
  */
441
- rm(...args: DropFirstParameters<typeof fsp.rm>) {
442
- return fsp.rm(this.#value, ...args);
441
+ async rm(...args: DropFirstParameters<typeof fsp.rm>) {
442
+ return await fsp.rm(this.#value, ...args);
443
443
  }
444
444
 
445
445
  /**
@@ -450,8 +450,8 @@ export class Path {
450
450
  *
451
451
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.rmdir}
452
452
  */
453
- rmdir(...args: DropFirstParameters<typeof fsp.rmdir>) {
454
- return fsp.rmdir(this.#value, ...args);
453
+ async rmdir(...args: DropFirstParameters<typeof fsp.rmdir>) {
454
+ return await fsp.rmdir(this.#value, ...args);
455
455
  }
456
456
 
457
457
  /**
@@ -512,8 +512,8 @@ export class Path {
512
512
  *
513
513
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.truncate}
514
514
  */
515
- truncate(...args: DropFirstParameters<typeof fsp.truncate>) {
516
- return fsp.truncate(this.#value, ...args);
515
+ async truncate(...args: DropFirstParameters<typeof fsp.truncate>) {
516
+ return await fsp.truncate(this.#value, ...args);
517
517
  }
518
518
 
519
519
  /**
@@ -524,8 +524,8 @@ export class Path {
524
524
  *
525
525
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.unlink}
526
526
  */
527
- unlink() {
528
- return fsp.unlink(this.#value);
527
+ async unlink() {
528
+ return await fsp.unlink(this.#value);
529
529
  }
530
530
 
531
531
  /**
@@ -536,7 +536,7 @@ export class Path {
536
536
  *
537
537
  * @see {@link https://nodejs.org/api/fs.html | Node.js fsPromises.writeFile}
538
538
  */
539
- writeFile(...args: DropFirstParameters<typeof fsp.writeFile>) {
540
- return fsp.writeFile(this.#value, ...args);
539
+ async writeFile(...args: DropFirstParameters<typeof fsp.writeFile>) {
540
+ return await fsp.writeFile(this.#value, ...args);
541
541
  }
542
542
  }
package/src/enum.ts CHANGED
@@ -1,3 +1,9 @@
1
+ import {
2
+ objectKeys,
3
+ objectValues,
4
+ } from 'ts-extras';
5
+ import type { ValueOf } from 'type-fest';
6
+
1
7
  /**
2
8
  * Extracts only the numeric values from an enumeration-like object.
3
9
  *
@@ -22,7 +28,7 @@
22
28
  * console.log(getEnumNumberValues(RecordType)); // => [0, 1]
23
29
  * ```
24
30
  */
25
- export function getEnumNumberValues<T extends Record<string, any>>(enumObject: T): Array<Extract<T[keyof T], number>> {
31
+ export function getEnumNumberValues<T extends Record<string, any>>(enumObject: T): Array<Extract<ValueOf<T>, number>> {
26
32
  return getEnumValues(enumObject).filter((value) => typeof value === 'number');
27
33
  }
28
34
 
@@ -50,7 +56,7 @@ export function getEnumNumberValues<T extends Record<string, any>>(enumObject: T
50
56
  * console.log(getEnumStringValues(RecordType)); // => ['unknown']
51
57
  * ```
52
58
  */
53
- export function getEnumStringValues<T extends Record<string, any>>(enumObject: T): Array<Extract<T[keyof T], string>> {
59
+ export function getEnumStringValues<T extends Record<string, any>>(enumObject: T): Array<Extract<ValueOf<T>, string>> {
54
60
  return getEnumValues(enumObject).filter((value) => typeof value === 'string');
55
61
  }
56
62
 
@@ -102,9 +108,9 @@ export function getEnumStringValues<T extends Record<string, any>>(enumObject: T
102
108
  * console.log(getEnumValues(RecordType)); // => [0, 1, 'unknown']
103
109
  * ```
104
110
  */
105
- export function getEnumValues<T extends Record<string, any>>(enumObject: T): Array<T[keyof T]> {
106
- const values = Object.values(enumObject);
111
+ export function getEnumValues<T extends Record<string, any>>(enumObject: T): Array<ValueOf<T>> {
112
+ const values = objectValues(enumObject);
107
113
  const hasNumberValues = values.some((value) => typeof value === 'number');
108
114
  if (!hasNumberValues) return values;
109
- return Object.keys(enumObject).filter((key) => Number.isNaN(Number(key))).map((key) => enumObject[key]);
115
+ return objectKeys(enumObject).filter((key) => Number.isNaN(Number(key))).map((key) => enumObject[key]);
110
116
  }
@@ -58,8 +58,8 @@ export class EventAwaiter<T> {
58
58
  *
59
59
  * @throws Error through promise rejection if `strict` mode encounters an existing waiter.
60
60
  */
61
- wait(key: string, timeoutMs?: number, mode?: 'override' | 'strict', signal?: AbortSignal) {
62
- return new Promise<T | undefined>((resolve) => {
61
+ async wait(key: string, timeoutMs?: number, mode?: 'override' | 'strict', signal?: AbortSignal) {
62
+ return await new Promise<T | undefined>((resolve) => {
63
63
  const resolvers = this.#promiseResolvers.get(key) || [];
64
64
  if (resolvers.length) {
65
65
  switch (mode) {
@@ -122,8 +122,8 @@ export class EventAwaiter<T> {
122
122
  *
123
123
  * @see {@link EventAwaiter.wait}
124
124
  */
125
- waitExclusive(key: string, timeoutMs?: number, signal?: AbortSignal) {
126
- return this.wait(key, timeoutMs, 'strict', signal);
125
+ async waitExclusive(key: string, timeoutMs?: number, signal?: AbortSignal) {
126
+ return await this.wait(key, timeoutMs, 'strict', signal);
127
127
  }
128
128
 
129
129
  /**
@@ -140,7 +140,7 @@ export class EventAwaiter<T> {
140
140
  *
141
141
  * @see {@link EventAwaiter.wait}
142
142
  */
143
- waitLatest(key: string, timeoutMs?: number, signal?: AbortSignal) {
144
- return this.wait(key, timeoutMs, 'override', signal);
143
+ async waitLatest(key: string, timeoutMs?: number, signal?: AbortSignal) {
144
+ return await this.wait(key, timeoutMs, 'override', signal);
145
145
  }
146
146
  }
package/src/general.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import type { Arrayable } from 'type-fest';
2
+
1
3
  /* eslint-disable jsdoc/check-param-names */
2
4
 
3
5
  /**
@@ -31,9 +33,9 @@
31
33
  * console.log(extractFirstValue(undefined, 'fallback')); // => 'fallback'
32
34
  * ```
33
35
  */
34
- export function extractFirstValue<T>(value: T | T[]): T | undefined;
35
- export function extractFirstValue<T, D>(value: T | T[], defaultValue: D): D | NonNullable<T>;
36
- export function extractFirstValue<T, D>(value: T | T[], defaultValue?: D) {
36
+ export function extractFirstValue<T>(value: Arrayable<T>): T | undefined;
37
+ export function extractFirstValue<T, D>(value: Arrayable<T>, defaultValue: D): D | NonNullable<T>;
38
+ export function extractFirstValue<T, D>(value: Arrayable<T>, defaultValue?: D) {
37
39
  return (Array.isArray(value) ? value[0] : value) ?? defaultValue;
38
40
  }
39
41
 
@@ -1,3 +1,8 @@
1
+ import {
2
+ objectHasOwn,
3
+ objectKeys,
4
+ } from 'ts-extras';
5
+
1
6
  import type {
2
7
  Logger,
3
8
  LoggerDiagnostic,
@@ -172,7 +177,7 @@ export function createLoggerCore(options: LoggerOptions, hooks: LoggerHooks): Re
172
177
  },
173
178
  } as Logger;
174
179
 
175
- for (const type of Object.keys(loggerMethods) as LoggerMethod[]) {
180
+ for (const type of objectKeys(loggerMethods) as LoggerMethod[]) {
176
181
  logger[type] = async (...args: unknown[]) => {
177
182
  try {
178
183
  refreshLevel();
@@ -202,7 +207,7 @@ function getLevelSeverity(level: LoggerLevel | LoggerMethod): number {
202
207
 
203
208
  function isLevel(value: unknown): value is LoggerLevel {
204
209
  return typeof value === 'string'
205
- && (value === 'silent' || (value !== 'success' && Object.hasOwn(loggerMethods, value)));
210
+ && (value === 'silent' || (value !== 'success' && objectHasOwn(loggerMethods, value)));
206
211
  }
207
212
 
208
213
  function readEnvironmentLevel(): string | undefined {
@@ -141,8 +141,8 @@ export async function createFileWriter(
141
141
  }
142
142
 
143
143
  return Object.freeze({
144
- close() {
145
- if (closePromise) return closePromise;
144
+ async close() {
145
+ if (closePromise) return await closePromise;
146
146
  closing = true;
147
147
  closePromise = new Promise<void>((resolveClosed) => {
148
148
  if (closed) {
@@ -158,21 +158,21 @@ export async function createFileWriter(
158
158
  }
159
159
  });
160
160
 
161
- return closePromise;
161
+ return await closePromise;
162
162
  },
163
163
  getStats: () => Object.freeze({
164
164
  droppedCount,
165
165
  pendingBytes,
166
166
  writeErrorCount,
167
167
  }),
168
- write(text: string) {
168
+ async write(text: string) {
169
169
  if (closing || closed || failed) {
170
170
  report({
171
171
  message: 'File output is closed or unavailable.',
172
172
  type: 'closed',
173
173
  });
174
174
 
175
- return Promise.resolve();
175
+ return await Promise.resolve();
176
176
  }
177
177
 
178
178
  const bytes = Buffer.byteLength(text);
@@ -184,11 +184,11 @@ export async function createFileWriter(
184
184
  type: 'overflow',
185
185
  });
186
186
 
187
- return Promise.resolve();
187
+ return await Promise.resolve();
188
188
  }
189
189
 
190
190
  pendingBytes += bytes;
191
- return new Promise<void>((resolveWritten) => {
191
+ return await new Promise<void>((resolveWritten) => {
192
192
  let settled = false;
193
193
  const settle = () => {
194
194
  if (settled) return;
@@ -47,7 +47,7 @@ export async function createNodeLogger(options: NodeLoggerOptions = {}): Promise
47
47
  options,
48
48
  {
49
49
  report,
50
- write(record) {
50
+ async write(record) {
51
51
  if (closed) {
52
52
  report({
53
53
  message: 'Logger is closed.',
@@ -69,14 +69,14 @@ export async function createNodeLogger(options: NodeLoggerOptions = {}): Promise
69
69
  void completion.then(() => consoleWrites.delete(completion));
70
70
  const fileCompletion = writer?.write(`${stripVTControlCharacters(text)}\n`);
71
71
  return fileCompletion
72
- ? Promise.all([
72
+ ? await Promise.all([
73
73
  completion,
74
74
  fileCompletion,
75
75
  ]).then(() => {})
76
- : completion;
76
+ : await completion;
77
77
  }
78
78
 
79
- return writer?.write(`${stripVTControlCharacters(text)}\n`);
79
+ return await writer?.write(`${stripVTControlCharacters(text)}\n`);
80
80
  },
81
81
  },
82
82
  );
@@ -85,8 +85,8 @@ export async function createNodeLogger(options: NodeLoggerOptions = {}): Promise
85
85
 
86
86
  return Object.freeze({
87
87
  ...logger,
88
- close() {
89
- if (closePromise) return closePromise;
88
+ async close() {
89
+ if (closePromise) return await closePromise;
90
90
  closed = true;
91
91
  closePromise = (async () => {
92
92
  await Promise.all([
@@ -108,7 +108,7 @@ export async function createNodeLogger(options: NodeLoggerOptions = {}): Promise
108
108
  consoleTargets.clear();
109
109
  })();
110
110
 
111
- return closePromise;
111
+ return await closePromise;
112
112
  },
113
113
  getStats: () => writer?.getStats() ?? Object.freeze({
114
114
  droppedCount: 0,
@@ -121,7 +121,7 @@ export async function createNodeLogger(options: NodeLoggerOptions = {}): Promise
121
121
  /**
122
122
  * One error listener per shared output stream; retained until its last owning logger calls close().
123
123
  */
124
- function writeConsole(
124
+ async function writeConsole(
125
125
  target: NodeJS.WriteStream,
126
126
  text: string,
127
127
  report: (event: LoggerDiagnostic) => void,
@@ -149,7 +149,7 @@ function writeConsole(
149
149
 
150
150
  state.owners.add(owner);
151
151
  const current = state;
152
- return new Promise<void>((resolveWritten) => {
152
+ return await new Promise<void>((resolveWritten) => {
153
153
  let settled = false;
154
154
  const settle = (error?: Error | null) => {
155
155
  if (settled) return;
@@ -20,18 +20,18 @@ import type { RedisLikeStorage } from './types';
20
20
  */
21
21
  export function createRedisKeyedStore<D = unknown>(storage: MaybeReadonly<RedisLikeStorage>) {
22
22
  return <P extends any[]>(keyFn: (...args: P) => string) => Object.freeze({
23
- getAndRemoveItem: (...args: P) => storage.getAndRemoveItem<D>(keyFn(...args)),
24
- getItem: (...args: P) => storage.getItem<D>(keyFn(...args)),
25
- getItemTtl: (...args: P) => storage.getItemTtl(keyFn(...args)),
26
- hasItem: (...args: P) => storage.hasItem(keyFn(...args)),
27
- removeItem: (...args: P) => storage.removeItem(keyFn(...args)),
23
+ getAndRemoveItem: async (...args: P) => await storage.getAndRemoveItem<D>(keyFn(...args)),
24
+ getItem: async (...args: P) => await storage.getItem<D>(keyFn(...args)),
25
+ getItemTtl: async (...args: P) => await storage.getItemTtl(keyFn(...args)),
26
+ hasItem: async (...args: P) => await storage.hasItem(keyFn(...args)),
27
+ removeItem: async (...args: P) => await storage.removeItem(keyFn(...args)),
28
28
  resolveKey: (...args: P) => keyFn(...args),
29
- setItem: (value: D, ...args: P) => storage.setItem(keyFn(...args), value),
30
- setItemWithTtl(ttlSeconds: number, value: D, ...args: P) {
31
- return storage.setItemWithTtl(keyFn(...args), ttlSeconds, value);
29
+ setItem: async (value: D, ...args: P) => await storage.setItem(keyFn(...args), value),
30
+ async setItemWithTtl(ttlSeconds: number, value: D, ...args: P) {
31
+ return await storage.setItemWithTtl(keyFn(...args), ttlSeconds, value);
32
32
  },
33
- setItemWithTtlIfAbsent(ttlSeconds: number, value: D, ...args: P) {
34
- return storage.setItemWithTtlIfAbsent(keyFn(...args), ttlSeconds, value);
33
+ async setItemWithTtlIfAbsent(ttlSeconds: number, value: D, ...args: P) {
34
+ return await storage.setItemWithTtlIfAbsent(keyFn(...args), ttlSeconds, value);
35
35
  },
36
36
  });
37
37
  }
@@ -73,8 +73,8 @@ export function createRedisMsgpackStorage(adapter: RedisLikeAdapter): Readonly<R
73
73
  const rawValue = await adapter.getBuffer(key);
74
74
  return rawValue ? decode(rawValue) as T : null;
75
75
  },
76
- getItemTtl: (key: string) => adapter.ttl(key),
77
- hasItem: (key: string) => adapter.has(key),
76
+ getItemTtl: async (key: string) => await adapter.ttl(key),
77
+ hasItem: async (key: string) => await adapter.has(key),
78
78
  removeItem: async (key: string) => await adapter.delete(key) === 1,
79
79
  setItem: async (key: string, value: any) => await adapter.setBuffer(key, encode(value)) === 'OK',
80
80
  async setItemWithTtl(key: string, ttlSeconds: number, value: any) {
package/src/time.ts CHANGED
@@ -18,8 +18,8 @@
18
18
  * await delay(5000, controller.signal);
19
19
  * ```
20
20
  */
21
- export function delay(ms: number, signal?: AbortSignal): Promise<void> {
22
- return new Promise((resolve) => {
21
+ export async function delay(ms: number, signal?: AbortSignal): Promise<void> {
22
+ return await new Promise((resolve) => {
23
23
  if (signal?.aborted) {
24
24
  resolve();
25
25
  return;
@@ -61,8 +61,8 @@ export function delay(ms: number, signal?: AbortSignal): Promise<void> {
61
61
  * }
62
62
  * ```
63
63
  */
64
- export function delayOrThrow(ms: number, signal?: AbortSignal): Promise<void> {
65
- return new Promise((resolve, reject) => {
64
+ export async function delayOrThrow(ms: number, signal?: AbortSignal): Promise<void> {
65
+ return await new Promise((resolve, reject) => {
66
66
  if (signal?.aborted) {
67
67
  reject(signal.reason);
68
68
  return;