@tanstack/angular-table 9.0.0-alpha.52 → 9.0.0-alpha.54
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.
|
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
|
|
|
2
2
|
import { InjectionToken, input, inject, Directive, reflectComponentType, Injectable, KeyValueDiffers, ChangeDetectorRef, OutputEmitterRef, TemplateRef, Type, runInInjectionContext, computed, effect, untracked, Injector, ViewContainerRef, DestroyRef, NgZone, signal, assertInInjectionContext } from '@angular/core';
|
|
3
3
|
import { constructTable, createColumnHelper } from '@tanstack/table-core';
|
|
4
4
|
export * from '@tanstack/table-core';
|
|
5
|
-
import {
|
|
5
|
+
import { toObservable } from '@angular/core/rxjs-interop';
|
|
6
6
|
export { shallow } from '@tanstack/angular-store';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -55,15 +55,15 @@ class TanStackTableCell {
|
|
|
55
55
|
* Provided as a required signal input so DI consumers always read the latest value.
|
|
56
56
|
*/
|
|
57
57
|
cell = input.required({ ...(ngDevMode ? { debugName: "cell" } : /* istanbul ignore next */ {}), alias: 'tanStackTableCell' });
|
|
58
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
59
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
58
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TanStackTableCell, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
59
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: TanStackTableCell, isStandalone: true, selector: "[tanStackTableCell]", inputs: { cell: { classPropertyName: "cell", publicName: "tanStackTableCell", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
60
60
|
{
|
|
61
61
|
provide: TanStackTableCellToken,
|
|
62
62
|
useFactory: () => inject(TanStackTableCell).cell,
|
|
63
63
|
},
|
|
64
64
|
], exportAs: ["cell"], ngImport: i0 });
|
|
65
65
|
}
|
|
66
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
66
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TanStackTableCell, decorators: [{
|
|
67
67
|
type: Directive,
|
|
68
68
|
args: [{
|
|
69
69
|
selector: '[tanStackTableCell]',
|
|
@@ -132,15 +132,15 @@ class TanStackTableHeader {
|
|
|
132
132
|
* Provided as a required signal input so DI consumers always read the latest value.
|
|
133
133
|
*/
|
|
134
134
|
header = input.required({ ...(ngDevMode ? { debugName: "header" } : /* istanbul ignore next */ {}), alias: 'tanStackTableHeader' });
|
|
135
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
136
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
135
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TanStackTableHeader, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
136
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: TanStackTableHeader, isStandalone: true, selector: "[tanStackTableHeader]", inputs: { header: { classPropertyName: "header", publicName: "tanStackTableHeader", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
137
137
|
{
|
|
138
138
|
provide: TanStackTableHeaderToken,
|
|
139
139
|
useFactory: () => inject(TanStackTableHeader).header,
|
|
140
140
|
},
|
|
141
141
|
], exportAs: ["header"], ngImport: i0 });
|
|
142
142
|
}
|
|
143
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
143
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TanStackTableHeader, decorators: [{
|
|
144
144
|
type: Directive,
|
|
145
145
|
args: [{
|
|
146
146
|
selector: '[tanStackTableHeader]',
|
|
@@ -211,15 +211,15 @@ class TanStackTable {
|
|
|
211
211
|
* Provided as a required signal input so DI consumers always read the latest value.
|
|
212
212
|
*/
|
|
213
213
|
table = input.required({ ...(ngDevMode ? { debugName: "table" } : /* istanbul ignore next */ {}), alias: 'tanStackTable' });
|
|
214
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
215
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
214
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TanStackTable, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
215
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: TanStackTable, isStandalone: true, selector: "[tanStackTable]", inputs: { table: { classPropertyName: "table", publicName: "tanStackTable", isSignal: true, isRequired: true, transformFunction: null } }, providers: [
|
|
216
216
|
{
|
|
217
217
|
provide: TanStackTableToken,
|
|
218
218
|
useFactory: () => inject(TanStackTable).table,
|
|
219
219
|
},
|
|
220
220
|
], exportAs: ["table"], ngImport: i0 });
|
|
221
221
|
}
|
|
222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
222
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: TanStackTable, decorators: [{
|
|
223
223
|
type: Directive,
|
|
224
224
|
args: [{
|
|
225
225
|
selector: '[tanStackTable]',
|
|
@@ -378,10 +378,10 @@ class FlexRenderComponentFactory {
|
|
|
378
378
|
view.setOutputs(outputs);
|
|
379
379
|
return view;
|
|
380
380
|
}
|
|
381
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
382
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
381
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderComponentFactory, deps: [{ token: i0.ViewContainerRef }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
382
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderComponentFactory });
|
|
383
383
|
}
|
|
384
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
384
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderComponentFactory, decorators: [{
|
|
385
385
|
type: Injectable
|
|
386
386
|
}], ctorParameters: () => [{ type: i0.ViewContainerRef }] });
|
|
387
387
|
/**
|
|
@@ -704,11 +704,13 @@ class FlexViewRenderer {
|
|
|
704
704
|
? content
|
|
705
705
|
: runInInjectionContext(this.#injector(), () => content(props));
|
|
706
706
|
};
|
|
707
|
-
#latestContent = computed(() => this.#getLatestContentValue(),
|
|
707
|
+
#latestContent = computed(() => this.#getLatestContentValue(), /* @ts-ignore */
|
|
708
|
+
...(ngDevMode ? [{ debugName: "#latestContent" }] : /* istanbul ignore next */ []));
|
|
708
709
|
#getContentValue = computed(() => {
|
|
709
710
|
const latestContent = this.#latestContent();
|
|
710
711
|
return mapToFlexRenderTypedContent(latestContent);
|
|
711
|
-
},
|
|
712
|
+
}, /* @ts-ignore */
|
|
713
|
+
...(ngDevMode ? [{ debugName: "#getContentValue" }] : /* istanbul ignore next */ []));
|
|
712
714
|
constructor(options) {
|
|
713
715
|
this.#content = options.content;
|
|
714
716
|
this.#props = options.props;
|
|
@@ -970,8 +972,10 @@ class FlexRenderCell {
|
|
|
970
972
|
#templateRef = inject(TemplateRef);
|
|
971
973
|
#viewContainerRef = inject(ViewContainerRef);
|
|
972
974
|
constructor() {
|
|
973
|
-
const content = computed(() => this.#renderData()[0],
|
|
974
|
-
|
|
975
|
+
const content = computed(() => this.#renderData()[0], /* @ts-ignore */
|
|
976
|
+
...(ngDevMode ? [{ debugName: "content" }] : /* istanbul ignore next */ []));
|
|
977
|
+
const props = computed(() => this.#renderData()[1], /* @ts-ignore */
|
|
978
|
+
...(ngDevMode ? [{ debugName: "props" }] : /* istanbul ignore next */ []));
|
|
975
979
|
const renderer = new FlexViewRenderer({
|
|
976
980
|
content: content,
|
|
977
981
|
props: props,
|
|
@@ -984,10 +988,10 @@ class FlexRenderCell {
|
|
|
984
988
|
renderer.destroy();
|
|
985
989
|
});
|
|
986
990
|
}
|
|
987
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
988
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
991
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderCell, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
992
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: FlexRenderCell, isStandalone: true, selector: "ng-template[flexRenderCell], ng-template[flexRenderFooter], ng-template[flexRenderHeader]", inputs: { cell: { classPropertyName: "cell", publicName: "flexRenderCell", isSignal: true, isRequired: false, transformFunction: null }, header: { classPropertyName: "header", publicName: "flexRenderHeader", isSignal: true, isRequired: false, transformFunction: null }, footer: { classPropertyName: "footer", publicName: "flexRenderFooter", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
989
993
|
}
|
|
990
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
994
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderCell, decorators: [{
|
|
991
995
|
type: Directive,
|
|
992
996
|
args: [{
|
|
993
997
|
selector: 'ng-template[flexRenderCell], ng-template[flexRenderFooter], ng-template[flexRenderHeader]',
|
|
@@ -1061,10 +1065,10 @@ class FlexRenderDirective {
|
|
|
1061
1065
|
renderer.destroy();
|
|
1062
1066
|
});
|
|
1063
1067
|
}
|
|
1064
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1065
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "
|
|
1068
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1069
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.0", type: FlexRenderDirective, isStandalone: true, selector: "ng-template[flexRender]", inputs: { content: { classPropertyName: "content", publicName: "flexRender", isSignal: true, isRequired: false, transformFunction: null }, props: { classPropertyName: "props", publicName: "flexRenderProps", isSignal: true, isRequired: false, transformFunction: null }, injector: { classPropertyName: "injector", publicName: "flexRenderInjector", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
|
|
1066
1070
|
}
|
|
1067
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1071
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.0", ngImport: i0, type: FlexRenderDirective, decorators: [{
|
|
1068
1072
|
type: Directive,
|
|
1069
1073
|
args: [{
|
|
1070
1074
|
selector: 'ng-template[flexRender]',
|
|
@@ -1113,48 +1117,34 @@ function lazyInit(initializer) {
|
|
|
1113
1117
|
});
|
|
1114
1118
|
}
|
|
1115
1119
|
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
}
|
|
1122
|
-
function signalToReadonlyAtom(source, getSource, subscribeSource) {
|
|
1123
|
-
return Object.assign(source, {
|
|
1124
|
-
get: () => {
|
|
1125
|
-
const value = getSource();
|
|
1126
|
-
source();
|
|
1127
|
-
return value;
|
|
1120
|
+
function signalToReadonlyAtom(signal, injector, debugName) {
|
|
1121
|
+
const _signal = Object.assign(signal, {
|
|
1122
|
+
get: () => signal(),
|
|
1123
|
+
subscribe: (observer) => {
|
|
1124
|
+
return untracked(() => toObservable(computed(signal), { injector: injector }).subscribe(observer));
|
|
1128
1125
|
},
|
|
1129
|
-
subscribe: subscribeSource,
|
|
1130
1126
|
});
|
|
1127
|
+
if (debugName) {
|
|
1128
|
+
_signal.toString = () => debugName;
|
|
1129
|
+
}
|
|
1130
|
+
return _signal;
|
|
1131
1131
|
}
|
|
1132
|
-
function signalToWritableAtom(
|
|
1133
|
-
const
|
|
1134
|
-
let observed = false;
|
|
1135
|
-
effect(() => {
|
|
1136
|
-
const value = source();
|
|
1137
|
-
if (!observed) {
|
|
1138
|
-
observed = true;
|
|
1139
|
-
return;
|
|
1140
|
-
}
|
|
1141
|
-
observers.forEach((observer) => observer(value));
|
|
1142
|
-
}, { injector });
|
|
1143
|
-
return Object.assign(source.asReadonly(), {
|
|
1132
|
+
function signalToWritableAtom(signal, injector, debugName) {
|
|
1133
|
+
const _signal = Object.assign(signal.asReadonly(), {
|
|
1144
1134
|
set: (updater) => {
|
|
1145
1135
|
typeof updater === 'function'
|
|
1146
|
-
?
|
|
1147
|
-
:
|
|
1136
|
+
? signal.update(updater)
|
|
1137
|
+
: signal.set(updater);
|
|
1138
|
+
},
|
|
1139
|
+
get: () => signal(),
|
|
1140
|
+
subscribe: (observer) => {
|
|
1141
|
+
return untracked(() => toObservable(computed(signal), { injector: injector }).subscribe(observer));
|
|
1148
1142
|
},
|
|
1149
|
-
get: () => source(),
|
|
1150
|
-
subscribe: ((observerOrNext) => {
|
|
1151
|
-
const observer = observerToCallback(observerOrNext);
|
|
1152
|
-
observers.add(observer);
|
|
1153
|
-
return {
|
|
1154
|
-
unsubscribe: () => observers.delete(observer),
|
|
1155
|
-
};
|
|
1156
|
-
}),
|
|
1157
1143
|
});
|
|
1144
|
+
if (debugName) {
|
|
1145
|
+
_signal.toString = () => debugName;
|
|
1146
|
+
}
|
|
1147
|
+
return _signal;
|
|
1158
1148
|
}
|
|
1159
1149
|
/**
|
|
1160
1150
|
* Creates the table-core reactivity bindings used by the Angular adapter.
|
|
@@ -1166,47 +1156,34 @@ function signalToWritableAtom(source, injector) {
|
|
|
1166
1156
|
*/
|
|
1167
1157
|
function angularReactivity(injector) {
|
|
1168
1158
|
const ngZone = injector.get(NgZone);
|
|
1169
|
-
const
|
|
1159
|
+
const subscriptions = new Set();
|
|
1170
1160
|
return {
|
|
1171
1161
|
createOptionsStore: true,
|
|
1162
|
+
wrapExternalAtoms: true,
|
|
1163
|
+
addSubscription: (subscription) => {
|
|
1164
|
+
subscriptions.add(subscription);
|
|
1165
|
+
},
|
|
1166
|
+
unmount: () => {
|
|
1167
|
+
subscriptions.forEach((s) => s.unsubscribe());
|
|
1168
|
+
subscriptions.clear();
|
|
1169
|
+
},
|
|
1172
1170
|
schedule: (fn) => ngZone.runOutsideAngular(() => queueMicrotask(fn)),
|
|
1173
1171
|
createReadonlyAtom: (fn, options) => {
|
|
1174
|
-
const
|
|
1175
|
-
compare: options?.compare,
|
|
1176
|
-
});
|
|
1177
|
-
const version = signal(0, { ...(ngDevMode ? { debugName: "version" } : /* istanbul ignore next */ {}), equal: () => false });
|
|
1178
|
-
const subscription = storeAtom.subscribe(() => {
|
|
1179
|
-
version.update((value) => value + 1);
|
|
1180
|
-
});
|
|
1181
|
-
destroyRef.onDestroy(() => subscription.unsubscribe());
|
|
1182
|
-
const value = computed(() => {
|
|
1183
|
-
version();
|
|
1184
|
-
return storeAtom.get();
|
|
1185
|
-
}, {
|
|
1172
|
+
const signal = computed(() => fn(), {
|
|
1186
1173
|
equal: options?.compare,
|
|
1187
1174
|
debugName: options?.debugName,
|
|
1188
1175
|
});
|
|
1189
|
-
return signalToReadonlyAtom(
|
|
1190
|
-
const observer = observerToCallback(observerOrNext);
|
|
1191
|
-
return storeAtom.subscribe(() => {
|
|
1192
|
-
observer(storeAtom.get());
|
|
1193
|
-
});
|
|
1194
|
-
});
|
|
1176
|
+
return signalToReadonlyAtom(signal, injector, options?.debugName);
|
|
1195
1177
|
},
|
|
1196
1178
|
createWritableAtom: (value, options) => {
|
|
1197
|
-
|
|
1198
|
-
|
|
1199
|
-
|
|
1200
|
-
debugName: options.debugName,
|
|
1201
|
-
});
|
|
1202
|
-
return signalToWritableAtom(writableSignal, injector);
|
|
1203
|
-
}
|
|
1204
|
-
return createAtom(value, {
|
|
1205
|
-
compare: options?.compare,
|
|
1179
|
+
const writableSignal = signal(value, {
|
|
1180
|
+
equal: options?.compare,
|
|
1181
|
+
debugName: options?.debugName,
|
|
1206
1182
|
});
|
|
1183
|
+
return signalToWritableAtom(writableSignal, injector, options?.debugName);
|
|
1207
1184
|
},
|
|
1208
1185
|
untrack: untracked,
|
|
1209
|
-
batch,
|
|
1186
|
+
batch: (fn) => fn(),
|
|
1210
1187
|
};
|
|
1211
1188
|
}
|
|
1212
1189
|
|
|
@@ -1315,6 +1292,9 @@ function injectTable(options) {
|
|
|
1315
1292
|
...options()._features,
|
|
1316
1293
|
},
|
|
1317
1294
|
});
|
|
1295
|
+
injector.get(DestroyRef).onDestroy(() => {
|
|
1296
|
+
table._reactivity.unmount?.();
|
|
1297
|
+
});
|
|
1318
1298
|
const stateProxy = createStateProxy(table);
|
|
1319
1299
|
Object.defineProperty(table, 'state', {
|
|
1320
1300
|
get() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tanstack-angular-table.mjs","sources":["../../src/helpers/cell.ts","../../src/helpers/header.ts","../../src/helpers/table.ts","../../src/flex-render/context.ts","../../src/flex-render/flags.ts","../../src/flex-render/flexRenderComponent.ts","../../src/flex-render/flexRenderComponentFactory.ts","../../src/flex-render/view.ts","../../src/flex-render/renderer.ts","../../src/helpers/flexRenderCell.ts","../../src/flexRender.ts","../../src/lazySignalInitializer.ts","../../src/reactivity.ts","../../src/injectTable.ts","../../src/helpers/createTableHook.ts","../../src/index.ts","../../src/tanstack-angular-table.ts"],"sourcesContent":["import { Directive, InjectionToken, inject, input } from '@angular/core'\nimport { Cell, CellData, RowData, TableFeatures } from '@tanstack/table-core'\nimport type { Signal } from '@angular/core'\n\n/**\n * DI context shape for a TanStack Table cell.\n *\n * This exists to make the current `Cell` injectable by any nested component/directive\n * without having to pass it through inputs/props manually.\n */\nexport interface TanStackTableCellContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> {\n /** Signal that returns the current cell instance. */\n cell: Signal<Cell<TFeatures, TData, TValue>>\n}\n\n/**\n * Injection token that provides access to the current cell.\n *\n * This token is provided by the {@link TanStackTableCell} directive.\n */\nexport const TanStackTableCellToken = new InjectionToken<\n TanStackTableCellContext<any, any, any>['cell']\n>('[TanStack Table] CellContext')\n\n/**\n * Provides a TanStack Table `Cell` instance in Angular DI.\n *\n * The cell can be injected by:\n * - any descendant of an element using `[tanStackTableCell]=\"...\"`\n * - any component instantiated by `*flexRender` when the render props contains `cell`\n *\n * @example\n * Inject from the nearest `[tanStackTableCell]`:\n * ```html\n * <td [tanStackTableCell]=\"cell\">\n * <app-cell-actions />\n * </td>\n * ```\n *\n * ```ts\n * @Component({\n * selector: 'app-cell-actions',\n * template: `{{ cell().id }}`,\n * })\n * export class CellActionsComponent {\n * readonly cell = injectTableCellContext()\n * }\n * ```\n *\n * @example\n * Inject inside a component rendered via `flexRender`:\n * ```ts\n * @Component({\n * selector: 'app-price-cell',\n * template: `{{ cell().getValue() }}`,\n * })\n * export class PriceCellComponent {\n * readonly cell = injectTableCellContext()\n * }\n * ```\n */\n@Directive({\n selector: '[tanStackTableCell]',\n exportAs: 'cell',\n providers: [\n {\n provide: TanStackTableCellToken,\n useFactory: () => inject(TanStackTableCell).cell,\n },\n ],\n})\nexport class TanStackTableCell<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> implements TanStackTableCellContext<TFeatures, TData, TValue> {\n /**\n * The current TanStack Table cell.\n *\n * Provided as a required signal input so DI consumers always read the latest value.\n */\n readonly cell = input.required<Cell<TFeatures, TData, TValue>>({\n alias: 'tanStackTableCell',\n })\n}\n\n/**\n * Injects the current TanStack Table cell signal.\n *\n * Available when:\n * - there is a nearest `[tanStackTableCell]` directive in the DI tree, or\n * - the caller is rendered via `*flexRender` with render props containing `cell`\n */\nexport function injectTableCellContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n>(): TanStackTableCellContext<TFeatures, TData, TValue>['cell'] {\n return inject(TanStackTableCellToken)\n}\n","import { Directive, InjectionToken, inject, input } from '@angular/core'\nimport { CellData, Header, RowData, TableFeatures } from '@tanstack/table-core'\nimport type { Signal } from '@angular/core'\n\n/**\n * DI context shape for a TanStack Table header.\n *\n * This exists to make the current `Header` injectable by any nested component/directive\n * without passing it through inputs/props.\n */\nexport interface TanStackTableHeaderContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> {\n /** Signal that returns the current header instance. */\n header: Signal<Header<TFeatures, TData, TValue>>\n}\n\n/**\n * Injection token that provides access to the current header.\n *\n * This token is provided by the {@link TanStackTableHeader} directive.\n */\nexport const TanStackTableHeaderToken = new InjectionToken<\n TanStackTableHeaderContext<any, any, any>['header']\n>('[TanStack Table] HeaderContext')\n\n/**\n * Provides a TanStack Table `Header` instance in Angular DI.\n *\n * The header can be injected by:\n * - any descendant of an element using `[tanStackTableHeader]=\"...\"`\n * - any component instantiated by `*flexRender` when the render props contains `header`\n *\n * @example\n * ```html\n * <th [tanStackTableHeader]=\"header\">\n * <app-sort-indicator />\n * </th>\n * ```\n *\n * ```ts\n * @Component({\n * selector: 'app-sort-indicator',\n * template: `\n * <button (click)=\"toggle()\">\n * {{ header().column.id }}\n * </button>\n * `,\n * })\n * export class SortIndicatorComponent {\n * readonly header = injectTableHeaderContext()\n *\n * toggle() {\n * this.header().column.toggleSorting()\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[tanStackTableHeader]',\n exportAs: 'header',\n providers: [\n {\n provide: TanStackTableHeaderToken,\n useFactory: () => inject(TanStackTableHeader).header,\n },\n ],\n})\nexport class TanStackTableHeader<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> implements TanStackTableHeaderContext<TFeatures, TData, TValue> {\n /**\n * The current TanStack Table header.\n *\n * Provided as a required signal input so DI consumers always read the latest value.\n */\n readonly header = input.required<Header<TFeatures, TData, TValue>>({\n alias: 'tanStackTableHeader',\n })\n}\n\n/**\n * Injects the current TanStack Table header signal.\n *\n * Available when:\n * - there is a nearest `[tanStackTableHeader]` directive in the DI tree, or\n * - the caller is rendered via `*flexRender` with render props containing `header`\n */\nexport function injectTableHeaderContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n>(): TanStackTableHeaderContext<TFeatures, TData, TValue>['header'] {\n return inject(TanStackTableHeaderToken)\n}\n","import { Directive, InjectionToken, inject, input } from '@angular/core'\nimport { RowData, TableFeatures } from '@tanstack/table-core'\nimport { AngularTable } from '../injectTable'\nimport type { Signal } from '@angular/core'\n\n/**\n * Injection token that provides access to the current {@link AngularTable} instance.\n *\n * This token is provided by the {@link TanStackTable} directive.\n */\nexport const TanStackTableToken = new InjectionToken<\n Signal<AngularTable<any, any>>\n>('[TanStack Table] Table Context')\n\n/**\n * Provides a TanStack Table instance (`AngularTable`) in Angular DI.\n *\n * The table can be injected by:\n * - any descendant of an element using `[tanStackTable]=\"...\"`\n * - any component instantiated by `*flexRender` when the render props contains `table`\n *\n * @example\n * ```html\n * <div [tanStackTable]=\"table\">\n * <app-pagination />\n * </div>\n * ```\n *\n * ```ts\n * @Component({\n * selector: 'app-pagination',\n * template: `\n * <button (click)=\"prev()\" [disabled]=\"!table().getCanPreviousPage()\">Prev</button>\n * <button (click)=\"next()\" [disabled]=\"!table().getCanNextPage()\">Next</button>\n * `,\n * })\n * export class PaginationComponent {\n * readonly table = injectTableContext()\n *\n * prev() {\n * this.table().previousPage()\n * }\n * next() {\n * this.table().nextPage()\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[tanStackTable]',\n exportAs: 'table',\n providers: [\n {\n provide: TanStackTableToken,\n useFactory: () => inject(TanStackTable).table,\n },\n ],\n})\nexport class TanStackTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> {\n /**\n * The current TanStack Table instance.\n *\n * Provided as a required signal input so DI consumers always read the latest value.\n */\n readonly table = input.required<AngularTable<TFeatures, TData>>({\n alias: 'tanStackTable',\n })\n}\n\n/**\n * Injects the current TanStack Table instance signal.\n *\n * Available when:\n * - there is a nearest `[tanStackTable]` directive in the DI tree, or\n * - the caller is rendered via `*flexRender` with render props containing `table`\n */\nexport function injectTableContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(): Signal<AngularTable<TFeatures, TData>> {\n return inject(TanStackTableToken)\n}\n","import { InjectionToken, inject } from '@angular/core'\n\nexport const FlexRenderComponentProps = new InjectionToken<\n NonNullable<unknown>\n>('[@tanstack/angular-table] Flex render component context props')\n\n/**\n * Inject the flex render context props.\n *\n * Can be used in components rendered via FlexRender directives.\n */\nexport function injectFlexRenderContext<T extends NonNullable<unknown>>(): T {\n return inject<T>(FlexRenderComponentProps)\n}\n","/**\n * Flags used to manage and optimize the rendering lifecycle of the content of the cell\n * while using {@link FlexViewRenderer}.\n */\nexport const FlexRenderFlags = {\n /**\n * Indicates that the view is being created for the first time or will be cleared during the next update phase.\n * This is the initial state and will transition after the first ngDoCheck.\n */\n ViewFirstRender: 1 << 0,\n /**\n * Indicates the `content` property has been modified or the view requires a complete re-render.\n * When this flag is enabled, the view will be cleared and recreated from scratch.\n */\n ContentChanged: 1 << 1,\n /**\n * Indicates that the `props` property reference has changed.\n * When this flag is enabled, the view context is updated based on the type of the content.\n *\n * For Component view, inputs will be updated and view will be marked as dirty.\n * For TemplateRef and primitive values, view will be marked as dirty\n */\n PropsReferenceChanged: 1 << 2,\n /**\n * Indicates that the current rendered view needs to be checked for changes.\n * This will be set to true when `content(props)` result has changed or during\n * forced update\n */\n Dirty: 1 << 3,\n /**\n * Indicates that the first render effect has been checked at least one time.\n */\n RenderEffectChecked: 1 << 4,\n} as const\n","import { reflectComponentType } from '@angular/core'\nimport type {\n Binding,\n ComponentMirror,\n Injector,\n InputSignal,\n OutputEmitterRef,\n Type,\n createComponent,\n} from '@angular/core'\n\ntype CreateComponentOptions = Parameters<typeof createComponent>[1]\ntype CreateComponentBindings = CreateComponentOptions['bindings']\ntype CreateComponentDirectives = CreateComponentOptions['directives']\n\ninterface FlexRenderOptions<\n TInputs extends Record<string, any>,\n TOutputs extends Record<string, any>,\n> {\n /**\n * Native Angular bindings applied at component creation time via `createComponent`.\n * Use this option to set inputs, outputs, or two-way bindings at creation time.\n * Shouldn't be used together with {@link FlexRenderOptions#inputs} or {@link FlexRenderOptions#outputs} option.\n *\n * Binding input/outputs at creation time: {@link https://angular.dev/guide/components/programmatic-rendering#binding-inputs-outputs-and-setting-host-directives-at-creation}\n *\n * Two-way binding: {@link https://angular.dev/api/core/twoWayBinding}\n *\n * Output binding: {@link https://angular.dev/api/core/outputBinding}\n *\n * Input binding: {@link https://angular.dev/api/core/inputBinding}\n *\n * @example\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table';\n * flexRenderComponent(MyComponent, {\n * bindings: [\n * // Will update `value` input every time `mySignalValue` changes\n * inputBinding('value', mySignalValue),\n * // Set myProperty to 1 when the component is created\n * inputBinding('myProperty', () => 1),\n * // Callback called every time `valueChange` output emit\n * outputBinding('valueChange', value => {\n * console.log(\"my value changed to\", value)\n * }),\n * // Two-way binding between `value` input and `valueChange` output\n * // Useful while using `model` inputs.\n * twoWayBinding('value', mySignal)\n * ]\n * })\n * ```\n */\n readonly bindings?: Array<Binding>\n /**\n * Directives to apply to the component at creation time.\n *\n * Binding directives at creation time: {@link https://angular.dev/guide/components/programmatic-rendering#binding-inputs-outputs-and-setting-host-directives-at-creation}\n *\n * Two-way binding: {@link https://angular.dev/api/core/twoWayBinding}\n *\n * Output binding: {@link https://angular.dev/api/core/outputBinding}\n *\n * Input binding: {@link https://angular.dev/api/core/inputBinding}\n *\n * @example\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table';\n * flexRenderComponent(MyComponent, {\n * bindings: [\n * // ...\n * ],\n * directives: [\n * DirectiveA,\n * {\n * type: DirectiveB,\n * bindings: [\n * inputBinding('value', mySignalValue),\n * // ...\n * ]\n * }\n * ]\n * })\n * ```\n */\n readonly directives?: CreateComponentDirectives\n /**\n * Component instance inputs.\n *\n * These values are assigned after the component has been created using\n * [componentRef.setInput API](https://angular.dev/api/core/ComponentRef#setInput).\n *\n * Shouldn't be used together with {@link FlexRenderOptions#bindings} option\n */\n readonly inputs?: TInputs\n /**\n * Component instance outputs.\n *\n * Outputs are wired imperatively after component creation using {@link OutputEmitterRef#subscribe}.\n *\n * Shouldn't be used together with {@link FlexRenderOptions#bindings} option\n */\n readonly outputs?: TOutputs\n /**\n * Optional {@link Injector} that will be used when rendering the component\n */\n readonly injector?: Injector\n}\n\ntype Inputs<T> = {\n [K in keyof T as T[K] extends InputSignal<infer R>\n ? K\n : never]?: T[K] extends InputSignal<infer R> ? R : never\n}\n\ntype Outputs<T> = {\n [K in keyof T as T[K] extends OutputEmitterRef<infer R>\n ? K\n : never]?: T[K] extends OutputEmitterRef<infer R>\n ? OutputEmitterRef<R>['emit']\n : never\n}\n\n/**\n * Helper function to create a {@link FlexRenderComponent} instance, with better type-safety.\n *\n * @example\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table'\n * import {inputBinding, outputBinding} from '@angular/core';\n *\n * const columns = [\n * {\n * cell: ({ row }) => {\n * return flexRenderComponent(MyComponent, {\n * inputs: { value: mySignalValue() },\n * outputs: { valueChange: (val) => {} }\n * // or using angular native createComponent#binding api\n * bindings: [\n * inputBinding('value', mySignalValue),\n * outputBinding('valueChange', value => {\n * console.log(\"my value changed to\", value)\n * })\n * ]\n * })\n * },\n * },\n * ]\n * ```\n */\nexport function flexRenderComponent<TComponent = any>(\n component: Type<TComponent>,\n options?: FlexRenderOptions<Inputs<TComponent>, Outputs<TComponent>>,\n): FlexRenderComponent<TComponent> {\n const { inputs, injector, outputs, directives, bindings } = options ?? {}\n return new FlexRenderComponentInstance(\n component,\n inputs,\n injector,\n outputs,\n directives,\n bindings,\n )\n}\n\n/**\n * Wrapper interface for a component that will be used as content for {@link FlexRenderDirective}.\n * Can be created using {@link flexRenderComponent} helper.\n *\n * @example\n *\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table'\n *\n * // Usage in cell/header/footer definition\n * const columns = [\n * {\n * cell: ({ row }) => {\n * return flexRenderComponent(MyComponent, {\n * inputs: { value: mySignalValue() },\n * outputs: { valueChange: (val) => {} }\n * // or using angular createComponent#bindings api\n * bindings: [\n * inputBinding('value', mySignalValue),\n * outputBinding('valueChange', value => {\n * console.log(\"my value changed to\", value)\n * })\n * ]\n * })\n * },\n * },\n * ]\n *\n * import {input, output} from '@angular/core';\n *\n * @Component({\n * selector: 'my-component',\n * })\n * class MyComponent {\n * readonly value = input(0);\n * readonly valueChange = output<number>();\n * }\n *\n * ```\n */\nexport interface FlexRenderComponent<TComponent = any> {\n /**\n * The component type\n */\n readonly component: Type<TComponent>\n /**\n * Reflected metadata about the component.\n */\n readonly mirror: ComponentMirror<TComponent>\n /**\n * List of allowed input names.\n */\n readonly allowedInputNames: Array<string>\n /**\n * List of allowed output names.\n */\n readonly allowedOutputNames: Array<string>\n /**\n * Component instance outputs. Subscribed via {@link OutputEmitterRef#subscribe}\n *\n * @see {@link FlexRenderOptions#outputs}\n */\n readonly outputs?: Outputs<TComponent>\n /**\n * Component instance inputs. Set via [componentRef.setInput API](https://angular.dev/api/core/ComponentRef#setInput))\n *\n * @see {@link FlexRenderOptions#inputs}\n */\n readonly inputs?: Inputs<TComponent>\n /**\n * Optional {@link Injector} that will be used when rendering the component.\n *\n * @see {@link FlexRenderOptions#injector}\n */\n readonly injector?: Injector\n /**\n * Bindings to apply to the root component\n *\n * @see {@link FlexRenderOptions#bindings}\n */\n bindings?: CreateComponentBindings\n /**\n * Directives that should be applied to the component.\n *\n * @see {FlexRenderOptions#directives}\n */\n directives?: CreateComponentDirectives\n}\n\n/**\n * Wrapper class for a component that will be used as content for {@link FlexRenderDirective}\n *\n * Prefer {@link flexRenderComponent} helper for better type-safety\n */\nexport class FlexRenderComponentInstance<\n TComponent = any,\n> implements FlexRenderComponent<TComponent> {\n readonly mirror: ComponentMirror<TComponent>\n readonly allowedInputNames: Array<string> = []\n readonly allowedOutputNames: Array<string> = []\n\n constructor(\n readonly component: Type<TComponent>,\n readonly inputs?: Inputs<TComponent>,\n readonly injector?: Injector,\n readonly outputs?: Outputs<TComponent>,\n readonly directives?: CreateComponentDirectives,\n readonly bindings?: CreateComponentBindings,\n ) {\n const mirror = reflectComponentType(component)\n if (!mirror) {\n throw new Error(\n `[@tanstack-table/angular] The provided symbol is not a component`,\n )\n }\n this.mirror = mirror\n for (const input of this.mirror.inputs) {\n this.allowedInputNames.push(input.propName)\n }\n for (const output of this.mirror.outputs) {\n this.allowedOutputNames.push(output.propName)\n }\n }\n}\n","import {\n ChangeDetectorRef,\n ComponentRef,\n Injectable,\n Injector,\n KeyValueDiffer,\n KeyValueDiffers,\n OutputEmitterRef,\n OutputRefSubscription,\n ViewContainerRef,\n} from '@angular/core'\nimport { FlexRenderComponent } from './flexRenderComponent'\n\n/**\n * Creates and manages Angular component instances used by flex-rendered table\n * content.\n */\n@Injectable()\nexport class FlexRenderComponentFactory {\n readonly #viewContainerRef: ViewContainerRef\n\n constructor(viewContainerRef: ViewContainerRef) {\n this.#viewContainerRef = viewContainerRef\n }\n\n createComponent<T>(\n flexRenderComponent: FlexRenderComponent<T>,\n componentInjector: Injector,\n ): FlexRenderComponentRef<T> {\n const componentRef = this.#viewContainerRef.createComponent(\n flexRenderComponent.component,\n {\n injector: componentInjector,\n directives: flexRenderComponent.directives,\n bindings: flexRenderComponent.bindings ?? [],\n },\n )\n const view = new FlexRenderComponentRef(\n componentRef,\n flexRenderComponent,\n componentInjector,\n )\n\n const { inputs, outputs } = flexRenderComponent\n\n if (inputs) view.setInputs(inputs)\n if (outputs) view.setOutputs(outputs)\n\n return view\n }\n}\n\n/**\n * Runtime wrapper around an Angular component rendered by `FlexRenderDirective`.\n *\n * It diffs inputs and outputs across table updates so component renderers can\n * be reused instead of recreated on every cell/header render.\n */\nexport class FlexRenderComponentRef<T> {\n readonly #keyValueDiffersFactory: KeyValueDiffers\n #componentData: FlexRenderComponent<T>\n #inputValueDiffer: KeyValueDiffer<string, unknown>\n\n readonly #outputRegistry: FlexRenderComponentOutputManager\n\n constructor(\n readonly componentRef: ComponentRef<T>,\n componentData: FlexRenderComponent<T>,\n readonly componentInjector: Injector,\n ) {\n this.#componentData = componentData\n this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers)\n\n this.#outputRegistry = new FlexRenderComponentOutputManager(\n this.#keyValueDiffersFactory,\n this.outputs,\n )\n\n this.#inputValueDiffer = this.#keyValueDiffersFactory\n .find(this.inputs)\n .create()\n this.#inputValueDiffer.diff(this.inputs)\n\n this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll())\n }\n\n get component() {\n return this.#componentData.component\n }\n\n get inputs() {\n return this.#componentData.inputs ?? {}\n }\n\n get outputs() {\n return this.#componentData.outputs ?? {}\n }\n\n /**\n * Get component input and output diff by the given item\n */\n diff(item: FlexRenderComponent<T>) {\n return {\n inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}),\n outputDiff: this.#outputRegistry.diff(item.outputs ?? {}),\n }\n }\n /**\n *\n * @param compare Whether the current ref component instance is the same as the given one\n */\n eqType(compare: FlexRenderComponent<T>): boolean {\n return compare.component === this.component\n }\n\n /**\n * Tries to update current component refs input by the new given content component.\n */\n update(content: FlexRenderComponent<T>) {\n const eq = this.eqType(content)\n if (!eq) return\n const { inputDiff, outputDiff } = this.diff(content)\n if (inputDiff) {\n inputDiff.forEachAddedItem((item) =>\n this.setInput(item.key, item.currentValue),\n )\n inputDiff.forEachChangedItem((item) =>\n this.setInput(item.key, item.currentValue),\n )\n inputDiff.forEachRemovedItem((item) => this.setInput(item.key, undefined))\n }\n if (outputDiff) {\n outputDiff.forEachAddedItem((item) => {\n this.setOutput(item.key, item.currentValue)\n })\n outputDiff.forEachChangedItem((item) => {\n if (item.currentValue) {\n this.#outputRegistry.setListener(item.key, item.currentValue)\n } else {\n this.#outputRegistry.unsubscribe(item.key)\n }\n })\n outputDiff.forEachRemovedItem((item) => {\n this.#outputRegistry.unsubscribe(item.key)\n })\n }\n\n this.#componentData = content\n }\n\n markAsDirty(): void {\n this.componentRef.injector.get(ChangeDetectorRef).markForCheck()\n }\n\n setInputs(inputs: Record<string, unknown>) {\n for (const prop in inputs) {\n this.setInput(prop, inputs[prop])\n }\n }\n\n setInput(key: string, value: unknown) {\n if (this.#componentData.allowedInputNames.includes(key)) {\n this.componentRef.setInput(key, value)\n }\n }\n\n setOutputs(\n outputs: Record<\n string,\n OutputEmitterRef<unknown>['emit'] | null | undefined\n >,\n ) {\n this.#outputRegistry.unsubscribeAll()\n for (const prop in outputs) {\n this.setOutput(prop, outputs[prop])\n }\n }\n\n setOutput(\n outputName: string,\n emit: OutputEmitterRef<unknown>['emit'] | undefined | null,\n ): void {\n if (!this.#componentData.allowedOutputNames.includes(outputName)) return\n if (!emit) {\n this.#outputRegistry.unsubscribe(outputName)\n return\n }\n\n const hasListener = this.#outputRegistry.hasListener(outputName)\n this.#outputRegistry.setListener(outputName, emit)\n\n if (hasListener) {\n return\n }\n\n const instance = this.componentRef.instance\n const output = instance[outputName as keyof typeof instance]\n if (output && output instanceof OutputEmitterRef) {\n output.subscribe((value) => {\n this.#outputRegistry.getListener(outputName)?.(value)\n })\n }\n }\n}\n\nclass FlexRenderComponentOutputManager {\n readonly #outputSubscribers: Record<string, OutputRefSubscription> = {}\n readonly #outputListeners: Record<string, (...args: Array<any>) => void> = {}\n\n readonly #valueDiffer: KeyValueDiffer<\n string,\n undefined | null | OutputEmitterRef<unknown>['emit']\n >\n\n constructor(keyValueDiffers: KeyValueDiffers, initialOutputs: any) {\n this.#valueDiffer = keyValueDiffers.find(initialOutputs).create()\n if (initialOutputs) {\n this.#valueDiffer.diff(initialOutputs)\n }\n }\n\n hasListener(outputName: string) {\n return outputName in this.#outputListeners\n }\n\n setListener(outputName: string, callback: (...args: Array<any>) => void) {\n this.#outputListeners[outputName] = callback\n }\n\n getListener(outputName: string) {\n return this.#outputListeners[outputName]\n }\n\n unsubscribeAll(): void {\n for (const prop in this.#outputSubscribers) {\n this.unsubscribe(prop)\n }\n }\n\n unsubscribe(outputName: string) {\n if (outputName in this.#outputSubscribers) {\n this.#outputSubscribers[outputName]?.unsubscribe()\n delete this.#outputSubscribers[outputName]\n delete this.#outputListeners[outputName]\n }\n }\n\n diff(outputs: Record<string, OutputEmitterRef<unknown>['emit'] | undefined>) {\n return this.#valueDiffer.diff(outputs)\n }\n}\n","import { TemplateRef, Type } from '@angular/core'\nimport { FlexRenderComponentInstance } from './flexRenderComponent'\nimport type { FlexRenderComponent } from './flexRenderComponent'\nimport type { FlexRenderContent } from './renderer'\nimport type { EmbeddedViewRef } from '@angular/core'\nimport type { FlexRenderComponentRef } from './flexRenderComponentFactory'\n\nexport type FlexRenderTypedContent =\n | { kind: 'null' }\n | {\n kind: 'primitive'\n content: string | number | Record<string, any>\n }\n | { kind: 'flexRenderComponent'; content: FlexRenderComponent<unknown> }\n | { kind: 'templateRef'; content: TemplateRef<unknown> }\n | { kind: 'component'; content: Type<unknown> }\n\n/**\n * Normalizes arbitrary Angular flex-render content into the renderer's internal\n * tagged representation.\n *\n * This lets the directive decide whether to reuse, update, or recreate an\n * embedded view or component view.\n */\nexport function mapToFlexRenderTypedContent(\n content: FlexRenderContent<any>,\n): FlexRenderTypedContent {\n if (content === null || content === undefined) {\n return { kind: 'null' }\n }\n if (typeof content === 'string' || typeof content === 'number') {\n return { kind: 'primitive', content }\n }\n if (content instanceof FlexRenderComponentInstance) {\n return { kind: 'flexRenderComponent', content }\n } else if (content instanceof TemplateRef) {\n return { kind: 'templateRef', content }\n } else if (content instanceof Type) {\n return { kind: 'component', content }\n } else {\n return { kind: 'primitive', content }\n }\n}\n\nexport type FlexRenderViewAllowedType =\n | FlexRenderComponentRef<any>\n | EmbeddedViewRef<unknown>\n | null\n\nexport abstract class FlexRenderView<\n TView extends FlexRenderViewAllowedType,\n TContent extends FlexRenderTypedContent,\n> {\n readonly view: TView\n #previousContent: FlexRenderTypedContent | undefined\n #content: FlexRenderTypedContent\n\n protected constructor(\n initialContent: Exclude<FlexRenderTypedContent, { kind: 'null' }>,\n view: TView,\n ) {\n this.#content = initialContent\n this.view = view\n }\n\n get previousContent(): FlexRenderTypedContent {\n return this.#previousContent ?? { kind: 'null' }\n }\n\n get content() {\n return this.#content\n }\n\n set content(content: FlexRenderTypedContent) {\n this.#previousContent = this.#content\n this.#content = content\n }\n\n abstract updateProps(props: Record<string, any>): void\n\n abstract dirtyCheck(): void\n\n abstract onDestroy(callback: Function): void\n\n abstract eq(view: TContent): boolean\n\n abstract unmount(): void\n}\n\n/**\n * Tracks an Angular embedded template view rendered by `FlexRenderDirective`.\n *\n * Template views receive updated props through their proxied context and can be\n * reused while the rendered content kind stays compatible.\n */\nexport class FlexRenderTemplateView extends FlexRenderView<\n EmbeddedViewRef<unknown>,\n Extract<FlexRenderTypedContent, { kind: 'primitive' | 'templateRef' }>\n> {\n constructor(\n initialContent: Extract<\n FlexRenderTypedContent,\n { kind: 'primitive' | 'templateRef' }\n >,\n view: EmbeddedViewRef<unknown>,\n ) {\n super(initialContent, view)\n }\n\n override updateProps(props: Record<string, any>) {\n this.view.markForCheck()\n }\n\n override dirtyCheck() {\n // Basically a no-op. When the view is created via EmbeddedViewRef, we don't need to do any manual update\n // since this type of content has a proxy as a context, then every time the root component is checked for changes,\n // the property getter will be re-evaluated.\n //\n // If in a future we need to manually mark the view as dirty, just uncomment next line\n // this.view.markForCheck()\n }\n\n override unmount() {\n this.view.destroy()\n }\n\n override onDestroy(callback: Function) {\n this.view.onDestroy(callback)\n }\n\n override eq(\n compare: Extract<\n FlexRenderTypedContent,\n { kind: 'primitive' | 'templateRef' }\n >,\n ): boolean {\n return (\n (this.content.kind === 'primitive' &&\n compare.kind === 'primitive' &&\n this.content.content === compare.content) ||\n (this.content.kind === 'templateRef' &&\n compare.kind === 'templateRef' &&\n this.content.content === compare.content)\n )\n }\n}\n\n/**\n * Tracks an Angular component view rendered by `FlexRenderDirective`.\n *\n * Component views own input/output updates for `flexRenderComponent(...)`\n * results and component classes rendered directly from column definitions.\n */\nexport class FlexRenderComponentView extends FlexRenderView<\n FlexRenderComponentRef<unknown>,\n Extract<FlexRenderTypedContent, { kind: 'component' | 'flexRenderComponent' }>\n> {\n constructor(\n initialContent: Extract<\n FlexRenderTypedContent,\n { kind: 'component' | 'flexRenderComponent' }\n >,\n view: FlexRenderComponentRef<unknown>,\n ) {\n super(initialContent, view)\n }\n\n override updateProps(props: Record<string, any>) {\n switch (this.content.kind) {\n case 'component': {\n this.view.setInputs(props)\n break\n }\n case 'flexRenderComponent': {\n // No-op. When FlexRenderFlags.PropsReferenceChanged is set,\n // FlexRenderComponent will be updated into `dirtyCheck`.\n break\n }\n }\n }\n\n override dirtyCheck() {\n switch (this.content.kind) {\n case 'component': {\n // Component context is currently valuated with the cell context. Since it's reference\n // shouldn't change, we force mark the component as dirty in order to re-evaluate function invocation in view.\n // NOTE: this should behave like having a component with ChangeDetectionStrategy.Default\n this.view.markAsDirty()\n break\n }\n case 'flexRenderComponent': {\n // Given context instance will always have a different reference than the previous one,\n // so instead of recreating the entire view, we will only update the current view\n if (this.view.eqType(this.content.content)) {\n this.view.update(this.content.content)\n }\n this.view.markAsDirty()\n break\n }\n }\n }\n\n override unmount() {\n this.view.componentRef.destroy()\n }\n\n override onDestroy(callback: Function) {\n this.view.componentRef.onDestroy(callback)\n }\n\n override eq(\n compare: Extract<\n FlexRenderTypedContent,\n { kind: 'component' | 'flexRenderComponent' }\n >,\n ): boolean {\n return (\n (this.content.kind === 'component' &&\n compare.kind === 'component' &&\n this.content.content === compare.content) ||\n (this.content.kind === 'flexRenderComponent' &&\n compare.kind === 'flexRenderComponent' &&\n this.content.content.component === compare.content.component)\n )\n }\n}\n","import {\n Injector,\n computed,\n effect,\n runInInjectionContext,\n untracked,\n} from '@angular/core'\nimport { TanStackTableCellToken } from '../helpers/cell'\nimport { TanStackTableHeaderToken } from '../helpers/header'\nimport { TanStackTableToken } from '../helpers/table'\nimport { FlexRenderComponentProps } from './context'\nimport { FlexRenderFlags } from './flags'\nimport { flexRenderComponent } from './flexRenderComponent'\nimport { FlexRenderComponentFactory } from './flexRenderComponentFactory'\nimport {\n FlexRenderComponentView,\n FlexRenderTemplateView,\n mapToFlexRenderTypedContent,\n} from './view'\nimport type {\n FlexRenderTypedContent,\n FlexRenderView,\n FlexRenderViewAllowedType,\n} from './view'\nimport type { FlexRenderComponent } from './flexRenderComponent'\nimport type {\n CellContext,\n CellData,\n HeaderContext,\n RowData,\n TableFeatures,\n} from '@tanstack/table-core'\nimport type {\n EffectRef,\n TemplateRef,\n Type,\n ViewContainerRef,\n} from '@angular/core'\n\n/**\n * Content supported by the `flexRender` directive when declaring\n * a table column header/cell.\n */\nexport type FlexRenderContent<TProps extends NonNullable<unknown>> =\n | string\n | number\n | Type<TProps>\n | FlexRenderComponent<TProps>\n | TemplateRef<{ $implicit: TProps }>\n | null\n | Record<any, any>\n | undefined\n\n/**\n * Input content supported by the `flexRender` directives.\n */\nexport type FlexRenderInputContent<TProps extends NonNullable<unknown>> =\n | number\n | string\n | ((props: TProps) => FlexRenderContent<TProps>)\n | null\n | undefined\n\n/**\n * Options used to create a {@link FlexViewRenderer}.\n *\n * This renderer is designed to be embedded inside a directive/component that owns the\n * `ViewContainerRef` and possibly a fallback `TemplateRef`.\n */\ninterface RendererViewOptions<TProps extends NonNullable<unknown>> {\n /**\n * Signal-like getter that returns the latest renderable content.\n */\n content: () => FlexRenderInputContent<TProps>\n /**\n * Signal-like getter returning the current props/context object.\n */\n props: () => NoInfer<TProps>\n /**\n * Getter returning the base injector to evaluate render functions in.\n *\n * If `content` is a function, it will be executed inside this injection context\n * via `runInInjectionContext` so Angular DI works as expected.\n */\n injector: () => Injector\n /**\n * Container that will host the dynamically created view/component.\n */\n viewContainerRef: ViewContainerRef\n /**\n * Fallback template used for primitive rendering.\n *\n * The template is instantiated with `$implicit` set to the primitive string/number.\n */\n templateRef: TemplateRef<unknown>\n}\n\n/**\n * Internal view renderer used by Angular TanStack Table to implement `flexRender` directives.\n *\n * @internal Use FlexRender directives instead.\n */\nexport class FlexViewRenderer<\n TFeatures extends TableFeatures,\n TRowData extends RowData,\n TValue extends CellData,\n TProps extends\n | NonNullable<unknown>\n | CellContext<TFeatures, TRowData, TValue>\n | HeaderContext<TFeatures, TRowData, TValue>,\n> {\n #renderFlags = FlexRenderFlags.ViewFirstRender\n #renderView: FlexRenderView<\n FlexRenderViewAllowedType,\n FlexRenderTypedContent\n > | null = null\n #currentRenderEffectRef: EffectRef | null = null\n #content: () => FlexRenderInputContent<TProps>\n #props: () => TProps\n #injector: () => Injector\n #viewContainerRef: ViewContainerRef\n #templateRef: TemplateRef<unknown>\n #flexRenderComponentFactory: FlexRenderComponentFactory\n\n readonly #getLatestContentValue = () => {\n const content = this.#content()\n const props = this.#props()\n return typeof content !== 'function'\n ? content\n : runInInjectionContext(this.#injector(), () => content(props))\n }\n\n readonly #latestContent = computed(() => this.#getLatestContentValue())\n\n #getContentValue = computed(() => {\n const latestContent = this.#latestContent()\n return mapToFlexRenderTypedContent(latestContent)\n })\n\n constructor(options: RendererViewOptions<TProps>) {\n this.#content = options.content\n this.#props = options.props\n this.#injector = options.injector\n this.#templateRef = options.templateRef\n this.#viewContainerRef = options.viewContainerRef\n this.#flexRenderComponentFactory = new FlexRenderComponentFactory(\n this.#viewContainerRef,\n )\n }\n\n mount(): EffectRef {\n let previousContent: FlexRenderInputContent<TProps>\n let previousProps: TProps\n\n return effect(() => {\n const props = this.#props()\n const content = this.#content()\n\n if (!(this.#renderFlags & FlexRenderFlags.ViewFirstRender)) {\n if (previousContent !== content) {\n this.#renderFlags |= FlexRenderFlags.ContentChanged\n }\n if (previousProps !== props) {\n this.#renderFlags |= FlexRenderFlags.PropsReferenceChanged\n }\n }\n\n untracked(() => this.#update())\n\n if (FlexRenderFlags.ViewFirstRender & this.#renderFlags) {\n this.#renderFlags &= ~FlexRenderFlags.ViewFirstRender\n }\n\n previousContent = content\n previousProps = props\n })\n }\n\n destroy(): void {\n if (this.#currentRenderEffectRef) {\n this.#currentRenderEffectRef.destroy()\n this.#currentRenderEffectRef = null\n }\n if (this.#renderView) {\n this.#renderView.unmount()\n this.#renderView = null\n }\n }\n\n #update() {\n if (\n this.#renderFlags &\n (FlexRenderFlags.ContentChanged | FlexRenderFlags.ViewFirstRender)\n ) {\n this.#render()\n return\n }\n\n if (this.#renderFlags & FlexRenderFlags.PropsReferenceChanged) {\n if (this.#renderView) this.#renderView.updateProps(this.#props())\n this.#renderFlags &= ~FlexRenderFlags.PropsReferenceChanged\n }\n\n if (this.#renderFlags & FlexRenderFlags.Dirty) {\n if (this.#renderView) this.#renderView.dirtyCheck()\n this.#renderFlags &= ~FlexRenderFlags.Dirty\n }\n }\n\n #render() {\n // When the view is recreated from scratch (content change or first render),\n // we have to destroy the current effect listener since it will be recreated\n // skipping the first call (FlexRenderFlags.RenderEffectChecked)\n if (this.#shouldRecreateEntireView() && this.#currentRenderEffectRef) {\n this.#currentRenderEffectRef.destroy()\n this.#currentRenderEffectRef = null\n this.#renderFlags &= ~FlexRenderFlags.RenderEffectChecked\n }\n\n this.#viewContainerRef.clear()\n if (this.#renderView) {\n this.#renderView.unmount()\n this.#renderView = null\n }\n\n this.#renderFlags =\n (this.#renderFlags & FlexRenderFlags.ViewFirstRender) |\n (this.#renderFlags & FlexRenderFlags.RenderEffectChecked)\n\n const resolvedContent = this.#getContentValue()\n this.#renderView = this.#renderViewByContent(resolvedContent)\n // If the content is a function `content(props)`, we initialize an effect\n // to react to changes. If the current fn uses signals, we will set the DirtySignal flag\n // to re-schedule the component updates\n if (\n !this.#currentRenderEffectRef &&\n typeof untracked(this.#content) === 'function'\n ) {\n this.#currentRenderEffectRef = effect(\n () => {\n this.#latestContent()\n if (!(this.#renderFlags & FlexRenderFlags.RenderEffectChecked)) {\n this.#renderFlags |= FlexRenderFlags.RenderEffectChecked\n return\n }\n this.#renderFlags |= FlexRenderFlags.Dirty\n this.#doCheck()\n },\n { injector: this.#viewContainerRef.injector },\n )\n }\n }\n\n #shouldRecreateEntireView() {\n return (\n this.#renderFlags &\n FlexRenderFlags.ContentChanged &\n FlexRenderFlags.ViewFirstRender\n )\n }\n\n #doCheck() {\n const latestContent = this.#getContentValue()\n if (latestContent.kind === 'null' || !this.#renderView) {\n this.#renderFlags |= FlexRenderFlags.ContentChanged\n } else {\n const { kind: currentKind } = this.#renderView.content\n if (\n latestContent.kind !== currentKind ||\n !this.#renderView.eq(latestContent)\n ) {\n this.#renderFlags |= FlexRenderFlags.ContentChanged\n }\n this.#renderView.content = latestContent\n }\n this.#update()\n }\n\n #renderViewByContent(\n content: FlexRenderTypedContent,\n ): FlexRenderView<FlexRenderViewAllowedType, FlexRenderTypedContent> | null {\n if (content.kind === 'primitive') {\n return this.#renderStringContent(content)\n } else if (content.kind === 'templateRef') {\n return this.#renderTemplateRefContent(content)\n } else if (content.kind === 'flexRenderComponent') {\n return this.#renderComponent(content)\n } else if (content.kind === 'component') {\n return this.#renderCustomComponent(content)\n } else {\n return null\n }\n }\n\n #renderStringContent(\n template: Extract<FlexRenderTypedContent, { kind: 'primitive' }>,\n ): FlexRenderTemplateView {\n const context = () => {\n const content = this.#content()\n return typeof content === 'string' || typeof content === 'number'\n ? content\n : runInInjectionContext(this.#injector(), () =>\n content?.(this.#props()),\n )\n }\n const ref = this.#viewContainerRef.createEmbeddedView(this.#templateRef, {\n get $implicit() {\n return context()\n },\n })\n return new FlexRenderTemplateView(template, ref)\n }\n\n #renderTemplateRefContent(\n template: Extract<FlexRenderTypedContent, { kind: 'templateRef' }>,\n ): FlexRenderTemplateView {\n const latestContext = () => this.#props()\n const view = this.#viewContainerRef.createEmbeddedView(\n template.content,\n {\n get $implicit() {\n return latestContext()\n },\n },\n { injector: this.#getInjector() },\n )\n return new FlexRenderTemplateView(template, view)\n }\n\n #renderComponent(\n flexRenderComponent: Extract<\n FlexRenderTypedContent,\n { kind: 'flexRenderComponent' }\n >,\n ): FlexRenderComponentView {\n const { injector } = flexRenderComponent.content\n const componentInjector = this.#getInjector(injector)\n const view = this.#flexRenderComponentFactory.createComponent(\n flexRenderComponent.content,\n componentInjector,\n )\n return new FlexRenderComponentView(flexRenderComponent, view)\n }\n\n #renderCustomComponent(\n component: Extract<FlexRenderTypedContent, { kind: 'component' }>,\n ): FlexRenderComponentView {\n const instance = flexRenderComponent(component.content, {\n inputs: this.#props(),\n })\n const injector = this.#getInjector(instance.injector)\n const view = this.#flexRenderComponentFactory.createComponent(\n instance,\n injector,\n )\n return new FlexRenderComponentView(component, view)\n }\n\n #getInjector(parentInjector?: Injector) {\n const getContext = () => this.#props()\n const proxy = new Proxy(this.#props(), {\n get: (_, key) => getContext()[key as keyof typeof _],\n })\n\n const staticProviders = []\n if ('table' in proxy) {\n staticProviders.push({\n provide: TanStackTableToken,\n useValue: () => proxy.table,\n })\n }\n if ('cell' in proxy) {\n staticProviders.push({\n provide: TanStackTableCellToken,\n useValue: () => proxy.cell,\n })\n }\n if ('header' in proxy) {\n staticProviders.push({\n provide: TanStackTableHeaderToken,\n useValue: () => proxy.header,\n })\n }\n\n return Injector.create({\n parent: parentInjector ?? this.#injector(),\n providers: [\n ...staticProviders,\n { provide: FlexRenderComponentProps, useValue: proxy },\n ],\n })\n }\n}\n","import {\n DestroyRef,\n Directive,\n Injector,\n TemplateRef,\n ViewContainerRef,\n computed,\n inject,\n input,\n} from '@angular/core'\nimport {\n Cell,\n CellData,\n Header,\n RowData,\n TableFeatures,\n} from '@tanstack/table-core'\nimport { FlexViewRenderer } from '../flex-render/renderer'\nimport type { FlexRenderInputContent } from '../flex-render/renderer'\nimport type { CellContext, HeaderContext } from '@tanstack/table-core'\n\n/**\n * Simplified directive wrapper of `*flexRender`.\n *\n * Use this utility component to render headers, cells, or footers with custom markup.\n *\n * Only one prop (`cell`, `header`, or `footer`) may be passed based on the used selector.\n *\n * @example\n * ```html\n * <td *flexRenderCell=\"cell; let cell\">{{cell}}</td>\n * <th *flexRenderHeader=\"header; let header\">{{header}}</th>\n * <th *flexRenderFooter=\"footer; let footer\">{{footer}}</th>\n * ```\n *\n * This replaces calling `*flexRender` directly like this:\n * ```html\n * <td *flexRender=\"cell.column.columnDef.cell; props: cell.getContext(); let cell\">{{cell}}</td>\n * <td *flexRender=\"header.column.columnDef.header; props: header.getContext(); let header\">{{header}}</td>\n * <td *flexRender=\"footer.column.columnDef.footer; props: footer.getContext(); let footer\">{{footer}}</td>\n * ```\n *\n * Can be imported through {@link FlexRenderCell} or {@link FlexRender} import,\n * which the latter is preferred.\n *\n * @example\n * ```ts\n * import {FlexRender} from '@tanstack/angular-table\n *\n * @Component({\n * // ...\n * imports: [\n * FlexRender\n * ]\n * })\n * ```\n */\n@Directive({\n selector:\n 'ng-template[flexRenderCell], ng-template[flexRenderFooter], ng-template[flexRenderHeader]',\n})\nexport class FlexRenderCell<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> {\n readonly cell = input<Cell<TFeatures, TData, TValue>>(undefined, {\n alias: 'flexRenderCell',\n })\n\n readonly header = input<Header<TFeatures, TData, TValue>>(undefined, {\n alias: 'flexRenderHeader',\n })\n\n readonly footer = input<Header<TFeatures, TData, TValue>>(undefined, {\n alias: 'flexRenderFooter',\n })\n\n readonly #renderData = computed<\n | [\n content: FlexRenderInputContent<CellContext<TFeatures, TData, TValue>>,\n props: CellContext<TFeatures, TData, TValue>,\n ]\n | [\n content: FlexRenderInputContent<\n HeaderContext<TFeatures, TData, TValue>\n >,\n props: HeaderContext<TFeatures, TData, TValue>,\n ]\n | [content: null, props: null]\n >(\n () => {\n const cell = this.cell()\n const header = this.header()\n const footer = this.footer()\n if (cell) {\n return [cell.column.columnDef.cell, cell.getContext()]\n }\n if (header) {\n return [header.column.columnDef.header, header.getContext()]\n }\n if (footer) {\n return [footer.column.columnDef.footer, footer.getContext()]\n }\n return [null, null]\n },\n {\n equal: (a, b) => {\n return a[0] === b[0] && a[1] === b[1]\n },\n },\n )\n\n readonly #injector = inject(Injector)\n readonly #templateRef = inject(TemplateRef)\n readonly #viewContainerRef = inject(ViewContainerRef)\n\n constructor() {\n const content = computed(() => this.#renderData()[0])\n const props = computed(() => this.#renderData()[1])\n\n const renderer = new FlexViewRenderer<TFeatures, TData, TValue, any>({\n content: content,\n props: props,\n injector: () => this.#injector,\n templateRef: this.#templateRef,\n viewContainerRef: this.#viewContainerRef,\n })\n\n renderer.mount()\n\n inject(DestroyRef).onDestroy(() => {\n renderer.destroy()\n })\n }\n}\n","import {\n DestroyRef,\n Directive,\n Injector,\n InputSignal,\n TemplateRef,\n ViewContainerRef,\n inject,\n input,\n} from '@angular/core'\nimport {\n FlexRenderInputContent,\n FlexViewRenderer,\n} from './flex-render/renderer'\nimport type {\n CellContext,\n CellData,\n HeaderContext,\n RowData,\n TableFeatures,\n} from '@tanstack/table-core'\n\nexport {\n injectFlexRenderContext,\n type FlexRenderComponentProps,\n} from './flex-render/context'\n\nexport type {\n FlexRenderInputContent,\n FlexRenderContent,\n} from './flex-render/renderer'\n\n/**\n * Use this utility directive to render headers, cells, or footers with custom markup.\n *\n * Note: If you are rendering cell, header, or footer without custom context or other props,\n * you can use the {@link FlexRenderCell} directive as shorthand instead .\n *\n * @example\n * ```ts\n * import {FlexRender} from '@tanstack/angular-table';\n *\n * @Component({\n * imports: [FlexRender],\n * template: `\n * <td\n * *flexRender=\"\n * cell.column.columnDef.cell;\n * props: cell.getContext();\n * let cell\"\n * >\n * {{cell}}\n * </td>\n *\n * <th\n * *flexRender=\"\n * header.column.columnDef.header;\n * props: header.getContext();\n * let header\"\n * >\n * {{header}}\n * </td>\n *\n * <td\n * *flexRender=\"\n * footer.column.columnDef.footer;\n * props: footer.getContext();\n * let footer\"\n * >\n * {{footer}}\n * </td>\n * `,\n * })\n * class App {\n * }\n * ```\n *\n * Can be imported through {@link FlexRenderDirective} or {@link FlexRender} import,\n * which the latter is preferred.\n */\n@Directive({\n selector: 'ng-template[flexRender]',\n})\nexport class FlexRenderDirective<\n TFeatures extends TableFeatures,\n TRowData extends RowData,\n TValue extends CellData,\n TProps extends\n | NonNullable<unknown>\n | CellContext<TFeatures, TRowData, TValue>\n | HeaderContext<TFeatures, TRowData, TValue>,\n> {\n readonly content: InputSignal<FlexRenderInputContent<TProps>> = input(\n undefined as FlexRenderInputContent<TProps>,\n { alias: 'flexRender' },\n )\n\n readonly props = input<TProps>({} as TProps, {\n alias: 'flexRenderProps',\n })\n\n readonly injector = input(inject(Injector), {\n alias: 'flexRenderInjector',\n })\n\n readonly #viewContainerRef = inject(ViewContainerRef)\n readonly #templateRef = inject(TemplateRef)\n\n constructor() {\n const renderer = new FlexViewRenderer({\n content: this.content,\n props: this.props,\n injector: this.injector,\n templateRef: this.#templateRef,\n viewContainerRef: this.#viewContainerRef,\n })\n\n renderer.mount()\n\n inject(DestroyRef).onDestroy(() => {\n renderer.destroy()\n })\n }\n}\n","import { untracked } from '@angular/core'\n\n/**\n * Implementation from @tanstack/angular-query\n * {https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}\n */\nexport function lazyInit<T extends object>(initializer: () => T): T {\n let object: T | null = null\n\n const initializeObject = () => {\n if (!object) {\n object = untracked(() => initializer())\n }\n }\n\n queueMicrotask(() => initializeObject())\n\n const table = () => {}\n\n return new Proxy<T>(table as T, {\n apply(target: T, thisArg: any, argArray: Array<any>): any {\n initializeObject()\n if (typeof object === 'function') {\n return Reflect.apply(object, thisArg, argArray)\n }\n return Reflect.apply(target as any, thisArg, argArray)\n },\n get(_, prop, receiver) {\n initializeObject()\n return Reflect.get(object as T, prop, receiver)\n },\n has(_, prop) {\n initializeObject()\n return Reflect.has(object as T, prop)\n },\n ownKeys() {\n initializeObject()\n return Reflect.ownKeys(object as T)\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n","import {\n DestroyRef,\n NgZone,\n computed,\n effect,\n signal,\n untracked,\n} from '@angular/core'\nimport { batch, createAtom } from '@tanstack/angular-store'\nimport type { Atom, Observer, ReadonlyAtom } from '@tanstack/angular-store'\nimport type {\n TableAtomOptions,\n TableReactivityBindings,\n} from '@tanstack/table-core/reactivity'\nimport type { Injector, Signal, WritableSignal } from '@angular/core'\n\nconst optionsStoreDebugName = 'table/optionsStore'\n\nfunction observerToCallback<T>(\n observerOrNext: Observer<T> | ((value: T) => void),\n): (value: T) => void {\n return typeof observerOrNext === 'function'\n ? observerOrNext\n : (value) => observerOrNext.next?.(value)\n}\n\nfunction signalToReadonlyAtom<T>(\n source: Signal<T>,\n getSource: () => T,\n subscribeSource: (observerOrNext: Observer<T> | ((value: T) => void)) => {\n unsubscribe: () => void\n },\n): ReadonlyAtom<T> {\n return Object.assign(source, {\n get: () => {\n const value = getSource()\n source()\n return value\n },\n subscribe: subscribeSource as ReadonlyAtom<T>['subscribe'],\n })\n}\n\nfunction signalToWritableAtom<T>(\n source: WritableSignal<T>,\n injector: Injector,\n): Atom<T> {\n const observers = new Set<(value: T) => void>()\n let observed = false\n effect(\n () => {\n const value = source()\n if (!observed) {\n observed = true\n return\n }\n observers.forEach((observer) => observer(value))\n },\n { injector },\n )\n\n return Object.assign(source.asReadonly(), {\n set: (updater: T | ((prevVal: T) => T)) => {\n typeof updater === 'function'\n ? source.update(updater as (val: T) => T)\n : source.set(updater)\n },\n get: () => source(),\n subscribe: ((observerOrNext: Observer<T> | ((value: T) => void)) => {\n const observer = observerToCallback(observerOrNext)\n observers.add(observer)\n\n return {\n unsubscribe: () => observers.delete(observer),\n }\n }) as Atom<T>['subscribe'],\n })\n}\n\n/**\n * Creates the table-core reactivity bindings used by the Angular adapter.\n *\n * Table state atoms are backed by TanStack Store atoms. The options store stays\n * framework-native because row-model APIs read `table.options` directly during\n * render. Readonly table atoms bridge Store dependency tracking into Angular\n * computed signals.\n */\nexport function angularReactivity(injector: Injector): TableReactivityBindings {\n const ngZone = injector.get(NgZone)\n const destroyRef = injector.get(DestroyRef)\n\n return {\n createOptionsStore: true,\n schedule: (fn) => ngZone.runOutsideAngular(() => queueMicrotask(fn)),\n createReadonlyAtom: <T>(fn: () => T, options?: TableAtomOptions<T>) => {\n const storeAtom = createAtom(() => fn(), {\n compare: options?.compare,\n })\n const version = signal(0, {\n equal: () => false,\n })\n const subscription = storeAtom.subscribe(() => {\n version.update((value) => value + 1)\n })\n destroyRef.onDestroy(() => subscription.unsubscribe())\n\n const value = computed(\n () => {\n version()\n return storeAtom.get()\n },\n {\n equal: options?.compare,\n debugName: options?.debugName,\n },\n )\n return signalToReadonlyAtom(\n value,\n () => storeAtom.get(),\n (observerOrNext) => {\n const observer = observerToCallback(observerOrNext)\n return storeAtom.subscribe(() => {\n observer(storeAtom.get())\n })\n },\n )\n },\n createWritableAtom: <T>(\n value: T,\n options?: TableAtomOptions<T>,\n ): Atom<T> => {\n if (options?.debugName === optionsStoreDebugName) {\n const writableSignal = signal(value, {\n equal: options.compare,\n debugName: options.debugName,\n })\n return signalToWritableAtom(writableSignal, injector)\n }\n\n return createAtom(value, {\n compare: options?.compare,\n })\n },\n untrack: untracked,\n batch,\n }\n}\n","import {\n Injector,\n NgZone,\n assertInInjectionContext,\n effect,\n inject,\n untracked,\n} from '@angular/core'\nimport { constructTable } from '@tanstack/table-core'\nimport { lazyInit } from './lazySignalInitializer'\nimport { angularReactivity } from './reactivity'\nimport type {\n Atom,\n ReadonlyAtom,\n ReadonlyStore,\n Store,\n} from '@tanstack/angular-store'\nimport type {\n RowData,\n Table,\n TableFeatures,\n TableOptions,\n TableState,\n} from '@tanstack/table-core'\n\nexport type SubscribeSource<TValue> =\n | Atom<TValue>\n | ReadonlyAtom<TValue>\n | Store<TValue>\n | ReadonlyStore<TValue>\n\nexport type AngularTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = Table<TFeatures, TData> & {\n /**\n * @deprecated Prefer `table.atoms.<slice>.get()` for template/render reads\n * of a specific state slice, `table.state` for full-state debug snapshots, or\n * Angular computed values around explicit selectors. `table.store.state` is a\n * current-value snapshot and is easy to misuse in render code.\n */\n readonly store: Table<TFeatures, TData>['store']\n /**\n * The current table state exposed as a flat proxy. Prefer\n * `table.atoms.<slice>.get()` when reading a specific slice.\n */\n readonly state: Readonly<TableState<TFeatures>>\n}\n\nfunction createStateProxy<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table<TFeatures, TData>): Readonly<TableState<TFeatures>> {\n const getSnapshot = () => {\n const snapshot = {} as TableState<TFeatures>\n const stateKeys = Object.keys(table.initialState) as Array<\n keyof TableState<TFeatures>\n >\n\n for (const key of stateKeys) {\n snapshot[key] = table.atoms[key].get()\n }\n\n return snapshot\n }\n\n const target = {} as TableState<TFeatures>\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n if (prop === 'toJSON') {\n return getSnapshot\n }\n\n if (typeof prop === 'string' && prop in table.initialState) {\n return table.atoms[prop as keyof TableState<TFeatures>]?.get()\n }\n\n return Reflect.get(target, prop, receiver)\n },\n has(_, prop) {\n return typeof prop === 'string' && prop in table.initialState\n },\n ownKeys() {\n return Reflect.ownKeys(table.initialState)\n },\n getOwnPropertyDescriptor(_, prop) {\n if (typeof prop !== 'string' || !(prop in table.initialState)) {\n return undefined\n }\n\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n\n/**\n * Creates and returns an Angular-reactive table instance.\n *\n * The initializer is intentionally re-evaluated whenever any signal read inside it changes.\n * This is how the adapter keeps the table in sync with Angular's reactivity model.\n *\n * Because of that behavior, keep expensive/static values (for example `columns`, feature setup, row models)\n * as stable references outside the initializer, and only read reactive state (`data()`, pagination/filter/sorting signals, etc.)\n * inside it.\n *\n * The returned table is also signal-reactive: table state and table APIs are wired for Angular signals, so you can safely consume table methods inside `computed(...)` and `effect(...)`.\n *\n * @example\n * 1. Register the table features you need\n * ```ts\n * // Register only the features you need\n * import {tableFeatures, rowPaginationFeature} from '@tanstack/angular-table';\n * const _features = tableFeatures({\n * rowPaginationFeature,\n * // ...all other features you need\n * })\n *\n * // Use all table core features\n * import {stockFeatures} from '@tanstack/angular-table';\n * const _features = tableFeatures(stockFeatures);\n * ```\n * 2. Prepare the table columns\n * ```ts\n * import {ColumnDef} from '@tanstack/angular-table';\n *\n * type MyData = {}\n *\n * const columns: ColumnDef<typeof _features, MyData>[] = [\n * // ...column definitions\n * ]\n *\n * // or using createColumnHelper\n * import {createColumnHelper} from '@tanstack/angular-table';\n * const columnHelper = createColumnHelper<typeof _features, MyData>();\n * const columns = columnHelper.columns([\n * columnHelper.accessor(...),\n * // ...other columns\n * ])\n * ```\n * 3. Create the table instance with `injectTable`\n * ```ts\n * const table = injectTable(() => {\n * // ...table options,\n * _features,\n * columns: columns,\n * data: myDataSignal(),\n * })\n * ```\n *\n * @returns An Angular-reactive TanStack Table instance.\n */\nexport function injectTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n options: () => TableOptions<TFeatures, TData>,\n): AngularTable<TFeatures, TData> {\n assertInInjectionContext(injectTable)\n const injector = inject(Injector)\n const ngZone = inject(NgZone)\n\n return ngZone.runOutsideAngular(() =>\n lazyInit(() => {\n const table = constructTable({\n ...options(),\n _features: {\n coreReativityFeature: angularReactivity(injector),\n ...options()._features,\n },\n }) as AngularTable<TFeatures, TData>\n const stateProxy = createStateProxy(table)\n\n Object.defineProperty(table, 'state', {\n get() {\n return stateProxy\n },\n configurable: true,\n enumerable: true,\n })\n\n let isMount = true\n effect(\n () => {\n const newOptions = options()\n if (isMount) {\n isMount = false\n return\n }\n untracked(() =>\n table.setOptions((previous) => ({\n ...previous,\n ...newOptions,\n })),\n )\n },\n { injector, debugName: 'tableOptionsUpdate' },\n )\n\n return table\n }),\n )\n}\n","import { createColumnHelper as coreCreateColumnHelper } from '@tanstack/table-core'\nimport { injectTable } from '../injectTable'\nimport { injectFlexRenderContext } from '../flexRender'\nimport { injectTableHeaderContext as _injectTableHeaderContext } from './header'\nimport { injectTableContext as _injectTableContext } from './table'\nimport { injectTableCellContext as _injectTableCellContext } from './cell'\nimport type { FlexRenderContent } from '../flexRender'\nimport type { AngularTable } from '../injectTable'\nimport type {\n AccessorFn,\n AccessorFnColumnDef,\n AccessorKeyColumnDef,\n Cell,\n CellContext,\n CellData,\n Column,\n ColumnDef,\n DeepKeys,\n DeepValue,\n DisplayColumnDef,\n GroupColumnDef,\n Header,\n HeaderContext,\n IdentifiedColumnDef,\n Row,\n RowData,\n Table,\n TableFeature,\n TableFeatures,\n TableOptions,\n TableState,\n} from '@tanstack/table-core'\nimport type { Signal, Type } from '@angular/core'\n\nexport type RenderableComponent =\n | Type<any>\n | (<T extends NonNullable<unknown>>(props: T) => FlexRenderContent<T>)\n\n// =============================================================================\n// Enhanced Context Types with Pre-bound Components\n// =============================================================================\n\n/**\n * Enhanced CellContext with pre-bound cell components.\n * The `cell` property includes the registered cellComponents.\n */\nexport type AppCellContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n TCellComponents extends Record<string, RenderableComponent>,\n> = {\n cell: Cell<TFeatures, TData, TValue> &\n TCellComponents & { FlexRender: () => unknown }\n column: Column<TFeatures, TData, TValue>\n getValue: CellContext<TFeatures, TData, TValue>['getValue']\n renderValue: CellContext<TFeatures, TData, TValue>['renderValue']\n row: Row<TFeatures, TData>\n table: Table<TFeatures, TData>\n}\n\n/**\n * Enhanced HeaderContext with pre-bound header components.\n * The `header` property includes the registered headerComponents.\n */\nexport type AppHeaderContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = {\n column: Column<TFeatures, TData, TValue>\n header: Header<TFeatures, TData, TValue> &\n THeaderComponents & { FlexRender: () => unknown }\n table: Table<TFeatures, TData>\n}\n\n// =============================================================================\n// Enhanced Column Definition Types\n// =============================================================================\n\n/**\n * Template type for column definitions that can be a string or a function.\n */\nexport type AppColumnDefTemplate<TProps extends object> =\n | string\n | ((props: TProps) => any)\n\n/**\n * Enhanced column definition base with pre-bound components in cell/header/footer contexts.\n */\nexport type AppColumnDefBase<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n IdentifiedColumnDef<TFeatures, TData, TValue>,\n 'cell' | 'header' | 'footer'\n> & {\n cell?: AppColumnDefTemplate<\n AppCellContext<TFeatures, TData, TValue, TCellComponents>\n >\n header?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>\n >\n footer?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>\n >\n}\n\n/**\n * Enhanced display column definition with pre-bound components.\n */\nexport type AppDisplayColumnDef<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n DisplayColumnDef<TFeatures, TData, unknown>,\n 'cell' | 'header' | 'footer'\n> & {\n cell?: AppColumnDefTemplate<\n AppCellContext<TFeatures, TData, unknown, TCellComponents>\n >\n header?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n footer?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n}\n\n/**\n * Enhanced group column definition with pre-bound components.\n */\nexport type AppGroupColumnDef<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n GroupColumnDef<TFeatures, TData, unknown>,\n 'cell' | 'header' | 'footer' | 'columns'\n> & {\n cell?: AppColumnDefTemplate<\n AppCellContext<TFeatures, TData, unknown, TCellComponents>\n >\n header?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n footer?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n columns?: ReadonlyArray<ColumnDef<TFeatures, TData, unknown>>\n}\n\n// =============================================================================\n// Enhanced Column Helper Type\n// =============================================================================\n\n/**\n * Enhanced column helper with pre-bound components in cell/header/footer contexts.\n * This enables TypeScript to know about the registered components when defining columns.\n */\nexport type AppColumnHelper<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = {\n /**\n * Creates a data column definition with an accessor key or function.\n * The cell, header, and footer contexts include pre-bound components.\n */\n accessor: <\n TAccessor extends AccessorFn<TData> | DeepKeys<TData>,\n TValue extends TAccessor extends AccessorFn<TData, infer TReturn>\n ? TReturn\n : TAccessor extends DeepKeys<TData>\n ? DeepValue<TData, TAccessor>\n : never,\n >(\n accessor: TAccessor,\n column: TAccessor extends AccessorFn<TData>\n ? AppColumnDefBase<\n TFeatures,\n TData,\n TValue,\n TCellComponents,\n THeaderComponents\n > & { id: string }\n : AppColumnDefBase<\n TFeatures,\n TData,\n TValue,\n TCellComponents,\n THeaderComponents\n >,\n ) => TAccessor extends AccessorFn<TData>\n ? AccessorFnColumnDef<TFeatures, TData, TValue>\n : AccessorKeyColumnDef<TFeatures, TData, TValue>\n\n /**\n * Wraps an array of column definitions to preserve each column's individual TValue type.\n */\n columns: <TColumns extends ReadonlyArray<ColumnDef<TFeatures, TData, any>>>(\n columns: [...TColumns],\n ) => Array<ColumnDef<TFeatures, TData, any>> & [...TColumns]\n\n /**\n * Creates a display column definition for non-data columns.\n * The cell, header, and footer contexts include pre-bound components.\n */\n display: (\n column: AppDisplayColumnDef<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >,\n ) => DisplayColumnDef<TFeatures, TData, unknown>\n\n /**\n * Creates a group column definition with nested child columns.\n * The cell, header, and footer contexts include pre-bound components.\n */\n group: (\n column: AppGroupColumnDef<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >,\n ) => GroupColumnDef<TFeatures, TData, unknown>\n}\n\n/**\n * Extended table API returned by useAppTable with all App wrapper components\n */\nexport type AppAngularTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TTableComponents extends Record<string, RenderableComponent>,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = AngularTable<TFeatures, TData> &\n NoInfer<TTableComponents> & {\n appCell: <TValue>(\n cell: Cell<TFeatures, TData, TValue>,\n ) => Cell<TFeatures, TData, TValue> & NoInfer<TCellComponents>\n\n appHeader: <TValue>(\n header: Header<TFeatures, TData, TValue>,\n ) => Header<TFeatures, TData, TValue> & NoInfer<THeaderComponents>\n\n appFooter: <TValue>(\n footer: Header<TFeatures, TData, TValue>,\n ) => Header<TFeatures, TData, TValue> & NoInfer<THeaderComponents>\n }\n\n// =============================================================================\n// CreateTableHook Options and Props\n// =============================================================================\n\n/**\n * Options for creating a table hook with pre-bound components and default table options.\n * Extends all TableOptions except 'columns' | 'data' | 'store' | 'state' | 'initialState'.\n */\nexport type CreateTableContextOptions<\n TFeatures extends TableFeatures,\n TTableComponents extends Record<string, RenderableComponent>,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n TableOptions<TFeatures, any>,\n 'columns' | 'data' | 'store' | 'state' | 'initialState'\n> & {\n /**\n * Table-level components that need access to the table instance.\n * These are available directly on the table object returned by useAppTable.\n * Use `useTableContext()` inside these components.\n * @example { PaginationControls, GlobalFilter, RowCount }\n */\n tableComponents?: TTableComponents\n /**\n * Cell-level components that need access to the cell instance.\n * These are available on the cell object passed to AppCell's children.\n * Use `useCellContext()` inside these components.\n * @example { TextCell, NumberCell, DateCell, CurrencyCell }\n */\n cellComponents?: TCellComponents\n /**\n * Header-level components that need access to the header instance.\n * These are available on the header object passed to AppHeader/AppFooter's children.\n * Use `useHeaderContext()` inside these components.\n * @example { SortIndicator, ColumnFilter, ResizeHandle }\n */\n headerComponents?: THeaderComponents\n}\n\nexport type CreateTableHookResult<\n TFeatures extends TableFeatures,\n TTableComponents extends Record<string, RenderableComponent>,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = {\n createAppColumnHelper: <TData extends RowData>() => AppColumnHelper<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >\n injectTableContext: <TData extends RowData = RowData>() => Signal<\n AngularTable<TFeatures, TData>\n >\n injectTableHeaderContext: <\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >() => Signal<Header<TFeatures, TRowData, TValue>>\n injectTableCellContext: <\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >() => Signal<Cell<TFeatures, TRowData, TValue>>\n injectFlexRenderHeaderContext: <\n TData extends RowData,\n TValue extends CellData,\n >() => HeaderContext<TFeatures, TData, TValue>\n injectFlexRenderCellContext: <\n TData extends RowData,\n TValue extends CellData,\n >() => CellContext<TFeatures, TData, TValue>\n injectAppTable: <TData extends RowData>(\n tableOptions: () => Omit<\n TableOptions<TFeatures, TData>,\n '_features' | '_rowModels'\n >,\n ) => AppAngularTable<\n TFeatures,\n TData,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n >\n}\n\n/**\n * Creates app-scoped Angular table helpers with features, row models, and\n * renderable component maps pre-bound.\n *\n * Use this when an app or design system wants typed `injectAppTable`,\n * pre-bound column helpers, and typed table/cell/header context injection\n * helpers without repeating the same feature and component generics.\n *\n * @example\n * ```ts\n * const { injectAppTable, createAppColumnHelper } = createTableHook({\n * _features,\n * _rowModels: {},\n * tableComponents: {},\n * cellComponents: {},\n * headerComponents: {},\n * })\n * ```\n */\nexport function createTableHook<\n TFeatures extends TableFeatures,\n const TTableComponents extends Record<string, RenderableComponent>,\n const TCellComponents extends Record<string, RenderableComponent>,\n const THeaderComponents extends Record<string, RenderableComponent>,\n>({\n tableComponents,\n cellComponents,\n headerComponents,\n ...defaultTableOptions\n}: CreateTableContextOptions<\n TFeatures,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n>): CreateTableHookResult<\n TFeatures,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n> {\n function injectTableContext<TData extends RowData = RowData>(): Signal<\n AngularTable<TFeatures, TData>\n > {\n return _injectTableContext<TFeatures, TData>()\n }\n\n function injectTableHeaderContext<\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >(): Signal<Header<TFeatures, TRowData, TValue>> {\n return _injectTableHeaderContext<TFeatures, TRowData, TValue>()\n }\n\n function injectTableCellContext<\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >(): Signal<Cell<TFeatures, TRowData, TValue>> {\n return _injectTableCellContext<TFeatures, TRowData, TValue>()\n }\n\n function injectFlexRenderHeaderContext<\n TData extends RowData,\n TValue extends CellData,\n >(): HeaderContext<TFeatures, TData, TValue> {\n return injectFlexRenderContext<HeaderContext<TFeatures, TData, TValue>>()\n }\n\n function injectFlexRenderCellContext<\n TData extends RowData,\n TValue extends CellData,\n >(): CellContext<TFeatures, TData, TValue> {\n return injectFlexRenderContext<CellContext<TFeatures, TData, TValue>>()\n }\n\n function injectAppTable<\n TData extends RowData,\n TSelected = TableState<TFeatures>,\n >(\n tableOptions: () => Omit<\n TableOptions<TFeatures, TData>,\n '_features' | '_rowModels'\n >,\n ): AppAngularTable<\n TFeatures,\n TData,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n > {\n function appCell(cell: Cell<TFeatures, TData, any>) {\n return cell as Cell<TFeatures, TData, any> & TCellComponents\n }\n\n function appHeader(header: Header<TFeatures, TData, any>) {\n return header as Header<TFeatures, TData, any> & THeaderComponents\n }\n\n function appFooter(footer: Header<TFeatures, TData, any>) {\n return footer as Header<TFeatures, TData, any> & THeaderComponents\n }\n\n const appTableFeatures: TableFeature<{}> = {\n constructTableAPIs: (table) => {\n Object.assign(table, tableComponents, { appCell, appHeader, appFooter })\n },\n assignCellPrototype(prototype) {\n Object.assign(prototype, cellComponents)\n },\n assignHeaderPrototype(prototype) {\n Object.assign(prototype, headerComponents)\n },\n }\n\n return injectTable<TFeatures, TData>(() => {\n return {\n ...defaultTableOptions,\n ...tableOptions(),\n _features: {\n ...defaultTableOptions._features,\n appTableFeatures,\n },\n } as TableOptions<TFeatures, TData>\n }) as AngularTable<any, any>\n }\n\n function createAppColumnHelper<TData extends RowData>(): AppColumnHelper<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n > {\n // The runtime implementation is the same - components are attached at render time\n // This cast provides the enhanced types for column definitions\n return coreCreateColumnHelper<TFeatures, TData>() as AppColumnHelper<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >\n }\n\n return {\n createAppColumnHelper,\n injectTableContext,\n injectTableHeaderContext,\n injectTableCellContext,\n injectFlexRenderHeaderContext,\n injectFlexRenderCellContext,\n injectAppTable,\n }\n}\n","import { FlexRenderCell } from './helpers/flexRenderCell'\nimport { FlexRenderDirective } from './flexRender'\n\nexport * from '@tanstack/table-core'\n\nexport * from './flexRender'\nexport * from './injectTable'\nexport * from './flex-render/flexRenderComponent'\n\nexport * from './helpers/cell'\nexport * from './helpers/header'\nexport * from './helpers/table'\nexport * from './helpers/createTableHook'\nexport * from './helpers/flexRenderCell'\n\n/**\n * Constant helper to import FlexRender directives.\n *\n * You should prefer to use this constant over importing the directives separately,\n * as it ensures you always have the correct set of directives over library updates.\n *\n * @see {@link FlexRenderDirective} and {@link FlexRenderCell} for more details on the directives included in this export.\n */\nexport const FlexRender = [FlexRenderDirective, FlexRenderCell] as const\n\nexport { shallow } from '@tanstack/angular-store'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["injectTableContext","_injectTableContext","injectTableHeaderContext","_injectTableHeaderContext","injectTableCellContext","_injectTableCellContext","coreCreateColumnHelper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tanstack-angular-table.mjs","sources":["../../src/helpers/cell.ts","../../src/helpers/header.ts","../../src/helpers/table.ts","../../src/flex-render/context.ts","../../src/flex-render/flags.ts","../../src/flex-render/flexRenderComponent.ts","../../src/flex-render/flexRenderComponentFactory.ts","../../src/flex-render/view.ts","../../src/flex-render/renderer.ts","../../src/helpers/flexRenderCell.ts","../../src/flexRender.ts","../../src/lazySignalInitializer.ts","../../src/reactivity.ts","../../src/injectTable.ts","../../src/helpers/createTableHook.ts","../../src/index.ts","../../src/tanstack-angular-table.ts"],"sourcesContent":["import { Directive, InjectionToken, inject, input } from '@angular/core'\nimport { Cell, CellData, RowData, TableFeatures } from '@tanstack/table-core'\nimport type { Signal } from '@angular/core'\n\n/**\n * DI context shape for a TanStack Table cell.\n *\n * This exists to make the current `Cell` injectable by any nested component/directive\n * without having to pass it through inputs/props manually.\n */\nexport interface TanStackTableCellContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> {\n /** Signal that returns the current cell instance. */\n cell: Signal<Cell<TFeatures, TData, TValue>>\n}\n\n/**\n * Injection token that provides access to the current cell.\n *\n * This token is provided by the {@link TanStackTableCell} directive.\n */\nexport const TanStackTableCellToken = new InjectionToken<\n TanStackTableCellContext<any, any, any>['cell']\n>('[TanStack Table] CellContext')\n\n/**\n * Provides a TanStack Table `Cell` instance in Angular DI.\n *\n * The cell can be injected by:\n * - any descendant of an element using `[tanStackTableCell]=\"...\"`\n * - any component instantiated by `*flexRender` when the render props contains `cell`\n *\n * @example\n * Inject from the nearest `[tanStackTableCell]`:\n * ```html\n * <td [tanStackTableCell]=\"cell\">\n * <app-cell-actions />\n * </td>\n * ```\n *\n * ```ts\n * @Component({\n * selector: 'app-cell-actions',\n * template: `{{ cell().id }}`,\n * })\n * export class CellActionsComponent {\n * readonly cell = injectTableCellContext()\n * }\n * ```\n *\n * @example\n * Inject inside a component rendered via `flexRender`:\n * ```ts\n * @Component({\n * selector: 'app-price-cell',\n * template: `{{ cell().getValue() }}`,\n * })\n * export class PriceCellComponent {\n * readonly cell = injectTableCellContext()\n * }\n * ```\n */\n@Directive({\n selector: '[tanStackTableCell]',\n exportAs: 'cell',\n providers: [\n {\n provide: TanStackTableCellToken,\n useFactory: () => inject(TanStackTableCell).cell,\n },\n ],\n})\nexport class TanStackTableCell<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> implements TanStackTableCellContext<TFeatures, TData, TValue> {\n /**\n * The current TanStack Table cell.\n *\n * Provided as a required signal input so DI consumers always read the latest value.\n */\n readonly cell = input.required<Cell<TFeatures, TData, TValue>>({\n alias: 'tanStackTableCell',\n })\n}\n\n/**\n * Injects the current TanStack Table cell signal.\n *\n * Available when:\n * - there is a nearest `[tanStackTableCell]` directive in the DI tree, or\n * - the caller is rendered via `*flexRender` with render props containing `cell`\n */\nexport function injectTableCellContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n>(): TanStackTableCellContext<TFeatures, TData, TValue>['cell'] {\n return inject(TanStackTableCellToken)\n}\n","import { Directive, InjectionToken, inject, input } from '@angular/core'\nimport { CellData, Header, RowData, TableFeatures } from '@tanstack/table-core'\nimport type { Signal } from '@angular/core'\n\n/**\n * DI context shape for a TanStack Table header.\n *\n * This exists to make the current `Header` injectable by any nested component/directive\n * without passing it through inputs/props.\n */\nexport interface TanStackTableHeaderContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> {\n /** Signal that returns the current header instance. */\n header: Signal<Header<TFeatures, TData, TValue>>\n}\n\n/**\n * Injection token that provides access to the current header.\n *\n * This token is provided by the {@link TanStackTableHeader} directive.\n */\nexport const TanStackTableHeaderToken = new InjectionToken<\n TanStackTableHeaderContext<any, any, any>['header']\n>('[TanStack Table] HeaderContext')\n\n/**\n * Provides a TanStack Table `Header` instance in Angular DI.\n *\n * The header can be injected by:\n * - any descendant of an element using `[tanStackTableHeader]=\"...\"`\n * - any component instantiated by `*flexRender` when the render props contains `header`\n *\n * @example\n * ```html\n * <th [tanStackTableHeader]=\"header\">\n * <app-sort-indicator />\n * </th>\n * ```\n *\n * ```ts\n * @Component({\n * selector: 'app-sort-indicator',\n * template: `\n * <button (click)=\"toggle()\">\n * {{ header().column.id }}\n * </button>\n * `,\n * })\n * export class SortIndicatorComponent {\n * readonly header = injectTableHeaderContext()\n *\n * toggle() {\n * this.header().column.toggleSorting()\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[tanStackTableHeader]',\n exportAs: 'header',\n providers: [\n {\n provide: TanStackTableHeaderToken,\n useFactory: () => inject(TanStackTableHeader).header,\n },\n ],\n})\nexport class TanStackTableHeader<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> implements TanStackTableHeaderContext<TFeatures, TData, TValue> {\n /**\n * The current TanStack Table header.\n *\n * Provided as a required signal input so DI consumers always read the latest value.\n */\n readonly header = input.required<Header<TFeatures, TData, TValue>>({\n alias: 'tanStackTableHeader',\n })\n}\n\n/**\n * Injects the current TanStack Table header signal.\n *\n * Available when:\n * - there is a nearest `[tanStackTableHeader]` directive in the DI tree, or\n * - the caller is rendered via `*flexRender` with render props containing `header`\n */\nexport function injectTableHeaderContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n>(): TanStackTableHeaderContext<TFeatures, TData, TValue>['header'] {\n return inject(TanStackTableHeaderToken)\n}\n","import { Directive, InjectionToken, inject, input } from '@angular/core'\nimport { RowData, TableFeatures } from '@tanstack/table-core'\nimport { AngularTable } from '../injectTable'\nimport type { Signal } from '@angular/core'\n\n/**\n * Injection token that provides access to the current {@link AngularTable} instance.\n *\n * This token is provided by the {@link TanStackTable} directive.\n */\nexport const TanStackTableToken = new InjectionToken<\n Signal<AngularTable<any, any>>\n>('[TanStack Table] Table Context')\n\n/**\n * Provides a TanStack Table instance (`AngularTable`) in Angular DI.\n *\n * The table can be injected by:\n * - any descendant of an element using `[tanStackTable]=\"...\"`\n * - any component instantiated by `*flexRender` when the render props contains `table`\n *\n * @example\n * ```html\n * <div [tanStackTable]=\"table\">\n * <app-pagination />\n * </div>\n * ```\n *\n * ```ts\n * @Component({\n * selector: 'app-pagination',\n * template: `\n * <button (click)=\"prev()\" [disabled]=\"!table().getCanPreviousPage()\">Prev</button>\n * <button (click)=\"next()\" [disabled]=\"!table().getCanNextPage()\">Next</button>\n * `,\n * })\n * export class PaginationComponent {\n * readonly table = injectTableContext()\n *\n * prev() {\n * this.table().previousPage()\n * }\n * next() {\n * this.table().nextPage()\n * }\n * }\n * ```\n */\n@Directive({\n selector: '[tanStackTable]',\n exportAs: 'table',\n providers: [\n {\n provide: TanStackTableToken,\n useFactory: () => inject(TanStackTable).table,\n },\n ],\n})\nexport class TanStackTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> {\n /**\n * The current TanStack Table instance.\n *\n * Provided as a required signal input so DI consumers always read the latest value.\n */\n readonly table = input.required<AngularTable<TFeatures, TData>>({\n alias: 'tanStackTable',\n })\n}\n\n/**\n * Injects the current TanStack Table instance signal.\n *\n * Available when:\n * - there is a nearest `[tanStackTable]` directive in the DI tree, or\n * - the caller is rendered via `*flexRender` with render props containing `table`\n */\nexport function injectTableContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(): Signal<AngularTable<TFeatures, TData>> {\n return inject(TanStackTableToken)\n}\n","import { InjectionToken, inject } from '@angular/core'\n\nexport const FlexRenderComponentProps = new InjectionToken<\n NonNullable<unknown>\n>('[@tanstack/angular-table] Flex render component context props')\n\n/**\n * Inject the flex render context props.\n *\n * Can be used in components rendered via FlexRender directives.\n */\nexport function injectFlexRenderContext<T extends NonNullable<unknown>>(): T {\n return inject<T>(FlexRenderComponentProps)\n}\n","/**\n * Flags used to manage and optimize the rendering lifecycle of the content of the cell\n * while using {@link FlexViewRenderer}.\n */\nexport const FlexRenderFlags = {\n /**\n * Indicates that the view is being created for the first time or will be cleared during the next update phase.\n * This is the initial state and will transition after the first ngDoCheck.\n */\n ViewFirstRender: 1 << 0,\n /**\n * Indicates the `content` property has been modified or the view requires a complete re-render.\n * When this flag is enabled, the view will be cleared and recreated from scratch.\n */\n ContentChanged: 1 << 1,\n /**\n * Indicates that the `props` property reference has changed.\n * When this flag is enabled, the view context is updated based on the type of the content.\n *\n * For Component view, inputs will be updated and view will be marked as dirty.\n * For TemplateRef and primitive values, view will be marked as dirty\n */\n PropsReferenceChanged: 1 << 2,\n /**\n * Indicates that the current rendered view needs to be checked for changes.\n * This will be set to true when `content(props)` result has changed or during\n * forced update\n */\n Dirty: 1 << 3,\n /**\n * Indicates that the first render effect has been checked at least one time.\n */\n RenderEffectChecked: 1 << 4,\n} as const\n","import { reflectComponentType } from '@angular/core'\nimport type {\n Binding,\n ComponentMirror,\n Injector,\n InputSignal,\n OutputEmitterRef,\n Type,\n createComponent,\n} from '@angular/core'\n\ntype CreateComponentOptions = Parameters<typeof createComponent>[1]\ntype CreateComponentBindings = CreateComponentOptions['bindings']\ntype CreateComponentDirectives = CreateComponentOptions['directives']\n\ninterface FlexRenderOptions<\n TInputs extends Record<string, any>,\n TOutputs extends Record<string, any>,\n> {\n /**\n * Native Angular bindings applied at component creation time via `createComponent`.\n * Use this option to set inputs, outputs, or two-way bindings at creation time.\n * Shouldn't be used together with {@link FlexRenderOptions#inputs} or {@link FlexRenderOptions#outputs} option.\n *\n * Binding input/outputs at creation time: {@link https://angular.dev/guide/components/programmatic-rendering#binding-inputs-outputs-and-setting-host-directives-at-creation}\n *\n * Two-way binding: {@link https://angular.dev/api/core/twoWayBinding}\n *\n * Output binding: {@link https://angular.dev/api/core/outputBinding}\n *\n * Input binding: {@link https://angular.dev/api/core/inputBinding}\n *\n * @example\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table';\n * flexRenderComponent(MyComponent, {\n * bindings: [\n * // Will update `value` input every time `mySignalValue` changes\n * inputBinding('value', mySignalValue),\n * // Set myProperty to 1 when the component is created\n * inputBinding('myProperty', () => 1),\n * // Callback called every time `valueChange` output emit\n * outputBinding('valueChange', value => {\n * console.log(\"my value changed to\", value)\n * }),\n * // Two-way binding between `value` input and `valueChange` output\n * // Useful while using `model` inputs.\n * twoWayBinding('value', mySignal)\n * ]\n * })\n * ```\n */\n readonly bindings?: Array<Binding>\n /**\n * Directives to apply to the component at creation time.\n *\n * Binding directives at creation time: {@link https://angular.dev/guide/components/programmatic-rendering#binding-inputs-outputs-and-setting-host-directives-at-creation}\n *\n * Two-way binding: {@link https://angular.dev/api/core/twoWayBinding}\n *\n * Output binding: {@link https://angular.dev/api/core/outputBinding}\n *\n * Input binding: {@link https://angular.dev/api/core/inputBinding}\n *\n * @example\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table';\n * flexRenderComponent(MyComponent, {\n * bindings: [\n * // ...\n * ],\n * directives: [\n * DirectiveA,\n * {\n * type: DirectiveB,\n * bindings: [\n * inputBinding('value', mySignalValue),\n * // ...\n * ]\n * }\n * ]\n * })\n * ```\n */\n readonly directives?: CreateComponentDirectives\n /**\n * Component instance inputs.\n *\n * These values are assigned after the component has been created using\n * [componentRef.setInput API](https://angular.dev/api/core/ComponentRef#setInput).\n *\n * Shouldn't be used together with {@link FlexRenderOptions#bindings} option\n */\n readonly inputs?: TInputs\n /**\n * Component instance outputs.\n *\n * Outputs are wired imperatively after component creation using {@link OutputEmitterRef#subscribe}.\n *\n * Shouldn't be used together with {@link FlexRenderOptions#bindings} option\n */\n readonly outputs?: TOutputs\n /**\n * Optional {@link Injector} that will be used when rendering the component\n */\n readonly injector?: Injector\n}\n\ntype Inputs<T> = {\n [K in keyof T as T[K] extends InputSignal<infer R>\n ? K\n : never]?: T[K] extends InputSignal<infer R> ? R : never\n}\n\ntype Outputs<T> = {\n [K in keyof T as T[K] extends OutputEmitterRef<infer R>\n ? K\n : never]?: T[K] extends OutputEmitterRef<infer R>\n ? OutputEmitterRef<R>['emit']\n : never\n}\n\n/**\n * Helper function to create a {@link FlexRenderComponent} instance, with better type-safety.\n *\n * @example\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table'\n * import {inputBinding, outputBinding} from '@angular/core';\n *\n * const columns = [\n * {\n * cell: ({ row }) => {\n * return flexRenderComponent(MyComponent, {\n * inputs: { value: mySignalValue() },\n * outputs: { valueChange: (val) => {} }\n * // or using angular native createComponent#binding api\n * bindings: [\n * inputBinding('value', mySignalValue),\n * outputBinding('valueChange', value => {\n * console.log(\"my value changed to\", value)\n * })\n * ]\n * })\n * },\n * },\n * ]\n * ```\n */\nexport function flexRenderComponent<TComponent = any>(\n component: Type<TComponent>,\n options?: FlexRenderOptions<Inputs<TComponent>, Outputs<TComponent>>,\n): FlexRenderComponent<TComponent> {\n const { inputs, injector, outputs, directives, bindings } = options ?? {}\n return new FlexRenderComponentInstance(\n component,\n inputs,\n injector,\n outputs,\n directives,\n bindings,\n )\n}\n\n/**\n * Wrapper interface for a component that will be used as content for {@link FlexRenderDirective}.\n * Can be created using {@link flexRenderComponent} helper.\n *\n * @example\n *\n * ```ts\n * import {flexRenderComponent} from '@tanstack/angular-table'\n *\n * // Usage in cell/header/footer definition\n * const columns = [\n * {\n * cell: ({ row }) => {\n * return flexRenderComponent(MyComponent, {\n * inputs: { value: mySignalValue() },\n * outputs: { valueChange: (val) => {} }\n * // or using angular createComponent#bindings api\n * bindings: [\n * inputBinding('value', mySignalValue),\n * outputBinding('valueChange', value => {\n * console.log(\"my value changed to\", value)\n * })\n * ]\n * })\n * },\n * },\n * ]\n *\n * import {input, output} from '@angular/core';\n *\n * @Component({\n * selector: 'my-component',\n * })\n * class MyComponent {\n * readonly value = input(0);\n * readonly valueChange = output<number>();\n * }\n *\n * ```\n */\nexport interface FlexRenderComponent<TComponent = any> {\n /**\n * The component type\n */\n readonly component: Type<TComponent>\n /**\n * Reflected metadata about the component.\n */\n readonly mirror: ComponentMirror<TComponent>\n /**\n * List of allowed input names.\n */\n readonly allowedInputNames: Array<string>\n /**\n * List of allowed output names.\n */\n readonly allowedOutputNames: Array<string>\n /**\n * Component instance outputs. Subscribed via {@link OutputEmitterRef#subscribe}\n *\n * @see {@link FlexRenderOptions#outputs}\n */\n readonly outputs?: Outputs<TComponent>\n /**\n * Component instance inputs. Set via [componentRef.setInput API](https://angular.dev/api/core/ComponentRef#setInput))\n *\n * @see {@link FlexRenderOptions#inputs}\n */\n readonly inputs?: Inputs<TComponent>\n /**\n * Optional {@link Injector} that will be used when rendering the component.\n *\n * @see {@link FlexRenderOptions#injector}\n */\n readonly injector?: Injector\n /**\n * Bindings to apply to the root component\n *\n * @see {@link FlexRenderOptions#bindings}\n */\n bindings?: CreateComponentBindings\n /**\n * Directives that should be applied to the component.\n *\n * @see {FlexRenderOptions#directives}\n */\n directives?: CreateComponentDirectives\n}\n\n/**\n * Wrapper class for a component that will be used as content for {@link FlexRenderDirective}\n *\n * Prefer {@link flexRenderComponent} helper for better type-safety\n */\nexport class FlexRenderComponentInstance<\n TComponent = any,\n> implements FlexRenderComponent<TComponent> {\n readonly mirror: ComponentMirror<TComponent>\n readonly allowedInputNames: Array<string> = []\n readonly allowedOutputNames: Array<string> = []\n\n constructor(\n readonly component: Type<TComponent>,\n readonly inputs?: Inputs<TComponent>,\n readonly injector?: Injector,\n readonly outputs?: Outputs<TComponent>,\n readonly directives?: CreateComponentDirectives,\n readonly bindings?: CreateComponentBindings,\n ) {\n const mirror = reflectComponentType(component)\n if (!mirror) {\n throw new Error(\n `[@tanstack-table/angular] The provided symbol is not a component`,\n )\n }\n this.mirror = mirror\n for (const input of this.mirror.inputs) {\n this.allowedInputNames.push(input.propName)\n }\n for (const output of this.mirror.outputs) {\n this.allowedOutputNames.push(output.propName)\n }\n }\n}\n","import {\n ChangeDetectorRef,\n ComponentRef,\n Injectable,\n Injector,\n KeyValueDiffer,\n KeyValueDiffers,\n OutputEmitterRef,\n OutputRefSubscription,\n ViewContainerRef,\n} from '@angular/core'\nimport { FlexRenderComponent } from './flexRenderComponent'\n\n/**\n * Creates and manages Angular component instances used by flex-rendered table\n * content.\n */\n@Injectable()\nexport class FlexRenderComponentFactory {\n readonly #viewContainerRef: ViewContainerRef\n\n constructor(viewContainerRef: ViewContainerRef) {\n this.#viewContainerRef = viewContainerRef\n }\n\n createComponent<T>(\n flexRenderComponent: FlexRenderComponent<T>,\n componentInjector: Injector,\n ): FlexRenderComponentRef<T> {\n const componentRef = this.#viewContainerRef.createComponent(\n flexRenderComponent.component,\n {\n injector: componentInjector,\n directives: flexRenderComponent.directives,\n bindings: flexRenderComponent.bindings ?? [],\n },\n )\n const view = new FlexRenderComponentRef(\n componentRef,\n flexRenderComponent,\n componentInjector,\n )\n\n const { inputs, outputs } = flexRenderComponent\n\n if (inputs) view.setInputs(inputs)\n if (outputs) view.setOutputs(outputs)\n\n return view\n }\n}\n\n/**\n * Runtime wrapper around an Angular component rendered by `FlexRenderDirective`.\n *\n * It diffs inputs and outputs across table updates so component renderers can\n * be reused instead of recreated on every cell/header render.\n */\nexport class FlexRenderComponentRef<T> {\n readonly #keyValueDiffersFactory: KeyValueDiffers\n #componentData: FlexRenderComponent<T>\n #inputValueDiffer: KeyValueDiffer<string, unknown>\n\n readonly #outputRegistry: FlexRenderComponentOutputManager\n\n constructor(\n readonly componentRef: ComponentRef<T>,\n componentData: FlexRenderComponent<T>,\n readonly componentInjector: Injector,\n ) {\n this.#componentData = componentData\n this.#keyValueDiffersFactory = componentInjector.get(KeyValueDiffers)\n\n this.#outputRegistry = new FlexRenderComponentOutputManager(\n this.#keyValueDiffersFactory,\n this.outputs,\n )\n\n this.#inputValueDiffer = this.#keyValueDiffersFactory\n .find(this.inputs)\n .create()\n this.#inputValueDiffer.diff(this.inputs)\n\n this.componentRef.onDestroy(() => this.#outputRegistry.unsubscribeAll())\n }\n\n get component() {\n return this.#componentData.component\n }\n\n get inputs() {\n return this.#componentData.inputs ?? {}\n }\n\n get outputs() {\n return this.#componentData.outputs ?? {}\n }\n\n /**\n * Get component input and output diff by the given item\n */\n diff(item: FlexRenderComponent<T>) {\n return {\n inputDiff: this.#inputValueDiffer.diff(item.inputs ?? {}),\n outputDiff: this.#outputRegistry.diff(item.outputs ?? {}),\n }\n }\n /**\n *\n * @param compare Whether the current ref component instance is the same as the given one\n */\n eqType(compare: FlexRenderComponent<T>): boolean {\n return compare.component === this.component\n }\n\n /**\n * Tries to update current component refs input by the new given content component.\n */\n update(content: FlexRenderComponent<T>) {\n const eq = this.eqType(content)\n if (!eq) return\n const { inputDiff, outputDiff } = this.diff(content)\n if (inputDiff) {\n inputDiff.forEachAddedItem((item) =>\n this.setInput(item.key, item.currentValue),\n )\n inputDiff.forEachChangedItem((item) =>\n this.setInput(item.key, item.currentValue),\n )\n inputDiff.forEachRemovedItem((item) => this.setInput(item.key, undefined))\n }\n if (outputDiff) {\n outputDiff.forEachAddedItem((item) => {\n this.setOutput(item.key, item.currentValue)\n })\n outputDiff.forEachChangedItem((item) => {\n if (item.currentValue) {\n this.#outputRegistry.setListener(item.key, item.currentValue)\n } else {\n this.#outputRegistry.unsubscribe(item.key)\n }\n })\n outputDiff.forEachRemovedItem((item) => {\n this.#outputRegistry.unsubscribe(item.key)\n })\n }\n\n this.#componentData = content\n }\n\n markAsDirty(): void {\n this.componentRef.injector.get(ChangeDetectorRef).markForCheck()\n }\n\n setInputs(inputs: Record<string, unknown>) {\n for (const prop in inputs) {\n this.setInput(prop, inputs[prop])\n }\n }\n\n setInput(key: string, value: unknown) {\n if (this.#componentData.allowedInputNames.includes(key)) {\n this.componentRef.setInput(key, value)\n }\n }\n\n setOutputs(\n outputs: Record<\n string,\n OutputEmitterRef<unknown>['emit'] | null | undefined\n >,\n ) {\n this.#outputRegistry.unsubscribeAll()\n for (const prop in outputs) {\n this.setOutput(prop, outputs[prop])\n }\n }\n\n setOutput(\n outputName: string,\n emit: OutputEmitterRef<unknown>['emit'] | undefined | null,\n ): void {\n if (!this.#componentData.allowedOutputNames.includes(outputName)) return\n if (!emit) {\n this.#outputRegistry.unsubscribe(outputName)\n return\n }\n\n const hasListener = this.#outputRegistry.hasListener(outputName)\n this.#outputRegistry.setListener(outputName, emit)\n\n if (hasListener) {\n return\n }\n\n const instance = this.componentRef.instance\n const output = instance[outputName as keyof typeof instance]\n if (output && output instanceof OutputEmitterRef) {\n output.subscribe((value) => {\n this.#outputRegistry.getListener(outputName)?.(value)\n })\n }\n }\n}\n\nclass FlexRenderComponentOutputManager {\n readonly #outputSubscribers: Record<string, OutputRefSubscription> = {}\n readonly #outputListeners: Record<string, (...args: Array<any>) => void> = {}\n\n readonly #valueDiffer: KeyValueDiffer<\n string,\n undefined | null | OutputEmitterRef<unknown>['emit']\n >\n\n constructor(keyValueDiffers: KeyValueDiffers, initialOutputs: any) {\n this.#valueDiffer = keyValueDiffers.find(initialOutputs).create()\n if (initialOutputs) {\n this.#valueDiffer.diff(initialOutputs)\n }\n }\n\n hasListener(outputName: string) {\n return outputName in this.#outputListeners\n }\n\n setListener(outputName: string, callback: (...args: Array<any>) => void) {\n this.#outputListeners[outputName] = callback\n }\n\n getListener(outputName: string) {\n return this.#outputListeners[outputName]\n }\n\n unsubscribeAll(): void {\n for (const prop in this.#outputSubscribers) {\n this.unsubscribe(prop)\n }\n }\n\n unsubscribe(outputName: string) {\n if (outputName in this.#outputSubscribers) {\n this.#outputSubscribers[outputName]?.unsubscribe()\n delete this.#outputSubscribers[outputName]\n delete this.#outputListeners[outputName]\n }\n }\n\n diff(outputs: Record<string, OutputEmitterRef<unknown>['emit'] | undefined>) {\n return this.#valueDiffer.diff(outputs)\n }\n}\n","import { TemplateRef, Type } from '@angular/core'\nimport { FlexRenderComponentInstance } from './flexRenderComponent'\nimport type { FlexRenderComponent } from './flexRenderComponent'\nimport type { FlexRenderContent } from './renderer'\nimport type { EmbeddedViewRef } from '@angular/core'\nimport type { FlexRenderComponentRef } from './flexRenderComponentFactory'\n\nexport type FlexRenderTypedContent =\n | { kind: 'null' }\n | {\n kind: 'primitive'\n content: string | number | Record<string, any>\n }\n | { kind: 'flexRenderComponent'; content: FlexRenderComponent<unknown> }\n | { kind: 'templateRef'; content: TemplateRef<unknown> }\n | { kind: 'component'; content: Type<unknown> }\n\n/**\n * Normalizes arbitrary Angular flex-render content into the renderer's internal\n * tagged representation.\n *\n * This lets the directive decide whether to reuse, update, or recreate an\n * embedded view or component view.\n */\nexport function mapToFlexRenderTypedContent(\n content: FlexRenderContent<any>,\n): FlexRenderTypedContent {\n if (content === null || content === undefined) {\n return { kind: 'null' }\n }\n if (typeof content === 'string' || typeof content === 'number') {\n return { kind: 'primitive', content }\n }\n if (content instanceof FlexRenderComponentInstance) {\n return { kind: 'flexRenderComponent', content }\n } else if (content instanceof TemplateRef) {\n return { kind: 'templateRef', content }\n } else if (content instanceof Type) {\n return { kind: 'component', content }\n } else {\n return { kind: 'primitive', content }\n }\n}\n\nexport type FlexRenderViewAllowedType =\n | FlexRenderComponentRef<any>\n | EmbeddedViewRef<unknown>\n | null\n\nexport abstract class FlexRenderView<\n TView extends FlexRenderViewAllowedType,\n TContent extends FlexRenderTypedContent,\n> {\n readonly view: TView\n #previousContent: FlexRenderTypedContent | undefined\n #content: FlexRenderTypedContent\n\n protected constructor(\n initialContent: Exclude<FlexRenderTypedContent, { kind: 'null' }>,\n view: TView,\n ) {\n this.#content = initialContent\n this.view = view\n }\n\n get previousContent(): FlexRenderTypedContent {\n return this.#previousContent ?? { kind: 'null' }\n }\n\n get content() {\n return this.#content\n }\n\n set content(content: FlexRenderTypedContent) {\n this.#previousContent = this.#content\n this.#content = content\n }\n\n abstract updateProps(props: Record<string, any>): void\n\n abstract dirtyCheck(): void\n\n abstract onDestroy(callback: Function): void\n\n abstract eq(view: TContent): boolean\n\n abstract unmount(): void\n}\n\n/**\n * Tracks an Angular embedded template view rendered by `FlexRenderDirective`.\n *\n * Template views receive updated props through their proxied context and can be\n * reused while the rendered content kind stays compatible.\n */\nexport class FlexRenderTemplateView extends FlexRenderView<\n EmbeddedViewRef<unknown>,\n Extract<FlexRenderTypedContent, { kind: 'primitive' | 'templateRef' }>\n> {\n constructor(\n initialContent: Extract<\n FlexRenderTypedContent,\n { kind: 'primitive' | 'templateRef' }\n >,\n view: EmbeddedViewRef<unknown>,\n ) {\n super(initialContent, view)\n }\n\n override updateProps(props: Record<string, any>) {\n this.view.markForCheck()\n }\n\n override dirtyCheck() {\n // Basically a no-op. When the view is created via EmbeddedViewRef, we don't need to do any manual update\n // since this type of content has a proxy as a context, then every time the root component is checked for changes,\n // the property getter will be re-evaluated.\n //\n // If in a future we need to manually mark the view as dirty, just uncomment next line\n // this.view.markForCheck()\n }\n\n override unmount() {\n this.view.destroy()\n }\n\n override onDestroy(callback: Function) {\n this.view.onDestroy(callback)\n }\n\n override eq(\n compare: Extract<\n FlexRenderTypedContent,\n { kind: 'primitive' | 'templateRef' }\n >,\n ): boolean {\n return (\n (this.content.kind === 'primitive' &&\n compare.kind === 'primitive' &&\n this.content.content === compare.content) ||\n (this.content.kind === 'templateRef' &&\n compare.kind === 'templateRef' &&\n this.content.content === compare.content)\n )\n }\n}\n\n/**\n * Tracks an Angular component view rendered by `FlexRenderDirective`.\n *\n * Component views own input/output updates for `flexRenderComponent(...)`\n * results and component classes rendered directly from column definitions.\n */\nexport class FlexRenderComponentView extends FlexRenderView<\n FlexRenderComponentRef<unknown>,\n Extract<FlexRenderTypedContent, { kind: 'component' | 'flexRenderComponent' }>\n> {\n constructor(\n initialContent: Extract<\n FlexRenderTypedContent,\n { kind: 'component' | 'flexRenderComponent' }\n >,\n view: FlexRenderComponentRef<unknown>,\n ) {\n super(initialContent, view)\n }\n\n override updateProps(props: Record<string, any>) {\n switch (this.content.kind) {\n case 'component': {\n this.view.setInputs(props)\n break\n }\n case 'flexRenderComponent': {\n // No-op. When FlexRenderFlags.PropsReferenceChanged is set,\n // FlexRenderComponent will be updated into `dirtyCheck`.\n break\n }\n }\n }\n\n override dirtyCheck() {\n switch (this.content.kind) {\n case 'component': {\n // Component context is currently valuated with the cell context. Since it's reference\n // shouldn't change, we force mark the component as dirty in order to re-evaluate function invocation in view.\n // NOTE: this should behave like having a component with ChangeDetectionStrategy.Default\n this.view.markAsDirty()\n break\n }\n case 'flexRenderComponent': {\n // Given context instance will always have a different reference than the previous one,\n // so instead of recreating the entire view, we will only update the current view\n if (this.view.eqType(this.content.content)) {\n this.view.update(this.content.content)\n }\n this.view.markAsDirty()\n break\n }\n }\n }\n\n override unmount() {\n this.view.componentRef.destroy()\n }\n\n override onDestroy(callback: Function) {\n this.view.componentRef.onDestroy(callback)\n }\n\n override eq(\n compare: Extract<\n FlexRenderTypedContent,\n { kind: 'component' | 'flexRenderComponent' }\n >,\n ): boolean {\n return (\n (this.content.kind === 'component' &&\n compare.kind === 'component' &&\n this.content.content === compare.content) ||\n (this.content.kind === 'flexRenderComponent' &&\n compare.kind === 'flexRenderComponent' &&\n this.content.content.component === compare.content.component)\n )\n }\n}\n","import {\n Injector,\n computed,\n effect,\n runInInjectionContext,\n untracked,\n} from '@angular/core'\nimport { TanStackTableCellToken } from '../helpers/cell'\nimport { TanStackTableHeaderToken } from '../helpers/header'\nimport { TanStackTableToken } from '../helpers/table'\nimport { FlexRenderComponentProps } from './context'\nimport { FlexRenderFlags } from './flags'\nimport { flexRenderComponent } from './flexRenderComponent'\nimport { FlexRenderComponentFactory } from './flexRenderComponentFactory'\nimport {\n FlexRenderComponentView,\n FlexRenderTemplateView,\n mapToFlexRenderTypedContent,\n} from './view'\nimport type {\n FlexRenderTypedContent,\n FlexRenderView,\n FlexRenderViewAllowedType,\n} from './view'\nimport type { FlexRenderComponent } from './flexRenderComponent'\nimport type {\n CellContext,\n CellData,\n HeaderContext,\n RowData,\n TableFeatures,\n} from '@tanstack/table-core'\nimport type {\n EffectRef,\n TemplateRef,\n Type,\n ViewContainerRef,\n} from '@angular/core'\n\n/**\n * Content supported by the `flexRender` directive when declaring\n * a table column header/cell.\n */\nexport type FlexRenderContent<TProps extends NonNullable<unknown>> =\n | string\n | number\n | Type<TProps>\n | FlexRenderComponent<TProps>\n | TemplateRef<{ $implicit: TProps }>\n | null\n | Record<any, any>\n | undefined\n\n/**\n * Input content supported by the `flexRender` directives.\n */\nexport type FlexRenderInputContent<TProps extends NonNullable<unknown>> =\n | number\n | string\n | ((props: TProps) => FlexRenderContent<TProps>)\n | null\n | undefined\n\n/**\n * Options used to create a {@link FlexViewRenderer}.\n *\n * This renderer is designed to be embedded inside a directive/component that owns the\n * `ViewContainerRef` and possibly a fallback `TemplateRef`.\n */\ninterface RendererViewOptions<TProps extends NonNullable<unknown>> {\n /**\n * Signal-like getter that returns the latest renderable content.\n */\n content: () => FlexRenderInputContent<TProps>\n /**\n * Signal-like getter returning the current props/context object.\n */\n props: () => NoInfer<TProps>\n /**\n * Getter returning the base injector to evaluate render functions in.\n *\n * If `content` is a function, it will be executed inside this injection context\n * via `runInInjectionContext` so Angular DI works as expected.\n */\n injector: () => Injector\n /**\n * Container that will host the dynamically created view/component.\n */\n viewContainerRef: ViewContainerRef\n /**\n * Fallback template used for primitive rendering.\n *\n * The template is instantiated with `$implicit` set to the primitive string/number.\n */\n templateRef: TemplateRef<unknown>\n}\n\n/**\n * Internal view renderer used by Angular TanStack Table to implement `flexRender` directives.\n *\n * @internal Use FlexRender directives instead.\n */\nexport class FlexViewRenderer<\n TFeatures extends TableFeatures,\n TRowData extends RowData,\n TValue extends CellData,\n TProps extends\n | NonNullable<unknown>\n | CellContext<TFeatures, TRowData, TValue>\n | HeaderContext<TFeatures, TRowData, TValue>,\n> {\n #renderFlags = FlexRenderFlags.ViewFirstRender\n #renderView: FlexRenderView<\n FlexRenderViewAllowedType,\n FlexRenderTypedContent\n > | null = null\n #currentRenderEffectRef: EffectRef | null = null\n #content: () => FlexRenderInputContent<TProps>\n #props: () => TProps\n #injector: () => Injector\n #viewContainerRef: ViewContainerRef\n #templateRef: TemplateRef<unknown>\n #flexRenderComponentFactory: FlexRenderComponentFactory\n\n readonly #getLatestContentValue = () => {\n const content = this.#content()\n const props = this.#props()\n return typeof content !== 'function'\n ? content\n : runInInjectionContext(this.#injector(), () => content(props))\n }\n\n readonly #latestContent = computed(() => this.#getLatestContentValue())\n\n #getContentValue = computed(() => {\n const latestContent = this.#latestContent()\n return mapToFlexRenderTypedContent(latestContent)\n })\n\n constructor(options: RendererViewOptions<TProps>) {\n this.#content = options.content\n this.#props = options.props\n this.#injector = options.injector\n this.#templateRef = options.templateRef\n this.#viewContainerRef = options.viewContainerRef\n this.#flexRenderComponentFactory = new FlexRenderComponentFactory(\n this.#viewContainerRef,\n )\n }\n\n mount(): EffectRef {\n let previousContent: FlexRenderInputContent<TProps>\n let previousProps: TProps\n\n return effect(() => {\n const props = this.#props()\n const content = this.#content()\n\n if (!(this.#renderFlags & FlexRenderFlags.ViewFirstRender)) {\n if (previousContent !== content) {\n this.#renderFlags |= FlexRenderFlags.ContentChanged\n }\n if (previousProps !== props) {\n this.#renderFlags |= FlexRenderFlags.PropsReferenceChanged\n }\n }\n\n untracked(() => this.#update())\n\n if (FlexRenderFlags.ViewFirstRender & this.#renderFlags) {\n this.#renderFlags &= ~FlexRenderFlags.ViewFirstRender\n }\n\n previousContent = content\n previousProps = props\n })\n }\n\n destroy(): void {\n if (this.#currentRenderEffectRef) {\n this.#currentRenderEffectRef.destroy()\n this.#currentRenderEffectRef = null\n }\n if (this.#renderView) {\n this.#renderView.unmount()\n this.#renderView = null\n }\n }\n\n #update() {\n if (\n this.#renderFlags &\n (FlexRenderFlags.ContentChanged | FlexRenderFlags.ViewFirstRender)\n ) {\n this.#render()\n return\n }\n\n if (this.#renderFlags & FlexRenderFlags.PropsReferenceChanged) {\n if (this.#renderView) this.#renderView.updateProps(this.#props())\n this.#renderFlags &= ~FlexRenderFlags.PropsReferenceChanged\n }\n\n if (this.#renderFlags & FlexRenderFlags.Dirty) {\n if (this.#renderView) this.#renderView.dirtyCheck()\n this.#renderFlags &= ~FlexRenderFlags.Dirty\n }\n }\n\n #render() {\n // When the view is recreated from scratch (content change or first render),\n // we have to destroy the current effect listener since it will be recreated\n // skipping the first call (FlexRenderFlags.RenderEffectChecked)\n if (this.#shouldRecreateEntireView() && this.#currentRenderEffectRef) {\n this.#currentRenderEffectRef.destroy()\n this.#currentRenderEffectRef = null\n this.#renderFlags &= ~FlexRenderFlags.RenderEffectChecked\n }\n\n this.#viewContainerRef.clear()\n if (this.#renderView) {\n this.#renderView.unmount()\n this.#renderView = null\n }\n\n this.#renderFlags =\n (this.#renderFlags & FlexRenderFlags.ViewFirstRender) |\n (this.#renderFlags & FlexRenderFlags.RenderEffectChecked)\n\n const resolvedContent = this.#getContentValue()\n this.#renderView = this.#renderViewByContent(resolvedContent)\n // If the content is a function `content(props)`, we initialize an effect\n // to react to changes. If the current fn uses signals, we will set the DirtySignal flag\n // to re-schedule the component updates\n if (\n !this.#currentRenderEffectRef &&\n typeof untracked(this.#content) === 'function'\n ) {\n this.#currentRenderEffectRef = effect(\n () => {\n this.#latestContent()\n if (!(this.#renderFlags & FlexRenderFlags.RenderEffectChecked)) {\n this.#renderFlags |= FlexRenderFlags.RenderEffectChecked\n return\n }\n this.#renderFlags |= FlexRenderFlags.Dirty\n this.#doCheck()\n },\n { injector: this.#viewContainerRef.injector },\n )\n }\n }\n\n #shouldRecreateEntireView() {\n return (\n this.#renderFlags &\n FlexRenderFlags.ContentChanged &\n FlexRenderFlags.ViewFirstRender\n )\n }\n\n #doCheck() {\n const latestContent = this.#getContentValue()\n if (latestContent.kind === 'null' || !this.#renderView) {\n this.#renderFlags |= FlexRenderFlags.ContentChanged\n } else {\n const { kind: currentKind } = this.#renderView.content\n if (\n latestContent.kind !== currentKind ||\n !this.#renderView.eq(latestContent)\n ) {\n this.#renderFlags |= FlexRenderFlags.ContentChanged\n }\n this.#renderView.content = latestContent\n }\n this.#update()\n }\n\n #renderViewByContent(\n content: FlexRenderTypedContent,\n ): FlexRenderView<FlexRenderViewAllowedType, FlexRenderTypedContent> | null {\n if (content.kind === 'primitive') {\n return this.#renderStringContent(content)\n } else if (content.kind === 'templateRef') {\n return this.#renderTemplateRefContent(content)\n } else if (content.kind === 'flexRenderComponent') {\n return this.#renderComponent(content)\n } else if (content.kind === 'component') {\n return this.#renderCustomComponent(content)\n } else {\n return null\n }\n }\n\n #renderStringContent(\n template: Extract<FlexRenderTypedContent, { kind: 'primitive' }>,\n ): FlexRenderTemplateView {\n const context = () => {\n const content = this.#content()\n return typeof content === 'string' || typeof content === 'number'\n ? content\n : runInInjectionContext(this.#injector(), () =>\n content?.(this.#props()),\n )\n }\n const ref = this.#viewContainerRef.createEmbeddedView(this.#templateRef, {\n get $implicit() {\n return context()\n },\n })\n return new FlexRenderTemplateView(template, ref)\n }\n\n #renderTemplateRefContent(\n template: Extract<FlexRenderTypedContent, { kind: 'templateRef' }>,\n ): FlexRenderTemplateView {\n const latestContext = () => this.#props()\n const view = this.#viewContainerRef.createEmbeddedView(\n template.content,\n {\n get $implicit() {\n return latestContext()\n },\n },\n { injector: this.#getInjector() },\n )\n return new FlexRenderTemplateView(template, view)\n }\n\n #renderComponent(\n flexRenderComponent: Extract<\n FlexRenderTypedContent,\n { kind: 'flexRenderComponent' }\n >,\n ): FlexRenderComponentView {\n const { injector } = flexRenderComponent.content\n const componentInjector = this.#getInjector(injector)\n const view = this.#flexRenderComponentFactory.createComponent(\n flexRenderComponent.content,\n componentInjector,\n )\n return new FlexRenderComponentView(flexRenderComponent, view)\n }\n\n #renderCustomComponent(\n component: Extract<FlexRenderTypedContent, { kind: 'component' }>,\n ): FlexRenderComponentView {\n const instance = flexRenderComponent(component.content, {\n inputs: this.#props(),\n })\n const injector = this.#getInjector(instance.injector)\n const view = this.#flexRenderComponentFactory.createComponent(\n instance,\n injector,\n )\n return new FlexRenderComponentView(component, view)\n }\n\n #getInjector(parentInjector?: Injector) {\n const getContext = () => this.#props()\n const proxy = new Proxy(this.#props(), {\n get: (_, key) => getContext()[key as keyof typeof _],\n })\n\n const staticProviders = []\n if ('table' in proxy) {\n staticProviders.push({\n provide: TanStackTableToken,\n useValue: () => proxy.table,\n })\n }\n if ('cell' in proxy) {\n staticProviders.push({\n provide: TanStackTableCellToken,\n useValue: () => proxy.cell,\n })\n }\n if ('header' in proxy) {\n staticProviders.push({\n provide: TanStackTableHeaderToken,\n useValue: () => proxy.header,\n })\n }\n\n return Injector.create({\n parent: parentInjector ?? this.#injector(),\n providers: [\n ...staticProviders,\n { provide: FlexRenderComponentProps, useValue: proxy },\n ],\n })\n }\n}\n","import {\n DestroyRef,\n Directive,\n Injector,\n TemplateRef,\n ViewContainerRef,\n computed,\n inject,\n input,\n} from '@angular/core'\nimport {\n Cell,\n CellData,\n Header,\n RowData,\n TableFeatures,\n} from '@tanstack/table-core'\nimport { FlexViewRenderer } from '../flex-render/renderer'\nimport type { FlexRenderInputContent } from '../flex-render/renderer'\nimport type { CellContext, HeaderContext } from '@tanstack/table-core'\n\n/**\n * Simplified directive wrapper of `*flexRender`.\n *\n * Use this utility component to render headers, cells, or footers with custom markup.\n *\n * Only one prop (`cell`, `header`, or `footer`) may be passed based on the used selector.\n *\n * @example\n * ```html\n * <td *flexRenderCell=\"cell; let cell\">{{cell}}</td>\n * <th *flexRenderHeader=\"header; let header\">{{header}}</th>\n * <th *flexRenderFooter=\"footer; let footer\">{{footer}}</th>\n * ```\n *\n * This replaces calling `*flexRender` directly like this:\n * ```html\n * <td *flexRender=\"cell.column.columnDef.cell; props: cell.getContext(); let cell\">{{cell}}</td>\n * <td *flexRender=\"header.column.columnDef.header; props: header.getContext(); let header\">{{header}}</td>\n * <td *flexRender=\"footer.column.columnDef.footer; props: footer.getContext(); let footer\">{{footer}}</td>\n * ```\n *\n * Can be imported through {@link FlexRenderCell} or {@link FlexRender} import,\n * which the latter is preferred.\n *\n * @example\n * ```ts\n * import {FlexRender} from '@tanstack/angular-table\n *\n * @Component({\n * // ...\n * imports: [\n * FlexRender\n * ]\n * })\n * ```\n */\n@Directive({\n selector:\n 'ng-template[flexRenderCell], ng-template[flexRenderFooter], ng-template[flexRenderHeader]',\n})\nexport class FlexRenderCell<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n> {\n readonly cell = input<Cell<TFeatures, TData, TValue>>(undefined, {\n alias: 'flexRenderCell',\n })\n\n readonly header = input<Header<TFeatures, TData, TValue>>(undefined, {\n alias: 'flexRenderHeader',\n })\n\n readonly footer = input<Header<TFeatures, TData, TValue>>(undefined, {\n alias: 'flexRenderFooter',\n })\n\n readonly #renderData = computed<\n | [\n content: FlexRenderInputContent<CellContext<TFeatures, TData, TValue>>,\n props: CellContext<TFeatures, TData, TValue>,\n ]\n | [\n content: FlexRenderInputContent<\n HeaderContext<TFeatures, TData, TValue>\n >,\n props: HeaderContext<TFeatures, TData, TValue>,\n ]\n | [content: null, props: null]\n >(\n () => {\n const cell = this.cell()\n const header = this.header()\n const footer = this.footer()\n if (cell) {\n return [cell.column.columnDef.cell, cell.getContext()]\n }\n if (header) {\n return [header.column.columnDef.header, header.getContext()]\n }\n if (footer) {\n return [footer.column.columnDef.footer, footer.getContext()]\n }\n return [null, null]\n },\n {\n equal: (a, b) => {\n return a[0] === b[0] && a[1] === b[1]\n },\n },\n )\n\n readonly #injector = inject(Injector)\n readonly #templateRef = inject(TemplateRef)\n readonly #viewContainerRef = inject(ViewContainerRef)\n\n constructor() {\n const content = computed(() => this.#renderData()[0])\n const props = computed(() => this.#renderData()[1])\n\n const renderer = new FlexViewRenderer<TFeatures, TData, TValue, any>({\n content: content,\n props: props,\n injector: () => this.#injector,\n templateRef: this.#templateRef,\n viewContainerRef: this.#viewContainerRef,\n })\n\n renderer.mount()\n\n inject(DestroyRef).onDestroy(() => {\n renderer.destroy()\n })\n }\n}\n","import {\n DestroyRef,\n Directive,\n Injector,\n InputSignal,\n TemplateRef,\n ViewContainerRef,\n inject,\n input,\n} from '@angular/core'\nimport {\n FlexRenderInputContent,\n FlexViewRenderer,\n} from './flex-render/renderer'\nimport type {\n CellContext,\n CellData,\n HeaderContext,\n RowData,\n TableFeatures,\n} from '@tanstack/table-core'\n\nexport {\n injectFlexRenderContext,\n type FlexRenderComponentProps,\n} from './flex-render/context'\n\nexport type {\n FlexRenderInputContent,\n FlexRenderContent,\n} from './flex-render/renderer'\n\n/**\n * Use this utility directive to render headers, cells, or footers with custom markup.\n *\n * Note: If you are rendering cell, header, or footer without custom context or other props,\n * you can use the {@link FlexRenderCell} directive as shorthand instead .\n *\n * @example\n * ```ts\n * import {FlexRender} from '@tanstack/angular-table';\n *\n * @Component({\n * imports: [FlexRender],\n * template: `\n * <td\n * *flexRender=\"\n * cell.column.columnDef.cell;\n * props: cell.getContext();\n * let cell\"\n * >\n * {{cell}}\n * </td>\n *\n * <th\n * *flexRender=\"\n * header.column.columnDef.header;\n * props: header.getContext();\n * let header\"\n * >\n * {{header}}\n * </td>\n *\n * <td\n * *flexRender=\"\n * footer.column.columnDef.footer;\n * props: footer.getContext();\n * let footer\"\n * >\n * {{footer}}\n * </td>\n * `,\n * })\n * class App {\n * }\n * ```\n *\n * Can be imported through {@link FlexRenderDirective} or {@link FlexRender} import,\n * which the latter is preferred.\n */\n@Directive({\n selector: 'ng-template[flexRender]',\n})\nexport class FlexRenderDirective<\n TFeatures extends TableFeatures,\n TRowData extends RowData,\n TValue extends CellData,\n TProps extends\n | NonNullable<unknown>\n | CellContext<TFeatures, TRowData, TValue>\n | HeaderContext<TFeatures, TRowData, TValue>,\n> {\n readonly content: InputSignal<FlexRenderInputContent<TProps>> = input(\n undefined as FlexRenderInputContent<TProps>,\n { alias: 'flexRender' },\n )\n\n readonly props = input<TProps>({} as TProps, {\n alias: 'flexRenderProps',\n })\n\n readonly injector = input(inject(Injector), {\n alias: 'flexRenderInjector',\n })\n\n readonly #viewContainerRef = inject(ViewContainerRef)\n readonly #templateRef = inject(TemplateRef)\n\n constructor() {\n const renderer = new FlexViewRenderer({\n content: this.content,\n props: this.props,\n injector: this.injector,\n templateRef: this.#templateRef,\n viewContainerRef: this.#viewContainerRef,\n })\n\n renderer.mount()\n\n inject(DestroyRef).onDestroy(() => {\n renderer.destroy()\n })\n }\n}\n","import { untracked } from '@angular/core'\n\n/**\n * Implementation from @tanstack/angular-query\n * {https://github.com/TanStack/query/blob/main/packages/angular-query-experimental/src/util/lazy-init/lazy-init.ts}\n */\nexport function lazyInit<T extends object>(initializer: () => T): T {\n let object: T | null = null\n\n const initializeObject = () => {\n if (!object) {\n object = untracked(() => initializer())\n }\n }\n\n queueMicrotask(() => initializeObject())\n\n const table = () => {}\n\n return new Proxy<T>(table as T, {\n apply(target: T, thisArg: any, argArray: Array<any>): any {\n initializeObject()\n if (typeof object === 'function') {\n return Reflect.apply(object, thisArg, argArray)\n }\n return Reflect.apply(target as any, thisArg, argArray)\n },\n get(_, prop, receiver) {\n initializeObject()\n return Reflect.get(object as T, prop, receiver)\n },\n has(_, prop) {\n initializeObject()\n return Reflect.has(object as T, prop)\n },\n ownKeys() {\n initializeObject()\n return Reflect.ownKeys(object as T)\n },\n getOwnPropertyDescriptor() {\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n","import { NgZone, computed, signal, untracked } from '@angular/core'\nimport { toObservable } from '@angular/core/rxjs-interop'\nimport type { Injector, Signal, WritableSignal } from '@angular/core'\nimport type {\n Atom,\n Observer,\n ReadonlyAtom,\n Subscription,\n} from '@tanstack/angular-store'\nimport type {\n TableAtomOptions,\n TableReactivityBindings,\n} from '@tanstack/table-core/reactivity'\n\nfunction signalToReadonlyAtom<T>(\n signal: Signal<T>,\n injector: Injector,\n debugName?: string,\n): ReadonlyAtom<T> {\n const _signal = Object.assign(signal, {\n get: () => signal(),\n subscribe: (observer: Observer<T>) => {\n return untracked(() =>\n toObservable(computed(signal), { injector: injector }).subscribe(\n observer,\n ),\n )\n },\n })\n if (debugName) {\n _signal.toString = () => debugName\n }\n return _signal\n}\n\nfunction signalToWritableAtom<T>(\n signal: WritableSignal<T>,\n injector: Injector,\n debugName?: string,\n): Atom<T> {\n const _signal = Object.assign(signal.asReadonly(), {\n set: (updater: T | ((prevVal: T) => T)) => {\n typeof updater === 'function'\n ? signal.update(updater as (val: T) => T)\n : signal.set(updater)\n },\n get: () => signal(),\n subscribe: (observer: Observer<T>) => {\n return untracked(() =>\n toObservable(computed(signal), { injector: injector }).subscribe(\n observer,\n ),\n )\n },\n })\n if (debugName) {\n _signal.toString = () => debugName\n }\n return _signal\n}\n\n/**\n * Creates the table-core reactivity bindings used by the Angular adapter.\n *\n * Table state atoms are backed by TanStack Store atoms. The options store stays\n * framework-native because row-model APIs read `table.options` directly during\n * render. Readonly table atoms bridge Store dependency tracking into Angular\n * computed signals.\n */\nexport function angularReactivity(injector: Injector): TableReactivityBindings {\n const ngZone = injector.get(NgZone)\n const subscriptions = new Set<Subscription>()\n\n return {\n createOptionsStore: true,\n wrapExternalAtoms: true,\n addSubscription: (subscription) => {\n subscriptions.add(subscription)\n },\n unmount: () => {\n subscriptions.forEach((s) => s.unsubscribe())\n subscriptions.clear()\n },\n schedule: (fn) => ngZone.runOutsideAngular(() => queueMicrotask(fn)),\n createReadonlyAtom: <T>(fn: () => T, options?: TableAtomOptions<T>) => {\n const signal = computed(() => fn(), {\n equal: options?.compare,\n debugName: options?.debugName,\n })\n return signalToReadonlyAtom(signal, injector, options?.debugName)\n },\n createWritableAtom: <T>(\n value: T,\n options?: TableAtomOptions<T>,\n ): Atom<T> => {\n const writableSignal = signal(value, {\n equal: options?.compare,\n debugName: options?.debugName,\n })\n return signalToWritableAtom(writableSignal, injector, options?.debugName)\n },\n untrack: untracked,\n batch: (fn) => fn(),\n }\n}\n","import {\n DestroyRef,\n Injector,\n NgZone,\n assertInInjectionContext,\n effect,\n inject,\n untracked,\n} from '@angular/core'\nimport { constructTable } from '@tanstack/table-core'\nimport { lazyInit } from './lazySignalInitializer'\nimport { angularReactivity } from './reactivity'\nimport type {\n RowData,\n Table,\n TableFeatures,\n TableOptions,\n TableState,\n} from '@tanstack/table-core'\nimport type {\n Atom,\n ReadonlyAtom,\n ReadonlyStore,\n Store,\n} from '@tanstack/angular-store'\n\nexport type SubscribeSource<TValue> =\n | Atom<TValue>\n | ReadonlyAtom<TValue>\n | Store<TValue>\n | ReadonlyStore<TValue>\n\nexport type AngularTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n> = Table<TFeatures, TData> & {\n /**\n * @deprecated Prefer `table.atoms.<slice>.get()` for template/render reads\n * of a specific state slice, `table.state` for full-state debug snapshots, or\n * Angular computed values around explicit selectors. `table.store.state` is a\n * current-value snapshot and is easy to misuse in render code.\n */\n readonly store: Table<TFeatures, TData>['store']\n /**\n * The current table state exposed as a flat proxy. Prefer\n * `table.atoms.<slice>.get()` when reading a specific slice.\n */\n readonly state: Readonly<TableState<TFeatures>>\n}\n\nfunction createStateProxy<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(table: Table<TFeatures, TData>): Readonly<TableState<TFeatures>> {\n const getSnapshot = () => {\n const snapshot = {} as TableState<TFeatures>\n const stateKeys = Object.keys(table.initialState) as Array<\n keyof TableState<TFeatures>\n >\n\n for (const key of stateKeys) {\n snapshot[key] = table.atoms[key].get()\n }\n\n return snapshot\n }\n\n const target = {} as TableState<TFeatures>\n\n return new Proxy(target, {\n get(target, prop, receiver) {\n if (prop === 'toJSON') {\n return getSnapshot\n }\n\n if (typeof prop === 'string' && prop in table.initialState) {\n return table.atoms[prop as keyof TableState<TFeatures>]?.get()\n }\n\n return Reflect.get(target, prop, receiver)\n },\n has(_, prop) {\n return typeof prop === 'string' && prop in table.initialState\n },\n ownKeys() {\n return Reflect.ownKeys(table.initialState)\n },\n getOwnPropertyDescriptor(_, prop) {\n if (typeof prop !== 'string' || !(prop in table.initialState)) {\n return undefined\n }\n\n return {\n enumerable: true,\n configurable: true,\n }\n },\n })\n}\n\n/**\n * Creates and returns an Angular-reactive table instance.\n *\n * The initializer is intentionally re-evaluated whenever any signal read inside it changes.\n * This is how the adapter keeps the table in sync with Angular's reactivity model.\n *\n * Because of that behavior, keep expensive/static values (for example `columns`, feature setup, row models)\n * as stable references outside the initializer, and only read reactive state (`data()`, pagination/filter/sorting signals, etc.)\n * inside it.\n *\n * The returned table is also signal-reactive: table state and table APIs are wired for Angular signals, so you can safely consume table methods inside `computed(...)` and `effect(...)`.\n *\n * @example\n * 1. Register the table features you need\n * ```ts\n * // Register only the features you need\n * import {tableFeatures, rowPaginationFeature} from '@tanstack/angular-table';\n * const _features = tableFeatures({\n * rowPaginationFeature,\n * // ...all other features you need\n * })\n *\n * // Use all table core features\n * import {stockFeatures} from '@tanstack/angular-table';\n * const _features = tableFeatures(stockFeatures);\n * ```\n * 2. Prepare the table columns\n * ```ts\n * import {ColumnDef} from '@tanstack/angular-table';\n *\n * type MyData = {}\n *\n * const columns: ColumnDef<typeof _features, MyData>[] = [\n * // ...column definitions\n * ]\n *\n * // or using createColumnHelper\n * import {createColumnHelper} from '@tanstack/angular-table';\n * const columnHelper = createColumnHelper<typeof _features, MyData>();\n * const columns = columnHelper.columns([\n * columnHelper.accessor(...),\n * // ...other columns\n * ])\n * ```\n * 3. Create the table instance with `injectTable`\n * ```ts\n * const table = injectTable(() => {\n * // ...table options,\n * _features,\n * columns: columns,\n * data: myDataSignal(),\n * })\n * ```\n *\n * @returns An Angular-reactive TanStack Table instance.\n */\nexport function injectTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n>(\n options: () => TableOptions<TFeatures, TData>,\n): AngularTable<TFeatures, TData> {\n assertInInjectionContext(injectTable)\n const injector = inject(Injector)\n const ngZone = inject(NgZone)\n\n return ngZone.runOutsideAngular(() =>\n lazyInit(() => {\n const table = constructTable({\n ...options(),\n _features: {\n coreReativityFeature: angularReactivity(injector),\n ...options()._features,\n },\n }) as AngularTable<TFeatures, TData>\n\n injector.get(DestroyRef).onDestroy(() => {\n table._reactivity.unmount?.()\n })\n\n const stateProxy = createStateProxy(table)\n\n Object.defineProperty(table, 'state', {\n get() {\n return stateProxy\n },\n configurable: true,\n enumerable: true,\n })\n\n let isMount = true\n effect(\n () => {\n const newOptions = options()\n if (isMount) {\n isMount = false\n return\n }\n untracked(() =>\n table.setOptions((previous) => ({\n ...previous,\n ...newOptions,\n })),\n )\n },\n { injector, debugName: 'tableOptionsUpdate' },\n )\n\n return table\n }),\n )\n}\n","import { createColumnHelper as coreCreateColumnHelper } from '@tanstack/table-core'\nimport { injectTable } from '../injectTable'\nimport { injectFlexRenderContext } from '../flexRender'\nimport { injectTableHeaderContext as _injectTableHeaderContext } from './header'\nimport { injectTableContext as _injectTableContext } from './table'\nimport { injectTableCellContext as _injectTableCellContext } from './cell'\nimport type { FlexRenderContent } from '../flexRender'\nimport type { AngularTable } from '../injectTable'\nimport type {\n AccessorFn,\n AccessorFnColumnDef,\n AccessorKeyColumnDef,\n Cell,\n CellContext,\n CellData,\n Column,\n ColumnDef,\n DeepKeys,\n DeepValue,\n DisplayColumnDef,\n GroupColumnDef,\n Header,\n HeaderContext,\n IdentifiedColumnDef,\n Row,\n RowData,\n Table,\n TableFeature,\n TableFeatures,\n TableOptions,\n TableState,\n} from '@tanstack/table-core'\nimport type { Signal, Type } from '@angular/core'\n\nexport type RenderableComponent =\n | Type<any>\n | (<T extends NonNullable<unknown>>(props: T) => FlexRenderContent<T>)\n\n// =============================================================================\n// Enhanced Context Types with Pre-bound Components\n// =============================================================================\n\n/**\n * Enhanced CellContext with pre-bound cell components.\n * The `cell` property includes the registered cellComponents.\n */\nexport type AppCellContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n TCellComponents extends Record<string, RenderableComponent>,\n> = {\n cell: Cell<TFeatures, TData, TValue> &\n TCellComponents & { FlexRender: () => unknown }\n column: Column<TFeatures, TData, TValue>\n getValue: CellContext<TFeatures, TData, TValue>['getValue']\n renderValue: CellContext<TFeatures, TData, TValue>['renderValue']\n row: Row<TFeatures, TData>\n table: Table<TFeatures, TData>\n}\n\n/**\n * Enhanced HeaderContext with pre-bound header components.\n * The `header` property includes the registered headerComponents.\n */\nexport type AppHeaderContext<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = {\n column: Column<TFeatures, TData, TValue>\n header: Header<TFeatures, TData, TValue> &\n THeaderComponents & { FlexRender: () => unknown }\n table: Table<TFeatures, TData>\n}\n\n// =============================================================================\n// Enhanced Column Definition Types\n// =============================================================================\n\n/**\n * Template type for column definitions that can be a string or a function.\n */\nexport type AppColumnDefTemplate<TProps extends object> =\n | string\n | ((props: TProps) => any)\n\n/**\n * Enhanced column definition base with pre-bound components in cell/header/footer contexts.\n */\nexport type AppColumnDefBase<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TValue extends CellData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n IdentifiedColumnDef<TFeatures, TData, TValue>,\n 'cell' | 'header' | 'footer'\n> & {\n cell?: AppColumnDefTemplate<\n AppCellContext<TFeatures, TData, TValue, TCellComponents>\n >\n header?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>\n >\n footer?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, TValue, THeaderComponents>\n >\n}\n\n/**\n * Enhanced display column definition with pre-bound components.\n */\nexport type AppDisplayColumnDef<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n DisplayColumnDef<TFeatures, TData, unknown>,\n 'cell' | 'header' | 'footer'\n> & {\n cell?: AppColumnDefTemplate<\n AppCellContext<TFeatures, TData, unknown, TCellComponents>\n >\n header?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n footer?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n}\n\n/**\n * Enhanced group column definition with pre-bound components.\n */\nexport type AppGroupColumnDef<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n GroupColumnDef<TFeatures, TData, unknown>,\n 'cell' | 'header' | 'footer' | 'columns'\n> & {\n cell?: AppColumnDefTemplate<\n AppCellContext<TFeatures, TData, unknown, TCellComponents>\n >\n header?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n footer?: AppColumnDefTemplate<\n AppHeaderContext<TFeatures, TData, unknown, THeaderComponents>\n >\n columns?: ReadonlyArray<ColumnDef<TFeatures, TData, unknown>>\n}\n\n// =============================================================================\n// Enhanced Column Helper Type\n// =============================================================================\n\n/**\n * Enhanced column helper with pre-bound components in cell/header/footer contexts.\n * This enables TypeScript to know about the registered components when defining columns.\n */\nexport type AppColumnHelper<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = {\n /**\n * Creates a data column definition with an accessor key or function.\n * The cell, header, and footer contexts include pre-bound components.\n */\n accessor: <\n TAccessor extends AccessorFn<TData> | DeepKeys<TData>,\n TValue extends TAccessor extends AccessorFn<TData, infer TReturn>\n ? TReturn\n : TAccessor extends DeepKeys<TData>\n ? DeepValue<TData, TAccessor>\n : never,\n >(\n accessor: TAccessor,\n column: TAccessor extends AccessorFn<TData>\n ? AppColumnDefBase<\n TFeatures,\n TData,\n TValue,\n TCellComponents,\n THeaderComponents\n > & { id: string }\n : AppColumnDefBase<\n TFeatures,\n TData,\n TValue,\n TCellComponents,\n THeaderComponents\n >,\n ) => TAccessor extends AccessorFn<TData>\n ? AccessorFnColumnDef<TFeatures, TData, TValue>\n : AccessorKeyColumnDef<TFeatures, TData, TValue>\n\n /**\n * Wraps an array of column definitions to preserve each column's individual TValue type.\n */\n columns: <TColumns extends ReadonlyArray<ColumnDef<TFeatures, TData, any>>>(\n columns: [...TColumns],\n ) => Array<ColumnDef<TFeatures, TData, any>> & [...TColumns]\n\n /**\n * Creates a display column definition for non-data columns.\n * The cell, header, and footer contexts include pre-bound components.\n */\n display: (\n column: AppDisplayColumnDef<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >,\n ) => DisplayColumnDef<TFeatures, TData, unknown>\n\n /**\n * Creates a group column definition with nested child columns.\n * The cell, header, and footer contexts include pre-bound components.\n */\n group: (\n column: AppGroupColumnDef<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >,\n ) => GroupColumnDef<TFeatures, TData, unknown>\n}\n\n/**\n * Extended table API returned by useAppTable with all App wrapper components\n */\nexport type AppAngularTable<\n TFeatures extends TableFeatures,\n TData extends RowData,\n TTableComponents extends Record<string, RenderableComponent>,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = AngularTable<TFeatures, TData> &\n NoInfer<TTableComponents> & {\n appCell: <TValue>(\n cell: Cell<TFeatures, TData, TValue>,\n ) => Cell<TFeatures, TData, TValue> & NoInfer<TCellComponents>\n\n appHeader: <TValue>(\n header: Header<TFeatures, TData, TValue>,\n ) => Header<TFeatures, TData, TValue> & NoInfer<THeaderComponents>\n\n appFooter: <TValue>(\n footer: Header<TFeatures, TData, TValue>,\n ) => Header<TFeatures, TData, TValue> & NoInfer<THeaderComponents>\n }\n\n// =============================================================================\n// CreateTableHook Options and Props\n// =============================================================================\n\n/**\n * Options for creating a table hook with pre-bound components and default table options.\n * Extends all TableOptions except 'columns' | 'data' | 'store' | 'state' | 'initialState'.\n */\nexport type CreateTableContextOptions<\n TFeatures extends TableFeatures,\n TTableComponents extends Record<string, RenderableComponent>,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = Omit<\n TableOptions<TFeatures, any>,\n 'columns' | 'data' | 'store' | 'state' | 'initialState'\n> & {\n /**\n * Table-level components that need access to the table instance.\n * These are available directly on the table object returned by useAppTable.\n * Use `useTableContext()` inside these components.\n * @example { PaginationControls, GlobalFilter, RowCount }\n */\n tableComponents?: TTableComponents\n /**\n * Cell-level components that need access to the cell instance.\n * These are available on the cell object passed to AppCell's children.\n * Use `useCellContext()` inside these components.\n * @example { TextCell, NumberCell, DateCell, CurrencyCell }\n */\n cellComponents?: TCellComponents\n /**\n * Header-level components that need access to the header instance.\n * These are available on the header object passed to AppHeader/AppFooter's children.\n * Use `useHeaderContext()` inside these components.\n * @example { SortIndicator, ColumnFilter, ResizeHandle }\n */\n headerComponents?: THeaderComponents\n}\n\nexport type CreateTableHookResult<\n TFeatures extends TableFeatures,\n TTableComponents extends Record<string, RenderableComponent>,\n TCellComponents extends Record<string, RenderableComponent>,\n THeaderComponents extends Record<string, RenderableComponent>,\n> = {\n createAppColumnHelper: <TData extends RowData>() => AppColumnHelper<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >\n injectTableContext: <TData extends RowData = RowData>() => Signal<\n AngularTable<TFeatures, TData>\n >\n injectTableHeaderContext: <\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >() => Signal<Header<TFeatures, TRowData, TValue>>\n injectTableCellContext: <\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >() => Signal<Cell<TFeatures, TRowData, TValue>>\n injectFlexRenderHeaderContext: <\n TData extends RowData,\n TValue extends CellData,\n >() => HeaderContext<TFeatures, TData, TValue>\n injectFlexRenderCellContext: <\n TData extends RowData,\n TValue extends CellData,\n >() => CellContext<TFeatures, TData, TValue>\n injectAppTable: <TData extends RowData>(\n tableOptions: () => Omit<\n TableOptions<TFeatures, TData>,\n '_features' | '_rowModels'\n >,\n ) => AppAngularTable<\n TFeatures,\n TData,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n >\n}\n\n/**\n * Creates app-scoped Angular table helpers with features, row models, and\n * renderable component maps pre-bound.\n *\n * Use this when an app or design system wants typed `injectAppTable`,\n * pre-bound column helpers, and typed table/cell/header context injection\n * helpers without repeating the same feature and component generics.\n *\n * @example\n * ```ts\n * const { injectAppTable, createAppColumnHelper } = createTableHook({\n * _features,\n * _rowModels: {},\n * tableComponents: {},\n * cellComponents: {},\n * headerComponents: {},\n * })\n * ```\n */\nexport function createTableHook<\n TFeatures extends TableFeatures,\n const TTableComponents extends Record<string, RenderableComponent>,\n const TCellComponents extends Record<string, RenderableComponent>,\n const THeaderComponents extends Record<string, RenderableComponent>,\n>({\n tableComponents,\n cellComponents,\n headerComponents,\n ...defaultTableOptions\n}: CreateTableContextOptions<\n TFeatures,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n>): CreateTableHookResult<\n TFeatures,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n> {\n function injectTableContext<TData extends RowData = RowData>(): Signal<\n AngularTable<TFeatures, TData>\n > {\n return _injectTableContext<TFeatures, TData>()\n }\n\n function injectTableHeaderContext<\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >(): Signal<Header<TFeatures, TRowData, TValue>> {\n return _injectTableHeaderContext<TFeatures, TRowData, TValue>()\n }\n\n function injectTableCellContext<\n TValue extends CellData = CellData,\n TRowData extends RowData = RowData,\n >(): Signal<Cell<TFeatures, TRowData, TValue>> {\n return _injectTableCellContext<TFeatures, TRowData, TValue>()\n }\n\n function injectFlexRenderHeaderContext<\n TData extends RowData,\n TValue extends CellData,\n >(): HeaderContext<TFeatures, TData, TValue> {\n return injectFlexRenderContext<HeaderContext<TFeatures, TData, TValue>>()\n }\n\n function injectFlexRenderCellContext<\n TData extends RowData,\n TValue extends CellData,\n >(): CellContext<TFeatures, TData, TValue> {\n return injectFlexRenderContext<CellContext<TFeatures, TData, TValue>>()\n }\n\n function injectAppTable<\n TData extends RowData,\n TSelected = TableState<TFeatures>,\n >(\n tableOptions: () => Omit<\n TableOptions<TFeatures, TData>,\n '_features' | '_rowModels'\n >,\n ): AppAngularTable<\n TFeatures,\n TData,\n TTableComponents,\n TCellComponents,\n THeaderComponents\n > {\n function appCell(cell: Cell<TFeatures, TData, any>) {\n return cell as Cell<TFeatures, TData, any> & TCellComponents\n }\n\n function appHeader(header: Header<TFeatures, TData, any>) {\n return header as Header<TFeatures, TData, any> & THeaderComponents\n }\n\n function appFooter(footer: Header<TFeatures, TData, any>) {\n return footer as Header<TFeatures, TData, any> & THeaderComponents\n }\n\n const appTableFeatures: TableFeature<{}> = {\n constructTableAPIs: (table) => {\n Object.assign(table, tableComponents, { appCell, appHeader, appFooter })\n },\n assignCellPrototype(prototype) {\n Object.assign(prototype, cellComponents)\n },\n assignHeaderPrototype(prototype) {\n Object.assign(prototype, headerComponents)\n },\n }\n\n return injectTable<TFeatures, TData>(() => {\n return {\n ...defaultTableOptions,\n ...tableOptions(),\n _features: {\n ...defaultTableOptions._features,\n appTableFeatures,\n },\n } as TableOptions<TFeatures, TData>\n }) as AngularTable<any, any>\n }\n\n function createAppColumnHelper<TData extends RowData>(): AppColumnHelper<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n > {\n // The runtime implementation is the same - components are attached at render time\n // This cast provides the enhanced types for column definitions\n return coreCreateColumnHelper<TFeatures, TData>() as AppColumnHelper<\n TFeatures,\n TData,\n TCellComponents,\n THeaderComponents\n >\n }\n\n return {\n createAppColumnHelper,\n injectTableContext,\n injectTableHeaderContext,\n injectTableCellContext,\n injectFlexRenderHeaderContext,\n injectFlexRenderCellContext,\n injectAppTable,\n }\n}\n","import { FlexRenderCell } from './helpers/flexRenderCell'\nimport { FlexRenderDirective } from './flexRender'\n\nexport * from '@tanstack/table-core'\n\nexport * from './flexRender'\nexport * from './injectTable'\nexport * from './flex-render/flexRenderComponent'\n\nexport * from './helpers/cell'\nexport * from './helpers/header'\nexport * from './helpers/table'\nexport * from './helpers/createTableHook'\nexport * from './helpers/flexRenderCell'\n\n/**\n * Constant helper to import FlexRender directives.\n *\n * You should prefer to use this constant over importing the directives separately,\n * as it ensures you always have the correct set of directives over library updates.\n *\n * @see {@link FlexRenderDirective} and {@link FlexRenderCell} for more details on the directives included in this export.\n */\nexport const FlexRender = [FlexRenderDirective, FlexRenderCell] as const\n\nexport { shallow } from '@tanstack/angular-store'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["injectTableContext","_injectTableContext","injectTableHeaderContext","_injectTableHeaderContext","injectTableCellContext","_injectTableCellContext","coreCreateColumnHelper"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/angular-table",
|
|
3
|
-
"version": "9.0.0-alpha.
|
|
3
|
+
"version": "9.0.0-alpha.54",
|
|
4
4
|
"description": "Headless UI for building powerful tables & datagrids for Angular.",
|
|
5
5
|
"author": "Tanner Linsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -52,15 +52,15 @@
|
|
|
52
52
|
],
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@tanstack/angular-store": "^0.11.0",
|
|
55
|
-
"
|
|
56
|
-
"
|
|
55
|
+
"@tanstack/table-core": "^9.0.0-alpha.53",
|
|
56
|
+
"tslib": "^2.8.1"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
|
-
"@analogjs/vite-plugin-angular": "^2.
|
|
60
|
-
"@analogjs/vitest-angular": "^2.
|
|
61
|
-
"@angular/core": "^
|
|
62
|
-
"@angular/platform-browser": "^
|
|
63
|
-
"ng-packagr": "^
|
|
59
|
+
"@analogjs/vite-plugin-angular": "^2.6.0",
|
|
60
|
+
"@analogjs/vitest-angular": "^2.6.0",
|
|
61
|
+
"@angular/core": "^22.0.0",
|
|
62
|
+
"@angular/platform-browser": "^22.0.0",
|
|
63
|
+
"ng-packagr": "^22.0.0",
|
|
64
64
|
"typescript": "6.0.3"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
package/src/injectTable.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {
|
|
2
|
+
DestroyRef,
|
|
2
3
|
Injector,
|
|
3
4
|
NgZone,
|
|
4
5
|
assertInInjectionContext,
|
|
@@ -9,12 +10,6 @@ import {
|
|
|
9
10
|
import { constructTable } from '@tanstack/table-core'
|
|
10
11
|
import { lazyInit } from './lazySignalInitializer'
|
|
11
12
|
import { angularReactivity } from './reactivity'
|
|
12
|
-
import type {
|
|
13
|
-
Atom,
|
|
14
|
-
ReadonlyAtom,
|
|
15
|
-
ReadonlyStore,
|
|
16
|
-
Store,
|
|
17
|
-
} from '@tanstack/angular-store'
|
|
18
13
|
import type {
|
|
19
14
|
RowData,
|
|
20
15
|
Table,
|
|
@@ -22,6 +17,12 @@ import type {
|
|
|
22
17
|
TableOptions,
|
|
23
18
|
TableState,
|
|
24
19
|
} from '@tanstack/table-core'
|
|
20
|
+
import type {
|
|
21
|
+
Atom,
|
|
22
|
+
ReadonlyAtom,
|
|
23
|
+
ReadonlyStore,
|
|
24
|
+
Store,
|
|
25
|
+
} from '@tanstack/angular-store'
|
|
25
26
|
|
|
26
27
|
export type SubscribeSource<TValue> =
|
|
27
28
|
| Atom<TValue>
|
|
@@ -172,6 +173,11 @@ export function injectTable<
|
|
|
172
173
|
...options()._features,
|
|
173
174
|
},
|
|
174
175
|
}) as AngularTable<TFeatures, TData>
|
|
176
|
+
|
|
177
|
+
injector.get(DestroyRef).onDestroy(() => {
|
|
178
|
+
table._reactivity.unmount?.()
|
|
179
|
+
})
|
|
180
|
+
|
|
175
181
|
const stateProxy = createStateProxy(table)
|
|
176
182
|
|
|
177
183
|
Object.defineProperty(table, 'state', {
|
package/src/reactivity.ts
CHANGED
|
@@ -1,80 +1,62 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import type { Atom, Observer, ReadonlyAtom } from '@tanstack/angular-store'
|
|
1
|
+
import { NgZone, computed, signal, untracked } from '@angular/core'
|
|
2
|
+
import { toObservable } from '@angular/core/rxjs-interop'
|
|
3
|
+
import type { Injector, Signal, WritableSignal } from '@angular/core'
|
|
4
|
+
import type {
|
|
5
|
+
Atom,
|
|
6
|
+
Observer,
|
|
7
|
+
ReadonlyAtom,
|
|
8
|
+
Subscription,
|
|
9
|
+
} from '@tanstack/angular-store'
|
|
11
10
|
import type {
|
|
12
11
|
TableAtomOptions,
|
|
13
12
|
TableReactivityBindings,
|
|
14
13
|
} from '@tanstack/table-core/reactivity'
|
|
15
|
-
import type { Injector, Signal, WritableSignal } from '@angular/core'
|
|
16
|
-
|
|
17
|
-
const optionsStoreDebugName = 'table/optionsStore'
|
|
18
|
-
|
|
19
|
-
function observerToCallback<T>(
|
|
20
|
-
observerOrNext: Observer<T> | ((value: T) => void),
|
|
21
|
-
): (value: T) => void {
|
|
22
|
-
return typeof observerOrNext === 'function'
|
|
23
|
-
? observerOrNext
|
|
24
|
-
: (value) => observerOrNext.next?.(value)
|
|
25
|
-
}
|
|
26
14
|
|
|
27
15
|
function signalToReadonlyAtom<T>(
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
unsubscribe: () => void
|
|
32
|
-
},
|
|
16
|
+
signal: Signal<T>,
|
|
17
|
+
injector: Injector,
|
|
18
|
+
debugName?: string,
|
|
33
19
|
): ReadonlyAtom<T> {
|
|
34
|
-
|
|
35
|
-
get: () =>
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
20
|
+
const _signal = Object.assign(signal, {
|
|
21
|
+
get: () => signal(),
|
|
22
|
+
subscribe: (observer: Observer<T>) => {
|
|
23
|
+
return untracked(() =>
|
|
24
|
+
toObservable(computed(signal), { injector: injector }).subscribe(
|
|
25
|
+
observer,
|
|
26
|
+
),
|
|
27
|
+
)
|
|
39
28
|
},
|
|
40
|
-
subscribe: subscribeSource as ReadonlyAtom<T>['subscribe'],
|
|
41
29
|
})
|
|
30
|
+
if (debugName) {
|
|
31
|
+
_signal.toString = () => debugName
|
|
32
|
+
}
|
|
33
|
+
return _signal
|
|
42
34
|
}
|
|
43
35
|
|
|
44
36
|
function signalToWritableAtom<T>(
|
|
45
|
-
|
|
37
|
+
signal: WritableSignal<T>,
|
|
46
38
|
injector: Injector,
|
|
39
|
+
debugName?: string,
|
|
47
40
|
): Atom<T> {
|
|
48
|
-
const
|
|
49
|
-
let observed = false
|
|
50
|
-
effect(
|
|
51
|
-
() => {
|
|
52
|
-
const value = source()
|
|
53
|
-
if (!observed) {
|
|
54
|
-
observed = true
|
|
55
|
-
return
|
|
56
|
-
}
|
|
57
|
-
observers.forEach((observer) => observer(value))
|
|
58
|
-
},
|
|
59
|
-
{ injector },
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
return Object.assign(source.asReadonly(), {
|
|
41
|
+
const _signal = Object.assign(signal.asReadonly(), {
|
|
63
42
|
set: (updater: T | ((prevVal: T) => T)) => {
|
|
64
43
|
typeof updater === 'function'
|
|
65
|
-
?
|
|
66
|
-
:
|
|
44
|
+
? signal.update(updater as (val: T) => T)
|
|
45
|
+
: signal.set(updater)
|
|
46
|
+
},
|
|
47
|
+
get: () => signal(),
|
|
48
|
+
subscribe: (observer: Observer<T>) => {
|
|
49
|
+
return untracked(() =>
|
|
50
|
+
toObservable(computed(signal), { injector: injector }).subscribe(
|
|
51
|
+
observer,
|
|
52
|
+
),
|
|
53
|
+
)
|
|
67
54
|
},
|
|
68
|
-
get: () => source(),
|
|
69
|
-
subscribe: ((observerOrNext: Observer<T> | ((value: T) => void)) => {
|
|
70
|
-
const observer = observerToCallback(observerOrNext)
|
|
71
|
-
observers.add(observer)
|
|
72
|
-
|
|
73
|
-
return {
|
|
74
|
-
unsubscribe: () => observers.delete(observer),
|
|
75
|
-
}
|
|
76
|
-
}) as Atom<T>['subscribe'],
|
|
77
55
|
})
|
|
56
|
+
if (debugName) {
|
|
57
|
+
_signal.toString = () => debugName
|
|
58
|
+
}
|
|
59
|
+
return _signal
|
|
78
60
|
}
|
|
79
61
|
|
|
80
62
|
/**
|
|
@@ -87,61 +69,37 @@ function signalToWritableAtom<T>(
|
|
|
87
69
|
*/
|
|
88
70
|
export function angularReactivity(injector: Injector): TableReactivityBindings {
|
|
89
71
|
const ngZone = injector.get(NgZone)
|
|
90
|
-
const
|
|
72
|
+
const subscriptions = new Set<Subscription>()
|
|
91
73
|
|
|
92
74
|
return {
|
|
93
75
|
createOptionsStore: true,
|
|
76
|
+
wrapExternalAtoms: true,
|
|
77
|
+
addSubscription: (subscription) => {
|
|
78
|
+
subscriptions.add(subscription)
|
|
79
|
+
},
|
|
80
|
+
unmount: () => {
|
|
81
|
+
subscriptions.forEach((s) => s.unsubscribe())
|
|
82
|
+
subscriptions.clear()
|
|
83
|
+
},
|
|
94
84
|
schedule: (fn) => ngZone.runOutsideAngular(() => queueMicrotask(fn)),
|
|
95
85
|
createReadonlyAtom: <T>(fn: () => T, options?: TableAtomOptions<T>) => {
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
const version = signal(0, {
|
|
100
|
-
equal: () => false,
|
|
86
|
+
const signal = computed(() => fn(), {
|
|
87
|
+
equal: options?.compare,
|
|
88
|
+
debugName: options?.debugName,
|
|
101
89
|
})
|
|
102
|
-
|
|
103
|
-
version.update((value) => value + 1)
|
|
104
|
-
})
|
|
105
|
-
destroyRef.onDestroy(() => subscription.unsubscribe())
|
|
106
|
-
|
|
107
|
-
const value = computed(
|
|
108
|
-
() => {
|
|
109
|
-
version()
|
|
110
|
-
return storeAtom.get()
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
equal: options?.compare,
|
|
114
|
-
debugName: options?.debugName,
|
|
115
|
-
},
|
|
116
|
-
)
|
|
117
|
-
return signalToReadonlyAtom(
|
|
118
|
-
value,
|
|
119
|
-
() => storeAtom.get(),
|
|
120
|
-
(observerOrNext) => {
|
|
121
|
-
const observer = observerToCallback(observerOrNext)
|
|
122
|
-
return storeAtom.subscribe(() => {
|
|
123
|
-
observer(storeAtom.get())
|
|
124
|
-
})
|
|
125
|
-
},
|
|
126
|
-
)
|
|
90
|
+
return signalToReadonlyAtom(signal, injector, options?.debugName)
|
|
127
91
|
},
|
|
128
92
|
createWritableAtom: <T>(
|
|
129
93
|
value: T,
|
|
130
94
|
options?: TableAtomOptions<T>,
|
|
131
95
|
): Atom<T> => {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
debugName: options.debugName,
|
|
136
|
-
})
|
|
137
|
-
return signalToWritableAtom(writableSignal, injector)
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
return createAtom(value, {
|
|
141
|
-
compare: options?.compare,
|
|
96
|
+
const writableSignal = signal(value, {
|
|
97
|
+
equal: options?.compare,
|
|
98
|
+
debugName: options?.debugName,
|
|
142
99
|
})
|
|
100
|
+
return signalToWritableAtom(writableSignal, injector, options?.debugName)
|
|
143
101
|
},
|
|
144
102
|
untrack: untracked,
|
|
145
|
-
batch,
|
|
103
|
+
batch: (fn) => fn(),
|
|
146
104
|
}
|
|
147
105
|
}
|