@lasterp/shared 1.0.0-alpha.1 → 1.0.0-alpha.10

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.
@@ -0,0 +1,591 @@
1
+ interface Item {
2
+ item_code: string;
3
+ area: string;
4
+ model: string;
5
+ region: string;
6
+ grade: string;
7
+ grade_issuer: string;
8
+ color: string;
9
+ storage: string;
10
+ memory: string;
11
+ connectivity: string;
12
+ carrier_compatibility: string;
13
+ }
14
+ interface ItemVariant extends Item {
15
+ item_variant: string;
16
+ }
17
+ interface Model {
18
+ model_number: string;
19
+ sim_card_type: string;
20
+ connectivity: string;
21
+ }
22
+ interface Colour {
23
+ color: string;
24
+ hex: string;
25
+ color_system: string;
26
+ }
27
+ import { FrappeApp, FrappeAuth, FrappeCall } from "frappe-js-sdk";
28
+ import { FrappeDB } from "frappe-js-sdk/lib/db";
29
+ import { FrappeFileUpload } from "frappe-js-sdk/lib/file";
30
+ import { Socket } from "socket.io-client";
31
+ interface FrappeConfig {
32
+ /** The URL of your Frappe server */
33
+ url: string;
34
+ tokenParams?: TokenParams;
35
+ app: FrappeApp;
36
+ auth: FrappeAuth;
37
+ db: FrappeDB;
38
+ call: FrappeCall;
39
+ file: FrappeFileUpload;
40
+ socket?: Socket;
41
+ enableSocket?: boolean;
42
+ socketPort?: string;
43
+ }
44
+ interface FrappeError {
45
+ httpStatus: number;
46
+ httpStatusText: string;
47
+ message: string;
48
+ exception: string;
49
+ exc_type?: string;
50
+ traceback?: string;
51
+ _server_messages?: string;
52
+ }
53
+ interface TokenParams {
54
+ /** Whether to use token for API calls */
55
+ useToken: boolean;
56
+ /** Function that returns the token as a string - this could be fetched from LocalStorage or auth providers like Firebase, Auth0 etc. */
57
+ token?: () => string;
58
+ /** Type of token to be used for authentication */
59
+ type: "Bearer" | "token";
60
+ }
61
+ import { PropsWithChildren } from "react";
62
+ type FrappeProviderProps = PropsWithChildren<{
63
+ /** URL of the Frappe server
64
+ *
65
+ * Only needed if the URL of the window is not the same as the Frappe server URL */
66
+ url?: string;
67
+ /** Token parameters to be used for authentication
68
+ *
69
+ * Only needed for token based authentication */
70
+ tokenParams?: TokenParams;
71
+ /** Flag to disable socket, if needed. This defaults to true. */
72
+ enableSocket?: boolean;
73
+ /** Port on which Socket is running. Only meant for local development. Set to undefined on production. */
74
+ socketPort?: string;
75
+ /** Get this from frappe.local.site on the server, or frappe.boot.sitename on the window.
76
+ * Required for Socket connection to work in Frappe v15+
77
+ */
78
+ siteName?: string;
79
+ /** Custom Headers to be passed in each request */
80
+ customHeaders?: object;
81
+ }>;
82
+ declare const FrappeContext: React.Context<null | FrappeConfig>;
83
+ declare const FrappeProvider: React.FC<FrappeProviderProps>;
84
+ import { AuthCredentials, AuthResponse } from "frappe-js-sdk/lib/auth/types";
85
+ /**
86
+ * Hook to start listening to user state and provides functions to login/logout
87
+ *
88
+ * @param options - [Optional] SWRConfiguration options for fetching current logged in user
89
+ * @returns Returns an object with the following properties: currentUser, loading, error, and functions to login, logout and updateCurrentUser
90
+ */
91
+ declare const useFrappeAuth: () => {
92
+ /** The current logged in user. Will be null/undefined if user is not logged in */
93
+ currentUser: string | null | undefined;
94
+ /** Will be true when the hook is fetching user data */
95
+ isLoading: boolean;
96
+ /** Will be true when the hook is fetching (or revalidating) the user state. (Refer to isValidating in useSWR) */
97
+ isValidating: boolean;
98
+ /** Error object returned from API call */
99
+ error: Error | null | undefined;
100
+ /** Function to login the user with email and password */
101
+ login: (credentials: AuthCredentials) => Promise<AuthResponse>;
102
+ /** Function to log the user out */
103
+ logout: () => Promise<any>;
104
+ /** Function to fetch updated user state */
105
+ updateCurrentUser: () => void;
106
+ /** Function to get the user cookie and */
107
+ getUserCookie: () => void;
108
+ };
109
+ /**
110
+ * Hook to make a GET request to the server
111
+ *
112
+ * @param method - name of the method to call (will be dotted path e.g. "frappe.client.get_list")
113
+ * @param params - parameters to pass to the method
114
+ * @param options - optional query options
115
+ * @param type - type of the request to make - defaults to GET
116
+ *
117
+ * @typeParam T - Type of the data returned by the method
118
+ * @returns an object with the following properties: data, error, isLoading, isFetching, and refetch
119
+ *
120
+ * @example
121
+ *
122
+ * const { data, error, isLoading } = useFrappeGetCall("ping")
123
+ *
124
+ */
125
+ declare const useFrappeGetCall: <T = any>(method: string, params?: Record<string, any>, options?: {
126
+ enabled?: boolean;
127
+ staleTime?: number;
128
+ retry?: boolean | number;
129
+ }, type?: "GET" | "POST") => {
130
+ data: T | undefined;
131
+ error: FrappeError | null;
132
+ isLoading: boolean;
133
+ isFetching: boolean;
134
+ refetch: () => void;
135
+ };
136
+ interface FrappeMutationResult<T = any> {
137
+ call: (params: Record<string, any>) => Promise<T>;
138
+ result: T | null;
139
+ loading: boolean;
140
+ error: FrappeError | null;
141
+ isCompleted: boolean;
142
+ reset: () => void;
143
+ }
144
+ /**
145
+ *
146
+ * @param method - name of the method to call (POST request) (will be dotted path e.g. "frappe.client.set_value")
147
+ * @returns an object with the following properties: loading, error, isCompleted , result, and call and reset functions
148
+ *
149
+ * @example
150
+ *
151
+ * const { call, result, loading, error, isCompleted, reset } = useFrappePostCall("frappe.client.set_value")
152
+ *
153
+ * const onSubmit = async () => {
154
+ * const message = await call({ doctype: "User", docname: "test@example.com", fieldname: "full_name", value: "John Doe" })
155
+ * }
156
+ *
157
+ */
158
+ declare const useFrappePostCall: <T = any>(method: string) => FrappeMutationResult<T>;
159
+ /**
160
+ *
161
+ * @param method - name of the method to call (PUT request) (will be dotted path e.g. "frappe.client.set_value")
162
+ * @returns an object with the following properties: loading, error, isCompleted , result, and call and reset functions
163
+ *
164
+ * @example
165
+ *
166
+ * const { call, result, loading, error, isCompleted, reset } = useFrappePutCall("frappe.client.set_value")
167
+ *
168
+ * const onSubmit = async () => {
169
+ * const message = await call({ doctype: "User", docname: "test@example.com", fieldname: "full_name", value: "John Doe" })
170
+ * }
171
+ */
172
+ declare const useFrappePutCall: <T = any>(method: string) => FrappeMutationResult<T>;
173
+ /**
174
+ *
175
+ * @param method - name of the method to call (DELETE request) (will be dotted path e.g. "frappe.client.delete")
176
+ * @returns an object with the following properties: loading, error, isCompleted , result, and call and reset functions
177
+ *
178
+ * @example
179
+ *
180
+ * const { call, result, loading, error, isCompleted, reset } = useFrappeDeleteCall("frappe.client.delete")
181
+ *
182
+ * const onSubmit = async () => {
183
+ * const message = await call({ doctype: "User", docname: "test@example.com" })
184
+ * }
185
+ */
186
+ declare const useFrappeDeleteCall: <T = any>(method: string) => FrappeMutationResult<T>;
187
+ import { Filter } from "frappe-js-sdk/lib/db/types";
188
+ /**
189
+ * Hook to fetch number of documents from the database
190
+ *
191
+ *
192
+ * @param doctype - The doctype to fetch
193
+ * @param filters - filters to apply to the query
194
+ * @param debug - Whether to log debug messages or not. Defaults to false
195
+ * @param options [Optional] SWRConfiguration options for fetching data
196
+ * @returns an object (SWRResponse) with the following properties: data (number), error, isValidating, and mutate
197
+ *
198
+ * @example
199
+ *
200
+ * const { data, error, isLoading, mutate } = useFrappeGetDocCount("User")
201
+ *
202
+ */
203
+ declare const useFrappeGetDocCount: <T = any>(doctype: string, filters?: Filter<T>[], debug?: boolean, options?: {
204
+ staleTime?: number;
205
+ retry?: boolean | number;
206
+ }) => {
207
+ data: number | undefined;
208
+ error: FrappeError | null;
209
+ isLoading: boolean;
210
+ isFetching: boolean;
211
+ refetch: () => void;
212
+ };
213
+ import { FrappeDoc } from "frappe-js-sdk/lib/db/types";
214
+ /**
215
+ * Hook to create a document in the database and maintain loading and error states
216
+ * @returns Object with the following properties: loading, error, isCompleted and createDoc and reset functions
217
+ *
218
+ * @example
219
+ *
220
+ * const { createDoc, loading, error, isCompleted, reset } = useFrappeCreateDoc()
221
+ *
222
+ * const onSubmit = async () => {
223
+ * const doc = await createDoc("User", { name: "John Doe", email: "john.doe@example.com" })
224
+ * }
225
+ */
226
+ declare const useFrappeCreateDoc: <T = any>() => {
227
+ createDoc: (doctype: string, doc: T) => Promise<FrappeDoc<T>>;
228
+ loading: boolean;
229
+ error: FrappeError | null;
230
+ isCompleted: boolean;
231
+ reset: () => void;
232
+ };
233
+ /**
234
+ * Hook to delete a document in the database and maintain loading and error states
235
+ * @returns Object with the following properties: loading, error, isCompleted and deleteDoc and reset functions
236
+ *
237
+ * @example
238
+ *
239
+ * const { deleteDoc, loading, error, isCompleted, reset } = useFrappeDeleteDoc()
240
+ *
241
+ * const onDelete = async () => {
242
+ * const message = await deleteDoc("User", "test@example.com")
243
+ * }
244
+ */
245
+ declare const useFrappeDeleteDoc: <T = any>() => {
246
+ deleteDoc: (doctype: string, docname?: string | null) => Promise<{
247
+ message: string;
248
+ }>;
249
+ loading: boolean;
250
+ error: FrappeError | null;
251
+ isCompleted: boolean;
252
+ reset: () => void;
253
+ };
254
+ /** useFrappeEventListener hook for listening to events from the server
255
+ * @param eventName - name of the event to listen to
256
+ * @param callback - callback function to be called when the event is triggered. The callback function will receive the data sent from the server. It is recommended to memoize this function.
257
+ *
258
+ * @example
259
+ * ```typescript
260
+ * useFrappeEventListener('my_event', (data) => {
261
+ * // do something with the data
262
+ * if(data.status === 'success') {
263
+ * console.log('success')
264
+ * }
265
+ * })
266
+ * ```
267
+ */
268
+ declare const useFrappeEventListener: <T = any>(eventName: string, callback: (eventData: T) => void) => void;
269
+ interface ViewerEventData {
270
+ doctype: string;
271
+ docname: string;
272
+ users: string[];
273
+ }
274
+ interface DocumentUpdateEventData {
275
+ doctype: string;
276
+ name: string;
277
+ modified: string;
278
+ }
279
+ /**
280
+ * Hook for listening to document events.
281
+ * The hook will automatically subscribe to the document room, and unsubscribe when the component unmounts.
282
+ * The hook listens to the following events:
283
+ * - doc_update: This is triggered when the document is updated. The callback function will receive the updated document.
284
+ * - doc_viewers: This is triggered when the list of viewers of the document changes. The hook will update the viewers state with the list of viewers.
285
+ *
286
+ * @param doctype Name of the doctype
287
+ * @param docname Name of the document
288
+ * @param emitOpenCloseEventsOnMount [Optional] If true, the hook will emit doc_open and doc_close events on mount and unmount respectively. Defaults to true.
289
+ * @param onUpdateCallback Function to be called when the document is updated. It is recommended to memoize this function.
290
+ * @returns viewers - array of userID's, emitDocOpen - function to emit doc_open event, emitDocClose - function to emit doc_close event
291
+ */
292
+ declare const useFrappeDocumentEventListener: (doctype: string, docname: string, onUpdateCallback: (eventData: DocumentUpdateEventData) => void, emitOpenCloseEventsOnMount?: boolean) => {
293
+ viewers: string[];
294
+ emitDocOpen: () => void;
295
+ emitDocClose: () => void;
296
+ };
297
+ interface DocTypeListUpdateEventData {
298
+ doctype: string;
299
+ name: string;
300
+ user: string;
301
+ }
302
+ /**
303
+ * Hook for listening to doctype events.
304
+ * The hook will automatically subscribe to the doctype room, and unsubscribe when the component unmounts.
305
+ * The hook listens to the following event:
306
+ * - list_update: This is triggered when a document of the doctype is updated (created, modified or deleted). The callback function will receive the updated document.
307
+ *
308
+ * @param doctype Name of the doctype
309
+ * @param onListUpdateCallback Function to be called when the document is updated. It is recommended to memoize this function.
310
+ */
311
+ declare const useFrappeDocTypeEventListener: (doctype: string, onListUpdateCallback: (eventData: DocTypeListUpdateEventData) => void) => void;
312
+ import { FileArgs } from "frappe-js-sdk/lib/file/types";
313
+ interface FrappeFileUploadResponse {
314
+ /** Name of the file document in the database */
315
+ name: string;
316
+ owner: string;
317
+ creation: string;
318
+ modified: string;
319
+ modified_by: string;
320
+ docstatus: 0 | 1 | 2;
321
+ idx: number;
322
+ /** Name of the uploaded file */
323
+ file_name: string;
324
+ /** File is not accessible by guest users */
325
+ is_private: 1 | 0;
326
+ is_home_folder: 0 | 1;
327
+ is_attachments_folder: 0 | 1;
328
+ /** File size in bytes */
329
+ file_size: number;
330
+ /** Path of the file ex: /private/files/file_name.jpg */
331
+ file_url: string;
332
+ folder: string;
333
+ is_folder: 0 | 1;
334
+ /** Doctype the file is linked to */
335
+ attached_to_doctype: string;
336
+ /** Document the file is linked to */
337
+ attached_to_name: string;
338
+ content_hash: string;
339
+ uploaded_to_dropbox: 0 | 1;
340
+ uploaded_to_google_drive: 0 | 1;
341
+ doctype: "File";
342
+ }
343
+ interface UseFrappeFileUploadReturnType<T = any> {
344
+ /** Function to upload the file */
345
+ upload: (file: File, args: FileArgs<T>, apiPath?: string) => Promise<FrappeFileUploadResponse>;
346
+ /** Upload Progress in % - rounded off */
347
+ progress: number;
348
+ /** Will be true when the file is being uploaded */
349
+ loading: boolean;
350
+ /** Error object returned from API call */
351
+ error: Error | null;
352
+ /** Will be true if file upload is successful. Else false */
353
+ isCompleted: boolean;
354
+ /** Function to reset the state of the hook */
355
+ reset: () => void;
356
+ }
357
+ /**
358
+ * Hook to upload files to the server
359
+ *
360
+ * @returns an object with the following properties: loading, error, isCompleted , result, and call and reset functions
361
+ *
362
+ * @example
363
+ *
364
+ * const { upload, progress, loading, error, isCompleted, reset } = useFrappeFileUpload()
365
+ *
366
+ * const onSubmit = async () => {
367
+ * const message = await upload(myFile, { doctype: "User", docname: "test@example.com", fieldname: "profile_pic", is_private: 1 })
368
+ * }
369
+ */
370
+ declare const useFrappeFileUpload: <T = any>() => UseFrappeFileUploadReturnType<T>;
371
+ import { FrappeDoc as FrappeDoc2 } from "frappe-js-sdk/lib/db/types";
372
+ /**
373
+ * Hook to fetch a document from the database
374
+ *
375
+ *
376
+ * @param doctype - The doctype to fetch
377
+ * @param name - the name of the document to fetch
378
+ * @param options [Optional] SWRConfiguration options for fetching data
379
+ * @returns an object (SWRResponse) with the following properties: data, error, isValidating, and mutate
380
+ *
381
+ * @typeParam T - The type of the document
382
+ *
383
+ * @example
384
+ *
385
+ * const { data, error, isLoading, mutate } = useFrappeGetDoc("User", "test")
386
+ *
387
+ * if (isLoading) {
388
+ * return <div>Loading...</div>
389
+ * }
390
+ *
391
+ * if (error) {
392
+ * return <div>Error: {error.message}</div>
393
+ * }
394
+ *
395
+ * return <div>{data?.name} - {data?.email}</div>
396
+ */
397
+ declare const useFrappeGetDoc: <T = any>(doctype: string, name?: string, options?: {
398
+ staleTime?: number;
399
+ retry?: boolean | number;
400
+ }) => {
401
+ data: FrappeDoc2<T> | undefined;
402
+ error: FrappeError | null;
403
+ isLoading: boolean;
404
+ isFetching: boolean;
405
+ refetch: () => void;
406
+ };
407
+ import { FrappeDoc as FrappeDoc3, GetDocListArgs } from "frappe-js-sdk/lib/db/types";
408
+ /**
409
+ * Hook to fetch a list of documents from the database
410
+ *
411
+ * @param doctype Name of the doctype to fetch
412
+ * @param args Arguments to pass (filters, pagination, etc)
413
+ * @param options [Optional] SWRConfiguration options for fetching data
414
+ * @returns an object (SWRResponse) with the following properties: data, error, isValidating, and mutate
415
+ *
416
+ * @typeParam T - The type definition of the document object
417
+ *
418
+ * @example
419
+ *
420
+ * const { data, error, isLoading, mutate } = useFrappeGetDocList("User")
421
+ *
422
+ * if (isLoading) {
423
+ * return <div>Loading...</div>
424
+ * }
425
+ *
426
+ * if (error) {
427
+ * return <div>Error: {error.message}</div>
428
+ * }
429
+ *
430
+ * return <ul>{data?.map((user) => <li key={user.name}>{user.name}</li>)}</ul>
431
+ *
432
+ */
433
+ declare const useFrappeGetDocList: <
434
+ T = any,
435
+ K = FrappeDoc3<T>
436
+ >(doctype: string, args?: GetDocListArgs<K>, options?: {
437
+ staleTime?: number;
438
+ retry?: boolean | number;
439
+ }) => {
440
+ data: T[] | undefined;
441
+ error: FrappeError | null;
442
+ isLoading: boolean;
443
+ isFetching: boolean;
444
+ refetch: () => void;
445
+ };
446
+ /**
447
+ * Hook to prefetch a document from the database
448
+ * @param doctype - The doctype to fetch
449
+ * @param name - The name of the document to fetch
450
+ * @param swrKey - The SWRKey to use for caching the result - optional
451
+ * @param options - The SWRConfiguration options for fetching data
452
+ * @returns A function to prefetch the document
453
+ *
454
+ * @example
455
+ *
456
+ * const preloadDoc = useFrappePrefetchDoc("User", "test@example.com")
457
+ *
458
+ * // Call the function when you want to prefetch the document
459
+ * const onHover = () => {
460
+ * preloadDoc()
461
+ * }
462
+ */
463
+ declare const useFrappePrefetchDoc: <T = any>(doctype: string, name?: string, options?: {
464
+ staleTime?: number;
465
+ }) => (() => void);
466
+ import { Filter as Filter2 } from "frappe-js-sdk/lib/db/types";
467
+ interface SearchResult {
468
+ value: string;
469
+ label: string;
470
+ description: string;
471
+ }
472
+ /**
473
+ * Hook to search for documents - only works with Frappe v15+
474
+ *
475
+ * @param doctype - name of the doctype (table) where we are performing our search
476
+ * @param text - search text
477
+ * @param filters - (optional) the results will be filtered based on these
478
+ * @param limit - (optional) the number of results to return. Defaults to 20
479
+ * @param debounce - (optional) the number of milliseconds to wait before making the API call. Defaults to 250ms.
480
+ * @returns result - array of type SearchResult with a list of suggestions based on search text
481
+ *
482
+ * @example
483
+ *
484
+ * const [searchText, setSearchText] = useState("")
485
+ * const { data, error, isLoading, mutate } = useSearch("User", searchText)
486
+ */
487
+ declare const useSearch: (doctype: string, text: string, filters?: Filter2[], limit?: number, debounce?: number) => {
488
+ data: {
489
+ message: SearchResult[];
490
+ } | undefined;
491
+ error: FrappeError | null;
492
+ isLoading: boolean;
493
+ isFetching: boolean;
494
+ refetch: () => void;
495
+ };
496
+ import { FrappeDoc as FrappeDoc4 } from "frappe-js-sdk/lib/db/types";
497
+ /**
498
+ * Hook to update a document in the database and maintain loading and error states
499
+ * @returns Object with the following properties: loading, error, isCompleted and updateDoc and reset functions
500
+ *
501
+ * @example
502
+ *
503
+ * const { updateDoc, loading, error, isCompleted, reset } = useFrappeUpdateDoc()
504
+ *
505
+ * const onSubmit = async () => {
506
+ * const doc = await updateDoc("User", "test@example.com", { name: "John Doe", email: "john.doe@example.com" })
507
+ * }
508
+ */
509
+ declare const useFrappeUpdateDoc: <T = any>() => {
510
+ updateDoc: (doctype: string, docname: string | null, doc: Partial<T>) => Promise<FrappeDoc4<T>>;
511
+ loading: boolean;
512
+ error: FrappeError | null;
513
+ isCompleted: boolean;
514
+ reset: () => void;
515
+ };
516
+ interface Globals {
517
+ header: Header;
518
+ footer: Footer;
519
+ }
520
+ interface Brand {
521
+ brandImage?: string;
522
+ }
523
+ interface NavbarItem {
524
+ label: string;
525
+ enableDropdown: boolean;
526
+ enableLink: boolean;
527
+ link?: string;
528
+ dropdownDescription?: string;
529
+ dropdownCTALabel?: string;
530
+ dropdownCTALink?: string;
531
+ groups?: NavbarSubItemGroup[];
532
+ }
533
+ interface NavbarSubItemGroup {
534
+ title: string;
535
+ items: NavbarSubItem[];
536
+ }
537
+ interface NavbarSubItem {
538
+ label: string;
539
+ description?: string;
540
+ image?: string;
541
+ link?: string;
542
+ }
543
+ interface Topbar {
544
+ enabled: boolean;
545
+ layout: string;
546
+ items: TopbarItem[];
547
+ }
548
+ interface TopbarItem {
549
+ icon?: string;
550
+ label: string;
551
+ link?: string;
552
+ }
553
+ interface Header {
554
+ headerType?: string;
555
+ brand: Brand;
556
+ tabs: NavbarItem[];
557
+ topbar: Topbar;
558
+ }
559
+ interface FooterItemGroup {
560
+ title: string;
561
+ items: FooterItem[];
562
+ }
563
+ interface FooterItem {
564
+ label: string;
565
+ link?: string;
566
+ }
567
+ interface Footer {
568
+ footerType?: string;
569
+ groups: FooterItemGroup[];
570
+ copyright?: string;
571
+ address?: string;
572
+ country?: string;
573
+ phone?: string;
574
+ email?: string;
575
+ }
576
+ interface Hero {
577
+ type: string;
578
+ data: Record<string, unknown>;
579
+ }
580
+ interface Block {
581
+ type: string;
582
+ data: Record<string, unknown>;
583
+ }
584
+ interface Page {
585
+ slug: string;
586
+ hero?: Hero;
587
+ blocks: Block[];
588
+ }
589
+ import { camelize, decamelize, camelizeKeys, decamelizeKeys } from "humps";
590
+ declare function equalsIgnoreCase(str1: string, str2: string): boolean;
591
+ export { useSearch, useFrappeUpdateDoc, useFrappePutCall, useFrappePrefetchDoc, useFrappePostCall, useFrappeGetDocList, useFrappeGetDocCount, useFrappeGetDoc, useFrappeGetCall, useFrappeFileUpload, useFrappeEventListener, useFrappeDocumentEventListener, useFrappeDocTypeEventListener, useFrappeDeleteDoc, useFrappeDeleteCall, useFrappeCreateDoc, useFrappeAuth, equalsIgnoreCase, decamelizeKeys, decamelize, camelizeKeys, camelize, ViewerEventData, UseFrappeFileUploadReturnType, TopbarItem, Topbar, TokenParams, SearchResult, Page, NavbarSubItemGroup, NavbarSubItem, NavbarItem, Model, ItemVariant, Item, Hero, Header, Globals, FrappeProviderProps, FrappeProvider, FrappeMutationResult, FrappeFileUploadResponse, FrappeError, FrappeContext, FrappeConfig, FooterItemGroup, FooterItem, Footer, DocumentUpdateEventData, DocTypeListUpdateEventData, Colour, Brand, Block };