cx 26.4.2 → 26.4.4

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/src/data/View.ts CHANGED
@@ -1,346 +1,301 @@
1
- import { Binding } from "./Binding";
2
- import { isArray } from "../util/isArray";
3
- import { isDefined } from "../util/isDefined";
4
- import { StoreRef } from "./StoreRef";
5
- import { isObject } from "../util/isObject";
6
- import { isFunction } from "../util/isFunction";
7
- import { AccessorChain } from "./createAccessorModelProxy";
8
- import { Ref } from "./Ref";
9
-
10
- type Path = string | Binding;
11
-
12
- export interface ViewConfig {
13
- store?: View;
14
- immutable?: boolean;
15
- sealed?: boolean;
16
- }
17
-
18
- export interface ViewMethods<D = Record<string, any>> {
19
- getData(): D;
20
-
21
- init(path: Path, value: unknown): boolean;
22
- init<V>(path: AccessorChain<V>, value: V): boolean;
23
- init<T extends Record<string, unknown>>(initObject: T): boolean;
24
-
25
- set(path: Path, value: any): boolean;
26
- set<T extends Record<string, any>>(changes: T): boolean;
27
- set<V>(path: AccessorChain<V>, value: V): boolean;
28
-
29
- get(path: Path): any;
30
- get(paths: Path[]): any[];
31
- get(...paths: Path[]): any[];
32
- get<V>(path: AccessorChain<V>): V;
33
- get<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
34
- get<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
35
-
36
- /**
37
- * Removes data from the Store.
38
- * @param paths - One or more paths to be deleted.
39
- * @return {boolean}
40
- */
41
- delete(path: Path): boolean;
42
- delete(paths: Path[]): boolean;
43
- delete(...paths: Path[]): boolean;
44
- delete<V>(path: AccessorChain<V>): boolean;
45
- delete<T extends any[]>(
46
- ...paths: { [K in keyof T]: AccessorChain<T[K]> }
47
- ): boolean;
48
- delete<T extends any[]>(paths: {
49
- [K in keyof T]: AccessorChain<T[K]>;
50
- }): boolean;
51
-
52
- toggle(path: Path): boolean;
53
- toggle(path: AccessorChain<boolean>): boolean;
54
-
55
- update<V>(path: AccessorChain<V>, updateFn: (currentValue: V) => V): boolean;
56
- update<V, A extends any[]>(
57
- path: AccessorChain<V>,
58
- updateFn: (currentValue: V, ...args: A) => V,
59
- ...args: A
60
- ): boolean;
61
- update<A extends any[]>(
62
- updateFn: (currentValue: D, ...args: A) => D,
63
- ...args: any
64
- ): boolean;
65
- update<A extends any[]>(
66
- path: Path,
67
- updateFn: (currentValue: any, ...args: A) => any,
68
- ...args: A
69
- ): boolean;
70
-
71
- /**
72
- * Mutates the content of the store using Immer
73
- */
74
- mutate(
75
- updateFn: (currentValue: D, ...args: any[]) => void,
76
- ...args: any[]
77
- ): boolean;
78
- mutate<A extends any[]>(
79
- path: Path,
80
- updateFn: (currentValue: any, ...args: A) => void,
81
- ...args: A
82
- ): boolean;
83
- mutate<V, A extends any[]>(
84
- path: AccessorChain<V>,
85
- updateFn: (currentValue: V, ...args: A) => void,
86
- ...args: A
87
- ): boolean;
88
-
89
- ref<T = any>(path: string | AccessorChain<T>, defaultValue?: T): Ref<T>;
90
- }
91
-
92
- export class View<D = any> implements ViewMethods<D> {
93
- declare store?: View;
94
- declare meta: any;
95
- declare sealed: boolean;
96
- cache: {
97
- version: number;
98
- data?: any;
99
- result?: any;
100
- itemIndex?: number;
101
- key?: string;
102
- parentStoreData?: any;
103
- };
104
- notificationsSuspended: number = 0;
105
- dirty: boolean = false;
106
-
107
- constructor(config?: ViewConfig) {
108
- Object.assign(this, config);
109
- this.cache = {
110
- version: -1,
111
- };
112
- if (this.store) this.setStore(this.store);
113
- }
114
-
115
- getData(): D {
116
- throw new Error("abstract method");
117
- }
118
-
119
- init(path: Path, value: unknown): boolean;
120
- init<V>(path: AccessorChain<V>, value: V): boolean;
121
- init<T extends Record<string, unknown>>(initObject: T): boolean;
122
- init(path: any, value?: any): boolean {
123
- if (typeof path == "object" && path != null) {
124
- let changed = false;
125
- for (let key in path)
126
- if (
127
- path.hasOwnProperty(key) &&
128
- this.get(key) === undefined &&
129
- this.setItem(key, path[key])
130
- )
131
- changed = true;
132
- return changed;
133
- }
134
- let binding = Binding.get(path);
135
- if (this.get(binding.path) === undefined)
136
- return this.setItem(binding.path, value);
137
- return false;
138
- }
139
-
140
- set(path: Path, value: any): boolean;
141
- set<T extends Record<string, any>>(changes: T): boolean;
142
- set<V>(path: AccessorChain<V>, value: V): boolean;
143
- set(path: any, value?: any): boolean {
144
- if (typeof path == "object" && path != null) {
145
- let changed = false;
146
- for (let key in path)
147
- if (path.hasOwnProperty(key) && this.setItem(key, path[key]))
148
- changed = true;
149
- return changed;
150
- }
151
- let binding = Binding.get(path);
152
- return this.setItem(binding.path, value);
153
- }
154
-
155
- copy(from: Path, to: Path): boolean;
156
- copy<V>(from: AccessorChain<V>, to: AccessorChain<V>): boolean;
157
- copy(from: any, to: any): boolean {
158
- let value = this.get(from);
159
- return this.set(to, value);
160
- }
161
-
162
- move(from: Path, to: Path): boolean;
163
- move<V>(from: AccessorChain<V>, to: AccessorChain<V>): boolean;
164
- move(from: any, to: any): boolean {
165
- return this.batch(() => {
166
- this.copy(from, to);
167
- this.delete(from);
168
- });
169
- }
170
-
171
- //protected
172
- setItem(path: string, value: any): boolean {
173
- if (this.store) return this.store.setItem(path, value);
174
- throw new Error("abstract method");
175
- }
176
-
177
- delete(path: Path): boolean;
178
- delete(paths: Path[]): boolean;
179
- delete(...paths: Path[]): boolean;
180
- delete<V>(path: AccessorChain<V>): boolean;
181
- delete<T extends any[]>(
182
- ...paths: { [K in keyof T]: AccessorChain<T[K]> }
183
- ): boolean;
184
- delete<T extends any[]>(paths: {
185
- [K in keyof T]: AccessorChain<T[K]>;
186
- }): boolean;
187
- delete(path?: any): boolean {
188
- if (arguments.length > 1) path = Array.from(arguments);
189
- if (isArray(path))
190
- return path.map((arg) => this.delete(arg as Path)).some(Boolean);
191
-
192
- let binding = Binding.get(path);
193
- return this.deleteItem(binding.path);
194
- }
195
-
196
- //protected
197
- deleteItem(path: string): boolean {
198
- if (this.store) return this.store.deleteItem(path);
199
-
200
- throw new Error("abstract method");
201
- }
202
-
203
- clear(): void {
204
- if (this.store) return this.store.clear();
205
-
206
- throw new Error("abstract method");
207
- }
208
-
209
- get(path: Path): any;
210
- get(paths: Path[]): any[];
211
- get(...paths: Path[]): any[];
212
- get<V>(path: AccessorChain<V>): V;
213
- get<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
214
- get<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
215
- get(path?: any, ...args: any[]): any {
216
- let storeData = this.getData();
217
-
218
- if (arguments.length > 1) path = Array.from(arguments);
219
-
220
- if (isArray(path))
221
- return path.map((arg) => Binding.get(arg as any).value(storeData));
222
-
223
- return Binding.get(path).value(storeData);
224
- }
225
-
226
- toggle(path: Path): boolean;
227
- toggle(path: AccessorChain<boolean>): boolean;
228
- toggle(path: any): boolean {
229
- return this.set(path, !this.get(path));
230
- }
231
-
232
- update<V>(path: AccessorChain<V>, updateFn: (currentValue: V) => V): boolean;
233
- update<V, A extends any[]>(
234
- path: AccessorChain<V>,
235
- updateFn: (currentValue: V, ...args: A) => V,
236
- ...args: A
237
- ): boolean;
238
- update(
239
- updateFn: (currentValue: D, ...args: any[]) => any,
240
- ...args: any
241
- ): boolean;
242
- update<A extends any[]>(
243
- path: Path,
244
- updateFn: (currentValue: any, ...args: A) => any,
245
- ...args: A
246
- ): boolean;
247
- update(path: any, updateFn?: any, ...args: any[]): boolean {
248
- if (arguments.length == 1 && isFunction(path))
249
- return this.load(
250
- path.apply(null, [this.getData(), updateFn, ...args]),
251
- );
252
- return this.set(path, updateFn.apply(null, [this.get(path), ...args]));
253
- }
254
-
255
- mutate(
256
- updateFn: (currentValue: D, ...args: any[]) => void,
257
- ...args: any[]
258
- ): boolean;
259
- mutate<A extends any[]>(
260
- path: Path,
261
- updateFn: (currentValue: any, ...args: A) => void,
262
- ...args: A
263
- ): boolean;
264
- mutate<V, A extends any[]>(
265
- path: AccessorChain<V>,
266
- updateFn: (currentValue: V, ...args: A) => void,
267
- ...args: A
268
- ): boolean;
269
- mutate(path?: any, updateFn?: any, ...args: any[]): boolean {
270
- throw new Error(
271
- "Mutate requires Immer. Please install 'immer' and 'cx-immer' packages and enable store mutation by calling enableImmerMutate().",
272
- );
273
- }
274
-
275
- batch(callback: (store?: View) => void): boolean {
276
- let dirty = this.silently(callback);
277
- if (dirty) this.notify();
278
- return dirty;
279
- }
280
-
281
- silently(callback: (store?: View) => void): boolean {
282
- if (this.store) return this.store.silently(callback);
283
-
284
- throw new Error("abstract method");
285
- }
286
-
287
- notify(path?: string): void {
288
- if (this.notificationsSuspended) this.dirty = true;
289
- else this.doNotify(path);
290
- }
291
-
292
- doNotify(path?: string): void {
293
- if (this.store) return this.store.notify(path);
294
-
295
- throw new Error("abstract method");
296
- }
297
-
298
- subscribe(callback: (changes?: any) => void): () => void {
299
- if (this.store) return this.store.subscribe(callback);
300
-
301
- throw new Error("abstract method");
302
- }
303
-
304
- load(data: Record<string, any>): boolean {
305
- return this.set(data);
306
- }
307
-
308
- dispatch(action: any): void {
309
- if (this.store) return this.store.dispatch(action);
310
-
311
- throw new Error("The underlying store doesn't support dispatch.");
312
- }
313
-
314
- getMeta() {
315
- return this.meta;
316
- }
317
-
318
- setStore(store: View) {
319
- this.store = store;
320
- this.meta = store.getMeta();
321
- }
322
-
323
- ref<T = any>(path: string | AccessorChain<T>, defaultValue?: T): Ref<T> {
324
- if (isDefined(defaultValue)) this.init(path as any, defaultValue);
325
- return StoreRef.create({
326
- store: this,
327
- path,
328
- }) as Ref<T>;
329
- }
330
-
331
- getMethods(): ViewMethods<D> {
332
- return {
333
- getData: this.getData.bind(this),
334
- set: this.set.bind(this),
335
- get: this.get.bind(this),
336
- update: this.update.bind(this),
337
- delete: this.delete.bind(this),
338
- toggle: this.toggle.bind(this),
339
- init: this.init.bind(this),
340
- ref: this.ref.bind(this),
341
- mutate: this.mutate.bind(this),
342
- };
343
- }
344
- }
345
-
346
- View.prototype.sealed = false; //indicate that data should be copied before virtual items are added
1
+ import { Binding } from "./Binding";
2
+ import { isArray } from "../util/isArray";
3
+ import { isDefined } from "../util/isDefined";
4
+ import { StoreRef } from "./StoreRef";
5
+ import { isObject } from "../util/isObject";
6
+ import { isFunction } from "../util/isFunction";
7
+ import { AccessorChain } from "./createAccessorModelProxy";
8
+ import { Ref } from "./Ref";
9
+
10
+ type Path = string | Binding;
11
+
12
+ export interface ViewConfig {
13
+ store?: View;
14
+ immutable?: boolean;
15
+ sealed?: boolean;
16
+ }
17
+
18
+ export interface ViewMethods<D = Record<string, any>> {
19
+ getData(): D;
20
+
21
+ init(path: Path, value: unknown): boolean;
22
+ init<V>(path: AccessorChain<V>, value: V): boolean;
23
+ init<T extends Record<string, unknown>>(initObject: T): boolean;
24
+
25
+ set(path: Path, value: any): boolean;
26
+ set<T extends Record<string, any>>(changes: T): boolean;
27
+ set<V>(path: AccessorChain<V>, value: V): boolean;
28
+
29
+ get(path: Path): any;
30
+ get(paths: Path[]): any[];
31
+ get(...paths: Path[]): any[];
32
+ get<V>(path: AccessorChain<V>): V;
33
+ get<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
34
+ get<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
35
+
36
+ /**
37
+ * Removes data from the Store.
38
+ * @param paths - One or more paths to be deleted.
39
+ * @return {boolean}
40
+ */
41
+ delete(path: Path): boolean;
42
+ delete(paths: Path[]): boolean;
43
+ delete(...paths: Path[]): boolean;
44
+ delete<V>(path: AccessorChain<V>): boolean;
45
+ delete<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): boolean;
46
+ delete<T extends any[]>(paths: {
47
+ [K in keyof T]: AccessorChain<T[K]>;
48
+ }): boolean;
49
+
50
+ toggle(path: Path): boolean;
51
+ toggle(path: AccessorChain<boolean>): boolean;
52
+
53
+ update<V>(path: AccessorChain<V>, updateFn: (currentValue: V) => V): boolean;
54
+ update<V, A extends any[]>(
55
+ path: AccessorChain<V>,
56
+ updateFn: (currentValue: V, ...args: A) => V,
57
+ ...args: A
58
+ ): boolean;
59
+ update<A extends any[]>(updateFn: (currentValue: D, ...args: A) => D, ...args: any): boolean;
60
+ update<A extends any[]>(path: Path, updateFn: (currentValue: any, ...args: A) => any, ...args: A): boolean;
61
+
62
+ /**
63
+ * Mutates the content of the store using Immer
64
+ */
65
+ mutate(updateFn: (currentValue: D, ...args: any[]) => void, ...args: any[]): boolean;
66
+ mutate<A extends any[]>(path: Path, updateFn: (currentValue: any, ...args: A) => void, ...args: A): boolean;
67
+ mutate<V, A extends any[]>(
68
+ path: AccessorChain<V>,
69
+ updateFn: (currentValue: V, ...args: A) => void,
70
+ ...args: A
71
+ ): boolean;
72
+
73
+ ref<T = any>(path: string | AccessorChain<T>, defaultValue?: T): Ref<T>;
74
+ }
75
+
76
+ export class View<D = any> implements ViewMethods<D> {
77
+ declare store?: View;
78
+ declare meta: any;
79
+ declare sealed: boolean;
80
+ cache: {
81
+ version: number;
82
+ data?: any;
83
+ result?: any;
84
+ itemIndex?: number;
85
+ key?: string;
86
+ };
87
+ notificationsSuspended: number = 0;
88
+ dirty: boolean = false;
89
+
90
+ constructor(config?: ViewConfig) {
91
+ Object.assign(this, config);
92
+ this.cache = {
93
+ version: -1,
94
+ };
95
+ if (this.store) this.setStore(this.store);
96
+ }
97
+
98
+ getData(): D {
99
+ throw new Error("abstract method");
100
+ }
101
+
102
+ init(path: Path, value: unknown): boolean;
103
+ init<V>(path: AccessorChain<V>, value: V): boolean;
104
+ init<T extends Record<string, unknown>>(initObject: T): boolean;
105
+ init(path: any, value?: any): boolean {
106
+ if (typeof path == "object" && path != null) {
107
+ let changed = false;
108
+ for (let key in path)
109
+ if (path.hasOwnProperty(key) && this.get(key) === undefined && this.setItem(key, path[key])) changed = true;
110
+ return changed;
111
+ }
112
+ let binding = Binding.get(path);
113
+ if (this.get(binding.path) === undefined) return this.setItem(binding.path, value);
114
+ return false;
115
+ }
116
+
117
+ set(path: Path, value: any): boolean;
118
+ set<T extends Record<string, any>>(changes: T): boolean;
119
+ set<V>(path: AccessorChain<V>, value: V): boolean;
120
+ set(path: any, value?: any): boolean {
121
+ if (typeof path == "object" && path != null) {
122
+ let changed = false;
123
+ for (let key in path) if (path.hasOwnProperty(key) && this.setItem(key, path[key])) changed = true;
124
+ return changed;
125
+ }
126
+ let binding = Binding.get(path);
127
+ return this.setItem(binding.path, value);
128
+ }
129
+
130
+ copy(from: Path, to: Path): boolean;
131
+ copy<V>(from: AccessorChain<V>, to: AccessorChain<V>): boolean;
132
+ copy(from: any, to: any): boolean {
133
+ let value = this.get(from);
134
+ return this.set(to, value);
135
+ }
136
+
137
+ move(from: Path, to: Path): boolean;
138
+ move<V>(from: AccessorChain<V>, to: AccessorChain<V>): boolean;
139
+ move(from: any, to: any): boolean {
140
+ return this.batch(() => {
141
+ this.copy(from, to);
142
+ this.delete(from);
143
+ });
144
+ }
145
+
146
+ //protected
147
+ setItem(path: string, value: any): boolean {
148
+ if (this.store) return this.store.setItem(path, value);
149
+ throw new Error("abstract method");
150
+ }
151
+
152
+ delete(path: Path): boolean;
153
+ delete(paths: Path[]): boolean;
154
+ delete(...paths: Path[]): boolean;
155
+ delete<V>(path: AccessorChain<V>): boolean;
156
+ delete<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): boolean;
157
+ delete<T extends any[]>(paths: {
158
+ [K in keyof T]: AccessorChain<T[K]>;
159
+ }): boolean;
160
+ delete(path?: any): boolean {
161
+ if (arguments.length > 1) path = Array.from(arguments);
162
+ if (isArray(path)) return path.map((arg) => this.delete(arg as Path)).some(Boolean);
163
+
164
+ let binding = Binding.get(path);
165
+ return this.deleteItem(binding.path);
166
+ }
167
+
168
+ //protected
169
+ deleteItem(path: string): boolean {
170
+ if (this.store) return this.store.deleteItem(path);
171
+
172
+ throw new Error("abstract method");
173
+ }
174
+
175
+ clear(): void {
176
+ if (this.store) return this.store.clear();
177
+
178
+ throw new Error("abstract method");
179
+ }
180
+
181
+ get(path: Path): any;
182
+ get(paths: Path[]): any[];
183
+ get(...paths: Path[]): any[];
184
+ get<V>(path: AccessorChain<V>): V;
185
+ get<T extends any[]>(...paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
186
+ get<T extends any[]>(paths: { [K in keyof T]: AccessorChain<T[K]> }): T;
187
+ get(path?: any, ...args: any[]): any {
188
+ let storeData = this.getData();
189
+
190
+ if (arguments.length > 1) path = Array.from(arguments);
191
+
192
+ if (isArray(path)) return path.map((arg) => Binding.get(arg as any).value(storeData));
193
+
194
+ return Binding.get(path).value(storeData);
195
+ }
196
+
197
+ toggle(path: Path): boolean;
198
+ toggle(path: AccessorChain<boolean>): boolean;
199
+ toggle(path: any): boolean {
200
+ return this.set(path, !this.get(path));
201
+ }
202
+
203
+ update<V>(path: AccessorChain<V>, updateFn: (currentValue: V) => V): boolean;
204
+ update<V, A extends any[]>(
205
+ path: AccessorChain<V>,
206
+ updateFn: (currentValue: V, ...args: A) => V,
207
+ ...args: A
208
+ ): boolean;
209
+ update(updateFn: (currentValue: D, ...args: any[]) => any, ...args: any): boolean;
210
+ update<A extends any[]>(path: Path, updateFn: (currentValue: any, ...args: A) => any, ...args: A): boolean;
211
+ update(path: any, updateFn?: any, ...args: any[]): boolean {
212
+ if (arguments.length == 1 && isFunction(path))
213
+ return this.load(path.apply(null, [this.getData(), updateFn, ...args]));
214
+ return this.set(path, updateFn.apply(null, [this.get(path), ...args]));
215
+ }
216
+
217
+ mutate(updateFn: (currentValue: D, ...args: any[]) => void, ...args: any[]): boolean;
218
+ mutate<A extends any[]>(path: Path, updateFn: (currentValue: any, ...args: A) => void, ...args: A): boolean;
219
+ mutate<V, A extends any[]>(
220
+ path: AccessorChain<V>,
221
+ updateFn: (currentValue: V, ...args: A) => void,
222
+ ...args: A
223
+ ): boolean;
224
+ mutate(path?: any, updateFn?: any, ...args: any[]): boolean {
225
+ throw new Error(
226
+ "Mutate requires Immer. Please install 'immer' and 'cx-immer' packages and enable store mutation by calling enableImmerMutate().",
227
+ );
228
+ }
229
+
230
+ batch(callback: (store?: View) => void): boolean {
231
+ let dirty = this.silently(callback);
232
+ if (dirty) this.notify();
233
+ return dirty;
234
+ }
235
+
236
+ silently(callback: (store?: View) => void): boolean {
237
+ if (this.store) return this.store.silently(callback);
238
+
239
+ throw new Error("abstract method");
240
+ }
241
+
242
+ notify(path?: string): void {
243
+ if (this.notificationsSuspended) this.dirty = true;
244
+ else this.doNotify(path);
245
+ }
246
+
247
+ doNotify(path?: string): void {
248
+ if (this.store) return this.store.notify(path);
249
+
250
+ throw new Error("abstract method");
251
+ }
252
+
253
+ subscribe(callback: (changes?: any) => void): () => void {
254
+ if (this.store) return this.store.subscribe(callback);
255
+
256
+ throw new Error("abstract method");
257
+ }
258
+
259
+ load(data: Record<string, any>): boolean {
260
+ return this.set(data);
261
+ }
262
+
263
+ dispatch(action: any): void {
264
+ if (this.store) return this.store.dispatch(action);
265
+
266
+ throw new Error("The underlying store doesn't support dispatch.");
267
+ }
268
+
269
+ getMeta() {
270
+ return this.meta;
271
+ }
272
+
273
+ setStore(store: View) {
274
+ this.store = store;
275
+ this.meta = store.getMeta();
276
+ }
277
+
278
+ ref<T = any>(path: string | AccessorChain<T>, defaultValue?: T): Ref<T> {
279
+ if (isDefined(defaultValue)) this.init(path as any, defaultValue);
280
+ return StoreRef.create({
281
+ store: this,
282
+ path,
283
+ }) as Ref<T>;
284
+ }
285
+
286
+ getMethods(): ViewMethods<D> {
287
+ return {
288
+ getData: this.getData.bind(this),
289
+ set: this.set.bind(this),
290
+ get: this.get.bind(this),
291
+ update: this.update.bind(this),
292
+ delete: this.delete.bind(this),
293
+ toggle: this.toggle.bind(this),
294
+ init: this.init.bind(this),
295
+ ref: this.ref.bind(this),
296
+ mutate: this.mutate.bind(this),
297
+ };
298
+ }
299
+ }
300
+
301
+ View.prototype.sealed = false; //indicate that data should be copied before virtual items are added
@@ -2,3 +2,4 @@ import { jsx, jsxs } from "./jsx-runtime";
2
2
 
3
3
  export const jsxDEV = jsx;
4
4
  export const jsxsDEV = jsxs;
5
+ export { Fragment, JSX } from "./jsx-runtime";