@oscarpalmer/atoms 0.191.0 → 0.193.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 (47) hide show
  1. package/dist/beacon.d.mts +6 -44
  2. package/dist/beacon.mjs +20 -67
  3. package/dist/color/constants.d.mts +82 -41
  4. package/dist/color/constants.mjs +102 -63
  5. package/dist/color/instance.mjs +36 -13
  6. package/dist/color/misc/alpha.mjs +9 -10
  7. package/dist/color/misc/format.mjs +4 -4
  8. package/dist/color/misc/get.mjs +18 -18
  9. package/dist/color/misc/is.mjs +22 -21
  10. package/dist/color/misc/state.d.mts +6 -5
  11. package/dist/color/misc/state.mjs +31 -26
  12. package/dist/color/models.d.mts +78 -1
  13. package/dist/color/space/hex.mjs +12 -12
  14. package/dist/color/space/hsl.mjs +16 -16
  15. package/dist/color/space/hwb.mjs +10 -10
  16. package/dist/color/space/rgb.mjs +16 -16
  17. package/dist/herald.d.mts +2 -3
  18. package/dist/index.d.mts +141 -67
  19. package/dist/index.mjs +552 -391
  20. package/dist/internal/subscription.d.mts +52 -0
  21. package/dist/internal/subscription.mjs +127 -0
  22. package/dist/models.d.mts +5 -1
  23. package/dist/queue.d.mts +25 -23
  24. package/dist/queue.mjs +27 -28
  25. package/package.json +1 -1
  26. package/src/beacon.ts +32 -117
  27. package/src/color/constants.ts +115 -78
  28. package/src/color/instance.ts +65 -12
  29. package/src/color/misc/alpha.ts +13 -21
  30. package/src/color/misc/format.ts +4 -4
  31. package/src/color/misc/get.ts +23 -40
  32. package/src/color/misc/is.ts +29 -39
  33. package/src/color/misc/state.ts +77 -41
  34. package/src/color/models.ts +94 -1
  35. package/src/color/space/hex.ts +18 -23
  36. package/src/color/space/hsl.ts +16 -24
  37. package/src/color/space/hwb.ts +10 -10
  38. package/src/color/space/rgb.ts +19 -16
  39. package/src/herald.ts +1 -3
  40. package/src/index.ts +1 -0
  41. package/src/internal/subscription.ts +264 -0
  42. package/src/models.ts +5 -0
  43. package/src/queue.ts +92 -92
  44. package/src/string/fuzzy.ts +1 -1
  45. package/src/value/freeze.ts +2 -2
  46. package/src/value/shake.ts +1 -1
  47. package/src/value/transform.ts +1 -1
package/src/queue.ts CHANGED
@@ -9,8 +9,8 @@ type HandleType = 'clear' | 'pause' | 'resume';
9
9
  * A queue that can be used to manage (a)synchronous tasks with a specific key
10
10
  */
11
11
  export type KeyedQueue<
12
- CallbackParameters extends Parameters<GenericAsyncCallback>,
13
- CallbackResult,
12
+ Callback extends GenericCallback | GenericAsyncCallback,
13
+ CallbackParameters extends unknown[] = Parameters<Callback>,
14
14
  > = {
15
15
  /**
16
16
  * Get keys of all active queues
@@ -74,7 +74,7 @@ export type KeyedQueue<
74
74
  key: string,
75
75
  parameters: Tail<CallbackParameters>,
76
76
  signal?: AbortSignal,
77
- ): Queued<CallbackResult>;
77
+ ): Queued<ReturnType<Callback>>;
78
78
 
79
79
  /**
80
80
  * Clear all items for a specific key _(or all items for all keys, if no key is provided)_
@@ -89,7 +89,7 @@ export type KeyedQueue<
89
89
  * @param key Key to get the queue for
90
90
  * @returns Queue for the key, or `undefined` if it doesn't exist
91
91
  */
92
- get(key: string): Queue<Tail<CallbackParameters>, CallbackResult> | undefined;
92
+ get(key: string): Queue<Callback, Tail<CallbackParameters>> | undefined;
93
93
 
94
94
  /**
95
95
  * Pause the queue for a specific key _(or all queues, if no key is provided)_
@@ -129,15 +129,18 @@ export type KeyedQueue<
129
129
  };
130
130
 
131
131
  type KeyedQueueState = {
132
- callback: GenericAsyncCallback;
132
+ callback: GenericCallback | GenericAsyncCallback;
133
133
  options: Required<QueueOptions>;
134
- queues: Map<string, Queue<Tail<unknown[]>, unknown>>;
134
+ queues: Map<string, Queue<GenericAsyncCallback, Tail<unknown[]>>>;
135
135
  };
136
136
 
137
137
  /**
138
138
  * A queue that can be used to manage (a)synchronous tasks
139
139
  */
140
- export type Queue<CallbackParameters extends Parameters<GenericAsyncCallback>, CallbackResult> = {
140
+ export type Queue<
141
+ Callback extends GenericCallback | GenericAsyncCallback,
142
+ CallbackParameters extends unknown[] = Parameters<Callback>,
143
+ > = {
141
144
  /**
142
145
  * Is the queue active?
143
146
  */
@@ -185,7 +188,7 @@ export type Queue<CallbackParameters extends Parameters<GenericAsyncCallback>, C
185
188
  * @param signal Optional signal to abort the item
186
189
  * @returns Queued item
187
190
  */
188
- add(parameters: CallbackParameters, signal?: AbortSignal): Queued<CallbackResult>;
191
+ add(parameters: CallbackParameters, signal?: AbortSignal): Queued<ReturnType<Callback>>;
189
192
 
190
193
  /**
191
194
  * Remove and reject all items in the queue
@@ -261,7 +264,7 @@ export type Queued<Value> = {
261
264
  /**
262
265
  * Queued promise
263
266
  */
264
- readonly promise: Promise<QueuedResult<Value>>;
267
+ readonly promise: Promise<Value extends Promise<infer Result> ? Result : Value>;
265
268
  };
266
269
 
267
270
  type QueuedItem = {
@@ -269,23 +272,12 @@ type QueuedItem = {
269
272
  id: number;
270
273
  key?: string;
271
274
  parameters: unknown[];
272
- promise: Promise<QueuedResult<unknown>>;
275
+ promise: Promise<unknown>;
273
276
  reject: (reason?: unknown) => void;
274
- resolve: (value: QueuedResult<unknown>) => void;
277
+ resolve: (value: unknown) => void;
275
278
  signal?: AbortSignal;
276
279
  };
277
280
 
278
- export type QueuedResult<Value> = {
279
- /**
280
- * Has the queue finished processing all items?
281
- */
282
- finished: boolean;
283
- /**
284
- * Result for the queued promise
285
- */
286
- value: Value extends Promise<infer Result> ? Result : Value;
287
- };
288
-
289
281
  type StatusKey = 'active' | 'empty' | 'full' | 'paused';
290
282
 
291
283
  type Tail<Values extends any[]> = Values extends [infer _, ...infer Rest] ? Rest : never;
@@ -295,10 +287,10 @@ type Tail<Values extends any[]> = Values extends [infer _, ...infer Rest] ? Rest
295
287
  // #region Functions
296
288
 
297
289
  function createQueue(
298
- callback: GenericCallback | GenericAsyncCallback,
290
+ callback: GenericAsyncCallback,
299
291
  options?: QueueOptions,
300
292
  key?: string,
301
- ): Queue<unknown[], unknown> {
293
+ ): Queue<never, never> {
302
294
  if (typeof callback !== 'function') {
303
295
  throw new TypeError(MESSAGE_CALLBACK);
304
296
  }
@@ -316,7 +308,7 @@ function createQueue(
316
308
 
317
309
  const instance = {
318
310
  add: (parameters: unknown[], signal?: AbortSignal) => {
319
- if ((instance as Queue<unknown[], unknown>).full) {
311
+ if ((instance as Queue<GenericCallback>).full) {
320
312
  throw new QueueError(MESSAGE_MAXIMUM);
321
313
  }
322
314
 
@@ -329,9 +321,9 @@ function createQueue(
329
321
  const id = identify(state);
330
322
 
331
323
  let rejector: (reason?: unknown) => void;
332
- let resolver: (value: QueuedResult<unknown>) => void;
324
+ let resolver: (value: unknown) => void;
333
325
 
334
- const promise = new Promise<QueuedResult<unknown>>((resolve, reject) => {
326
+ const promise = new Promise<unknown>((resolve, reject) => {
335
327
  rejector = reject;
336
328
  resolver = resolve;
337
329
  });
@@ -442,13 +434,25 @@ function createQueue(
442
434
  },
443
435
  });
444
436
 
445
- return Object.freeze(instance) as Queue<unknown[], unknown>;
437
+ return Object.freeze(instance) as Queue<GenericCallback>;
446
438
  }
447
439
 
448
440
  function getBooleanOrDefault(value: unknown, defaultValue: boolean): boolean {
449
441
  return typeof value === 'boolean' ? value : defaultValue;
450
442
  }
451
443
 
444
+ function getItems(state: KeyedQueueState): Record<string, number> {
445
+ const size: Record<string, number> = {};
446
+
447
+ const queues = state.queues.entries();
448
+
449
+ for (const [key, queue] of queues) {
450
+ size[key] = queue.size;
451
+ }
452
+
453
+ return size;
454
+ }
455
+
452
456
  function getOptions(input?: QueueOptions): Required<QueueOptions> {
453
457
  const options = typeof input === 'object' && input != null ? input : {};
454
458
 
@@ -459,15 +463,15 @@ function getOptions(input?: QueueOptions): Required<QueueOptions> {
459
463
  };
460
464
  }
461
465
 
462
- function getQueue(state: KeyedQueueState, key: string, add: true): Queue<Tail<unknown[]>, unknown>;
466
+ function getQueue(state: KeyedQueueState, key: string, add: true): Queue<GenericCallback>;
463
467
 
464
- function getQueue(state: KeyedQueueState, key: string): Queue<Tail<unknown[]>, unknown> | undefined;
468
+ function getQueue(state: KeyedQueueState, key: string): Queue<GenericCallback> | undefined;
465
469
 
466
470
  function getQueue(
467
471
  state: KeyedQueueState,
468
472
  key: string,
469
473
  add?: boolean,
470
- ): Queue<Tail<unknown[]>, unknown> | undefined {
474
+ ): Queue<GenericCallback> | undefined {
471
475
  if (typeof key !== 'string' || key.trim().length === 0) {
472
476
  throw new TypeError(MESSAGE_KEY);
473
477
  }
@@ -497,12 +501,7 @@ function getStatus(state: KeyedQueueState, status: StatusKey): string[] {
497
501
  return result;
498
502
  }
499
503
 
500
- function handleQueuedResult(
501
- item: QueuedItem,
502
- error: boolean,
503
- result: unknown,
504
- finished: boolean,
505
- ): void {
504
+ function handleQueuedResult(item: QueuedItem, error: boolean, result: unknown): void {
506
505
  item.signal?.removeEventListener(EVENT_NAME, item.abort!);
507
506
 
508
507
  if (item.signal?.aborted ?? false) {
@@ -517,10 +516,7 @@ function handleQueuedResult(
517
516
  return;
518
517
  }
519
518
 
520
- item.resolve({
521
- finished,
522
- value: result as never,
523
- });
519
+ item.resolve(result);
524
520
  }
525
521
 
526
522
  function handleQueues(state: KeyedQueueState, type: HandleType, key?: string): void {
@@ -549,7 +545,7 @@ function identify(state: QueueState): number {
549
545
  * @param value Value to check
550
546
  * @returns `true` if the value is a keyed queue, otherwise `false`
551
547
  */
552
- export function isKeyedQueue(value: unknown): value is KeyedQueue<unknown[], unknown> {
548
+ export function isKeyedQueue(value: unknown): value is KeyedQueue<GenericAsyncCallback> {
553
549
  return isQueueInstance(NAME_KEYED, value);
554
550
  }
555
551
 
@@ -559,7 +555,7 @@ export function isKeyedQueue(value: unknown): value is KeyedQueue<unknown[], unk
559
555
  * @param value Value to check
560
556
  * @returns `true` if the value is a queue, otherwise `false`
561
557
  */
562
- export function isQueue(value: unknown): value is Queue<unknown[], unknown> {
558
+ export function isQueue(value: unknown): value is Queue<GenericCallback | GenericAsyncCallback> {
563
559
  return isQueueInstance(NAME_QUEUE, value);
564
560
  }
565
561
 
@@ -571,20 +567,32 @@ export function isQueueInstance<Instance>(name: string, value: unknown): value i
571
567
  );
572
568
  }
573
569
 
570
+ /**
571
+ * Create a keyed queue for an asynchronous callback function, where each key has its own queue
572
+ *
573
+ * @param callback Callback function for queued items
574
+ * @param options Queue options
575
+ */
574
576
  export function keyedQueue<Callback extends (key: string, ...parameters: any[]) => Promise<void>>(
575
577
  callback: Callback,
576
578
  options?: QueueOptions,
577
- ): KeyedQueue<Parameters<Callback>, Awaited<ReturnType<Callback>>>;
579
+ ): KeyedQueue<Callback, Parameters<Callback>>;
578
580
 
581
+ /**
582
+ * Create a keyed queue for an asynchronous callback function, where each key has its own queue
583
+ *
584
+ * @param callback Callback function for queued items
585
+ * @param options Queue options
586
+ */
579
587
  export function keyedQueue<Callback extends (key: string, ...parameters: any[]) => void>(
580
588
  callback: Callback,
581
589
  options?: QueueOptions,
582
- ): KeyedQueue<Parameters<Callback>, ReturnType<Callback>>;
590
+ ): KeyedQueue<Callback, Parameters<Callback>>;
583
591
 
584
- export function keyedQueue(
585
- callback: GenericCallback | GenericAsyncCallback,
592
+ export function keyedQueue<Callback extends (key: string, ...parameters: any[]) => Promise<void>>(
593
+ callback: Callback,
586
594
  options?: QueueOptions,
587
- ): KeyedQueue<unknown[], unknown> {
595
+ ): KeyedQueue<Callback, Parameters<Callback>> {
588
596
  if (typeof callback !== 'function') {
589
597
  throw new TypeError(MESSAGE_CALLBACK);
590
598
  }
@@ -605,31 +613,7 @@ export function keyedQueue(
605
613
  pause: (key?: string): void => {
606
614
  handleQueues(state, HANDLE_PAUSE, key);
607
615
  },
608
- remove: (key?: string, id?: number): void => {
609
- if (key == null) {
610
- handleQueues(state, HANDLE_CLEAR);
611
-
612
- state.queues.clear();
613
-
614
- return;
615
- }
616
-
617
- const queue = getQueue(state, key);
618
-
619
- if (queue == null) {
620
- return;
621
- }
622
-
623
- if (typeof id === 'number') {
624
- queue.remove(id);
625
-
626
- return;
627
- }
628
-
629
- queue.clear();
630
-
631
- state.queues.delete(key);
632
- },
616
+ remove: (key?: string, id?: number): void => removeQueue(state, key, id),
633
617
  resume: (key?: string): void => {
634
618
  handleQueues(state, HANDLE_RESUME, key);
635
619
  },
@@ -662,17 +646,7 @@ export function keyedQueue(
662
646
  },
663
647
  items: {
664
648
  enumerable: true,
665
- get: () => {
666
- const size: Record<string, number> = {};
667
-
668
- const queues = state.queues.entries();
669
-
670
- for (const [key, queue] of queues) {
671
- size[key] = queue.size;
672
- }
673
-
674
- return size;
675
- },
649
+ get: () => getItems(state),
676
650
  },
677
651
  keys: {
678
652
  enumerable: true,
@@ -692,7 +666,7 @@ export function keyedQueue(
692
666
  },
693
667
  });
694
668
 
695
- return Object.freeze(instance) as KeyedQueue<unknown[], unknown>;
669
+ return Object.freeze(instance) as unknown as KeyedQueue<Callback, Parameters<Callback>>;
696
670
  }
697
671
 
698
672
  /**
@@ -705,7 +679,7 @@ export function keyedQueue(
705
679
  export function queue<Callback extends GenericAsyncCallback>(
706
680
  callback: Callback,
707
681
  options?: QueueOptions,
708
- ): Queue<Parameters<Callback>, Awaited<ReturnType<Callback>>>;
682
+ ): Queue<Callback, Parameters<Callback>>;
709
683
 
710
684
  /**
711
685
  * Create a queue for a synchronous callback function
@@ -717,17 +691,43 @@ export function queue<Callback extends GenericAsyncCallback>(
717
691
  export function queue<Callback extends GenericCallback>(
718
692
  callback: Callback,
719
693
  options?: QueueOptions,
720
- ): Queue<Parameters<Callback>, ReturnType<Callback>>;
694
+ ): Queue<Callback, Parameters<Callback>>;
721
695
 
722
- export function queue(
723
- callback: GenericCallback | GenericAsyncCallback,
696
+ export function queue<Callback extends GenericCallback | GenericAsyncCallback>(
697
+ callback: Callback,
724
698
  options?: QueueOptions,
725
- ): Queue<unknown[], unknown> {
699
+ ): Queue<Callback, Parameters<Callback>> {
726
700
  return createQueue(callback, options);
727
701
  }
728
702
 
729
703
  queue.keyed = keyedQueue;
730
704
 
705
+ function removeQueue(state: KeyedQueueState, key?: string, id?: number): void {
706
+ if (key == null) {
707
+ handleQueues(state, HANDLE_CLEAR);
708
+
709
+ state.queues.clear();
710
+
711
+ return;
712
+ }
713
+
714
+ const queue = getQueue(state, key);
715
+
716
+ if (queue == null) {
717
+ return;
718
+ }
719
+
720
+ if (typeof id === 'number') {
721
+ queue.remove(id);
722
+
723
+ return;
724
+ }
725
+
726
+ queue.clear();
727
+
728
+ state.queues.delete(key);
729
+ }
730
+
731
731
  async function run(state: QueueState): Promise<void> {
732
732
  if (state.paused || state.runners >= state.options.concurrency) {
733
733
  return;
@@ -757,13 +757,13 @@ async function run(state: QueueState): Promise<void> {
757
757
  const paused = item;
758
758
 
759
759
  state.handled.push(() => {
760
- handleQueuedResult(paused, error, result, state.items.length === 0);
760
+ handleQueuedResult(paused, error, result);
761
761
  });
762
762
 
763
763
  break;
764
764
  }
765
765
 
766
- handleQueuedResult(item, error, result, state.items.length === 0);
766
+ handleQueuedResult(item, error, result);
767
767
 
768
768
  item = state.items.shift();
769
769
  }
@@ -1,5 +1,5 @@
1
+ import {isPlainObject} from '../internal/is';
1
2
  import {getString} from '../internal/string';
2
- import {isPlainObject} from '../is';
3
3
  import type {PlainObject, RequiredKeys} from '../models';
4
4
  import {lowerCase} from './case';
5
5
  import {includes} from './match';
@@ -1,6 +1,6 @@
1
1
  import {noop} from '../function';
2
- import {isPlainObject} from '../is';
3
- import type {ArrayOrPlainObject, GenericCallback, PlainObject} from '../models';
2
+ import {isPlainObject} from '../internal/is';
3
+ import type {PlainObject} from '../models';
4
4
 
5
5
  // #region Types
6
6
 
@@ -1,4 +1,4 @@
1
- import {isNonPlainObject} from '../is';
1
+ import {isNonPlainObject} from '../internal/is';
2
2
  import type {PlainObject} from '../models';
3
3
 
4
4
  // #region Types
@@ -1,4 +1,4 @@
1
- import {isNonPlainObject} from '../is';
1
+ import {isNonPlainObject} from '../internal/is';
2
2
  import type {GenericCallback, PlainObject} from '../models';
3
3
 
4
4
  // #region Types