Skip to content

Commit 3d4dfdd

Browse files
authored
feat: prop handles primitive values gracefully (#245)
* fix: prop handles primitive values gracefully Change prop(key) to return the value as-is when it's not a non-null object, instead of returning undefined. This fixes cell rendering, XLSX export, tooltips, grouping, and filtering in cosmoz-omnitable when value-path points to a primitive. FE-726 * test: remove duplicate prop object test
1 parent 3e1c806 commit 3d4dfdd

2 files changed

Lines changed: 23 additions & 7 deletions

File tree

src/object.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@ export function prop(): typeof identity;
77
export function prop(a: '' | null | false | undefined | 0): typeof identity;
88
export function prop<K extends PropertyKey>(
99
key?: K,
10-
): <O>(obj: O) => K extends keyof O ? O[K] : undefined;
10+
): <O>(obj: O) => O extends object ? (K extends keyof O ? O[K] : undefined) : O;
1111
export function prop<K extends PropertyKey>(key?: K) {
1212
if (!key) {
1313
return identity;
1414
}
15-
return <O>(obj: O) => (obj as Rec<K>)?.[key];
15+
return <O>(obj: O) =>
16+
typeof obj === 'object' && obj !== null ? (obj as Rec<K>)[key] : obj;
1617
}
1718

1819
export const strProp = <K extends PropertyKey>(key?: K) => {

test/object.test.js

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { assert } from '@open-wc/testing';
22
import { identity } from '../src/function';
3-
import { prop, props, strProp, merge, omit } from '../src/object';
3+
import { merge, omit, prop, props, strProp } from '../src/object';
44

55
suite('prop', () => {
66
test('prop', () => {
@@ -9,10 +9,25 @@ suite('prop', () => {
99
assert.equal(prop(''), identity);
1010
});
1111

12+
test('prop passes through primitives', () => {
13+
assert.equal(prop('key')('hello'), 'hello');
14+
assert.equal(prop('key')(42), 42);
15+
assert.isTrue(prop('key')(true));
16+
assert.isNull(prop('key')(null));
17+
assert.isUndefined(prop('key')(undefined));
18+
});
19+
1220
test('strProp', () => {
1321
assert.equal(strProp('b')({ b: 2 }), '2');
1422
assert.equal(strProp('b')({ c: 4 }), '');
1523
});
24+
25+
test('strProp passes through primitives', () => {
26+
assert.equal(strProp('key')(42), '42');
27+
assert.equal(strProp('key')('hello'), 'hello');
28+
assert.equal(strProp('key')(null), '');
29+
assert.equal(strProp('key')(undefined), '');
30+
});
1631
});
1732

1833
suite('merge', () => {
@@ -27,12 +42,12 @@ suite('merge', () => {
2742
a: 1,
2843
b: 3,
2944
},
30-
{ b: 2 }
45+
{ b: 2 },
3146
),
3247
{
3348
a: 1,
3449
b: 2,
35-
}
50+
},
3651
);
3752
assert.deepEqual(
3853
merge(
@@ -41,12 +56,12 @@ suite('merge', () => {
4156
b: 3,
4257
},
4358
{ b: 2 },
44-
null
59+
null,
4560
),
4661
{
4762
a: 1,
4863
b: 2,
49-
}
64+
},
5065
);
5166
});
5267

0 commit comments

Comments
 (0)