Skip to content

Commit 99fff82

Browse files
committed
feat: implement plugin architecture for table features
1 parent 7880dc3 commit 99fff82

File tree

43 files changed

+1433
-1753
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1433
-1753
lines changed

.changeset/eleven-facts-repeat.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
---
2+
'svelte-reactive-table': minor
3+
---
4+
5+
feat: implement plugin architecture for table features
6+
7+
This update redesigns how table features work by introducing a standardized plugin system. Features like pagination, sorting, and column visibility are now implemented as plugins with a consistent interface.
8+
9+
Improvements include:
10+
11+
- New plugin system with `table.use(plugin)` method
12+
- Enhanced pagination state with `hasNextPage`, `hasPreviousPage`, `isFirstPage`, `isLastPage`, and `pageItemRange`
13+
- Better TypeScript types for improved type safety
14+
- Standardized plugin lifecycle with init and cleanup methods
15+
16+
BREAKING CHANGES:
17+
18+
- Plugins must now be attached to tables using `table.use(plugin)`
19+
- Plugin state is accessed through `table.plugins.[pluginId].state`
20+
- Navigation methods are now renamed to `goToNextPage`, `goToPreviousPage`, `goToFirstPage`, `goToLastPage`

eslint.config.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ export default ts.config(
2626
languageOptions: {
2727
parserOptions: {
2828
projectService: true,
29-
extraFileExtensions: ['.svelte']
29+
extraFileExtensions: ['.svelte'],
30+
parser: ts.parser,
31+
svelteConfig: './**/svelte.config.js'
3032
}
3133
}
3234
},
@@ -39,4 +41,4 @@ export default ts.config(
3941
}
4042
}
4143
}
42-
);
44+
);

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"version": "1.0.0",
44
"description": "Monorepo for svelte-reactive-table",
55
"main": "index.js",
6+
"type": "module",
67
"private": true,
78
"scripts": {
89
"ci:publish": "turbo run build --filter=svelte-reactive-table && changeset publish",
Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,2 @@
11
export { reactiveTable } from './table.svelte.js';
2-
export type {
3-
ReactiveTable,
4-
ColumnDef,
5-
Column,
6-
Cell,
7-
Row,
8-
TableOptions,
9-
ReactiveTableBase,
10-
PaginationFeature,
11-
ColumnVisibilityFeature
12-
} from './table.svelte.js';
2+
export * from './types/index.js';

packages/svelte-reactive-table/src/lib/core/table.svelte.spec.ts

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
2-
import { reactivePagination } from '../features/pagination/index.js';
2+
import { reactivePagination } from '../plugins/pagination/index.js';
33
import { reactiveTable, type ColumnDef, type ReactiveTable } from './index.js';
4-
import { reactiveColumnVisibility } from '../features/column-visibility/index.js';
5-
import { reactiveSorting } from '$lib/features/sorting/sorting.svelte.js';
4+
import { reactiveColumnVisibility } from '../plugins/column-visibility/index.js';
5+
import { reactiveSorting } from '$lib/plugins/sorting/sorting.svelte.js';
66

77
type Person = {
88
id: number;
@@ -212,38 +212,36 @@ describe('reactiveTable', () => {
212212
});
213213

214214
it('should add pagination feature when option is provided', () => {
215-
const tableWithPagination = reactiveTable(sampleData, columns, {
216-
pagination: reactivePagination({ pageSize: 2 })
217-
});
215+
const tableWithPagination = reactiveTable(sampleData, columns).use(
216+
reactivePagination({ pageSize: 2 })
217+
);
218218

219-
expect(tableWithPagination.pagination).toBeDefined();
220-
expect(tableWithPagination.pagination.pageSize).toBe(2);
221-
expect(tableWithPagination.pagination.pageCount).toBe(2);
219+
expect(tableWithPagination.plugins.pagination).toBeDefined();
220+
expect(tableWithPagination.plugins.pagination.pageSize).toBe(2);
221+
expect(tableWithPagination.plugins.pagination.pageCount).toBe(2);
222222
expect(tableWithPagination.rows).toHaveLength(2); // First 2 rows
223223
});
224224

225225
it('should add column visibility feature when option is provided', () => {
226-
const tableWithColumnVisvibility = reactiveTable(sampleData, columns, {
227-
columnVisibility: reactiveColumnVisibility({
228-
hiddenColumns: ['age']
229-
})
230-
});
226+
const tableWithColumnVisvibility = reactiveTable(sampleData, columns).use(
227+
reactiveColumnVisibility({ hiddenColumns: ['age'] })
228+
);
231229

232-
expect(tableWithColumnVisvibility.columnVisibility).toBeDefined();
233-
expect(tableWithColumnVisvibility.columnVisibility.hiddenColumns).toEqual(['age']);
230+
expect(tableWithColumnVisvibility.plugins.columnVisibility).toBeDefined();
231+
expect(tableWithColumnVisvibility.plugins.columnVisibility.hiddenColumns).toEqual(['age']);
234232
expect(tableWithColumnVisvibility.columns).toHaveLength(3);
235233
});
236234

237235
it('should add sorting feature when option is provided', () => {
238-
const tableWithSorting = reactiveTable(sampleData, columns, {
239-
sorting: reactiveSorting({
236+
const tableWithSorting = reactiveTable(sampleData, columns).use(
237+
reactiveSorting({
240238
columnSortings: [{ key: 'name', direction: 'asc' }]
241239
})
242-
});
240+
);
243241

244-
expect(tableWithSorting.sorting).toBeDefined();
245-
expect(tableWithSorting.sorting.columnSortings).toHaveLength(1);
246-
expect(tableWithSorting.sorting.columnSortings[0].key).toBe('name');
247-
expect(tableWithSorting.sorting.columnSortings[0].direction).toBe('asc');
242+
expect(tableWithSorting.plugins.sorting).toBeDefined();
243+
expect(tableWithSorting.plugins.sorting.columnSortings).toHaveLength(1);
244+
expect(tableWithSorting.plugins.sorting.columnSortings[0].key).toBe('name');
245+
expect(tableWithSorting.plugins.sorting.columnSortings[0].direction).toBe('asc');
248246
});
249247
});

0 commit comments

Comments
 (0)