@object-ui/plugin-aggrid 0.4.1 → 0.5.0
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.
- package/.turbo/turbo-build.log +21 -0
- package/OBJECT_AGGRID_CN.md +483 -0
- package/QUICKSTART.md +186 -0
- package/README.md +221 -1
- package/dist/{AgGridImpl-DKkq6v1B.js → AgGridImpl-BQ6tBvrq.js} +61 -57
- package/dist/ObjectAgGridImpl-CGFeGvOH.js +372 -0
- package/dist/{index-B6NPAFZx.js → index-CLKYMco3.js} +273 -139
- package/dist/index.css +1 -1
- package/dist/index.js +4 -3
- package/dist/index.umd.cjs +5 -2
- package/dist/src/ObjectAgGridImpl.d.ts +6 -0
- package/dist/src/VirtualScrolling.d.ts +72 -0
- package/dist/src/index.d.ts +42 -0
- package/dist/src/object-aggrid.types.d.ts +74 -0
- package/package.json +10 -9
- package/src/AgGridImpl.tsx +5 -1
- package/src/ObjectAgGridImpl.tsx +603 -0
- package/src/VirtualScrolling.ts +74 -0
- package/src/index.test.ts +1 -1
- package/src/index.tsx +182 -0
- package/src/object-aggrid.test.ts +99 -0
- package/src/object-aggrid.types.ts +123 -0
- package/vite.config.ts +13 -0
package/src/index.tsx
CHANGED
|
@@ -20,12 +20,15 @@ import 'ag-grid-community/styles/ag-theme-material.css';
|
|
|
20
20
|
|
|
21
21
|
// Export types for external use
|
|
22
22
|
export type { AgGridSchema, SimpleColumnDef, AgGridCallbacks, ExportConfig, StatusBarConfig, ColumnConfig, ContextMenuConfig } from './types';
|
|
23
|
+
export type { ObjectAgGridSchema } from './object-aggrid.types';
|
|
23
24
|
|
|
24
25
|
import type { AgGridCallbacks, ExportConfig, StatusBarConfig, ColumnConfig, ContextMenuConfig } from './types';
|
|
26
|
+
import type { DataSource } from '@object-ui/types';
|
|
25
27
|
|
|
26
28
|
// 🚀 Lazy load the implementation file
|
|
27
29
|
// This ensures AG Grid is only loaded when the component is actually rendered
|
|
28
30
|
const LazyAgGrid = React.lazy(() => import('./AgGridImpl'));
|
|
31
|
+
const LazyObjectAgGrid = React.lazy(() => import('./ObjectAgGridImpl'));
|
|
29
32
|
|
|
30
33
|
export interface AgGridRendererProps {
|
|
31
34
|
schema: {
|
|
@@ -96,6 +99,7 @@ ComponentRegistry.register(
|
|
|
96
99
|
'aggrid',
|
|
97
100
|
AgGridRenderer,
|
|
98
101
|
{
|
|
102
|
+
namespace: 'plugin-aggrid',
|
|
99
103
|
label: 'AG Grid',
|
|
100
104
|
icon: 'Table',
|
|
101
105
|
category: 'plugin',
|
|
@@ -299,7 +303,185 @@ ComponentRegistry.register(
|
|
|
299
303
|
}
|
|
300
304
|
);
|
|
301
305
|
|
|
306
|
+
/**
|
|
307
|
+
* ObjectAgGridRenderer - The public API for the metadata-driven AG Grid component
|
|
308
|
+
* This wrapper handles lazy loading internally using React.Suspense
|
|
309
|
+
*/
|
|
310
|
+
export interface ObjectAgGridRendererProps {
|
|
311
|
+
schema: {
|
|
312
|
+
type: string;
|
|
313
|
+
id?: string;
|
|
314
|
+
className?: string;
|
|
315
|
+
objectName: string;
|
|
316
|
+
dataSource?: DataSource;
|
|
317
|
+
fields?: any[];
|
|
318
|
+
fieldNames?: string[];
|
|
319
|
+
filters?: Record<string, any>;
|
|
320
|
+
sort?: Record<string, 'asc' | 'desc'>;
|
|
321
|
+
pageSize?: number;
|
|
322
|
+
pagination?: boolean;
|
|
323
|
+
domLayout?: 'normal' | 'autoHeight' | 'print';
|
|
324
|
+
animateRows?: boolean;
|
|
325
|
+
rowSelection?: 'single' | 'multiple';
|
|
326
|
+
theme?: 'alpine' | 'balham' | 'material' | 'quartz';
|
|
327
|
+
height?: number | string;
|
|
328
|
+
editable?: boolean;
|
|
329
|
+
editType?: 'fullRow';
|
|
330
|
+
singleClickEdit?: boolean;
|
|
331
|
+
stopEditingWhenCellsLoseFocus?: boolean;
|
|
332
|
+
exportConfig?: ExportConfig;
|
|
333
|
+
statusBar?: StatusBarConfig;
|
|
334
|
+
callbacks?: AgGridCallbacks & {
|
|
335
|
+
onDataLoaded?: (data: any[]) => void;
|
|
336
|
+
onDataError?: (error: Error) => void;
|
|
337
|
+
};
|
|
338
|
+
columnConfig?: ColumnConfig;
|
|
339
|
+
enableRangeSelection?: boolean;
|
|
340
|
+
enableCharts?: boolean;
|
|
341
|
+
contextMenu?: ContextMenuConfig;
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export const ObjectAgGridRenderer: React.FC<ObjectAgGridRendererProps> = ({ schema }) => {
|
|
346
|
+
return (
|
|
347
|
+
<Suspense fallback={<Skeleton className="w-full h-[500px]" />}>
|
|
348
|
+
<LazyObjectAgGrid
|
|
349
|
+
objectName={schema.objectName}
|
|
350
|
+
dataSource={schema.dataSource}
|
|
351
|
+
fields={schema.fields}
|
|
352
|
+
fieldNames={schema.fieldNames}
|
|
353
|
+
filters={schema.filters}
|
|
354
|
+
sort={schema.sort}
|
|
355
|
+
pageSize={schema.pageSize}
|
|
356
|
+
pagination={schema.pagination}
|
|
357
|
+
domLayout={schema.domLayout}
|
|
358
|
+
animateRows={schema.animateRows}
|
|
359
|
+
rowSelection={schema.rowSelection}
|
|
360
|
+
theme={schema.theme}
|
|
361
|
+
height={schema.height}
|
|
362
|
+
className={schema.className}
|
|
363
|
+
editable={schema.editable}
|
|
364
|
+
editType={schema.editType}
|
|
365
|
+
singleClickEdit={schema.singleClickEdit}
|
|
366
|
+
stopEditingWhenCellsLoseFocus={schema.stopEditingWhenCellsLoseFocus}
|
|
367
|
+
exportConfig={schema.exportConfig}
|
|
368
|
+
statusBar={schema.statusBar}
|
|
369
|
+
callbacks={schema.callbacks}
|
|
370
|
+
columnConfig={schema.columnConfig}
|
|
371
|
+
enableRangeSelection={schema.enableRangeSelection}
|
|
372
|
+
enableCharts={schema.enableCharts}
|
|
373
|
+
contextMenu={schema.contextMenu}
|
|
374
|
+
/>
|
|
375
|
+
</Suspense>
|
|
376
|
+
);
|
|
377
|
+
};
|
|
378
|
+
|
|
302
379
|
// Standard Export Protocol - for manual integration
|
|
303
380
|
export const aggridComponents = {
|
|
304
381
|
'aggrid': AgGridRenderer,
|
|
382
|
+
'object-aggrid': ObjectAgGridRenderer,
|
|
305
383
|
};
|
|
384
|
+
|
|
385
|
+
// Register the ObjectAgGrid component with the ComponentRegistry
|
|
386
|
+
ComponentRegistry.register(
|
|
387
|
+
'object-aggrid',
|
|
388
|
+
ObjectAgGridRenderer,
|
|
389
|
+
{
|
|
390
|
+
namespace: 'plugin-aggrid',
|
|
391
|
+
label: 'Object AG Grid',
|
|
392
|
+
icon: 'Table',
|
|
393
|
+
category: 'plugin',
|
|
394
|
+
inputs: [
|
|
395
|
+
{
|
|
396
|
+
name: 'objectName',
|
|
397
|
+
type: 'string',
|
|
398
|
+
label: 'Object Name',
|
|
399
|
+
description: 'Name of the object to fetch metadata and data from',
|
|
400
|
+
required: true
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
name: 'dataSource',
|
|
404
|
+
type: 'object',
|
|
405
|
+
label: 'Data Source',
|
|
406
|
+
description: 'ObjectStack data source adapter instance',
|
|
407
|
+
required: true
|
|
408
|
+
},
|
|
409
|
+
{
|
|
410
|
+
name: 'fieldNames',
|
|
411
|
+
type: 'array',
|
|
412
|
+
label: 'Field Names',
|
|
413
|
+
description: 'Optional: Specify which fields to show (defaults to all fields)',
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
name: 'filters',
|
|
417
|
+
type: 'object',
|
|
418
|
+
label: 'Filters',
|
|
419
|
+
description: 'Query filters to apply to the data',
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
name: 'sort',
|
|
423
|
+
type: 'object',
|
|
424
|
+
label: 'Sort',
|
|
425
|
+
description: 'Sorting configuration: { fieldName: "asc" | "desc" }',
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
name: 'pagination',
|
|
429
|
+
type: 'boolean',
|
|
430
|
+
label: 'Enable Pagination',
|
|
431
|
+
defaultValue: true
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
name: 'pageSize',
|
|
435
|
+
type: 'number',
|
|
436
|
+
label: 'Page Size',
|
|
437
|
+
defaultValue: 10,
|
|
438
|
+
description: 'Number of rows per page'
|
|
439
|
+
},
|
|
440
|
+
{
|
|
441
|
+
name: 'theme',
|
|
442
|
+
type: 'enum',
|
|
443
|
+
label: 'Theme',
|
|
444
|
+
enum: [
|
|
445
|
+
{ label: 'Quartz', value: 'quartz' },
|
|
446
|
+
{ label: 'Alpine', value: 'alpine' },
|
|
447
|
+
{ label: 'Balham', value: 'balham' },
|
|
448
|
+
{ label: 'Material', value: 'material' }
|
|
449
|
+
],
|
|
450
|
+
defaultValue: 'quartz'
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
name: 'height',
|
|
454
|
+
type: 'number',
|
|
455
|
+
label: 'Height (px)',
|
|
456
|
+
defaultValue: 500
|
|
457
|
+
},
|
|
458
|
+
{
|
|
459
|
+
name: 'editable',
|
|
460
|
+
type: 'boolean',
|
|
461
|
+
label: 'Enable Editing',
|
|
462
|
+
defaultValue: false,
|
|
463
|
+
description: 'Allow cells to be edited inline',
|
|
464
|
+
advanced: true
|
|
465
|
+
},
|
|
466
|
+
{
|
|
467
|
+
name: 'exportConfig',
|
|
468
|
+
type: 'code',
|
|
469
|
+
label: 'Export Config (JSON)',
|
|
470
|
+
description: 'Configure CSV export: { enabled: true, fileName: "data.csv" }',
|
|
471
|
+
advanced: true
|
|
472
|
+
},
|
|
473
|
+
{
|
|
474
|
+
name: 'columnConfig',
|
|
475
|
+
type: 'code',
|
|
476
|
+
label: 'Column Config (JSON)',
|
|
477
|
+
description: 'Global column settings: { resizable: true, sortable: true, filterable: true }',
|
|
478
|
+
advanced: true
|
|
479
|
+
},
|
|
480
|
+
{
|
|
481
|
+
name: 'className',
|
|
482
|
+
type: 'string',
|
|
483
|
+
label: 'CSS Class'
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
}
|
|
487
|
+
);
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
10
|
+
import { ObjectAgGridRenderer } from './index';
|
|
11
|
+
import type { DataSource } from '@object-ui/types';
|
|
12
|
+
|
|
13
|
+
describe('ObjectAgGridRenderer', () => {
|
|
14
|
+
let mockDataSource: DataSource;
|
|
15
|
+
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
mockDataSource = {
|
|
18
|
+
find: vi.fn().mockResolvedValue({
|
|
19
|
+
data: [
|
|
20
|
+
{ id: '1', name: 'Test 1', email: 'test1@example.com' },
|
|
21
|
+
{ id: '2', name: 'Test 2', email: 'test2@example.com' }
|
|
22
|
+
],
|
|
23
|
+
total: 2,
|
|
24
|
+
page: 1,
|
|
25
|
+
pageSize: 10,
|
|
26
|
+
hasMore: false
|
|
27
|
+
}),
|
|
28
|
+
findOne: vi.fn(),
|
|
29
|
+
create: vi.fn(),
|
|
30
|
+
update: vi.fn(),
|
|
31
|
+
delete: vi.fn(),
|
|
32
|
+
bulk: vi.fn(),
|
|
33
|
+
getObjectSchema: vi.fn().mockResolvedValue({
|
|
34
|
+
name: 'contacts',
|
|
35
|
+
label: 'Contacts',
|
|
36
|
+
fields: {
|
|
37
|
+
name: {
|
|
38
|
+
name: 'name',
|
|
39
|
+
label: 'Name',
|
|
40
|
+
type: 'text',
|
|
41
|
+
sortable: true,
|
|
42
|
+
filterable: true
|
|
43
|
+
},
|
|
44
|
+
email: {
|
|
45
|
+
name: 'email',
|
|
46
|
+
label: 'Email',
|
|
47
|
+
type: 'email',
|
|
48
|
+
sortable: true,
|
|
49
|
+
filterable: true
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
} as any;
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it('should be defined', () => {
|
|
57
|
+
expect(ObjectAgGridRenderer).toBeDefined();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('should accept schema with objectName and dataSource', () => {
|
|
61
|
+
const schema = {
|
|
62
|
+
type: 'object-aggrid',
|
|
63
|
+
objectName: 'contacts',
|
|
64
|
+
dataSource: mockDataSource
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
expect(() => {
|
|
68
|
+
ObjectAgGridRenderer({ schema });
|
|
69
|
+
}).not.toThrow();
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it('should accept optional pagination settings', () => {
|
|
73
|
+
const schema = {
|
|
74
|
+
type: 'object-aggrid',
|
|
75
|
+
objectName: 'contacts',
|
|
76
|
+
dataSource: mockDataSource,
|
|
77
|
+
pagination: true,
|
|
78
|
+
pageSize: 20
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
expect(() => {
|
|
82
|
+
ObjectAgGridRenderer({ schema });
|
|
83
|
+
}).not.toThrow();
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it('should accept optional filters and sorting', () => {
|
|
87
|
+
const schema = {
|
|
88
|
+
type: 'object-aggrid',
|
|
89
|
+
objectName: 'contacts',
|
|
90
|
+
dataSource: mockDataSource,
|
|
91
|
+
filters: { status: 'active' },
|
|
92
|
+
sort: { name: 'asc' as const }
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
expect(() => {
|
|
96
|
+
ObjectAgGridRenderer({ schema });
|
|
97
|
+
}).not.toThrow();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ObjectUI
|
|
3
|
+
* Copyright (c) 2024-present ObjectStack Inc.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the MIT license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { ColDef } from 'ag-grid-community';
|
|
10
|
+
import type { DataSource } from '@object-ui/types';
|
|
11
|
+
import type { FieldMetadata } from '@object-ui/types';
|
|
12
|
+
import type { AgGridCallbacks, ExportConfig, StatusBarConfig, ColumnConfig, ContextMenuConfig } from './types';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Object AgGrid schema for metadata-driven grid
|
|
16
|
+
*/
|
|
17
|
+
export interface ObjectAgGridSchema {
|
|
18
|
+
type: 'object-aggrid';
|
|
19
|
+
id?: string;
|
|
20
|
+
className?: string;
|
|
21
|
+
|
|
22
|
+
// Object metadata
|
|
23
|
+
objectName: string;
|
|
24
|
+
dataSource: DataSource; // Required for metadata-driven grid
|
|
25
|
+
|
|
26
|
+
// Optional field configuration override
|
|
27
|
+
fields?: FieldMetadata[];
|
|
28
|
+
fieldNames?: string[]; // Show only specific fields
|
|
29
|
+
|
|
30
|
+
// Query parameters
|
|
31
|
+
filters?: Record<string, any>;
|
|
32
|
+
sort?: Record<string, 'asc' | 'desc'>;
|
|
33
|
+
pageSize?: number;
|
|
34
|
+
|
|
35
|
+
// Grid configuration (same as aggrid)
|
|
36
|
+
pagination?: boolean;
|
|
37
|
+
domLayout?: 'normal' | 'autoHeight' | 'print';
|
|
38
|
+
animateRows?: boolean;
|
|
39
|
+
rowSelection?: 'single' | 'multiple';
|
|
40
|
+
|
|
41
|
+
// Editing
|
|
42
|
+
editable?: boolean;
|
|
43
|
+
editType?: 'fullRow';
|
|
44
|
+
singleClickEdit?: boolean;
|
|
45
|
+
stopEditingWhenCellsLoseFocus?: boolean;
|
|
46
|
+
|
|
47
|
+
// Export
|
|
48
|
+
exportConfig?: ExportConfig;
|
|
49
|
+
|
|
50
|
+
// Status bar
|
|
51
|
+
statusBar?: StatusBarConfig;
|
|
52
|
+
|
|
53
|
+
// Column features
|
|
54
|
+
columnConfig?: ColumnConfig;
|
|
55
|
+
enableRangeSelection?: boolean;
|
|
56
|
+
enableCharts?: boolean;
|
|
57
|
+
|
|
58
|
+
// Context menu
|
|
59
|
+
contextMenu?: ContextMenuConfig;
|
|
60
|
+
|
|
61
|
+
// Event callbacks
|
|
62
|
+
callbacks?: AgGridCallbacks & {
|
|
63
|
+
onDataLoaded?: (data: any[]) => void;
|
|
64
|
+
onDataError?: (error: Error) => void;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
// Styling
|
|
68
|
+
theme?: 'alpine' | 'balham' | 'material' | 'quartz';
|
|
69
|
+
height?: number | string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Props for ObjectAgGridImpl component
|
|
74
|
+
*/
|
|
75
|
+
export interface ObjectAgGridImplProps {
|
|
76
|
+
objectName: string;
|
|
77
|
+
dataSource?: DataSource; // Optional in props, but required for functionality
|
|
78
|
+
fields?: FieldMetadata[];
|
|
79
|
+
fieldNames?: string[];
|
|
80
|
+
filters?: Record<string, any>;
|
|
81
|
+
sort?: Record<string, 'asc' | 'desc'>;
|
|
82
|
+
pageSize?: number;
|
|
83
|
+
pagination?: boolean;
|
|
84
|
+
domLayout?: 'normal' | 'autoHeight' | 'print';
|
|
85
|
+
animateRows?: boolean;
|
|
86
|
+
rowSelection?: 'single' | 'multiple';
|
|
87
|
+
theme?: 'alpine' | 'balham' | 'material' | 'quartz';
|
|
88
|
+
height?: number | string;
|
|
89
|
+
className?: string;
|
|
90
|
+
editable?: boolean;
|
|
91
|
+
editType?: 'fullRow';
|
|
92
|
+
singleClickEdit?: boolean;
|
|
93
|
+
stopEditingWhenCellsLoseFocus?: boolean;
|
|
94
|
+
exportConfig?: ExportConfig;
|
|
95
|
+
statusBar?: StatusBarConfig;
|
|
96
|
+
callbacks?: AgGridCallbacks & {
|
|
97
|
+
onDataLoaded?: (data: any[]) => void;
|
|
98
|
+
onDataError?: (error: Error) => void;
|
|
99
|
+
};
|
|
100
|
+
columnConfig?: ColumnConfig;
|
|
101
|
+
enableRangeSelection?: boolean;
|
|
102
|
+
enableCharts?: boolean;
|
|
103
|
+
contextMenu?: ContextMenuConfig;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Field type to AG Grid filter type mapping
|
|
108
|
+
*/
|
|
109
|
+
export const FIELD_TYPE_TO_FILTER_TYPE: Record<string, string | boolean> = {
|
|
110
|
+
text: 'agTextColumnFilter',
|
|
111
|
+
textarea: 'agTextColumnFilter',
|
|
112
|
+
number: 'agNumberColumnFilter',
|
|
113
|
+
currency: 'agNumberColumnFilter',
|
|
114
|
+
percent: 'agNumberColumnFilter',
|
|
115
|
+
boolean: 'agSetColumnFilter',
|
|
116
|
+
date: 'agDateColumnFilter',
|
|
117
|
+
datetime: 'agDateColumnFilter',
|
|
118
|
+
time: 'agTextColumnFilter',
|
|
119
|
+
email: 'agTextColumnFilter',
|
|
120
|
+
phone: 'agTextColumnFilter',
|
|
121
|
+
url: 'agTextColumnFilter',
|
|
122
|
+
select: 'agSetColumnFilter',
|
|
123
|
+
};
|
package/vite.config.ts
CHANGED
|
@@ -24,6 +24,13 @@ export default defineConfig({
|
|
|
24
24
|
resolve: {
|
|
25
25
|
alias: {
|
|
26
26
|
'@': resolve(__dirname, './src'),
|
|
27
|
+
'@object-ui/core': resolve(__dirname, '../core/src'),
|
|
28
|
+
'@object-ui/types': resolve(__dirname, '../types/src'),
|
|
29
|
+
'@object-ui/react': resolve(__dirname, '../react/src'),
|
|
30
|
+
'@object-ui/components': resolve(__dirname, '../components/src'),
|
|
31
|
+
'@object-ui/fields': resolve(__dirname, '../fields/src'),
|
|
32
|
+
'@object-ui/plugin-dashboard': resolve(__dirname, '../plugin-dashboard/src'),
|
|
33
|
+
'@object-ui/plugin-grid': resolve(__dirname, '../plugin-grid/src'),
|
|
27
34
|
},
|
|
28
35
|
},
|
|
29
36
|
build: {
|
|
@@ -47,4 +54,10 @@ export default defineConfig({
|
|
|
47
54
|
},
|
|
48
55
|
},
|
|
49
56
|
},
|
|
57
|
+
test: {
|
|
58
|
+
globals: true,
|
|
59
|
+
environment: 'happy-dom',
|
|
60
|
+
setupFiles: ['../../vitest.setup.tsx'],
|
|
61
|
+
passWithNoTests: true,
|
|
62
|
+
},
|
|
50
63
|
});
|