shelving 1.87.0 → 1.88.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/{react/useItem.d.ts → db/ItemState.d.ts} +3 -9
- package/{react/useItem.js → db/ItemState.js} +2 -11
- package/{react/useQuery.d.ts → db/QueryState.d.ts} +0 -6
- package/{react/useQuery.js → db/QueryState.js} +0 -8
- package/db/index.d.ts +2 -0
- package/db/index.js +2 -0
- package/package.json +1 -1
- package/react/index.d.ts +1 -2
- package/react/index.js +1 -2
- package/react/useData.d.ts +15 -0
- package/react/useData.js +17 -0
- package/react/useState.d.ts +8 -6
- package/react/useState.js +15 -7
- package/schema/NumberSchema.d.ts +14 -2
- package/schema/NumberSchema.js +15 -3
- package/util/transform.d.ts +28 -23
- package/util/transform.js +16 -18
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import { Datas, DataKey } from "../util/data.js";
|
|
1
|
+
import { DataKey, Datas } from "../util/data.js";
|
|
2
|
+
import { Dispatch } from "../util/function.js";
|
|
4
3
|
import { State } from "../state/State.js";
|
|
5
4
|
import { BooleanState } from "../state/BooleanState.js";
|
|
5
|
+
import { ItemValue, Item, AsyncItem, ItemData } from "./Item.js";
|
|
6
6
|
/** Hold the current state of a item. */
|
|
7
7
|
export declare class ItemState<T extends Datas, K extends DataKey<T> = DataKey<T>> extends State<ItemValue<T[K]>> {
|
|
8
8
|
readonly ref: Item<T, K> | AsyncItem<T, K>;
|
|
@@ -20,9 +20,3 @@ export declare class ItemState<T extends Datas, K extends DataKey<T> = DataKey<T
|
|
|
20
20
|
/** Subscribe this state to the source provider. */
|
|
21
21
|
connectSource(): Dispatch;
|
|
22
22
|
}
|
|
23
|
-
/**
|
|
24
|
-
* Use an item in a React component.
|
|
25
|
-
* - Uses the default cache, so will error if not used inside `<Cache>`
|
|
26
|
-
*/
|
|
27
|
-
export declare function useItem<T extends Datas, K extends DataKey<T>>(ref: Item<T, K> | AsyncItem<T, K>): ItemState<T, K>;
|
|
28
|
-
export declare function useItem<T extends Datas, K extends DataKey<T>>(ref?: Item<T, K> | AsyncItem<T, K>): ItemState<T, K> | undefined;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { getData } from "../util/data.js";
|
|
2
|
-
import { getOptionalSource } from "../util/source.js";
|
|
3
|
-
import { setMapItem } from "../util/map.js";
|
|
4
|
-
import { CacheProvider } from "../provider/CacheProvider.js";
|
|
5
2
|
import { State } from "../state/State.js";
|
|
6
3
|
import { BooleanState } from "../state/BooleanState.js";
|
|
4
|
+
import { getOptionalSource } from "../util/source.js";
|
|
7
5
|
import { LazyDeferredSequence } from "../sequence/LazyDeferredSequence.js";
|
|
8
|
-
import {
|
|
9
|
-
import { useCache } from "./useCache.js";
|
|
6
|
+
import { CacheProvider } from "../provider/CacheProvider.js";
|
|
10
7
|
/** Hold the current state of a item. */
|
|
11
8
|
export class ItemState extends State {
|
|
12
9
|
/** Get the data of the item (throws `RequiredError` if item doesn't exist). */
|
|
@@ -58,9 +55,3 @@ export class ItemState extends State {
|
|
|
58
55
|
return this.from(this.ref);
|
|
59
56
|
}
|
|
60
57
|
}
|
|
61
|
-
export function useItem(ref) {
|
|
62
|
-
const cache = useCache();
|
|
63
|
-
const key = ref === null || ref === void 0 ? void 0 : ref.toString();
|
|
64
|
-
const state = ref && key ? cache.get(key) || setMapItem(cache, key, new ItemState(ref)) : undefined;
|
|
65
|
-
return useState(state);
|
|
66
|
-
}
|
|
@@ -41,9 +41,3 @@ export declare class QueryState<T extends Datas, K extends DataKey<T> = DataKey<
|
|
|
41
41
|
/** Iterate over the items. */
|
|
42
42
|
[Symbol.iterator](): Iterator<ItemData<T[K]>>;
|
|
43
43
|
}
|
|
44
|
-
/**
|
|
45
|
-
* Use a query in a React component.
|
|
46
|
-
* - Uses the default cache, so will error if not used inside `<Cache>`
|
|
47
|
-
*/
|
|
48
|
-
export declare function useQuery<T extends Datas, K extends DataKey<T>>(ref: Query<T, K> | AsyncQuery<T, K>): QueryState<T, K>;
|
|
49
|
-
export declare function useQuery<T extends Datas, K extends DataKey<T>>(ref?: Query<T, K> | AsyncQuery<T, K>): QueryState<T, K> | undefined;
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { setMapItem } from "../util/map.js";
|
|
2
1
|
import { getFirstItem, getLastItem, getOptionalFirstItem, getOptionalLastItem } from "../util/array.js";
|
|
3
2
|
import { getOptionalSource } from "../util/source.js";
|
|
4
3
|
import { CacheProvider } from "../provider/CacheProvider.js";
|
|
5
4
|
import { State } from "../state/State.js";
|
|
6
5
|
import { BooleanState } from "../state/BooleanState.js";
|
|
7
6
|
import { LazyDeferredSequence } from "../sequence/LazyDeferredSequence.js";
|
|
8
|
-
import { useState } from "./useState.js";
|
|
9
|
-
import { useCache } from "./useCache.js";
|
|
10
7
|
/** Hold the current state of a query. */
|
|
11
8
|
export class QueryState extends State {
|
|
12
9
|
/** Can more items be loaded after the current result. */
|
|
@@ -110,8 +107,3 @@ export class QueryState extends State {
|
|
|
110
107
|
return this.value.values();
|
|
111
108
|
}
|
|
112
109
|
}
|
|
113
|
-
export function useQuery(ref) {
|
|
114
|
-
const cache = useCache();
|
|
115
|
-
const key = ref === null || ref === void 0 ? void 0 : ref.toString();
|
|
116
|
-
return useState(ref && key ? cache.get(key) || setMapItem(cache, key, new QueryState(ref)) : undefined);
|
|
117
|
-
}
|
package/db/index.d.ts
CHANGED
package/db/index.js
CHANGED
package/package.json
CHANGED
package/react/index.d.ts
CHANGED
package/react/index.js
CHANGED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { ImmutableArray } from "../util/array.js";
|
|
2
|
+
import { DataKey, Datas } from "../util/data.js";
|
|
3
|
+
import { AsyncItem } from "../db/Item.js";
|
|
4
|
+
import { ItemState } from "../db/ItemState.js";
|
|
5
|
+
import { AsyncQuery } from "../db/Query.js";
|
|
6
|
+
import { QueryState } from "../db/QueryState.js";
|
|
7
|
+
type Reference<T extends Datas, K extends DataKey<T>> = AsyncItem<T, K> | AsyncQuery<T, K>;
|
|
8
|
+
type ReferenceReferenceState<T extends Reference<Datas, string>> = T extends AsyncItem<infer D, infer K> ? ItemState<D, K> : T extends AsyncQuery<infer D, infer K> ? QueryState<D, K> : never;
|
|
9
|
+
/** Use one or more data items or queries. */
|
|
10
|
+
export declare function useData<T extends Reference<Datas, string>>(ref: T): ReferenceReferenceState<T>;
|
|
11
|
+
export declare function useData<T extends Reference<Datas, string>>(ref: T | undefined): ReferenceReferenceState<T> | undefined;
|
|
12
|
+
export declare function useData<T extends ImmutableArray<Reference<Datas, string>>>(...refs: T): {
|
|
13
|
+
[K in keyof T]: ReferenceReferenceState<T[K]>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
package/react/useData.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { setMapItem } from "../util/map.js";
|
|
2
|
+
import { mapArray } from "../util/transform.js";
|
|
3
|
+
import { AsyncItem } from "../db/Item.js";
|
|
4
|
+
import { ItemState } from "../db/ItemState.js";
|
|
5
|
+
import { QueryState } from "../db/QueryState.js";
|
|
6
|
+
import { useState } from "./useState.js";
|
|
7
|
+
import { useCache } from "./useCache.js";
|
|
8
|
+
export function useData(...refs) {
|
|
9
|
+
const cache = useCache();
|
|
10
|
+
const states = mapArray(refs, _getReferenceState, cache);
|
|
11
|
+
return useState(...states);
|
|
12
|
+
}
|
|
13
|
+
/** Get the corresponding `ItemState` or `QueryState` instance from the cache for a given `Item` or `Query`. */
|
|
14
|
+
function _getReferenceState(ref, cache) {
|
|
15
|
+
const key = ref === null || ref === void 0 ? void 0 : ref.toString();
|
|
16
|
+
return ref && key ? cache.get(key) || setMapItem(cache, key, ref instanceof AsyncItem ? new ItemState(ref) : new QueryState(ref)) : undefined;
|
|
17
|
+
}
|
package/react/useState.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { AnyState } from "../state/State.js";
|
|
1
|
+
import type { AnyState } from "../state/State.js";
|
|
2
|
+
import { ImmutableArray } from "../util/array.js";
|
|
2
3
|
/**
|
|
3
|
-
* Subscribe to
|
|
4
|
+
* Subscribe to one or more `State` instances.
|
|
4
5
|
*
|
|
5
|
-
* @param state
|
|
6
|
-
* - Subscription is recreated every time
|
|
6
|
+
* @param state `State` instance.
|
|
7
|
+
* - Subscription is recreated every time the state instance changes.
|
|
7
8
|
* - Memoise this value to persist the subscription for the lifetime of the component.
|
|
8
9
|
* - If the value is a `State` instance
|
|
9
10
|
*/
|
|
10
|
-
export declare function useState<
|
|
11
|
-
export declare function useState<
|
|
11
|
+
export declare function useState<T extends AnyState>(state: T): T;
|
|
12
|
+
export declare function useState<T extends AnyState>(state?: T | undefined): T | undefined;
|
|
13
|
+
export declare function useState<T extends ImmutableArray<AnyState | undefined>>(...states: T): T;
|
package/react/useState.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
1
|
import { useEffect, useState as useReactState } from "react";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
export function useState(
|
|
6
|
-
const
|
|
2
|
+
import { dispatch } from "../util/function.js";
|
|
3
|
+
import { mapArray } from "../util/transform.js";
|
|
4
|
+
import { isDefined } from "../util/undefined.js";
|
|
5
|
+
export function useState(...states) {
|
|
6
|
+
const setValue = useReactState(undefined)[1];
|
|
7
7
|
const [error, setError] = useReactState(undefined);
|
|
8
|
-
useEffect(
|
|
8
|
+
useEffect(() => {
|
|
9
|
+
const forceRerender = () => setValue({});
|
|
10
|
+
const stops = mapArray(states, _startState, forceRerender, setError);
|
|
11
|
+
return () => stops.filter(isDefined).forEach(dispatch);
|
|
12
|
+
}, states);
|
|
9
13
|
if (error)
|
|
10
14
|
throw error;
|
|
11
|
-
return
|
|
15
|
+
return states.length <= 1 ? states[0] : states;
|
|
16
|
+
}
|
|
17
|
+
/** Start a subscription to a `ReferenceState` instance. */
|
|
18
|
+
function _startState(state, setValue, setError) {
|
|
19
|
+
return state === null || state === void 0 ? void 0 : state.next.to(setValue, setError);
|
|
12
20
|
}
|
package/schema/NumberSchema.d.ts
CHANGED
|
@@ -17,9 +17,21 @@ export declare class NumberSchema extends Schema<number> {
|
|
|
17
17
|
}
|
|
18
18
|
/** Valid number, e.g. `2048.12345` or `0` zero. */
|
|
19
19
|
export declare const NUMBER: NumberSchema;
|
|
20
|
-
/** Valid number, e.g. `2048.12345` or `0` zero, or `null` */
|
|
20
|
+
/** Valid optional number, e.g. `2048.12345` or `0` zero, or `null` */
|
|
21
21
|
export declare const OPTIONAL_NUMBER: import("./OptionalSchema.js").OptionalSchema<number>;
|
|
22
22
|
/** Valid integer number, e.g. `2048` or `0` zero. */
|
|
23
23
|
export declare const INTEGER: NumberSchema;
|
|
24
|
-
/** Valid integer number, e.g. `
|
|
24
|
+
/** Valid positive integer number, e.g. `1,2,3` (not including zero). */
|
|
25
|
+
export declare const POSITIVE_INTEGER: NumberSchema;
|
|
26
|
+
/** Valid non-negative integer number, e.g. `0,1,2,3` (including zero). */
|
|
27
|
+
export declare const NON_NEGATIVE_INTEGER: NumberSchema;
|
|
28
|
+
/** Valid negative integer number, e.g. `-1,-2,-3` (not including zero). */
|
|
29
|
+
export declare const NEGATIVE_INTEGER: NumberSchema;
|
|
30
|
+
/** Valid non-positive integer number, e.g. `0,-1,-2,-3` (including zero). */
|
|
31
|
+
export declare const NON_POSITIVE_INTEGER: NumberSchema;
|
|
32
|
+
/** Valid optional integer number, e.g. `2048` or `0` zero, or `null` */
|
|
25
33
|
export declare const OPTIONAL_INTEGER: import("./OptionalSchema.js").OptionalSchema<number>;
|
|
34
|
+
/** Valid Unix timestamp (including milliseconds). */
|
|
35
|
+
export declare const TIMESTAMP: NumberSchema;
|
|
36
|
+
/** Valid Unix timestamp (including milliseconds). */
|
|
37
|
+
export declare const OPTIONAL_TIMESTAMP: import("./OptionalSchema.js").OptionalSchema<number>;
|
package/schema/NumberSchema.js
CHANGED
|
@@ -25,9 +25,21 @@ export class NumberSchema extends Schema {
|
|
|
25
25
|
}
|
|
26
26
|
/** Valid number, e.g. `2048.12345` or `0` zero. */
|
|
27
27
|
export const NUMBER = new NumberSchema({});
|
|
28
|
-
/** Valid number, e.g. `2048.12345` or `0` zero, or `null` */
|
|
28
|
+
/** Valid optional number, e.g. `2048.12345` or `0` zero, or `null` */
|
|
29
29
|
export const OPTIONAL_NUMBER = OPTIONAL(NUMBER);
|
|
30
30
|
/** Valid integer number, e.g. `2048` or `0` zero. */
|
|
31
|
-
export const INTEGER = new NumberSchema({ step: 1, min: Number.MIN_SAFE_INTEGER, max: Number.MAX_SAFE_INTEGER });
|
|
32
|
-
/** Valid integer number, e.g. `
|
|
31
|
+
export const INTEGER = new NumberSchema({ step: 1, min: Number.MIN_SAFE_INTEGER, max: Number.MAX_SAFE_INTEGER, value: 0 });
|
|
32
|
+
/** Valid positive integer number, e.g. `1,2,3` (not including zero). */
|
|
33
|
+
export const POSITIVE_INTEGER = new NumberSchema({ step: 1, min: 1, max: Number.MAX_SAFE_INTEGER, value: 1 });
|
|
34
|
+
/** Valid non-negative integer number, e.g. `0,1,2,3` (including zero). */
|
|
35
|
+
export const NON_NEGATIVE_INTEGER = new NumberSchema({ step: 1, min: 0, max: Number.MAX_SAFE_INTEGER, value: 0 });
|
|
36
|
+
/** Valid negative integer number, e.g. `-1,-2,-3` (not including zero). */
|
|
37
|
+
export const NEGATIVE_INTEGER = new NumberSchema({ step: 1, min: Number.MIN_SAFE_INTEGER, max: -1, value: -1 });
|
|
38
|
+
/** Valid non-positive integer number, e.g. `0,-1,-2,-3` (including zero). */
|
|
39
|
+
export const NON_POSITIVE_INTEGER = new NumberSchema({ step: 1, min: Number.MIN_SAFE_INTEGER, max: 0, value: 0 });
|
|
40
|
+
/** Valid optional integer number, e.g. `2048` or `0` zero, or `null` */
|
|
33
41
|
export const OPTIONAL_INTEGER = OPTIONAL(INTEGER);
|
|
42
|
+
/** Valid Unix timestamp (including milliseconds). */
|
|
43
|
+
export const TIMESTAMP = INTEGER;
|
|
44
|
+
/** Valid Unix timestamp (including milliseconds). */
|
|
45
|
+
export const OPTIONAL_TIMESTAMP = OPTIONAL_INTEGER;
|
package/util/transform.d.ts
CHANGED
|
@@ -1,49 +1,54 @@
|
|
|
1
1
|
import type { ArrayItem, ImmutableArray } from "./array.js";
|
|
2
2
|
import type { Entry } from "./entry.js";
|
|
3
|
+
import { Arguments } from "./function.js";
|
|
3
4
|
import { ImmutableObject, ObjectValue } from "./object.js";
|
|
4
5
|
import { ImmutableDictionary } from "./dictionary.js";
|
|
5
6
|
/** Object that transforms an input value into an output value with its `transform()` method. */
|
|
6
|
-
export interface Transformable<I, O> {
|
|
7
|
-
transform(input: I): O;
|
|
7
|
+
export interface Transformable<I, O, A extends Arguments = []> {
|
|
8
|
+
transform(input: I, ...args: A): O;
|
|
8
9
|
}
|
|
9
10
|
/** Object that transforms an input value into an output value with its `transform()` method. */
|
|
10
|
-
export interface AsyncTransformable<I, O> {
|
|
11
|
-
transform(input: I): O | PromiseLike<O>;
|
|
11
|
+
export interface AsyncTransformable<I, O, A extends Arguments = []> {
|
|
12
|
+
transform(input: I, ...args: A): O | PromiseLike<O>;
|
|
12
13
|
}
|
|
13
14
|
/** Is an unknown value a transformable. */
|
|
14
|
-
export declare const isTransformable: <T extends Transformable<unknown, unknown>>(value: unknown) => value is T;
|
|
15
|
+
export declare const isTransformable: <T extends Transformable<unknown, unknown, Arguments>>(value: unknown) => value is T;
|
|
15
16
|
/** Function that can transform an input value into an output value. */
|
|
16
|
-
export type Transform<I, O> = (input: I) => O;
|
|
17
|
+
export type Transform<I, O, A extends Arguments = []> = (input: I, ...args: A) => O;
|
|
17
18
|
/** Function that can transform an input value into an output value. */
|
|
18
|
-
export type AsyncTransform<I, O> = (input: I) => O | PromiseLike<O>;
|
|
19
|
+
export type AsyncTransform<I, O, A extends Arguments = []> = (input: I, ...args: A) => O | PromiseLike<O>;
|
|
19
20
|
/** Something that can transform an input value into an output value (or a plain value). */
|
|
20
|
-
export type Transformer<I, O> = Transformable<I, O> | Transform<I, O> | O;
|
|
21
|
+
export type Transformer<I, O, A extends Arguments = []> = Transformable<I, O, A> | Transform<I, O, A> | O;
|
|
21
22
|
/** Something that can transform an input value into an output value (or a plain value). */
|
|
22
|
-
export type AsyncTransformer<I, O> = AsyncTransformable<I, O> | AsyncTransform<I, O> | O;
|
|
23
|
+
export type AsyncTransformer<I, O, A extends Arguments = []> = AsyncTransformable<I, O, A> | AsyncTransform<I, O, A> | O;
|
|
23
24
|
/** Transform a value using a transformer. */
|
|
24
|
-
export declare function transform<I, O>(input: I, transformer: (v: I) => O): O;
|
|
25
|
-
export declare function transform<I, O>(input: I, transformer: (v: I) => O | PromiseLike<O
|
|
26
|
-
export declare function transform<I, O>(input: I, transformer: Transformer<I, O
|
|
27
|
-
export declare function transform<I, O>(input: I, transformer: AsyncTransformer<I, O
|
|
25
|
+
export declare function transform<I, O, A extends Arguments = []>(input: I, transformer: (v: I) => O, ...args: A): O;
|
|
26
|
+
export declare function transform<I, O, A extends Arguments = []>(input: I, transformer: (v: I) => O | PromiseLike<O>, ...args: A): O | PromiseLike<O>;
|
|
27
|
+
export declare function transform<I, O, A extends Arguments = []>(input: I, transformer: Transformer<I, O, A>, ...args: A): O;
|
|
28
|
+
export declare function transform<I, O, A extends Arguments = []>(input: I, transformer: AsyncTransformer<I, O, A>, ...args: A): O;
|
|
28
29
|
/** Modify a set of items using a transformer. */
|
|
29
|
-
export declare function mapItems<I, O>(items: Iterable<I>, transformer:
|
|
30
|
+
export declare function mapItems<I, O, A extends Arguments = []>(items: Iterable<I>, transformer: (v: I, ...args: A) => O, ...args: A): Iterable<O>;
|
|
31
|
+
export declare function mapItems<I, O, A extends Arguments = []>(items: Iterable<I>, transformer: Transformer<I, O, A>, ...args: A): Iterable<O>;
|
|
30
32
|
/** Modify the items of an array using a transformer. */
|
|
31
33
|
export declare function mapArray<T extends ImmutableArray>(arr: T, transformer: Transformer<ArrayItem<T>, ArrayItem<T>>): T;
|
|
32
|
-
export declare function mapArray<I, O>(arr: Iterable<I>, transformer:
|
|
34
|
+
export declare function mapArray<I, O, A extends Arguments = []>(arr: Iterable<I>, transformer: (v: I, ...args: A) => O, ...args: A): ImmutableArray<O>;
|
|
35
|
+
export declare function mapArray<I, O, A extends Arguments = []>(arr: Iterable<I>, transformer: Transformer<I, O, A>, ...args: A): ImmutableArray<O>;
|
|
33
36
|
/** Modify the values of the props of an object using a transformer. */
|
|
34
37
|
export declare function mapObject<T extends ImmutableObject>(obj: T, transformer: Transformer<ObjectValue<T>, ObjectValue<T>>): T;
|
|
35
|
-
export declare function mapObject<I extends ImmutableObject, O extends ImmutableObject>(obj: I, transformer:
|
|
38
|
+
export declare function mapObject<I extends ImmutableObject, O extends ImmutableObject, A extends Arguments = []>(obj: I, transformer: (v: ObjectValue<I>, ...args: A) => ObjectValue<O>, ...args: A): O;
|
|
39
|
+
export declare function mapObject<I extends ImmutableObject, O extends ImmutableObject, A extends Arguments = []>(obj: I, transformer: Transformer<ObjectValue<I>, ObjectValue<O>>, ...args: A): O;
|
|
36
40
|
/** Modify the values of a dictionary using a transformer. */
|
|
37
|
-
export declare const mapDictionary: <I, O>(dictionary: ImmutableDictionary<I>, transformer: Transformer<I, O
|
|
41
|
+
export declare const mapDictionary: <I, O, A extends Arguments = []>(dictionary: ImmutableDictionary<I>, transformer: Transformer<I, O, A>, ...args: A) => ImmutableDictionary<O>;
|
|
38
42
|
/** Modify the values of a set of entries using a transformer. */
|
|
39
|
-
export declare function mapEntries<K, I, O>(entries: Iterable<Entry<K, I>>, transformer: Transformer<I, O
|
|
43
|
+
export declare function mapEntries<K, I, O, A extends Arguments = []>(entries: Iterable<Entry<K, I>>, transformer: Transformer<I, O, A>, ...args: A): Iterable<Entry<K, O>>;
|
|
40
44
|
/** Set of named transformers for a data object (or `undefined` to skip the transform). */
|
|
41
|
-
export type Transformers<T extends ImmutableObject> = {
|
|
42
|
-
readonly [K in keyof T]?: Transformer<T[K], T[K]> | undefined;
|
|
45
|
+
export type Transformers<T extends ImmutableObject, A extends Arguments = []> = {
|
|
46
|
+
readonly [K in keyof T]?: Transformer<T[K], T[K], A> | undefined;
|
|
43
47
|
};
|
|
44
48
|
/** Transform an object using a set of named transformers. */
|
|
45
|
-
export declare function transformObject<T extends ImmutableObject>(obj: T, transforms: Transformers<T
|
|
49
|
+
export declare function transformObject<T extends ImmutableObject, A extends Arguments = []>(obj: T, transforms: Transformers<T, A>, ...args: A): T;
|
|
46
50
|
/** Transform a dictionary object using a set of named transformers. */
|
|
47
|
-
export declare const transformDictionary: <T>(dict: ImmutableDictionary<T>, transforms: Transformers<ImmutableDictionary<T
|
|
51
|
+
export declare const transformDictionary: <T, A extends Arguments = []>(dict: ImmutableDictionary<T>, transforms: Transformers<ImmutableDictionary<T>, A>, ...args: A) => ImmutableDictionary<T>;
|
|
48
52
|
/** Transform items in a sequence as they are yielded using a (potentially async) transformer. */
|
|
49
|
-
export declare function mapSequence<
|
|
53
|
+
export declare function mapSequence<I, O, A extends Arguments = []>(sequence: AsyncIterable<I>, transformer: (input: I, ...args: A) => O | PromiseLike<O>, ...args: A): AsyncIterable<O>;
|
|
54
|
+
export declare function mapSequence<I, O, A extends Arguments = []>(sequence: AsyncIterable<I>, transformer: AsyncTransformer<I, O, A>, ...args: A): AsyncIterable<O>;
|
package/util/transform.js
CHANGED
|
@@ -2,40 +2,38 @@ import { isFunction } from "./function.js";
|
|
|
2
2
|
import { getProps, isObject } from "./object.js";
|
|
3
3
|
/** Is an unknown value a transformable. */
|
|
4
4
|
export const isTransformable = (value) => isObject(value) && typeof value.transform === "function";
|
|
5
|
-
export function transform(input, transformer) {
|
|
6
|
-
return isFunction(transformer) ? transformer(input) : isTransformable(transformer) ? transformer.transform(input) : transformer;
|
|
5
|
+
export function transform(input, transformer, ...args) {
|
|
6
|
+
return isFunction(transformer) ? transformer(input, ...args) : isTransformable(transformer) ? transformer.transform(input, ...args) : transformer;
|
|
7
7
|
}
|
|
8
|
-
|
|
9
|
-
export function* mapItems(items, transformer) {
|
|
8
|
+
export function* mapItems(items, transformer, ...args) {
|
|
10
9
|
for (const item of items)
|
|
11
|
-
yield transform(item, transformer);
|
|
10
|
+
yield transform(item, transformer, ...args);
|
|
12
11
|
}
|
|
13
|
-
export function mapArray(arr, transformer) {
|
|
14
|
-
return Array.from(mapItems(arr, transformer));
|
|
12
|
+
export function mapArray(arr, transformer, ...args) {
|
|
13
|
+
return Array.from(mapItems(arr, transformer, ...args));
|
|
15
14
|
}
|
|
16
|
-
export function mapObject(obj, transformer) {
|
|
17
|
-
return Object.fromEntries(mapEntries(getProps(obj), transformer));
|
|
15
|
+
export function mapObject(obj, transformer, ...args) {
|
|
16
|
+
return Object.fromEntries(mapEntries(getProps(obj), transformer, ...args));
|
|
18
17
|
}
|
|
19
18
|
/** Modify the values of a dictionary using a transformer. */
|
|
20
19
|
export const mapDictionary = mapObject;
|
|
21
20
|
/** Modify the values of a set of entries using a transformer. */
|
|
22
|
-
export function* mapEntries(entries, transformer) {
|
|
21
|
+
export function* mapEntries(entries, transformer, ...args) {
|
|
23
22
|
for (const [k, v] of entries)
|
|
24
|
-
yield [k, transform(v, transformer)];
|
|
23
|
+
yield [k, transform(v, transformer, ...args)];
|
|
25
24
|
}
|
|
26
25
|
/** Transform an object using a set of named transformers. */
|
|
27
|
-
export function transformObject(obj, transforms) {
|
|
28
|
-
return { ...obj, ...Object.fromEntries(_transformObjectProps(obj, transforms)) };
|
|
26
|
+
export function transformObject(obj, transforms, ...args) {
|
|
27
|
+
return { ...obj, ...Object.fromEntries(_transformObjectProps(obj, transforms, ...args)) };
|
|
29
28
|
}
|
|
30
|
-
function* _transformObjectProps(obj, transforms) {
|
|
29
|
+
function* _transformObjectProps(obj, transforms, ...args) {
|
|
31
30
|
for (const [k, v] of getProps(transforms))
|
|
32
31
|
if (v !== undefined)
|
|
33
|
-
yield [k, transform(obj[k], v)];
|
|
32
|
+
yield [k, transform(obj[k], v, ...args)];
|
|
34
33
|
}
|
|
35
34
|
/** Transform a dictionary object using a set of named transformers. */
|
|
36
35
|
export const transformDictionary = transformObject;
|
|
37
|
-
|
|
38
|
-
export async function* mapSequence(sequence, transformer) {
|
|
36
|
+
export async function* mapSequence(sequence, transformer, ...args) {
|
|
39
37
|
for await (const item of sequence)
|
|
40
|
-
yield transform(item, transformer);
|
|
38
|
+
yield transform(item, transformer, ...args);
|
|
41
39
|
}
|