diff --git a/src/decorator/impl/index/util.ts b/src/decorator/impl/index/util.ts index 6dfd12362..a1bd6fbfb 100644 --- a/src/decorator/impl/index/util.ts +++ b/src/decorator/impl/index/util.ts @@ -47,7 +47,10 @@ export function initOrUpdateIndex(indexType: IndexType, indexData: IndexData, ta /** * @hidden */ -function initOrUpdateGSI(indexes: Record, indexData: IndexData): Partial> { +function initOrUpdateGSI( + indexes: Record, + indexData: IndexData, +): Partial> { if (indexes[indexData.name]) { // TODO INVESTIGATE when we throw an error we have a problem where multiple different classes extend one base class, this will be executed multiple times // throw new Error( diff --git a/src/dynamo/expression/condition-expression-builder.spec.ts b/src/dynamo/expression/condition-expression-builder.spec.ts index ce565020d..63cdf10f0 100644 --- a/src/dynamo/expression/condition-expression-builder.spec.ts +++ b/src/dynamo/expression/condition-expression-builder.spec.ts @@ -41,12 +41,20 @@ describe('expressions', () => { [undefined, undefined, {}], {}, [], - { blub: undefined, other: undefined }, + { blub: undefined, other: undefined, empty_arr: [] }, new Set(arr), ] const filteredObj = deepFilter(obj, (item) => item !== undefined) - expect(filteredObj).toEqual([{ street: 'street', zip: 1524 }, [{ age: 25 }], new Set([arr[0], arr[1]])]) + expect(filteredObj).toEqual([ + { street: 'street', zip: 1524 }, + [{ age: 25 }], + [{}], + {}, + [], + { empty_arr: [] }, + new Set([arr[0], arr[1]]), + ]) }) it('use property metadata', () => { diff --git a/src/dynamo/expression/condition-expression-builder.ts b/src/dynamo/expression/condition-expression-builder.ts index 9cd186886..aac94f09b 100644 --- a/src/dynamo/expression/condition-expression-builder.ts +++ b/src/dynamo/expression/condition-expression-builder.ts @@ -51,22 +51,22 @@ export function deepFilter(obj: any, filterFn: (value: any) => boolean): any { const returnArr: any[] = [] obj.forEach((i) => { const item = deepFilter(i, filterFn) - if (item !== null) { + if (item !== undefined) { returnArr.push(item) } }) - return returnArr.length ? returnArr : null + return returnArr } else if (obj instanceof Set) { const returnArr: any[] = [] Array.from(obj).forEach((i) => { const item = deepFilter(i, filterFn) - if (item !== null) { + if (item !== undefined) { returnArr.push(item) } }) - return returnArr.length ? new Set(returnArr) : null + return new Set(returnArr) } else if (isPlainObject(obj)) { const returnObj: Record = {} @@ -74,18 +74,18 @@ export function deepFilter(obj: any, filterFn: (value: any) => boolean): any { if (obj.hasOwnProperty(key)) { const value = obj[key] const item = deepFilter(value, filterFn) - if (item !== null) { + if (item !== undefined) { returnObj[key] = item } } } - return Object.keys(returnObj).length ? returnObj : null + return returnObj } else { if (filterFn(obj)) { return obj } else { - return null + return undefined } } } diff --git a/src/helper/fetch-all.function.ts b/src/helper/fetch-all.function.ts index d952af1a0..12f95c4bd 100644 --- a/src/helper/fetch-all.function.ts +++ b/src/helper/fetch-all.function.ts @@ -11,7 +11,10 @@ import { ScanRequest } from '../dynamo/request/scan/scan.request' * available. This can be used with scan and query requests. */ -export function fetchAll(request: ScanRequest | QueryRequest, startKey?: Record): Promise { +export function fetchAll( + request: ScanRequest | QueryRequest, + startKey?: Record, +): Promise { request.limit(ReadManyRequest.INFINITE_LIMIT) if (startKey) { request.exclusiveStartKey(startKey) diff --git a/src/mapper/mapper.spec.ts b/src/mapper/mapper.spec.ts index 1dfe6ed1b..8684a593a 100644 --- a/src/mapper/mapper.spec.ts +++ b/src/mapper/mapper.spec.ts @@ -179,7 +179,7 @@ describe('Mapper', () => { const employee1 = >attrValue.L[0] expect(employee1).toBeDefined() expect(keyOf(employee1)).toBe('M') - expect(Object.keys(employee1.M).length).toBe(2) + expect(Object.keys(employee1.M).length).toBe(3) expect(employee1.M.name).toBeDefined() expect(keyOf(employee1.M.name)).toBe('S') expect((employee1.M.name).S).toBe('max') @@ -187,6 +187,10 @@ describe('Mapper', () => { expect(employee1.M.age).toBeDefined() expect(keyOf(employee1.M.age)).toBe('N') expect((employee1.M.age).N).toBe('25') + + expect(employee1.M.age).toBeDefined() + expect(keyOf(employee1.M.sortedSet)).toBe('NULL') + expect((employee1.M.sortedSet).NULL).toBe(true) }) it('heterogenous Set without decorator should throw', () => { @@ -713,7 +717,10 @@ describe('Mapper', () => { describe('model with non string/number/binary keys', () => { it('should accept date as HASH or RANGE key', () => { const now = new Date() - const toDbVal: Record = toDb(new ModelWithDateAsHashKey(now), ModelWithDateAsHashKey) + const toDbVal: Record = toDb( + new ModelWithDateAsHashKey(now), + ModelWithDateAsHashKey, + ) expect(toDbVal.startDate.S).toBeDefined() expect(toDbVal.startDate.S).toEqual(now.toISOString()) }) diff --git a/src/mapper/mapper.ts b/src/mapper/mapper.ts index 1c6d18698..3ca3b3e5d 100644 --- a/src/mapper/mapper.ts +++ b/src/mapper/mapper.ts @@ -63,7 +63,7 @@ export function toDb(item: T, modelConstructor?: ModelConstructor): Attrib let attributeValue: Attribute | undefined | null - if (propertyValue === undefined || propertyValue === null) { + if (propertyValue === undefined) { // noop ignore because we can't map it } else { /* @@ -274,7 +274,7 @@ export function fromDb(attributeMap: Attributes, modelConstructor?: ModelC modelValue = fromDbOne(attributeValue) } - if (modelValue !== null && modelValue !== undefined) { + if (modelValue !== undefined) { Reflect.set(model, propertyMetadata ? propertyMetadata.name : attributeName, modelValue) } })