From ecb930dda264a26495e87d1bbfa748d0f9ba8241 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 23 Mar 2020 17:35:18 +0300 Subject: [PATCH 1/4] build(npm): add ts-toolbelt to devDependencies --- npm/ng-packs/package.json | 1 + npm/ng-packs/yarn.lock | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json index c3e26038f0..37621afb49 100644 --- a/npm/ng-packs/package.json +++ b/npm/ng-packs/package.json @@ -83,6 +83,7 @@ "snq": "^1.0.3", "symlink-manager": "^1.4.2", "ts-node": "~7.0.0", + "ts-toolbelt": "^6.3.6", "tsickle": "^0.37.0", "tslint": "~5.20.0", "typescript": "~3.5.3", diff --git a/npm/ng-packs/yarn.lock b/npm/ng-packs/yarn.lock index db911bfb55..8c2e4c37d2 100644 --- a/npm/ng-packs/yarn.lock +++ b/npm/ng-packs/yarn.lock @@ -11685,6 +11685,11 @@ ts-node@~7.0.0: source-map-support "^0.5.6" yn "^2.0.0" +ts-toolbelt@^6.3.6: + version "6.3.6" + resolved "https://registry.yarnpkg.com/ts-toolbelt/-/ts-toolbelt-6.3.6.tgz#2bde29106c013ed520c32f30e1248daf8fd4f5f9" + integrity sha512-eVzym+LyQodOCfyVyQDQ6FGYbO2Xf9Nc4dGLRKlKSUpAs+8qQWHG+grDiA3ciEuNPNZ0qJnNIYkdqBW1rCWuUA== + tsickle@^0.37.0: version "0.37.1" resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.37.1.tgz#2f8a87c1b15766e866457bd06fb6c0e0d84eed09" From 007421aae13446c63bd2b23f0f3e9f9d535bc61c Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 23 Mar 2020 18:55:29 +0300 Subject: [PATCH 2/4] feat(core): use Object.Paths in byDeep method of TrackByService --- .../core/src/lib/services/track-by.service.ts | 9 +++++---- .../core/src/lib/tests/track-by.service.spec.ts | 16 +++++----------- 2 files changed, 10 insertions(+), 15 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts index ca2b92db5f..4f7cc6f7c8 100644 --- a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts @@ -1,18 +1,19 @@ import { Injectable, TrackByFunction } from '@angular/core'; +import { O } from 'ts-toolbelt'; @Injectable({ providedIn: 'root', }) export class TrackByService { by(key: keyof T): TrackByFunction { - return ({}, item) => item[key]; + return (_, item) => item[key]; } - byDeep(...keys: (string | number)[]): TrackByFunction { - return ({}, item) => keys.reduce((acc, key) => acc[key], item); + byDeep(...keys: T extends object ? O.Paths : never): TrackByFunction { + return (_, item) => keys.reduce((acc, key) => acc[key], item); } bySelf(): TrackByFunction { - return ({}, item) => item; + return (_, item) => item; } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts index 19868e8ad5..c1125d2930 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts @@ -11,17 +11,11 @@ describe('TrackByService', () => { describe('#byDeep', () => { it('should return a function which tracks a deeply-nested property', () => { - expect( - service.byDeep( - 'a', - 'b', - 'c', - 1, - 'x', - )(284, { - a: { b: { c: [{ x: 1035 }, { x: 1036 }, { x: 1037 }] } }, - }), - ).toBe(1036); + const obj = { + a: { b: { c: { x: 1036 } } }, + }; + + expect(service.byDeep('a', 'b', 'c', 'x')(284, obj)).toBe(1036); }); }); From 25204e5d34d4850514e417273e57b984d3156659 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 23 Mar 2020 20:00:10 +0300 Subject: [PATCH 3/4] refactor: remove bySelf method --- .../packages/core/src/lib/services/track-by.service.ts | 4 ---- .../packages/core/src/lib/tests/track-by.service.spec.ts | 6 ------ 2 files changed, 10 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts index 4f7cc6f7c8..9576a287f2 100644 --- a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts @@ -12,8 +12,4 @@ export class TrackByService { byDeep(...keys: T extends object ? O.Paths : never): TrackByFunction { return (_, item) => keys.reduce((acc, key) => acc[key], item); } - - bySelf(): TrackByFunction { - return (_, item) => item; - } } diff --git a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts index c1125d2930..377f129ff5 100644 --- a/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts +++ b/npm/ng-packs/packages/core/src/lib/tests/track-by.service.spec.ts @@ -18,10 +18,4 @@ describe('TrackByService', () => { expect(service.byDeep('a', 'b', 'c', 'x')(284, obj)).toBe(1036); }); }); - - describe('#bySelf', () => { - it('should return a function which tracks the item', () => { - expect(service.bySelf()(284, 'X')).toBe('X'); - }); - }); }); From 15b93c3199084f92a6a337aa3909861a97e4a398 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 23 Mar 2020 20:08:08 +0300 Subject: [PATCH 4/4] feat(core): export trackBy and trackByDeep separately --- .../core/src/lib/services/track-by.service.ts | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts index 9576a287f2..aa72942ec0 100644 --- a/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts +++ b/npm/ng-packs/packages/core/src/lib/services/track-by.service.ts @@ -1,15 +1,17 @@ import { Injectable, TrackByFunction } from '@angular/core'; import { O } from 'ts-toolbelt'; +export const trackBy = (key: keyof T): TrackByFunction => (_, item) => item[key]; + +export const trackByDeep = ( + ...keys: T extends object ? O.Paths : never +): TrackByFunction => (_, item) => keys.reduce((acc, key) => acc[key], item); + @Injectable({ providedIn: 'root', }) export class TrackByService { - by(key: keyof T): TrackByFunction { - return (_, item) => item[key]; - } + by = trackBy; - byDeep(...keys: T extends object ? O.Paths : never): TrackByFunction { - return (_, item) => keys.reduce((acc, key) => acc[key], item); - } + byDeep = trackByDeep; }