map-transform 1.2.0 → 1.4.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 +50 -4
- package/dist/transformers/index.d.ts +1 -0
- package/dist/transformers/index.js +2 -0
- package/dist/transformers/index.js.map +1 -1
- package/dist/transformers/project.d.ts +9 -0
- package/dist/transformers/project.js +51 -0
- package/dist/transformers/project.js.map +1 -0
- package/dist/utils/is.d.ts +2 -0
- package/dist/utils/is.js +2 -0
- package/dist/utils/is.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1452,7 +1452,7 @@ and not the order of the items in the original array. When a path is given, the
|
|
|
1452
1452
|
array will be set on this path.
|
|
1453
1453
|
|
|
1454
1454
|
```javascript
|
|
1455
|
-
const def40 = bucket({
|
|
1455
|
+
const def40 = transform(bucket({
|
|
1456
1456
|
path: 'users[]',
|
|
1457
1457
|
buckets: [
|
|
1458
1458
|
{
|
|
@@ -1467,7 +1467,7 @@ const def40 = bucket({
|
|
|
1467
1467
|
key: 'users',
|
|
1468
1468
|
},
|
|
1469
1469
|
],
|
|
1470
|
-
})
|
|
1470
|
+
}))
|
|
1471
1471
|
|
|
1472
1472
|
const data = {
|
|
1473
1473
|
users: [
|
|
@@ -1500,9 +1500,9 @@ const mappedData = await mapper(data)
|
|
|
1500
1500
|
Or by size:
|
|
1501
1501
|
|
|
1502
1502
|
```javascript
|
|
1503
|
-
const def41 = bucket({
|
|
1503
|
+
const def41 = transform(bucket({
|
|
1504
1504
|
buckets: [{ key: 'top3', size: 3 }, { key: 'theOthers' }],
|
|
1505
|
-
})
|
|
1505
|
+
}))
|
|
1506
1506
|
|
|
1507
1507
|
const data = ['user1', 'user2', 'user3', 'user4', 'user5', 'user6', 'user7']
|
|
1508
1508
|
|
|
@@ -1848,6 +1848,52 @@ const def21b = [
|
|
|
1848
1848
|
]
|
|
1849
1849
|
```
|
|
1850
1850
|
|
|
1851
|
+
#### `project({include, exclude})` transformer
|
|
1852
|
+
|
|
1853
|
+
Will return an object with only the props specified in `include` or none of the
|
|
1854
|
+
props in `exclude`. Both `include` and `exclude` may be array of strings, and
|
|
1855
|
+
they should not be used in combination. If both are provided, `include` will be
|
|
1856
|
+
used.
|
|
1857
|
+
|
|
1858
|
+
You may also specify an `includePath` or `excludePath`. These are dot notation
|
|
1859
|
+
paths to arrays of strings, and will be used instead of `include` or `exclude`.
|
|
1860
|
+
If `include` or `exclude` are also provided, they will be used as default
|
|
1861
|
+
values when the corresponding path yields no value. Note that "no value" here
|
|
1862
|
+
means `undefined`, and we don't support custom nonvalues here yet.
|
|
1863
|
+
|
|
1864
|
+
When given an array of object, each object will be projected. When given
|
|
1865
|
+
anything that is not an object, undefined will be returned.
|
|
1866
|
+
|
|
1867
|
+
As we cannot bring back the removed props when mapping in reverse, this
|
|
1868
|
+
transformer will pass on the object data as is in reverse.
|
|
1869
|
+
|
|
1870
|
+
```javascript
|
|
1871
|
+
import { transform, transformers } from 'map-transform'
|
|
1872
|
+
const { project } = transformers
|
|
1873
|
+
|
|
1874
|
+
const def42 = transform(project({ include: ['id', 'name'] }))
|
|
1875
|
+
|
|
1876
|
+
const data = {
|
|
1877
|
+
id: 'ent1',
|
|
1878
|
+
name: 'Entry 1',
|
|
1879
|
+
text: 'Do not include',
|
|
1880
|
+
created: new Date('2023-12-01T00:00:00Z'),
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
const mapper = mapTransform(def42)
|
|
1884
|
+
const mappedData = await mapper(data)
|
|
1885
|
+
// --> {
|
|
1886
|
+
// id: 'ent1',
|
|
1887
|
+
// name: 'Entry 1',
|
|
1888
|
+
// }
|
|
1889
|
+
```
|
|
1890
|
+
|
|
1891
|
+
You may also define this as an operation object:
|
|
1892
|
+
|
|
1893
|
+
```javascript
|
|
1894
|
+
const def42b = { $transform: 'project', include: ['id', 'name'] }
|
|
1895
|
+
```
|
|
1896
|
+
|
|
1851
1897
|
#### `sort({asc, path})` transformer
|
|
1852
1898
|
|
|
1853
1899
|
The `sort` transformer will sort the array at the given `path`, in the direction
|
|
@@ -12,6 +12,7 @@ declare const _default: {
|
|
|
12
12
|
merge: import("../types.js").AsyncTransformer<import("./merge.js").Props>;
|
|
13
13
|
mergeRev: import("../types.js").AsyncTransformer<import("./merge.js").Props>;
|
|
14
14
|
not: import("../types.js").AsyncTransformer<import("../types.js").AsyncDataMapperWithOptions | import("../types.js").DataMapperWithOptions | import("./not.js").Props>;
|
|
15
|
+
project: import("../types.js").Transformer<import("./project.js").Props>;
|
|
15
16
|
sort: import("../types.js").Transformer<import("./sort.js").Props>;
|
|
16
17
|
value: import("../types.js").Transformer<unknown>;
|
|
17
18
|
};
|
|
@@ -9,6 +9,7 @@ import logical from './logical.js';
|
|
|
9
9
|
import map from './map.js';
|
|
10
10
|
import { merge, mergeRev } from './merge.js';
|
|
11
11
|
import not from './not.js';
|
|
12
|
+
import project from './project.js';
|
|
12
13
|
import sort from './sort.js';
|
|
13
14
|
export default {
|
|
14
15
|
bucket,
|
|
@@ -24,6 +25,7 @@ export default {
|
|
|
24
25
|
merge,
|
|
25
26
|
mergeRev,
|
|
26
27
|
not,
|
|
28
|
+
project,
|
|
27
29
|
sort,
|
|
28
30
|
value,
|
|
29
31
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,KAAK,MAAM,cAAc,CAAA;AAChC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,eAAe;IACb,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,GAAG;IACH,OAAO;IACP,KAAK;IACL,OAAO;IACP,GAAG;IACH,KAAK;IACL,QAAQ;IACR,GAAG;IACH,IAAI;IACJ,KAAK;CACN,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transformers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AACzC,OAAO,MAAM,MAAM,aAAa,CAAA;AAChC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,KAAK,MAAM,cAAc,CAAA;AAChC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,GAAG,MAAM,UAAU,CAAA;AAC1B,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,eAAe;IACb,MAAM;IACN,OAAO;IACP,OAAO;IACP,KAAK;IACL,OAAO;IACP,GAAG;IACH,OAAO;IACP,KAAK;IACL,OAAO;IACP,GAAG;IACH,KAAK;IACL,QAAQ;IACR,GAAG;IACH,OAAO;IACP,IAAI;IACJ,KAAK;CACN,CAAA"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Transformer, TransformerProps } from '../types.js';
|
|
2
|
+
export interface Props extends TransformerProps {
|
|
3
|
+
include?: string[];
|
|
4
|
+
includePath?: string;
|
|
5
|
+
exclude?: string[];
|
|
6
|
+
excludePath?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const transformer: Transformer<Props>;
|
|
9
|
+
export default transformer;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import mapAny from 'map-any';
|
|
2
|
+
import { pathGetter } from '../operations/getSet.js';
|
|
3
|
+
import { isObject, isString, isNonEmptyArray } from '../utils/is.js';
|
|
4
|
+
import { ensureArray } from '../utils/array.js';
|
|
5
|
+
const projectProps = (rawProps, doInclude) => {
|
|
6
|
+
const props = rawProps.filter(isString);
|
|
7
|
+
const filterFn = doInclude
|
|
8
|
+
? ([key]) => props.includes(key)
|
|
9
|
+
: ([key]) => !props.includes(key);
|
|
10
|
+
return (obj) => Object.fromEntries(Object.entries(obj).filter(filterFn));
|
|
11
|
+
};
|
|
12
|
+
const projectPropsFromPath = (path, rawProps, doInclude) => {
|
|
13
|
+
const getFn = pathGetter(path);
|
|
14
|
+
return (obj, state) => {
|
|
15
|
+
let props = getFn(obj, state);
|
|
16
|
+
if (props === undefined) {
|
|
17
|
+
props = rawProps;
|
|
18
|
+
}
|
|
19
|
+
if (!props) {
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
return projectProps(ensureArray(props), doInclude)(obj);
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
function prepareProjectFn(include, includePath, exclude, excludePath) {
|
|
26
|
+
if (typeof includePath === 'string') {
|
|
27
|
+
return projectPropsFromPath(includePath, include, true);
|
|
28
|
+
}
|
|
29
|
+
else if (typeof excludePath === 'string') {
|
|
30
|
+
return projectPropsFromPath(excludePath, exclude, false);
|
|
31
|
+
}
|
|
32
|
+
else if (isNonEmptyArray(include)) {
|
|
33
|
+
return projectProps(include, true);
|
|
34
|
+
}
|
|
35
|
+
else if (isNonEmptyArray(exclude)) {
|
|
36
|
+
return projectProps(exclude, false);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return (obj) => obj;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const transformer = function bucket({ include, includePath, exclude, excludePath, }) {
|
|
43
|
+
const projectFn = prepareProjectFn(include, includePath, exclude, excludePath);
|
|
44
|
+
return () => (data, state) => mapAny((data) => isObject(data)
|
|
45
|
+
? state.rev
|
|
46
|
+
? data
|
|
47
|
+
: projectFn(data, state)
|
|
48
|
+
: undefined, data);
|
|
49
|
+
};
|
|
50
|
+
export default transformer;
|
|
51
|
+
//# sourceMappingURL=project.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/transformers/project.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/is.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export declare const isObject: (value: unknown) => value is Record<string, unknown>;
|
|
2
|
+
export declare const isString: (value: unknown) => value is string;
|
|
2
3
|
export declare const isPath: (value: unknown) => value is string;
|
|
3
4
|
export declare const isArrayPath: (value: unknown) => value is string;
|
|
4
5
|
export declare const isNullOrUndefined: (value: unknown) => value is null | undefined;
|
|
5
6
|
export declare const isNotNullOrUndefined: <T>(value: T) => value is NonNullable<T>;
|
|
7
|
+
export declare const isNonEmptyArray: <T>(value: unknown) => value is T[];
|
package/dist/utils/is.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export const isObject = (value) => Object.prototype.toString.call(value) === '[object Object]';
|
|
2
|
+
export const isString = (value) => typeof value === 'string';
|
|
2
3
|
export const isPath = (value) => typeof value === 'string';
|
|
3
4
|
export const isArrayPath = (value) => isPath(value) && value.endsWith('[]');
|
|
4
5
|
export const isNullOrUndefined = (value) => value === null || value === undefined;
|
|
5
6
|
export const isNotNullOrUndefined = (value) => !isNullOrUndefined(value);
|
|
7
|
+
export const isNonEmptyArray = (value) => Array.isArray(value) && value.length > 0;
|
|
6
8
|
//# sourceMappingURL=is.js.map
|
package/dist/utils/is.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"is.js","sourceRoot":"","sources":["../../src/utils/is.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAC3E,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAAA;AAE7D,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAiB,EAAE,CACtD,OAAO,KAAK,KAAK,QAAQ,CAAA;AAE3B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAiB,EAAE,CAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC7E,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAA;AAEvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAI,KAAQ,EAA2B,EAAE,CAC3E,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"is.js","sourceRoot":"","sources":["../../src/utils/is.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CAC3E,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,iBAAiB,CAAA;AAE7D,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE,CAC1D,OAAO,KAAK,KAAK,QAAQ,CAAA;AAE3B,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAiB,EAAE,CACtD,OAAO,KAAK,KAAK,QAAQ,CAAA;AAE3B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAiB,EAAE,CAC3D,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;AAEvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAA6B,EAAE,CAC7E,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,CAAA;AAEvC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAI,KAAQ,EAA2B,EAAE,CAC3E,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;AAE3B,MAAM,CAAC,MAAM,eAAe,GAAG,CAAI,KAAc,EAAgB,EAAE,CACjE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "map-transform",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Map and transform objects with mapping definitions",
|
|
5
5
|
"author": "Kjell-Morten Bratsberg Thorsen <kjellmorten@integreat.io>",
|
|
6
6
|
"license": "ISC",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@integreat/ts-dev-setup": "^5.0.4",
|
|
57
57
|
"@types/deep-freeze": "^0.1.5",
|
|
58
|
-
"@types/sinon": "^17.0.
|
|
58
|
+
"@types/sinon": "^17.0.3",
|
|
59
59
|
"deep-freeze": "0.0.1",
|
|
60
60
|
"sinon": "^17.0.1"
|
|
61
61
|
}
|