From 784dd78009109d6488c12b9ca48bea285526d33f Mon Sep 17 00:00:00 2001 From: damyanpetev Date: Tue, 27 Jan 2026 16:18:06 +0200 Subject: [PATCH 1/4] fix: restrict DotPaths inference recursion and ignore built-in types --- src/internal/types.ts | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/internal/types.ts b/src/internal/types.ts index 944b83a..8227e12 100644 --- a/src/internal/types.ts +++ b/src/internal/types.ts @@ -19,11 +19,27 @@ export type Themes = { }; type FlatKeys = keyof T; -type DotPaths = { - [K in keyof T & string]: T[K] extends object - ? K | `${K}.${DotPaths}` // Note: resolving `never` will collapse the entire interpolated string to never, leaving only valid paths - : K; + +type NonTraversable = + | ((...args: never) => unknown) + | Array + | Date + | RegExp + | Map + | Set + | Promise; +type Prev = [never, 0, 1, 2, 3, 4]; + +type DotPaths = { + [K in keyof T & string]: Depth extends 0 + ? K + : T[K] extends object + ? T[K] extends NonTraversable + ? K + : K | `${K}.${DotPaths}` // Note: resolving `never` will collapse the entire interpolated string to never, leaving only valid paths + : K; }[keyof T & string]; + type NestedKeys = Exclude, FlatKeys>; /** From c30e13c9509e2aee1615f9040ad82e06ae8a43ce Mon Sep 17 00:00:00 2001 From: damyanpetev Date: Tue, 27 Jan 2026 18:23:29 +0200 Subject: [PATCH 2/4] fix: type errors from --- src/components/grid.ts | 2 +- src/controllers/filter.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/grid.ts b/src/components/grid.ts index 9df7e4e..9fb715e 100644 --- a/src/components/grid.ts +++ b/src/components/grid.ts @@ -376,7 +376,7 @@ export class IgcGridLite extends EventEmitterBase | FilterExpression[]): void { this._stateController.filtering.filter( - asArray(config).map((each) => + asArray(config).map>((each) => isString(each.condition) ? Object.assign(each, { condition: (getFilterOperandsFor(this.getColumn(each.key)!) as any)[each.condition], diff --git a/src/controllers/filter.ts b/src/controllers/filter.ts index 1c955e2..40866c6 100644 --- a/src/controllers/filter.ts +++ b/src/controllers/filter.ts @@ -146,7 +146,7 @@ export class FilterController implements ReactiveController { public filter(expression: FilterExpression | FilterExpression[]) { this.#filter( - asArray(expression).map((expr) => + asArray(expression).map>((expr) => Object.assign(this.getDefaultExpression(this.host.getColumn(expr.key)!), expr) ) ); From 4c6e0bb36c45ab530c4070ac625045db681edb76 Mon Sep 17 00:00:00 2001 From: damyanpetev Date: Thu, 29 Jan 2026 11:30:35 +0200 Subject: [PATCH 3/4] refactor: simplify DotPaths, avoid K from each branch resolution and add at end --- src/components/grid.ts | 2 +- src/controllers/filter.ts | 2 +- src/internal/types.ts | 20 +++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/grid.ts b/src/components/grid.ts index 9fb715e..9df7e4e 100644 --- a/src/components/grid.ts +++ b/src/components/grid.ts @@ -376,7 +376,7 @@ export class IgcGridLite extends EventEmitterBase | FilterExpression[]): void { this._stateController.filtering.filter( - asArray(config).map>((each) => + asArray(config).map((each) => isString(each.condition) ? Object.assign(each, { condition: (getFilterOperandsFor(this.getColumn(each.key)!) as any)[each.condition], diff --git a/src/controllers/filter.ts b/src/controllers/filter.ts index 40866c6..1c955e2 100644 --- a/src/controllers/filter.ts +++ b/src/controllers/filter.ts @@ -146,7 +146,7 @@ export class FilterController implements ReactiveController { public filter(expression: FilterExpression | FilterExpression[]) { this.#filter( - asArray(expression).map>((expr) => + asArray(expression).map((expr) => Object.assign(this.getDefaultExpression(this.host.getColumn(expr.key)!), expr) ) ); diff --git a/src/internal/types.ts b/src/internal/types.ts index 8227e12..96077d3 100644 --- a/src/internal/types.ts +++ b/src/internal/types.ts @@ -30,15 +30,17 @@ type NonTraversable = | Promise; type Prev = [never, 0, 1, 2, 3, 4]; -type DotPaths = { - [K in keyof T & string]: Depth extends 0 - ? K - : T[K] extends object - ? T[K] extends NonTraversable - ? K - : K | `${K}.${DotPaths}` // Note: resolving `never` will collapse the entire interpolated string to never, leaving only valid paths - : K; -}[keyof T & string]; +type DotPaths = Depth extends 0 + ? never + : + | { + [K in keyof T & string]: T[K] extends object + ? T[K] extends NonTraversable + ? never + : `${K}.${DotPaths}` // Note: resolving `never` will collapse the entire interpolated string to never, leaving only valid paths + : never; + }[keyof T & string] + | (keyof T & string); type NestedKeys = Exclude, FlatKeys>; From 50a19f5d0967df012ab9572a35522a98d5cfdfe1 Mon Sep 17 00:00:00 2001 From: damyanpetev Date: Thu, 29 Jan 2026 11:42:11 +0200 Subject: [PATCH 4/4] chore: use unknown instead of any --- src/internal/types.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/internal/types.ts b/src/internal/types.ts index 96077d3..8f3cd75 100644 --- a/src/internal/types.ts +++ b/src/internal/types.ts @@ -22,12 +22,12 @@ type FlatKeys = keyof T; type NonTraversable = | ((...args: never) => unknown) - | Array + | Array | Date | RegExp - | Map - | Set - | Promise; + | Map + | Set + | Promise; type Prev = [never, 0, 1, 2, 3, 4]; type DotPaths = Depth extends 0