@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.
- package/dist/beacon.d.mts +6 -44
- package/dist/beacon.mjs +20 -67
- package/dist/color/constants.d.mts +82 -41
- package/dist/color/constants.mjs +102 -63
- package/dist/color/instance.mjs +36 -13
- package/dist/color/misc/alpha.mjs +9 -10
- package/dist/color/misc/format.mjs +4 -4
- package/dist/color/misc/get.mjs +18 -18
- package/dist/color/misc/is.mjs +22 -21
- package/dist/color/misc/state.d.mts +6 -5
- package/dist/color/misc/state.mjs +31 -26
- package/dist/color/models.d.mts +78 -1
- package/dist/color/space/hex.mjs +12 -12
- package/dist/color/space/hsl.mjs +16 -16
- package/dist/color/space/hwb.mjs +10 -10
- package/dist/color/space/rgb.mjs +16 -16
- package/dist/herald.d.mts +2 -3
- package/dist/index.d.mts +141 -67
- package/dist/index.mjs +552 -391
- package/dist/internal/subscription.d.mts +52 -0
- package/dist/internal/subscription.mjs +127 -0
- package/dist/models.d.mts +5 -1
- package/dist/queue.d.mts +25 -23
- package/dist/queue.mjs +27 -28
- package/package.json +1 -1
- package/src/beacon.ts +32 -117
- package/src/color/constants.ts +115 -78
- package/src/color/instance.ts +65 -12
- package/src/color/misc/alpha.ts +13 -21
- package/src/color/misc/format.ts +4 -4
- package/src/color/misc/get.ts +23 -40
- package/src/color/misc/is.ts +29 -39
- package/src/color/misc/state.ts +77 -41
- package/src/color/models.ts +94 -1
- package/src/color/space/hex.ts +18 -23
- package/src/color/space/hsl.ts +16 -24
- package/src/color/space/hwb.ts +10 -10
- package/src/color/space/rgb.ts +19 -16
- package/src/herald.ts +1 -3
- package/src/index.ts +1 -0
- package/src/internal/subscription.ts +264 -0
- package/src/models.ts +5 -0
- package/src/queue.ts +92 -92
- package/src/string/fuzzy.ts +1 -1
- package/src/value/freeze.ts +2 -2
- package/src/value/shake.ts +1 -1
- 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
|
-
|
|
13
|
-
|
|
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<
|
|
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
|
|
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[]
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
275
|
+
promise: Promise<unknown>;
|
|
273
276
|
reject: (reason?: unknown) => void;
|
|
274
|
-
resolve: (value:
|
|
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:
|
|
290
|
+
callback: GenericAsyncCallback,
|
|
299
291
|
options?: QueueOptions,
|
|
300
292
|
key?: string,
|
|
301
|
-
): Queue<
|
|
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<
|
|
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:
|
|
324
|
+
let resolver: (value: unknown) => void;
|
|
333
325
|
|
|
334
|
-
const promise = new Promise<
|
|
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<
|
|
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<
|
|
466
|
+
function getQueue(state: KeyedQueueState, key: string, add: true): Queue<GenericCallback>;
|
|
463
467
|
|
|
464
|
-
function getQueue(state: KeyedQueueState, key: string): Queue<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
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<
|
|
590
|
+
): KeyedQueue<Callback, Parameters<Callback>>;
|
|
583
591
|
|
|
584
|
-
export function keyedQueue(
|
|
585
|
-
callback:
|
|
592
|
+
export function keyedQueue<Callback extends (key: string, ...parameters: any[]) => Promise<void>>(
|
|
593
|
+
callback: Callback,
|
|
586
594
|
options?: QueueOptions,
|
|
587
|
-
): KeyedQueue<
|
|
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<
|
|
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<
|
|
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<
|
|
694
|
+
): Queue<Callback, Parameters<Callback>>;
|
|
721
695
|
|
|
722
|
-
export function queue(
|
|
723
|
-
callback:
|
|
696
|
+
export function queue<Callback extends GenericCallback | GenericAsyncCallback>(
|
|
697
|
+
callback: Callback,
|
|
724
698
|
options?: QueueOptions,
|
|
725
|
-
): Queue<
|
|
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
|
|
760
|
+
handleQueuedResult(paused, error, result);
|
|
761
761
|
});
|
|
762
762
|
|
|
763
763
|
break;
|
|
764
764
|
}
|
|
765
765
|
|
|
766
|
-
handleQueuedResult(item, error, result
|
|
766
|
+
handleQueuedResult(item, error, result);
|
|
767
767
|
|
|
768
768
|
item = state.items.shift();
|
|
769
769
|
}
|
package/src/string/fuzzy.ts
CHANGED
package/src/value/freeze.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {noop} from '../function';
|
|
2
|
-
import {isPlainObject} from '../is';
|
|
3
|
-
import type {
|
|
2
|
+
import {isPlainObject} from '../internal/is';
|
|
3
|
+
import type {PlainObject} from '../models';
|
|
4
4
|
|
|
5
5
|
// #region Types
|
|
6
6
|
|
package/src/value/shake.ts
CHANGED
package/src/value/transform.ts
CHANGED