@faasjs/react 0.0.3-beta.10 → 0.0.3-beta.101

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/README.md CHANGED
@@ -10,18 +10,23 @@ React plugin for FaasJS.
10
10
 
11
11
  ## Install
12
12
 
13
- npm install @faasjs/react
13
+ npm install @faasjs/react react react-dom
14
14
 
15
15
  ## Modules
16
16
 
17
17
  ### Classes
18
18
 
19
- - [FaasBrowserClient](classes/FaasBrowserClient.md)
19
+ - [ErrorBoundary](classes/ErrorBoundary.md)
20
20
  - [Response](classes/Response.md)
21
21
  - [ResponseError](classes/ResponseError.md)
22
22
 
23
+ ### Interfaces
24
+
25
+ - [ErrorBoundaryProps](interfaces/ErrorBoundaryProps.md)
26
+
23
27
  ### Type Aliases
24
28
 
29
+ - [ErrorChildrenProps](#errorchildrenprops)
25
30
  - [FaasAction](#faasaction)
26
31
  - [FaasData](#faasdata)
27
32
  - [FaasDataInjection](#faasdatainjection)
@@ -30,6 +35,7 @@ React plugin for FaasJS.
30
35
  - [FaasReactClientInstance](#faasreactclientinstance)
31
36
  - [Options](#options)
32
37
  - [ResponseHeaders](#responseheaders)
38
+ - [useFaasOptions](#usefaasoptions)
33
39
 
34
40
  ### Functions
35
41
 
@@ -41,6 +47,21 @@ React plugin for FaasJS.
41
47
 
42
48
  ## Type Aliases
43
49
 
50
+ ### ErrorChildrenProps
51
+
52
+ Ƭ **ErrorChildrenProps**: `Object`
53
+
54
+ #### Type declaration
55
+
56
+ | Name | Type |
57
+ | :------ | :------ |
58
+ | `error?` | `Error` |
59
+ | `errorDescription?` | `string` |
60
+ | `errorMessage?` | `string` |
61
+ | `info?` | `any` |
62
+
63
+ ___
64
+
44
65
  ### FaasAction
45
66
 
46
67
  Ƭ **FaasAction**: `FaasActionPaths` \| `Record`<`string`, `any`\>
@@ -80,12 +101,13 @@ Injects FaasData props.
80
101
  | `error` | `any` |
81
102
  | `loading` | `boolean` |
82
103
  | `params` | `Record`<`string`, `any`\> |
83
- | `promise` | `Promise`<[`Response`](classes/Response.md)<`Data`\>\> |
104
+ | `promise` | `Promise`<`Response`<`Data`\>\> |
105
+ | `reloadTimes` | `number` |
84
106
  | `setData` | `React.Dispatch`<`React.SetStateAction`<`Data`\>\> |
85
107
  | `setError` | `React.Dispatch`<`React.SetStateAction`<`any`\>\> |
86
108
  | `setLoading` | `React.Dispatch`<`React.SetStateAction`<`boolean`\>\> |
87
- | `setPromise` | `React.Dispatch`<`React.SetStateAction`<`Promise`<[`Response`](classes/Response.md)<`Data`\>\>\>\> |
88
- | `reload` | (`params?`: `Record`<`string`, `any`\>) => `Promise`<[`Response`](classes/Response.md)<`Data`\>\> |
109
+ | `setPromise` | `React.Dispatch`<`React.SetStateAction`<`Promise`<`Response`<`Data`\>\>\>\> |
110
+ | `reload` | (`params?`: `Record`<`string`, `any`\>) => `Promise`<`any`\> |
89
111
 
90
112
  ___
91
113
 
@@ -97,19 +119,20 @@ ___
97
119
 
98
120
  | Name | Type |
99
121
  | :------ | :------ |
100
- | `PathOrData` | extends [`FaasAction`](#faasaction) |
122
+ | `PathOrData` | extends `FaasAction` |
101
123
 
102
124
  #### Type declaration
103
125
 
104
126
  | Name | Type | Description |
105
127
  | :------ | :------ | :------ |
106
128
  | `action` | `string` | - |
107
- | `data?` | [`FaasData`](#faasdata)<`PathOrData`\> | use custom data, should work with setData |
129
+ | `children?` | `React.ReactElement`<`Partial`<[`FaasDataInjection`](#faasdatainjection)\>\> | - |
130
+ | `data?` | `FaasData`<`PathOrData`\> | use custom data, should work with setData |
108
131
  | `fallback?` | `JSX.Element` \| ``false`` | - |
109
- | `params?` | [`FaasParams`](#faasparams)<`PathOrData`\> | - |
110
- | `setData?` | `React.Dispatch`<`React.SetStateAction`<[`FaasData`](#faasdata)<`PathOrData`\>\>\> | use custom setData, should work with data |
111
- | `onDataChange?` | (`args`: [`FaasDataInjection`](#faasdatainjection)<[`FaasData`](#faasdata)<`PathOrData`\>\>) => `void` | - |
112
- | `render?` | (`args`: [`FaasDataInjection`](#faasdatainjection)<[`FaasData`](#faasdata)<`PathOrData`\>\>) => `Element` \| `Element`[] | - |
132
+ | `params?` | `FaasParams`<`PathOrData`\> | - |
133
+ | `setData?` | `React.Dispatch`<`React.SetStateAction`<`FaasData`<`PathOrData`\>\>\> | use custom setData, should work with data |
134
+ | `onDataChange?` | (`args`: [`FaasDataInjection`](#faasdatainjection)<`FaasData`<`PathOrData`\>\>) => `void` | - |
135
+ | `render?` | (`args`: [`FaasDataInjection`](#faasdatainjection)<`FaasData`<`PathOrData`\>\>) => `Element` \| `Element`[] | - |
113
136
 
114
137
  ___
115
138
 
@@ -133,8 +156,9 @@ ___
133
156
 
134
157
  | Name | Type |
135
158
  | :------ | :------ |
136
- | `faas` | <PathOrData\>(`action`: `string` \| `PathOrData`, `params`: [`FaasParams`](#faasparams)<`PathOrData`\>) => `Promise`<[`Response`](classes/Response.md)<[`FaasData`](#faasdata)<`PathOrData`\>\>\> |
137
- | `useFaas` | <PathOrData\>(`action`: `string` \| `PathOrData`, `defaultParams`: [`FaasParams`](#faasparams)<`PathOrData`\>) => [`FaasDataInjection`](#faasdatainjection)<[`FaasData`](#faasdata)<`PathOrData`\>\> |
159
+ | `faas` | <PathOrData\>(`action`: `string` \| `PathOrData`, `params`: `FaasParams`<`PathOrData`\>) => `Promise`<`Response`<`FaasData`<`PathOrData`\>\>\> |
160
+ | `id` | `string` |
161
+ | `useFaas` | <PathOrData\>(`action`: `string` \| `PathOrData`, `defaultParams`: `FaasParams`<`PathOrData`\>, `options?`: [`useFaasOptions`](#usefaasoptions)<`PathOrData`\>) => [`FaasDataInjection`](#faasdatainjection)<`FaasData`<`PathOrData`\>\> |
138
162
  | `FaasDataWrapper` | <PathOrData\>(`props`: [`FaasDataWrapperProps`](#faasdatawrapperprops)<`PathOrData`\>) => `Element` |
139
163
 
140
164
  ___
@@ -155,6 +179,28 @@ ___
155
179
 
156
180
  ▪ [key: `string`]: `string`
157
181
 
182
+ ___
183
+
184
+ ### useFaasOptions
185
+
186
+ Ƭ **useFaasOptions**<`PathOrData`\>: `Object`
187
+
188
+ #### Type parameters
189
+
190
+ | Name | Type |
191
+ | :------ | :------ |
192
+ | `PathOrData` | extends `FaasAction` |
193
+
194
+ #### Type declaration
195
+
196
+ | Name | Type | Description |
197
+ | :------ | :------ | :------ |
198
+ | `data?` | `FaasData`<`PathOrData`\> | - |
199
+ | `debounce?` | `number` | send the last request after milliseconds |
200
+ | `params?` | `FaasParams`<`PathOrData`\> | - |
201
+ | `setData?` | `React.Dispatch`<`React.SetStateAction`<`FaasData`<`PathOrData`\>\>\> | - |
202
+ | `skip?` | `boolean` | - |
203
+
158
204
  ## Functions
159
205
 
160
206
  ### FaasDataWrapper
@@ -194,7 +240,7 @@ ___
194
240
 
195
241
  ### FaasReactClient
196
242
 
197
- ▸ **FaasReactClient**(`__namedParameters`): [`FaasReactClientInstance`](#faasreactclientinstance)
243
+ ▸ **FaasReactClient**(`«destructured»`): [`FaasReactClientInstance`](#faasreactclientinstance)
198
244
 
199
245
  Before use faas, you should initialize a FaasReactClient.
200
246
 
@@ -202,10 +248,10 @@ Before use faas, you should initialize a FaasReactClient.
202
248
 
203
249
  | Name | Type |
204
250
  | :------ | :------ |
205
- | `__namedParameters` | `Object` |
206
- | `__namedParameters.domain` | `string` |
207
- | `__namedParameters.onError?` | (`action`: `string`, `params`: `Record`<`string`, `any`\>) => (`res`: [`ResponseError`](classes/ResponseError.md)) => `Promise`<`void`\> |
208
- | `__namedParameters.options?` | [`Options`](#options) |
251
+ | `«destructured»` | `Object` |
252
+ | › `domain` | `string` |
253
+ | › `onError?` | (`action`: `string`, `params`: `Record`<`string`, `any`\>) => (`res`: [`ResponseError`](classes/ResponseError.md)) => `Promise`<`void`\> |
254
+ | › `options?` | [`Options`](#options) |
209
255
 
210
256
  #### Returns
211
257
 
@@ -276,7 +322,7 @@ ___
276
322
 
277
323
  ### useFaas
278
324
 
279
- ▸ **useFaas**<`PathOrData`\>(`action`, `defaultParams`): [`FaasDataInjection`](#faasdatainjection)<[`FaasData`](#faasdata)<`PathOrData`\>\>
325
+ ▸ **useFaas**<`PathOrData`\>(`action`, `defaultParams`, `options?`): [`FaasDataInjection`](#faasdatainjection)<[`FaasData`](#faasdata)<`PathOrData`\>\>
280
326
 
281
327
  Request faas server with React hook
282
328
 
@@ -292,6 +338,7 @@ Request faas server with React hook
292
338
  | :------ | :------ | :------ |
293
339
  | `action` | `string` \| `PathOrData` | {string} action name |
294
340
  | `defaultParams` | [`FaasParams`](#faasparams)<`PathOrData`\> | {object} initial action params |
341
+ | `options?` | [`useFaasOptions`](#usefaasoptions)<`PathOrData`\> | - |
295
342
 
296
343
  #### Returns
297
344
 
@@ -0,0 +1,159 @@
1
+ import { FaasAction as FaasAction$1, FaasParams as FaasParams$1, FaasData as FaasData$1 } from '@faasjs/types';
2
+ export { FaasAction, FaasData, FaasParams } from '@faasjs/types';
3
+ import { Options, ResponseError, Response as Response$1 } from '@faasjs/browser';
4
+ export { Options, Response, ResponseError, ResponseHeaders } from '@faasjs/browser';
5
+ import * as react_jsx_runtime from 'react/jsx-runtime';
6
+ import { ReactNode, ReactElement, Component } from 'react';
7
+
8
+ type FaasReactClientInstance = {
9
+ id: string
10
+ faas: <PathOrData extends FaasAction>(
11
+ action: string | PathOrData,
12
+ params: FaasParams<PathOrData>
13
+ ) => Promise<Response<FaasData<PathOrData>>>
14
+ useFaas: <PathOrData extends FaasAction>(
15
+ action: string | PathOrData,
16
+ defaultParams: FaasParams<PathOrData>,
17
+ options?: useFaasOptions<PathOrData>,
18
+ ) => FaasDataInjection<FaasData<PathOrData>>
19
+ FaasDataWrapper<PathOrData extends FaasAction>(props: FaasDataWrapperProps<PathOrData>): JSX.Element
20
+ }
21
+
22
+ /**
23
+ * Injects FaasData props.
24
+ */
25
+ type FaasDataInjection<Data = any> = {
26
+ action: string | any
27
+ params: Record<string, any>
28
+ loading: boolean
29
+ reloadTimes: number
30
+ data: Data
31
+ error: any
32
+ promise: Promise<Response<Data>>
33
+ reload(params?: Record<string, any>): Promise<Response<Data>>,
34
+ setData: React.Dispatch<React.SetStateAction<Data>>
35
+ setLoading: React.Dispatch<React.SetStateAction<boolean>>
36
+ setPromise: React.Dispatch<React.SetStateAction<Promise<Response<Data>>>>
37
+ setError: React.Dispatch<React.SetStateAction<any>>
38
+ }
39
+
40
+ type FaasDataWrapperProps<PathOrData extends FaasAction> = {
41
+ render?(args: FaasDataInjection<FaasData<PathOrData>>): JSX.Element | JSX.Element[]
42
+ children?: React.ReactElement<Partial<FaasDataInjection>>
43
+ fallback?: JSX.Element | false
44
+ action: string
45
+ params?: FaasParams<PathOrData>
46
+ onDataChange?(args: FaasDataInjection<FaasData<PathOrData>>): void
47
+ /** use custom data, should work with setData */
48
+ data?: FaasData<PathOrData>
49
+ /** use custom setData, should work with data */
50
+ setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>
51
+ }
52
+
53
+ type useFaasOptions<PathOrData extends FaasAction> = {
54
+ params?: FaasParams<PathOrData>
55
+ data?: FaasData<PathOrData>
56
+ setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>
57
+ skip?: boolean
58
+ /** send the last request after milliseconds */
59
+ debounce?: number
60
+ }
61
+
62
+ /**
63
+ * Before use faas, you should initialize a FaasReactClient.
64
+ *
65
+ * @param props.domain {string} The domain of your faas server
66
+ * @param props.options {Options} The options of client
67
+ * @returns {FaasReactClientInstance}
68
+ *
69
+ * ```ts
70
+ * const client = FaasReactClient({
71
+ * domain: 'localhost:8080/api'
72
+ * })
73
+ * ```
74
+ */
75
+ declare function FaasReactClient({ domain, options, onError }: {
76
+ domain: string;
77
+ options?: Options;
78
+ onError?: (action: string, params: Record<string, any>) => (res: ResponseError) => Promise<void>;
79
+ }): FaasReactClientInstance;
80
+ /**
81
+ * Get FaasReactClient instance
82
+ * @param domain {string} empty string for default domain
83
+ * @returns {FaasReactClientInstance}
84
+ *
85
+ * ```ts
86
+ * getClient()
87
+ * // or
88
+ * getClient('another-domain')
89
+ * ```
90
+ */
91
+ declare function getClient(domain?: string): FaasReactClientInstance;
92
+ /**
93
+ * Request faas server
94
+ *
95
+ * @param action {string} action name
96
+ * @param params {object} action params
97
+ * @returns {Promise<Response<any>>}
98
+ *
99
+ * ```ts
100
+ * faas<{ title: string }>('post/get', { id: 1 }).then(res => {
101
+ * console.log(res.data.title)
102
+ * })
103
+ * ```
104
+ */
105
+ declare function faas<PathOrData extends FaasAction$1>(action: string | PathOrData, params: FaasParams$1<PathOrData>): Promise<Response$1<FaasData$1<PathOrData>>>;
106
+ /**
107
+ * Request faas server with React hook
108
+ * @param action {string} action name
109
+ * @param defaultParams {object} initial action params
110
+ * @returns {FaasDataInjection<any>}
111
+ *
112
+ * ```ts
113
+ * function Post ({ id }) {
114
+ * const { data } = useFaas<{ title: string }>('post/get', { id })
115
+ * return <h1>{data.title}</h1>
116
+ * }
117
+ * ```
118
+ */
119
+ declare function useFaas<PathOrData extends FaasAction$1>(action: string | PathOrData, defaultParams: FaasParams$1<PathOrData>, options?: useFaasOptions<PathOrData>): FaasDataInjection<FaasData$1<PathOrData>>;
120
+ /**
121
+ * A data wrapper for react components
122
+ * @returns {JSX.Element}
123
+ *
124
+ * ```ts
125
+ * <FaasDataWrapper<{
126
+ * id: string
127
+ * title: string
128
+ * }>
129
+ * action='post/get'
130
+ * params={ { id: 1 } }
131
+ * render={ ({ data }) => <h1>{ data.title }</h1> }
132
+ * />
133
+ * ```
134
+ */
135
+ declare function FaasDataWrapper<PathOrData extends FaasAction$1>(props: FaasDataWrapperProps<PathOrData>): JSX.Element;
136
+
137
+ interface ErrorBoundaryProps {
138
+ children?: ReactNode;
139
+ onError?: (error: Error | null, info: any) => void;
140
+ errorChildren?: ReactElement<ErrorChildrenProps>;
141
+ }
142
+ type ErrorChildrenProps = {
143
+ error?: Error;
144
+ info?: any;
145
+ errorMessage?: string;
146
+ errorDescription?: string;
147
+ };
148
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, {
149
+ error?: Error;
150
+ info?: {
151
+ componentStack?: string;
152
+ };
153
+ }> {
154
+ constructor(props: ErrorBoundaryProps);
155
+ componentDidCatch(error: Error | null, info: any): void;
156
+ render(): string | number | boolean | react_jsx_runtime.JSX.Element | Iterable<ReactNode>;
157
+ }
158
+
159
+ export { ErrorBoundary, ErrorBoundaryProps, ErrorChildrenProps, FaasDataInjection, FaasDataWrapper, FaasDataWrapperProps, FaasReactClient, FaasReactClientInstance, faas, getClient, useFaas, useFaasOptions };
package/dist/index.d.ts CHANGED
@@ -1,44 +1,64 @@
1
- import { Response, Options, ResponseError } from '@faasjs/browser';
2
- export { FaasBrowserClient, Options, Response, ResponseError, ResponseHeaders } from '@faasjs/browser';
3
- import { FaasAction, FaasData, FaasParams } from '@faasjs/types';
1
+ import { FaasAction as FaasAction$1, FaasParams as FaasParams$1, FaasData as FaasData$1 } from '@faasjs/types';
4
2
  export { FaasAction, FaasData, FaasParams } from '@faasjs/types';
3
+ import { Options, ResponseError, Response as Response$1 } from '@faasjs/browser';
4
+ export { Options, Response, ResponseError, ResponseHeaders } from '@faasjs/browser';
5
+ import * as react_jsx_runtime from 'react/jsx-runtime';
6
+ import { ReactNode, ReactElement, Component } from 'react';
7
+
8
+ type FaasReactClientInstance = {
9
+ id: string
10
+ faas: <PathOrData extends FaasAction>(
11
+ action: string | PathOrData,
12
+ params: FaasParams<PathOrData>
13
+ ) => Promise<Response<FaasData<PathOrData>>>
14
+ useFaas: <PathOrData extends FaasAction>(
15
+ action: string | PathOrData,
16
+ defaultParams: FaasParams<PathOrData>,
17
+ options?: useFaasOptions<PathOrData>,
18
+ ) => FaasDataInjection<FaasData<PathOrData>>
19
+ FaasDataWrapper<PathOrData extends FaasAction>(props: FaasDataWrapperProps<PathOrData>): JSX.Element
20
+ }
5
21
 
6
22
  /**
7
23
  * Injects FaasData props.
8
24
  */
9
25
  type FaasDataInjection<Data = any> = {
10
- action: string | any;
11
- params: Record<string, any>;
12
- loading: boolean;
13
- data: Data;
14
- error: any;
15
- promise: Promise<Response<Data>>;
16
- reload(params?: Record<string, any>): Promise<Response<Data>>;
17
- setData: React.Dispatch<React.SetStateAction<Data>>;
18
- setLoading: React.Dispatch<React.SetStateAction<boolean>>;
19
- setPromise: React.Dispatch<React.SetStateAction<Promise<Response<Data>>>>;
20
- setError: React.Dispatch<React.SetStateAction<any>>;
21
- };
26
+ action: string | any
27
+ params: Record<string, any>
28
+ loading: boolean
29
+ reloadTimes: number
30
+ data: Data
31
+ error: any
32
+ promise: Promise<Response<Data>>
33
+ reload(params?: Record<string, any>): Promise<Response<Data>>,
34
+ setData: React.Dispatch<React.SetStateAction<Data>>
35
+ setLoading: React.Dispatch<React.SetStateAction<boolean>>
36
+ setPromise: React.Dispatch<React.SetStateAction<Promise<Response<Data>>>>
37
+ setError: React.Dispatch<React.SetStateAction<any>>
38
+ }
39
+
22
40
  type FaasDataWrapperProps<PathOrData extends FaasAction> = {
23
- render?(args: FaasDataInjection<FaasData<PathOrData>>): JSX.Element | JSX.Element[];
24
- fallback?: JSX.Element | false;
25
- action: string;
26
- params?: FaasParams<PathOrData>;
27
- onDataChange?(args: FaasDataInjection<FaasData<PathOrData>>): void;
28
- /** use custom data, should work with setData */
29
- data?: FaasData<PathOrData>;
30
- /** use custom setData, should work with data */
31
- setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>;
32
- };
33
- type FaasReactClientInstance = {
34
- faas: <PathOrData extends FaasAction>(action: string | PathOrData, params: FaasParams<PathOrData>) => Promise<Response<FaasData<PathOrData>>>;
35
- useFaas: <PathOrData extends FaasAction>(action: string | PathOrData, defaultParams: FaasParams<PathOrData>, options?: {
36
- data?: FaasData<PathOrData>;
37
- setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>;
38
- skip?: boolean;
39
- }) => FaasDataInjection<FaasData<PathOrData>>;
40
- FaasDataWrapper<PathOrData extends FaasAction>(props: FaasDataWrapperProps<PathOrData>): JSX.Element;
41
- };
41
+ render?(args: FaasDataInjection<FaasData<PathOrData>>): JSX.Element | JSX.Element[]
42
+ children?: React.ReactElement<Partial<FaasDataInjection>>
43
+ fallback?: JSX.Element | false
44
+ action: string
45
+ params?: FaasParams<PathOrData>
46
+ onDataChange?(args: FaasDataInjection<FaasData<PathOrData>>): void
47
+ /** use custom data, should work with setData */
48
+ data?: FaasData<PathOrData>
49
+ /** use custom setData, should work with data */
50
+ setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>
51
+ }
52
+
53
+ type useFaasOptions<PathOrData extends FaasAction> = {
54
+ params?: FaasParams<PathOrData>
55
+ data?: FaasData<PathOrData>
56
+ setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>
57
+ skip?: boolean
58
+ /** send the last request after milliseconds */
59
+ debounce?: number
60
+ }
61
+
42
62
  /**
43
63
  * Before use faas, you should initialize a FaasReactClient.
44
64
  *
@@ -82,7 +102,7 @@ declare function getClient(domain?: string): FaasReactClientInstance;
82
102
  * })
83
103
  * ```
84
104
  */
85
- declare function faas<PathOrData extends FaasAction>(action: string | PathOrData, params: FaasParams<PathOrData>): Promise<Response<FaasData<PathOrData>>>;
105
+ declare function faas<PathOrData extends FaasAction$1>(action: string | PathOrData, params: FaasParams$1<PathOrData>): Promise<Response$1<FaasData$1<PathOrData>>>;
86
106
  /**
87
107
  * Request faas server with React hook
88
108
  * @param action {string} action name
@@ -96,11 +116,7 @@ declare function faas<PathOrData extends FaasAction>(action: string | PathOrData
96
116
  * }
97
117
  * ```
98
118
  */
99
- declare function useFaas<PathOrData extends FaasAction>(action: string | PathOrData, defaultParams: FaasParams<PathOrData>, options?: {
100
- data?: FaasData<PathOrData>;
101
- setData?: React.Dispatch<React.SetStateAction<FaasData<PathOrData>>>;
102
- skip?: boolean;
103
- }): FaasDataInjection<FaasData<PathOrData>>;
119
+ declare function useFaas<PathOrData extends FaasAction$1>(action: string | PathOrData, defaultParams: FaasParams$1<PathOrData>, options?: useFaasOptions<PathOrData>): FaasDataInjection<FaasData$1<PathOrData>>;
104
120
  /**
105
121
  * A data wrapper for react components
106
122
  * @returns {JSX.Element}
@@ -116,6 +132,28 @@ declare function useFaas<PathOrData extends FaasAction>(action: string | PathOrD
116
132
  * />
117
133
  * ```
118
134
  */
119
- declare function FaasDataWrapper<PathOrData extends FaasAction>(props: FaasDataWrapperProps<PathOrData>): JSX.Element;
135
+ declare function FaasDataWrapper<PathOrData extends FaasAction$1>(props: FaasDataWrapperProps<PathOrData>): JSX.Element;
136
+
137
+ interface ErrorBoundaryProps {
138
+ children?: ReactNode;
139
+ onError?: (error: Error | null, info: any) => void;
140
+ errorChildren?: ReactElement<ErrorChildrenProps>;
141
+ }
142
+ type ErrorChildrenProps = {
143
+ error?: Error;
144
+ info?: any;
145
+ errorMessage?: string;
146
+ errorDescription?: string;
147
+ };
148
+ declare class ErrorBoundary extends Component<ErrorBoundaryProps, {
149
+ error?: Error;
150
+ info?: {
151
+ componentStack?: string;
152
+ };
153
+ }> {
154
+ constructor(props: ErrorBoundaryProps);
155
+ componentDidCatch(error: Error | null, info: any): void;
156
+ render(): string | number | boolean | react_jsx_runtime.JSX.Element | Iterable<ReactNode>;
157
+ }
120
158
 
121
- export { FaasDataInjection, FaasDataWrapper, FaasDataWrapperProps, FaasReactClient, FaasReactClientInstance, faas, getClient, useFaas };
159
+ export { ErrorBoundary, ErrorBoundaryProps, ErrorChildrenProps, FaasDataInjection, FaasDataWrapper, FaasDataWrapperProps, FaasReactClient, FaasReactClientInstance, faas, getClient, useFaas, useFaasOptions };
package/dist/index.js CHANGED
@@ -1,41 +1,17 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var browser = require('@faasjs/browser');
5
+ var jsxRuntime = require('react/jsx-runtime');
19
6
 
20
- // src/index.tsx
21
- var src_exports = {};
22
- __export(src_exports, {
23
- FaasDataWrapper: () => FaasDataWrapper,
24
- FaasReactClient: () => FaasReactClient,
25
- faas: () => faas,
26
- getClient: () => getClient,
27
- useFaas: () => useFaas
28
- });
29
- module.exports = __toCommonJS(src_exports);
30
- var import_browser = require("@faasjs/browser");
31
- var import_react = require("react");
7
+ // src/client.tsx
32
8
  var clients = {};
33
9
  function FaasReactClient({
34
10
  domain,
35
11
  options,
36
12
  onError
37
13
  }) {
38
- const client = new import_browser.FaasBrowserClient(domain, options);
14
+ const client = new browser.FaasBrowserClient(domain, options);
39
15
  async function faas2(action, params) {
40
16
  if (onError)
41
17
  return client.action(action, params).catch(async (res) => {
@@ -47,46 +23,63 @@ function FaasReactClient({
47
23
  function useFaas2(action, defaultParams, options2) {
48
24
  if (!options2)
49
25
  options2 = {};
50
- const [loading, setLoading] = (0, import_react.useState)(true);
51
- const [data, setData] = (0, import_react.useState)();
52
- const [error, setError] = (0, import_react.useState)();
53
- const [promise, setPromise] = (0, import_react.useState)();
54
- const [params, setParams] = (0, import_react.useState)(defaultParams);
55
- const [reloadTimes, setReloadTimes] = (0, import_react.useState)(0);
56
- (0, import_react.useEffect)(function() {
26
+ const [loading, setLoading] = react.useState(true);
27
+ const [data, setData] = react.useState();
28
+ const [error, setError] = react.useState();
29
+ const [promise, setPromise] = react.useState();
30
+ const [params, setParams] = react.useState(defaultParams);
31
+ const [reloadTimes, setReloadTimes] = react.useState(0);
32
+ const [fails, setFails] = react.useState(0);
33
+ react.useEffect(function() {
57
34
  if (JSON.stringify(defaultParams) !== JSON.stringify(params)) {
58
35
  setParams(defaultParams);
59
36
  }
60
37
  }, [JSON.stringify(defaultParams)]);
61
- (0, import_react.useEffect)(function() {
62
- if (options2 == null ? void 0 : options2.skip) {
38
+ react.useEffect(function() {
39
+ if (!action || (options2 == null ? void 0 : options2.skip)) {
63
40
  setLoading(false);
64
41
  return;
65
42
  }
66
43
  setLoading(true);
67
44
  const controller = new AbortController();
68
- const request = client.action(action, params, { signal: controller.signal });
69
- setPromise(request);
70
- request.then((r) => (options2 == null ? void 0 : options2.setData) ? options2.setData(r.data) : setData(r.data)).catch(async (e) => {
71
- if ((e == null ? void 0 : e.message) === "The user aborted a request.")
72
- return;
73
- if (onError)
74
- try {
75
- await onError(action, params)(e);
76
- } catch (error2) {
77
- setError(error2);
45
+ function send() {
46
+ const request = client.action(action, options2.params || params, { signal: controller.signal });
47
+ setPromise(request);
48
+ request.then((r) => (options2 == null ? void 0 : options2.setData) ? options2.setData(r.data) : setData(r.data)).catch(async (e) => {
49
+ if ((e == null ? void 0 : e.message) === "The user aborted a request." || (e == null ? void 0 : e.message) === "Aborted")
50
+ return;
51
+ if (!fails && typeof (e == null ? void 0 : e.message) === "string" && e.message.indexOf("Failed to fetch") >= 0) {
52
+ console.warn(`FaasReactClient: ${e.message} retry...`);
53
+ setFails(1);
54
+ return send();
78
55
  }
79
- else
80
- setError(e);
81
- return Promise.reject(e);
82
- }).finally(() => setLoading(false));
56
+ if (onError)
57
+ try {
58
+ await onError(action, params)(e);
59
+ } catch (error2) {
60
+ setError(error2);
61
+ }
62
+ else
63
+ setError(e);
64
+ return Promise.reject(e);
65
+ }).finally(() => setLoading(false));
66
+ }
67
+ if (options2 == null ? void 0 : options2.debounce) {
68
+ const timeout = setTimeout(send, options2.debounce);
69
+ return () => {
70
+ clearTimeout(timeout);
71
+ controller.abort();
72
+ setLoading(false);
73
+ };
74
+ }
75
+ send();
83
76
  return () => {
84
77
  controller.abort();
85
78
  setLoading(false);
86
79
  };
87
80
  }, [
88
81
  action,
89
- JSON.stringify(params),
82
+ JSON.stringify(options2.params || params),
90
83
  reloadTimes,
91
84
  options2.skip
92
85
  ]);
@@ -95,6 +88,7 @@ function FaasReactClient({
95
88
  params,
96
89
  loading,
97
90
  data: (options2 == null ? void 0 : options2.data) || data,
91
+ reloadTimes,
98
92
  error,
99
93
  promise,
100
94
  async reload(params2) {
@@ -110,6 +104,7 @@ function FaasReactClient({
110
104
  };
111
105
  }
112
106
  const reactClient = {
107
+ id: client.id,
113
108
  faas: faas2,
114
109
  useFaas: useFaas2,
115
110
  FaasDataWrapper({
@@ -117,6 +112,7 @@ function FaasReactClient({
117
112
  params,
118
113
  fallback,
119
114
  render,
115
+ children,
120
116
  onDataChange,
121
117
  data,
122
118
  setData
@@ -125,17 +121,21 @@ function FaasReactClient({
125
121
  data,
126
122
  setData
127
123
  });
128
- const [loaded, setLoaded] = (0, import_react.useState)(false);
129
- (0, import_react.useEffect)(function() {
124
+ const [loaded, setLoaded] = react.useState(false);
125
+ react.useEffect(function() {
130
126
  if (!loaded && !request.loading)
131
127
  setLoaded(true);
132
128
  }, [request.loading]);
133
- (0, import_react.useEffect)(function() {
129
+ react.useEffect(function() {
134
130
  if (onDataChange)
135
131
  onDataChange(request);
136
132
  }, [JSON.stringify(request.data)]);
137
- if (loaded)
138
- return render(request);
133
+ if (loaded) {
134
+ if (children)
135
+ return react.cloneElement(children, request);
136
+ if (render)
137
+ return render(request);
138
+ }
139
139
  return fallback || null;
140
140
  }
141
141
  };
@@ -155,21 +155,56 @@ function useFaas(action, defaultParams, options) {
155
155
  return getClient().useFaas(action, defaultParams, options);
156
156
  }
157
157
  function FaasDataWrapper(props) {
158
- const [client, setClient] = (0, import_react.useState)();
159
- (0, import_react.useEffect)(() => {
158
+ const [client, setClient] = react.useState();
159
+ react.useEffect(() => {
160
160
  if (client)
161
161
  return;
162
162
  setClient(getClient());
163
163
  }, []);
164
164
  if (!client)
165
165
  return props.fallback || null;
166
- return (0, import_react.createElement)(client.FaasDataWrapper, props);
166
+ return /* @__PURE__ */ jsxRuntime.jsx(client.FaasDataWrapper, { ...props });
167
167
  }
168
- // Annotate the CommonJS export names for ESM import in node:
169
- 0 && (module.exports = {
170
- FaasDataWrapper,
171
- FaasReactClient,
172
- faas,
173
- getClient,
174
- useFaas
175
- });
168
+ var ErrorBoundary = class extends react.Component {
169
+ constructor(props) {
170
+ super(props);
171
+ this.state = {
172
+ error: void 0,
173
+ info: { componentStack: "" }
174
+ };
175
+ }
176
+ componentDidCatch(error, info) {
177
+ this.setState({
178
+ error,
179
+ info
180
+ });
181
+ }
182
+ render() {
183
+ var _a;
184
+ const errorMessage = (this.state.error || "").toString();
185
+ const errorDescription = ((_a = this.state.info) == null ? void 0 : _a.componentStack) ? this.state.info.componentStack : null;
186
+ if (this.state.error) {
187
+ if (this.props.onError)
188
+ this.props.onError(this.state.error, this.state.info);
189
+ if (this.props.errorChildren)
190
+ return react.cloneElement(this.props.errorChildren, {
191
+ error: this.state.error,
192
+ info: this.state.info,
193
+ errorMessage,
194
+ errorDescription
195
+ });
196
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
197
+ /* @__PURE__ */ jsxRuntime.jsx("p", { children: errorMessage }),
198
+ /* @__PURE__ */ jsxRuntime.jsx("pre", { children: errorDescription })
199
+ ] });
200
+ }
201
+ return this.props.children;
202
+ }
203
+ };
204
+
205
+ exports.ErrorBoundary = ErrorBoundary;
206
+ exports.FaasDataWrapper = FaasDataWrapper;
207
+ exports.FaasReactClient = FaasReactClient;
208
+ exports.faas = faas;
209
+ exports.getClient = getClient;
210
+ exports.useFaas = useFaas;
package/dist/index.mjs CHANGED
@@ -1,12 +1,8 @@
1
- // src/index.tsx
2
- import {
3
- FaasBrowserClient
4
- } from "@faasjs/browser";
5
- import {
6
- useState,
7
- useEffect,
8
- createElement
9
- } from "react";
1
+ import { useState, useEffect, cloneElement, Component } from 'react';
2
+ import { FaasBrowserClient } from '@faasjs/browser';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ // src/client.tsx
10
6
  var clients = {};
11
7
  function FaasReactClient({
12
8
  domain,
@@ -31,40 +27,57 @@ function FaasReactClient({
31
27
  const [promise, setPromise] = useState();
32
28
  const [params, setParams] = useState(defaultParams);
33
29
  const [reloadTimes, setReloadTimes] = useState(0);
30
+ const [fails, setFails] = useState(0);
34
31
  useEffect(function() {
35
32
  if (JSON.stringify(defaultParams) !== JSON.stringify(params)) {
36
33
  setParams(defaultParams);
37
34
  }
38
35
  }, [JSON.stringify(defaultParams)]);
39
36
  useEffect(function() {
40
- if (options2 == null ? void 0 : options2.skip) {
37
+ if (!action || (options2 == null ? void 0 : options2.skip)) {
41
38
  setLoading(false);
42
39
  return;
43
40
  }
44
41
  setLoading(true);
45
42
  const controller = new AbortController();
46
- const request = client.action(action, params, { signal: controller.signal });
47
- setPromise(request);
48
- request.then((r) => (options2 == null ? void 0 : options2.setData) ? options2.setData(r.data) : setData(r.data)).catch(async (e) => {
49
- if ((e == null ? void 0 : e.message) === "The user aborted a request.")
50
- return;
51
- if (onError)
52
- try {
53
- await onError(action, params)(e);
54
- } catch (error2) {
55
- setError(error2);
43
+ function send() {
44
+ const request = client.action(action, options2.params || params, { signal: controller.signal });
45
+ setPromise(request);
46
+ request.then((r) => (options2 == null ? void 0 : options2.setData) ? options2.setData(r.data) : setData(r.data)).catch(async (e) => {
47
+ if ((e == null ? void 0 : e.message) === "The user aborted a request." || (e == null ? void 0 : e.message) === "Aborted")
48
+ return;
49
+ if (!fails && typeof (e == null ? void 0 : e.message) === "string" && e.message.indexOf("Failed to fetch") >= 0) {
50
+ console.warn(`FaasReactClient: ${e.message} retry...`);
51
+ setFails(1);
52
+ return send();
56
53
  }
57
- else
58
- setError(e);
59
- return Promise.reject(e);
60
- }).finally(() => setLoading(false));
54
+ if (onError)
55
+ try {
56
+ await onError(action, params)(e);
57
+ } catch (error2) {
58
+ setError(error2);
59
+ }
60
+ else
61
+ setError(e);
62
+ return Promise.reject(e);
63
+ }).finally(() => setLoading(false));
64
+ }
65
+ if (options2 == null ? void 0 : options2.debounce) {
66
+ const timeout = setTimeout(send, options2.debounce);
67
+ return () => {
68
+ clearTimeout(timeout);
69
+ controller.abort();
70
+ setLoading(false);
71
+ };
72
+ }
73
+ send();
61
74
  return () => {
62
75
  controller.abort();
63
76
  setLoading(false);
64
77
  };
65
78
  }, [
66
79
  action,
67
- JSON.stringify(params),
80
+ JSON.stringify(options2.params || params),
68
81
  reloadTimes,
69
82
  options2.skip
70
83
  ]);
@@ -73,6 +86,7 @@ function FaasReactClient({
73
86
  params,
74
87
  loading,
75
88
  data: (options2 == null ? void 0 : options2.data) || data,
89
+ reloadTimes,
76
90
  error,
77
91
  promise,
78
92
  async reload(params2) {
@@ -88,6 +102,7 @@ function FaasReactClient({
88
102
  };
89
103
  }
90
104
  const reactClient = {
105
+ id: client.id,
91
106
  faas: faas2,
92
107
  useFaas: useFaas2,
93
108
  FaasDataWrapper({
@@ -95,6 +110,7 @@ function FaasReactClient({
95
110
  params,
96
111
  fallback,
97
112
  render,
113
+ children,
98
114
  onDataChange,
99
115
  data,
100
116
  setData
@@ -112,8 +128,12 @@ function FaasReactClient({
112
128
  if (onDataChange)
113
129
  onDataChange(request);
114
130
  }, [JSON.stringify(request.data)]);
115
- if (loaded)
116
- return render(request);
131
+ if (loaded) {
132
+ if (children)
133
+ return cloneElement(children, request);
134
+ if (render)
135
+ return render(request);
136
+ }
117
137
  return fallback || null;
118
138
  }
119
139
  };
@@ -141,12 +161,43 @@ function FaasDataWrapper(props) {
141
161
  }, []);
142
162
  if (!client)
143
163
  return props.fallback || null;
144
- return createElement(client.FaasDataWrapper, props);
164
+ return /* @__PURE__ */ jsx(client.FaasDataWrapper, { ...props });
145
165
  }
146
- export {
147
- FaasDataWrapper,
148
- FaasReactClient,
149
- faas,
150
- getClient,
151
- useFaas
166
+ var ErrorBoundary = class extends Component {
167
+ constructor(props) {
168
+ super(props);
169
+ this.state = {
170
+ error: void 0,
171
+ info: { componentStack: "" }
172
+ };
173
+ }
174
+ componentDidCatch(error, info) {
175
+ this.setState({
176
+ error,
177
+ info
178
+ });
179
+ }
180
+ render() {
181
+ var _a;
182
+ const errorMessage = (this.state.error || "").toString();
183
+ const errorDescription = ((_a = this.state.info) == null ? void 0 : _a.componentStack) ? this.state.info.componentStack : null;
184
+ if (this.state.error) {
185
+ if (this.props.onError)
186
+ this.props.onError(this.state.error, this.state.info);
187
+ if (this.props.errorChildren)
188
+ return cloneElement(this.props.errorChildren, {
189
+ error: this.state.error,
190
+ info: this.state.info,
191
+ errorMessage,
192
+ errorDescription
193
+ });
194
+ return /* @__PURE__ */ jsxs("div", { children: [
195
+ /* @__PURE__ */ jsx("p", { children: errorMessage }),
196
+ /* @__PURE__ */ jsx("pre", { children: errorDescription })
197
+ ] });
198
+ }
199
+ return this.props.children;
200
+ }
152
201
  };
202
+
203
+ export { ErrorBoundary, FaasDataWrapper, FaasReactClient, faas, getClient, useFaas };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faasjs/react",
3
- "version": "0.0.3-beta.10",
3
+ "version": "0.0.3-beta.101",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -16,15 +16,15 @@
16
16
  },
17
17
  "funding": "https://github.com/sponsors/faasjs",
18
18
  "scripts": {
19
- "build": "tsup src/index.tsx --format esm,cjs",
20
- "build:types": "tsup-node src/index.tsx --dts-only"
19
+ "build": "tsup src/index.tsx --config ../../tsup.config.json"
21
20
  },
22
21
  "files": [
23
22
  "dist"
24
23
  ],
25
24
  "dependencies": {
26
- "@faasjs/browser": "^0.0.3-beta.10",
27
- "@faasjs/types": "^0.0.3-beta.10",
25
+ "@faasjs/browser": "0.0.3-beta.101"
26
+ },
27
+ "peerDependencies": {
28
28
  "react": "*"
29
29
  },
30
30
  "devDependencies": {