native-document 1.0.169 → 1.0.173

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.
Files changed (134) hide show
  1. package/CHANGELOG.md +100 -2
  2. package/docs/vitepress-conventions.md +2 -2
  3. package/index.d.ts +1 -1
  4. package/package.json +11 -4
  5. package/src/components/BaseComponent.js +43 -1
  6. package/src/components/accordion/Accordion.js +1 -0
  7. package/src/components/accordion/AccordionItem.js +1 -0
  8. package/src/components/alert/Alert.js +4 -0
  9. package/src/components/avatar/Avatar.js +1 -0
  10. package/src/components/avatar/AvatarGroup.js +1 -0
  11. package/src/components/badge/Badge.js +1 -0
  12. package/src/components/breadcrumb/BreadCrumb.js +4 -0
  13. package/src/components/button/Button.js +1 -0
  14. package/src/components/card/Card.js +1 -0
  15. package/src/components/context-menu/ContextMenu.js +2 -0
  16. package/src/components/context-menu/ContextMenuGroup.js +2 -0
  17. package/src/components/context-menu/ContextMenuItem.js +2 -0
  18. package/src/components/divider/Divider.js +2 -0
  19. package/src/components/dropdown/Dropdown.js +1 -0
  20. package/src/components/dropdown/DropdownDivider.js +1 -0
  21. package/src/components/dropdown/DropdownGroup.js +1 -0
  22. package/src/components/dropdown/DropdownItem.js +1 -0
  23. package/src/components/dropdown/DropdownTrigger.js +1 -0
  24. package/src/components/form/FormControl.js +1 -0
  25. package/src/components/form/field/Field.js +1 -0
  26. package/src/components/form/field/types/StringField.js +1 -1
  27. package/src/components/icon/Icon.js +1 -0
  28. package/src/components/list/ListItem.js +1 -0
  29. package/src/components/menu/Menu.js +3 -0
  30. package/src/components/menu/MenuDivider.js +1 -0
  31. package/src/components/menu/MenuGroup.js +1 -0
  32. package/src/components/menu/MenuItem.js +1 -0
  33. package/src/components/menu/MenuLink.js +1 -0
  34. package/src/components/modal/Modal.js +4 -0
  35. package/src/components/pagination/Pagination.js +1 -0
  36. package/src/components/popover/Popover.js +1 -0
  37. package/src/components/popover/PopoverFooter.js +1 -0
  38. package/src/components/popover/PopoverHeader.js +1 -0
  39. package/src/components/progress/Progress.js +5 -0
  40. package/src/components/skeleton/Skeleton.js +4 -0
  41. package/src/components/slider/Slider.js +1 -0
  42. package/src/components/spacer/Spacer.js +1 -0
  43. package/src/components/spinner/Spinner.js +1 -0
  44. package/src/components/splitter/Splitter.js +1 -0
  45. package/src/components/splitter/SplitterGutter.js +6 -0
  46. package/src/components/splitter/SplitterPanel.js +1 -0
  47. package/src/components/stacks/AbsoluteStack.js +1 -0
  48. package/src/components/stacks/FixedStack.js +1 -0
  49. package/src/components/stacks/HStack.js +1 -0
  50. package/src/components/stacks/PositionStack.js +1 -0
  51. package/src/components/stacks/RelativeStack.js +1 -0
  52. package/src/components/stacks/Stack.js +1 -0
  53. package/src/components/stacks/VStack.js +1 -0
  54. package/src/components/stepper/Stepper.js +1 -0
  55. package/src/components/stepper/StepperStep.js +1 -0
  56. package/src/components/switch/Switch.js +1 -0
  57. package/src/components/table/DataTable.js +1 -0
  58. package/src/components/table/SimpleTable.js +1 -0
  59. package/src/components/tabs/Tabs.js +1 -0
  60. package/src/components/toast/Toast.js +1 -0
  61. package/src/components/tooltip/Tooltip.js +1 -0
  62. package/src/core/data/MemoryManager.js +6 -1
  63. package/src/core/data/ObservableItem.js +33 -15
  64. package/src/core/data/ObservableObject.js +1 -2
  65. package/src/core/elements/anchor/anchor.js +4 -3
  66. package/src/core/elements/anchor/one-child-anchor-overwriting.js +4 -4
  67. package/src/core/elements/content-formatter.js +19 -0
  68. package/src/core/elements/control/for-each-array-cache.js +59 -0
  69. package/src/core/elements/control/for-each-array.js +15 -23
  70. package/src/core/wrappers/AttributesWrapper.js +12 -12
  71. package/src/core/wrappers/ElementCreator.js +33 -10
  72. package/src/core/wrappers/HtmlElementWrapper.js +17 -13
  73. package/src/core/wrappers/NDElement.js +23 -8
  74. package/src/core/wrappers/NdPrototype.js +64 -39
  75. package/src/core/wrappers/constants.js +12 -12
  76. package/src/core/wrappers/prototypes/nd-element-extensions.js +127 -57
  77. package/src/core/wrappers/template-cloner/NodeCloner.js +10 -6
  78. package/src/core/wrappers/template-cloner/TemplateCloner.js +7 -4
  79. package/src/fetch/NativeFetch.js +1 -0
  80. package/src/ui/components/accordion/AccordionItemRender.js +29 -7
  81. package/src/ui/components/alert/AlertRender.js +6 -0
  82. package/src/ui/components/breadcrumb/BreadcrumbRender.js +9 -1
  83. package/src/ui/components/button/ButtonRender.js +3 -0
  84. package/src/ui/components/contextmenu/ContextmenuRender.js +2 -0
  85. package/src/ui/components/dropdown/DropdownRender.js +3 -0
  86. package/src/ui/components/dropdown/item/DropdownItemRender.js +6 -1
  87. package/src/ui/components/form/FieldCollectionRender.js +4 -0
  88. package/src/ui/components/form/fields/CheckboxFieldRender.js +4 -0
  89. package/src/ui/components/form/fields/CheckboxGroupFieldRender.js +4 -0
  90. package/src/ui/components/form/fields/FieldRender.js +1 -1
  91. package/src/ui/components/form/fields/RadioFieldRender.js +4 -0
  92. package/src/ui/components/form/fields/RangeFieldRender.js +4 -0
  93. package/src/ui/components/form/fields/SelectFieldRender.js +5 -0
  94. package/src/ui/components/form/fields/SliderFieldRender.js +3 -0
  95. package/src/ui/components/icon/tabler/TablerIconRender.js +0 -1
  96. package/src/ui/components/list/item/ListItemRender.js +4 -0
  97. package/src/ui/components/menu/MenuItemRender.js +8 -0
  98. package/src/ui/components/menu/MenuLinkRender.js +11 -0
  99. package/src/ui/components/menu/MenuRender.js +5 -0
  100. package/src/ui/components/menu/helpers.js +2 -1
  101. package/src/ui/components/modal/ModalRender.js +8 -2
  102. package/src/ui/components/progress/ProgressRender.js +9 -0
  103. package/src/ui/components/skeleton/SkeletonRender.js +2 -0
  104. package/src/ui/components/spinner/SpinnerRender.js +3 -0
  105. package/src/ui/components/splitter/SplitterGutterRender.js +4 -0
  106. package/src/ui/components/splitter/SplitterPanelRender.js +4 -0
  107. package/src/ui/components/splitter/SplitterRender.js +2 -0
  108. package/src/ui/components/stepper/StepperRender.js +2 -1
  109. package/src/ui/components/stepper/StepperStepRender.js +8 -1
  110. package/src/ui/components/switch/SwitchRender.js +3 -0
  111. package/src/ui/components/table/data-table/DataTableRender.js +4 -0
  112. package/src/ui/components/table/simple-table/SimpleTableRender.js +2 -0
  113. package/src/ui/components/toast/ToastRender.js +4 -0
  114. package/src/ui/utils/aria.js +19 -0
  115. package/tests/integration/ui/attributes-wrapper.test.js +177 -0
  116. package/tests/integration/ui/for-each-array.test.js +167 -0
  117. package/tests/integration/ui/lifecycle.test.js +146 -0
  118. package/tests/integration/ui/show-if.test.js +168 -0
  119. package/tests/unit/core/observable-array.test.js +404 -0
  120. package/tests/unit/core/observable-item.test.js +428 -0
  121. package/tests/unit/core/observable-object.test.js +239 -0
  122. package/tests/unit/core/observable-resource.test.js +323 -0
  123. package/tests/unit/core/store.test.js +347 -0
  124. package/tests/unit/router/route-matching.test.js +169 -0
  125. package/tests/unit/router/router-guards.test.js +189 -0
  126. package/tests/unit/utils/cache.test.js +120 -0
  127. package/tests/unit/utils/filters.test.js +394 -0
  128. package/types/elements.d.ts +5 -0
  129. package/types/native-fetch.d.ts +1 -1
  130. package/types/observable-resource.d.ts +2 -2
  131. package/types/observable.d.ts +137 -21
  132. package/types/service.d.ts +2 -1
  133. package/utils.js +7 -4
  134. package/vitest.config.js +15 -0
@@ -1,4 +1,4 @@
1
- import {FilterResult, PredicateMap} from "./filters";
1
+ import { FilterResult, PredicateMap } from './filters';
2
2
 
3
3
  export type Unsubscribe = () => void;
4
4
 
@@ -41,45 +41,96 @@ export interface FormattersStatic {
41
41
 
42
42
  export declare const Formatters: FormattersStatic;
43
43
 
44
+ // -- Observable system type definitions ---------------------------------------
44
45
 
45
- // Observable system type definitions
46
46
  export interface ObservableItem<T = any> {
47
47
  readonly $currentValue: T;
48
48
  readonly $previousValue: T;
49
49
  readonly $initialValue: T | null;
50
50
  readonly $isCleanedUp: boolean;
51
+ readonly $memoryId: number | null;
52
+ readonly __$Observable: true;
53
+ readonly __$isObservable: true;
51
54
 
52
55
  $value: T;
53
- $memoryId: number | null;
54
56
 
55
57
  val(): T;
56
58
  set(value: T | ((prev: T) => T)): void;
57
59
  trigger(operations?: ObservableOperation): void;
58
60
  cleanup(): void;
61
+ clone(): ObservableItem<T>;
62
+ disconnectAll(): void;
59
63
 
60
- subscribe(callback: (current: T, previous: T, operations?: ObservableOperation) => void): Unsubscribe;
64
+ /**
65
+ * Registers a subscriber. Does NOT return an unsubscribe function —
66
+ * call .unsubscribe(callback) with the same reference to remove it.
67
+ */
68
+ subscribe(callback: (current: T, previous: T, operations?: ObservableOperation) => void): void;
61
69
  unsubscribe(callback: Function): void;
62
- on(value: T, callback: ObservableItem<boolean> | ((isActive: boolean) => void)): () => void;
70
+
71
+ /**
72
+ * Registers a watcher for a specific value. Does NOT return an unsubscribe
73
+ * function — call .off(value, callback) to remove it.
74
+ */
75
+ on(value: T, callback: ObservableItem<boolean> | ((isActive: boolean) => void)): void;
76
+ off(value: T, callback?: Function): void;
77
+ once(predicate: T | ((value: T) => boolean), callback: (value: T) => void): void;
78
+ onCleanup(callback: () => void): void;
79
+
80
+ intercept(callback: (newValue: T, currentValue: T) => T | undefined): this;
81
+ interceptMutations(callback: (operation: ObservableOperation) => void): this;
63
82
 
64
83
  check<U>(callback: (value: T) => U): ObservableChecker<U>;
65
84
  transform<U>(callback: (value: T) => U): ObservableChecker<U>;
66
85
  is<U>(callback: (value: T) => U): ObservableChecker<U>;
67
86
  select<U>(callback: (value: T) => U): ObservableChecker<U>;
68
- pluck<U>(callback: (value: T) => U): ObservableChecker<U>;
87
+ pluck<U>(key: string): ObservableChecker<U>;
69
88
  format(type: FormatType | ((value: T) => string), options?: FormatOptions): ObservableItem<string>;
70
89
  get(key: string | number): any;
71
90
  when(value: T): ObservableWhen<T>;
72
- off(value: T, callback?: Function): void;
73
- once(predicate: T | ((value: T) => boolean), callback: (value: T) => void): void;
74
- onCleanup(callback: () => void): void;
75
- intercept(callback: (newValue: T, currentValue: T) => T | undefined): this;
91
+
76
92
  persist(key: string, options?: {
77
93
  get?: (value: any) => T;
78
94
  set?: (value: T) => any;
79
95
  }): this;
80
- disconnectAll(): void;
96
+
97
+ // -- comparison helpers (is*) -----------------------------------------------
98
+
99
+ isEqualTo(value: T | ObservableItem<T>): ObservableChecker<boolean>;
100
+ isNotEqualTo(value: T | ObservableItem<T>): ObservableChecker<boolean>;
101
+ isGreaterThan(value: T | ObservableItem<T>): ObservableChecker<boolean>;
102
+ isGreaterThanOrEqualTo(value: T | ObservableItem<T>): ObservableChecker<boolean>;
103
+ isLessThan(value: T | ObservableItem<T>): ObservableChecker<boolean>;
104
+ isLessThanOrEqualTo(value: T | ObservableItem<T>): ObservableChecker<boolean>;
105
+ isBetween(min: T | ObservableItem<T>, max: T | ObservableItem<T>): ObservableChecker<boolean>;
106
+ isNull(): ObservableChecker<boolean>;
107
+ isTruthy(): ObservableChecker<boolean>;
108
+ isFalsy(): ObservableChecker<boolean>;
109
+ isStartingWith(value: string | ObservableItem<string>): ObservableChecker<boolean>;
110
+ isEndingWith(value: string | ObservableItem<string>): ObservableChecker<boolean>;
111
+ isMatchingPattern(pattern: RegExp | ObservableItem<RegExp>): ObservableChecker<boolean>;
112
+ isEmpty(): ObservableChecker<boolean>;
113
+ isNotEmpty(): ObservableChecker<boolean>;
114
+ isIncludes(value: any | ObservableItem<any>): ObservableChecker<boolean>;
115
+ isIncludedIn(collection: any[] | ObservableItem<any[]>): ObservableChecker<boolean>;
116
+ isOneOf(collection: any[] | ObservableItem<any[]>): ObservableChecker<boolean>;
117
+ isHaving(key: string | ObservableItem<string>): ObservableChecker<boolean>;
118
+
119
+ // -- transform helpers (to*) -------------------------------------------------
120
+
121
+ toUpperCase(): ObservableChecker<string>;
122
+ toLowerCase(): ObservableChecker<string>;
123
+ toTrimmed(): ObservableChecker<string>;
124
+ toBoolean(): ObservableChecker<boolean>;
125
+ toLiteral(template: string, placeholder?: string): ObservableChecker<string>;
126
+ toFormatted(template: string, placeholder?: string): ObservableChecker<string>;
127
+ toProperty<U = any>(path: string): ObservableChecker<U>;
128
+ toLength(): ObservableChecker<number>;
129
+ toClamped(min: number | ObservableItem<number>, max: number | ObservableItem<number>): ObservableChecker<number>;
130
+ toPercent(total: number | ObservableItem<number>): ObservableChecker<number>;
81
131
 
82
132
  toString(): string;
133
+ valueOf(): T;
83
134
  equals(value: any): boolean;
84
135
  toBool(): boolean;
85
136
  toggle(): void;
@@ -93,7 +144,8 @@ export class ObservableWhen<T = any> {
93
144
 
94
145
  constructor(observer: ObservableItem<T>, value: T);
95
146
 
96
- subscribe(callback: (value: boolean) => void): Unsubscribe;
147
+ /** Does NOT return an unsubscribe function — use .off() on the underlying observer. */
148
+ subscribe(callback: (value: boolean) => void): void;
97
149
  val(): boolean;
98
150
  isMatch(): boolean;
99
151
  isActive(): boolean;
@@ -106,11 +158,14 @@ export interface ObservableOperation {
106
158
  }
107
159
 
108
160
  export interface ObservableChecker<T = any> {
161
+ readonly __$Observable: true;
109
162
  readonly __$isObservableChecker: true;
110
163
 
111
- subscribe(callback: (value: T) => void): Unsubscribe;
164
+ /** Does NOT return an unsubscribe function. */
165
+ subscribe(callback: (value: T) => void): void;
112
166
  check<U>(callback: (value: T) => U): ObservableChecker<U>;
113
167
  val(): T;
168
+ toNdElement(): Text;
114
169
 
115
170
  set(value: any): void;
116
171
  trigger(): void;
@@ -119,6 +174,7 @@ export interface ObservableChecker<T = any> {
119
174
 
120
175
  export interface ObservableArray<T> extends ObservableItem<T[]> {
121
176
  readonly length: number;
177
+ readonly __$isObservableArray: true;
122
178
 
123
179
  push(...items: T[]): number;
124
180
  pop(): T | undefined;
@@ -128,16 +184,19 @@ export interface ObservableArray<T> extends ObservableItem<T[]> {
128
184
  sort(compareFn?: (a: T, b: T) => number): T[];
129
185
  splice(start: number, deleteCount?: number, ...items: T[]): T[];
130
186
 
131
- isEmpty(): boolean;
187
+ empty(): boolean;
132
188
  clear(): boolean;
133
189
  merge(values: T[]): void;
134
190
  removeItem(item: T): T[];
135
191
  remove(index: number): T[];
136
192
  swap(indexA: number, indexB: number): boolean;
137
- count(condition: (item:T, index?:number) => boolean): number;
138
- populateAndRender(iteration: number, callback: (index: number) => T): void;
193
+ swapItems(itemA: T, itemB: T): boolean;
194
+ insertAfter(item: T, afterItem: T): T[];
195
+ count(condition: (item: T, index?: number) => boolean): number;
196
+ populateAndRender(items: T[], factory: any, options: any): void;
139
197
 
140
198
  map<U>(callback: (value: T, index: number, array: T[]) => U): U[];
199
+ forEach(callback: (value: T, index: number, array: T[]) => void): void;
141
200
  filter(callback: (value: T, index: number, array: T[]) => boolean): T[];
142
201
  reduce<U>(callback: (acc: U, value: T, index: number, array: T[]) => U, initial: U): U;
143
202
  some(callback: (value: T, index: number, array: T[]) => boolean): boolean;
@@ -146,12 +205,21 @@ export interface ObservableArray<T> extends ObservableItem<T[]> {
146
205
  at(index: number): T | undefined;
147
206
  findIndex(callback: (value: T, index: number, array: T[]) => boolean): number;
148
207
  concat(...items: (T | T[])[]): T[];
208
+ indexOf(item: T): number;
209
+ includes(item: T): boolean;
149
210
 
150
- where(predicates: PredicateMap<T>): ObservableArray<T>;
211
+ where(predicates: PredicateMap<T> | ((item: T) => boolean)): ObservableArray<T>;
151
212
  whereSome<K extends keyof T>(fields: K[], filter: FilterResult<T[K]>): ObservableArray<T>;
152
213
  whereEvery<K extends keyof T>(fields: K[], filter: FilterResult<T[K]>): ObservableArray<T>;
153
214
 
154
- deepSubscribe(callback: (value: T[]) => void): () => void;
215
+ /** Returns an unsubscribe function that stops all deep observation. */
216
+ deepSubscribe(callback: (value: T[]) => void): Unsubscribe;
217
+
218
+ /** One-way sync — pushes mutations from this array to the target. Returns unsubscribe. */
219
+ sync(target: ObservableArray<T>): Unsubscribe;
220
+
221
+ clone(): ObservableArray<T>;
222
+ isNotEmpty(): ObservableChecker<boolean>;
155
223
  }
156
224
 
157
225
  export type ObservableObject<T extends Record<string, any>> = ObservableItem<T> & {
@@ -175,6 +243,12 @@ export type ObservableObject<T extends Record<string, any>> = ObservableItem<T>
175
243
  keys(): string[];
176
244
  $keys(): string[];
177
245
  observables(): ObservableItem<any>[];
246
+
247
+ /**
248
+ * Subscribing to an ObservableObject also deep-subscribes to all nested
249
+ * observables and observable arrays — triggers on any nested change.
250
+ */
251
+ subscribe(callback: (current: T, previous: T, operations?: ObservableOperation) => void): void;
178
252
  } & {
179
253
  [K in keyof T]: T[K] extends (infer U)[]
180
254
  ? ObservableArray<U>
@@ -183,6 +257,40 @@ export type ObservableObject<T extends Record<string, any>> = ObservableItem<T>
183
257
  : ObservableItem<T[K]>;
184
258
  };
185
259
 
260
+ // -- ObservableResource ---------------------------------------------------------
261
+
262
+ export type ResourceState = 'unresolved' | 'pending' | 'ready' | 'refreshing' | 'errored';
263
+
264
+ export interface ObservableResourceConfig<T = any> {
265
+ auto?: boolean;
266
+ lazy?: boolean;
267
+ debounce?: number;
268
+ into?: ObservableItem<T>;
269
+ apply?: (result: any, data: ObservableItem<T>) => void;
270
+ }
271
+
272
+ export interface ObservableResource<T = any> {
273
+ readonly data: ObservableItem<T>;
274
+ readonly error: ObservableItem<Error | null>;
275
+ readonly state: ObservableItem<ResourceState>;
276
+ readonly loading: ObservableItem<boolean>;
277
+
278
+ fetch(): this;
279
+ refetch(): this;
280
+ mutate(value: T): this;
281
+ into(target: ObservableItem<T>): this;
282
+ apply(callback: (result: any, data: ObservableItem<T>) => void): this;
283
+ destroy(): void;
284
+
285
+ isReady(): ObservableChecker<boolean>;
286
+ isPending(): ObservableChecker<boolean>;
287
+ isRefreshing(): ObservableChecker<boolean>;
288
+ isErrored(): ObservableChecker<boolean>;
289
+ isUnresolved(): ObservableChecker<boolean>;
290
+
291
+ onSuccess(callback: (data: T) => void): this;
292
+ onError(callback: (error: Error) => void): this;
293
+ }
186
294
 
187
295
  export interface BatchFunction<TArgs extends any[] = any[], TReturn = any> {
188
296
  (...args: TArgs): TReturn;
@@ -210,8 +318,14 @@ export interface ObservableStatic {
210
318
  object<T extends Record<string, any>>(value: T, configs?: ObservableConfig | null): ObservableObject<T>;
211
319
  json<T extends Record<string, any>>(value: T, configs?: ObservableConfig | null): ObservableObject<T>;
212
320
 
213
- computed<T>(callback: () => T, dependencies?: ValidComputedDependencies | BatchFunction): ObservableItem<T>;
214
- computed<T>(callback: () => T, batchFunction?: BatchFunction): ObservableItem<T>;
321
+ resource<T = any>(
322
+ fn: (...args: any[]) => Promise<T>,
323
+ dependencies?: ValidComputedDependencies,
324
+ config?: ObservableResourceConfig<T> | boolean,
325
+ ): ObservableResource<T>;
326
+
327
+ computed<T>(callback: (...values: any[]) => T, dependencies?: ValidComputedDependencies | BatchFunction): ObservableItem<T>;
328
+ computed<T>(callback: (...values: any[]) => T, batchFunction?: BatchFunction): ObservableItem<T>;
215
329
 
216
330
  batch<TArgs extends any[], TReturn>(
217
331
  callback: (...args: TArgs) => TReturn
@@ -219,9 +333,11 @@ export interface ObservableStatic {
219
333
 
220
334
  value(data: any): any;
221
335
  update(target: any, data: any): void;
336
+ setLocale(locale: string | ObservableItem<string>): void;
337
+ useValueProperty(propertyName?: string): void;
222
338
 
223
339
  getById(id: number): ObservableItem | null;
224
340
  cleanup(observable: ObservableItem): void;
225
341
  autoCleanup(enable?: boolean, options?: AutoCleanupOptions): void;
226
342
  arrayOfObject<T extends Record<string, any>>(data: T[]): ObservableObject<T>[];
227
- }
343
+ }
@@ -20,4 +20,5 @@ interface ServiceStatic {
20
20
  ): MemoizeProxy<(...args: Args) => T>;
21
21
  }
22
22
 
23
- export const Service: ServiceStatic;
23
+ export const Service: ServiceStatic;
24
+ export const Cache: ServiceStatic;
package/utils.js CHANGED
@@ -1,11 +1,14 @@
1
- import NativeFetch from "./src/fetch/NativeFetch";
2
- import * as Cache from "./src/core/utils/cache";
3
- import * as filters from "./src/core/utils/filters/index";
4
- import {classPropertyAccumulator, cssPropertyAccumulator} from "./src/core/utils/property-accumulator";
1
+ import NativeFetch from './src/fetch/NativeFetch';
2
+ import * as Cache from './src/core/utils/cache';
3
+ import * as filters from './src/core/utils/filters/index';
4
+ import {classPropertyAccumulator, cssPropertyAccumulator} from './src/core/utils/property-accumulator';
5
+
6
+ const Service = Cache;
5
7
 
6
8
  export {
7
9
  NativeFetch,
8
10
  Cache,
11
+ Service,
9
12
  filters,
10
13
  classPropertyAccumulator,
11
14
  cssPropertyAccumulator
@@ -0,0 +1,15 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: 'happy-dom',
6
+ globals: true,
7
+ include: ['tests/**/*.test.js'],
8
+ coverage: {
9
+ provider: 'v8',
10
+ reporter: ['text', 'html'],
11
+ include: ['src/**/*.js'],
12
+ exclude: ['src/**/*.d.ts', 'src/ui/**/*.css'],
13
+ },
14
+ },
15
+ });