treege 3.0.0-beta.26 → 3.0.0-beta.27
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 +188 -24
- package/dist/ThemeContext-Cc71SvqK.js +410 -0
- package/dist/{TreegeEditor-WqTXkYl3.js → TreegeEditor-PuRxHufZ.js} +198 -197
- package/dist/TreegeRenderer-COBf5Nh3.js +1047 -0
- package/dist/editor.js +2 -2
- package/dist/main.js +54 -52
- package/dist/node-gfy3ym4p.js +340 -0
- package/dist/renderer/features/TreegeRenderer/native/TreegeRenderer.d.ts +20 -11
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultFormWrapper.d.ts +7 -7
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultGroup.d.ts +7 -7
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputs.d.ts +26 -15
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButton.d.ts +9 -7
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButtonWrapper.d.ts +11 -0
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultUI.d.ts +8 -7
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAddressInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAutocompleteInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultCheckboxInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultDateInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultDateRangeInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultFileInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultHiddenInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultHttpInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultNumberInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultPasswordInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultRadioInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSelectInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSwitchInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextareaInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTimeInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTimeRangeInput.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/useTreegeRenderer.d.ts +81 -23
- package/dist/renderer/features/TreegeRenderer/web/TreegeRenderer.d.ts +1 -1
- package/dist/renderer/hooks/useRenderNode.d.ts +55 -0
- package/dist/renderer/index.d.ts +1 -0
- package/dist/renderer/index.native.d.ts +19 -0
- package/dist/renderer/types/renderer.d.ts +20 -4
- package/dist/renderer/utils/sanitize.native.d.ts +69 -0
- package/dist/renderer/utils/submit.d.ts +1 -1
- package/dist/renderer-native.d.ts +2 -0
- package/dist/renderer-native.js +2979 -0
- package/dist/renderer.js +49 -47
- package/dist/shared/locales/ar.json.d.ts +13 -5
- package/dist/shared/locales/de.json.d.ts +13 -5
- package/dist/shared/locales/en.json.d.ts +13 -5
- package/dist/shared/locales/es.json.d.ts +13 -5
- package/dist/shared/locales/fr.json.d.ts +13 -5
- package/dist/shared/locales/it.json.d.ts +13 -5
- package/dist/shared/locales/pt.json.d.ts +13 -5
- package/dist/shared/types/node.d.ts +2 -2
- package/dist/useRenderNode-B9cpomOv.js +863 -0
- package/package.json +24 -1
- package/dist/ThemeContext-BIT4DHqC.js +0 -764
- package/dist/TreegeRenderer-BSR_ez96.js +0 -1812
|
@@ -1,15 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
1
|
+
import { default as DefaultAddressInput } from './inputs/DefaultAddressInput';
|
|
2
|
+
import { default as DefaultAutocompleteInput } from './inputs/DefaultAutocompleteInput';
|
|
3
|
+
import { default as DefaultCheckboxInput } from './inputs/DefaultCheckboxInput';
|
|
4
|
+
import { default as DefaultDateInput } from './inputs/DefaultDateInput';
|
|
5
|
+
import { default as DefaultDateRangeInput } from './inputs/DefaultDateRangeInput';
|
|
6
|
+
import { default as DefaultFileInput } from './inputs/DefaultFileInput';
|
|
7
|
+
import { default as DefaultHiddenInput } from './inputs/DefaultHiddenInput';
|
|
8
|
+
import { default as DefaultHttpInput } from './inputs/DefaultHttpInput';
|
|
9
|
+
import { default as DefaultNumberInput } from './inputs/DefaultNumberInput';
|
|
10
|
+
import { default as DefaultPasswordInput } from './inputs/DefaultPasswordInput';
|
|
11
|
+
import { default as DefaultRadioInput } from './inputs/DefaultRadioInput';
|
|
12
|
+
import { default as DefaultSelectInput } from './inputs/DefaultSelectInput';
|
|
13
|
+
import { default as DefaultSwitchInput } from './inputs/DefaultSwitchInput';
|
|
14
|
+
import { default as DefaultTextareaInput } from './inputs/DefaultTextareaInput';
|
|
15
|
+
import { default as DefaultTextInput } from './inputs/DefaultTextInput';
|
|
16
|
+
import { default as DefaultTimeInput } from './inputs/DefaultTimeInput';
|
|
17
|
+
import { default as DefaultTimeRangeInput } from './inputs/DefaultTimeRangeInput';
|
|
18
|
+
import { InputRenderers, InputRenderProps } from '../../../../types/renderer';
|
|
19
|
+
export { DefaultTextInput, DefaultNumberInput, DefaultPasswordInput, DefaultTextareaInput };
|
|
20
|
+
export { DefaultCheckboxInput, DefaultSwitchInput, DefaultRadioInput, DefaultSelectInput };
|
|
21
|
+
export { DefaultHiddenInput };
|
|
22
|
+
export { DefaultAddressInput, DefaultAutocompleteInput, DefaultHttpInput };
|
|
23
|
+
export { DefaultDateInput, DefaultDateRangeInput, DefaultTimeInput, DefaultTimeRangeInput };
|
|
24
|
+
export { DefaultFileInput };
|
|
25
|
+
export declare const DefaultSubmitInput: ({ node }: InputRenderProps<"submit">) => import("react/jsx-runtime").JSX.Element;
|
|
26
|
+
export declare const defaultInputRenderers: InputRenderers;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface DefaultSubmitButtonProps {
|
|
3
|
+
children?: ReactNode;
|
|
4
|
+
disabled?: boolean;
|
|
5
|
+
isSubmitting?: boolean;
|
|
6
|
+
onPress?: () => void;
|
|
7
|
+
}
|
|
8
|
+
declare const DefaultSubmitButton: ({ children, disabled, isSubmitting, onPress }: DefaultSubmitButtonProps) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default DefaultSubmitButton;
|
package/dist/renderer/features/TreegeRenderer/native/components/DefaultSubmitButtonWrapper.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
export interface SubmitButtonWrapperProps {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
missingFields?: string[];
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Default submit button wrapper for React Native
|
|
8
|
+
* Simple wrapper that renders children (no tooltip like web version)
|
|
9
|
+
*/
|
|
10
|
+
declare const DefaultSubmitButtonWrapper: ({ children }: SubmitButtonWrapperProps) => ReactNode;
|
|
11
|
+
export default DefaultSubmitButtonWrapper;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { UiRenderProps } from '../../../../types/renderer';
|
|
2
|
+
declare const DefaultTitleUI: ({ node }: UiRenderProps) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
declare const DefaultDividerUI: () => import("react/jsx-runtime").JSX.Element;
|
|
4
|
+
export { DefaultTitleUI, DefaultDividerUI };
|
|
5
|
+
export declare const defaultUI: {
|
|
6
|
+
divider: () => import("react/jsx-runtime").JSX.Element;
|
|
7
|
+
title: ({ node }: UiRenderProps) => import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
};
|
package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAddressInput.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultAddressInput: ({ node, value, setValue, error, label, placeholder, helperText, id: _id, name: _name, }: InputRenderProps<"address">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultAddressInput;
|
package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultAutocompleteInput.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultAutocompleteInput: ({ node, value, setValue, error, label, placeholder, helperText }: InputRenderProps<"autocomplete">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultAutocompleteInput;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultHttpInput: ({ node, value, setValue, error, label, placeholder, helperText, id: _id, name: _name, }: InputRenderProps<"http">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultHttpInput;
|
package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultNumberInput.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultNumberInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"number">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultNumberInput;
|
package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultPasswordInput.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultPasswordInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"password">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultPasswordInput;
|
package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultSelectInput.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultSelectInput: ({ node, value, setValue, error, label, placeholder, helperText }: InputRenderProps<"select">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultSelectInput;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultTextInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"text">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultTextInput;
|
package/dist/renderer/features/TreegeRenderer/native/components/inputs/DefaultTextareaInput.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { InputRenderProps } from '../../../../../types/renderer';
|
|
2
|
+
declare const DefaultTextareaInput: ({ node, value, setValue, error, label, placeholder, helperText, name }: InputRenderProps<"textarea">) => import("react/jsx-runtime").JSX.Element;
|
|
3
|
+
export default DefaultTextareaInput;
|
|
@@ -1,44 +1,97 @@
|
|
|
1
1
|
import { Node } from '@xyflow/react';
|
|
2
|
-
import { FormValues } from '../../types/renderer';
|
|
3
|
-
import {
|
|
2
|
+
import { FormValues, TreegeRendererProps } from '../../types/renderer';
|
|
3
|
+
import { TreegeNodeData } from '../../../shared/types/node';
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* Main TreegeRenderer hook
|
|
6
6
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* All state is keyed by nodeId for uniqueness.
|
|
7
|
+
* Manages all form state, configuration, validation, and submission logic.
|
|
8
|
+
* Can be used directly in custom components for headless mode.
|
|
10
9
|
*
|
|
11
10
|
* Responsibilities:
|
|
11
|
+
* - Config merging (props + global provider)
|
|
12
12
|
* - Form values state (keyed by nodeId)
|
|
13
13
|
* - Errors state
|
|
14
14
|
* - Node visibility calculation (progressive rendering)
|
|
15
|
-
* - Form validation (built-in: required, pattern)
|
|
16
|
-
* - Submit
|
|
15
|
+
* - Form validation (built-in: required, pattern + custom validation)
|
|
16
|
+
* - Submit handling (with HTTP integration support)
|
|
17
|
+
* - Side effects (onChange callbacks, validation modes, reference field sync)
|
|
17
18
|
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* - Side effects like onChange callbacks (done in component)
|
|
21
|
-
* - Custom validation (passed to component)
|
|
19
|
+
* @param props - Configuration props (flows, initialValues, callbacks, etc.)
|
|
20
|
+
* @returns Complete form state and control methods
|
|
22
21
|
*/
|
|
23
|
-
|
|
24
|
-
* Custom hook for TreegeRenderer - Pure state logic only
|
|
25
|
-
*
|
|
26
|
-
* @param flows - Flow or array of flows (can be null/undefined)
|
|
27
|
-
* @param initialValues - Initial form values (will be merged with node defaults)
|
|
28
|
-
* @param language - Preferred language for translations (defaults to 'en')
|
|
29
|
-
* @returns Pure state and computed values (no side effects)
|
|
30
|
-
*/
|
|
31
|
-
export declare const useTreegeRenderer: (flows: Flow | Flow[] | null | undefined, initialValues?: FormValues, language?: string) => {
|
|
22
|
+
export declare const useTreegeRenderer: ({ components, flows, googleApiKey, initialValues, language, onChange, onSubmit, theme, validate, validationMode, }: Pick<TreegeRendererProps, "components" | "flows" | "googleApiKey" | "initialValues" | "language" | "onChange" | "onSubmit" | "theme" | "validate" | "validationMode">) => {
|
|
32
23
|
canSubmit: boolean;
|
|
24
|
+
clearSubmitMessage: () => void;
|
|
25
|
+
config: {
|
|
26
|
+
components: {
|
|
27
|
+
form: ((props: {
|
|
28
|
+
children: import('react').ReactNode;
|
|
29
|
+
onSubmit: (e: import('react').FormEvent) => void;
|
|
30
|
+
}) => import('react').ReactNode) | undefined;
|
|
31
|
+
group: ((props: import('../../types/renderer').NodeRenderProps & {
|
|
32
|
+
children?: import('react').ReactNode;
|
|
33
|
+
}) => import('react').ReactNode) | undefined;
|
|
34
|
+
inputs: {
|
|
35
|
+
number?: ((props: import('../../types/renderer').InputRenderProps<"number">) => import('react').ReactNode) | undefined;
|
|
36
|
+
address?: ((props: import('../../types/renderer').InputRenderProps<"address">) => import('react').ReactNode) | undefined;
|
|
37
|
+
autocomplete?: ((props: import('../../types/renderer').InputRenderProps<"autocomplete">) => import('react').ReactNode) | undefined;
|
|
38
|
+
checkbox?: ((props: import('../../types/renderer').InputRenderProps<"checkbox">) => import('react').ReactNode) | undefined;
|
|
39
|
+
date?: ((props: import('../../types/renderer').InputRenderProps<"date">) => import('react').ReactNode) | undefined;
|
|
40
|
+
daterange?: ((props: import('../../types/renderer').InputRenderProps<"daterange">) => import('react').ReactNode) | undefined;
|
|
41
|
+
file?: ((props: import('../../types/renderer').InputRenderProps<"file">) => import('react').ReactNode) | undefined;
|
|
42
|
+
hidden?: ((props: import('../../types/renderer').InputRenderProps<"hidden">) => import('react').ReactNode) | undefined;
|
|
43
|
+
http?: ((props: import('../../types/renderer').InputRenderProps<"http">) => import('react').ReactNode) | undefined;
|
|
44
|
+
password?: ((props: import('../../types/renderer').InputRenderProps<"password">) => import('react').ReactNode) | undefined;
|
|
45
|
+
radio?: ((props: import('../../types/renderer').InputRenderProps<"radio">) => import('react').ReactNode) | undefined;
|
|
46
|
+
select?: ((props: import('../../types/renderer').InputRenderProps<"select">) => import('react').ReactNode) | undefined;
|
|
47
|
+
submit?: ((props: import('../../types/renderer').InputRenderProps<"submit">) => import('react').ReactNode) | undefined;
|
|
48
|
+
switch?: ((props: import('../../types/renderer').InputRenderProps<"switch">) => import('react').ReactNode) | undefined;
|
|
49
|
+
text?: ((props: import('../../types/renderer').InputRenderProps<"text">) => import('react').ReactNode) | undefined;
|
|
50
|
+
textarea?: ((props: import('../../types/renderer').InputRenderProps<"textarea">) => import('react').ReactNode) | undefined;
|
|
51
|
+
time?: ((props: import('../../types/renderer').InputRenderProps<"time">) => import('react').ReactNode) | undefined;
|
|
52
|
+
timerange?: ((props: import('../../types/renderer').InputRenderProps<"timerange">) => import('react').ReactNode) | undefined;
|
|
53
|
+
};
|
|
54
|
+
submitButton: ((props: {
|
|
55
|
+
label?: string;
|
|
56
|
+
disabled?: boolean;
|
|
57
|
+
[key: string]: unknown;
|
|
58
|
+
} | {
|
|
59
|
+
children?: import('react').ReactNode;
|
|
60
|
+
disabled?: boolean;
|
|
61
|
+
isSubmitting?: boolean;
|
|
62
|
+
onPress?: () => void;
|
|
63
|
+
[key: string]: unknown;
|
|
64
|
+
}) => import('react').ReactNode) | undefined;
|
|
65
|
+
submitButtonWrapper: ((props: {
|
|
66
|
+
children: import('react').ReactNode;
|
|
67
|
+
missingFields?: string[];
|
|
68
|
+
}) => import('react').ReactNode) | undefined;
|
|
69
|
+
ui: {
|
|
70
|
+
divider?: ((props: import('../../types/renderer').NodeRenderProps) => import('react').ReactNode) | undefined;
|
|
71
|
+
title?: ((props: import('../../types/renderer').NodeRenderProps) => import('react').ReactNode) | undefined;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
googleApiKey: string | undefined;
|
|
75
|
+
language: string;
|
|
76
|
+
theme: "dark" | "light";
|
|
77
|
+
validationMode: "onChange" | "onSubmit";
|
|
78
|
+
};
|
|
79
|
+
firstErrorFieldId: string | undefined;
|
|
33
80
|
formErrors: Record<string, string>;
|
|
34
81
|
formValues: FormValues;
|
|
82
|
+
handleSubmit: () => Promise<boolean>;
|
|
35
83
|
inputNodes: Node<import('../../../shared/types/node').InputNodeData>[];
|
|
36
|
-
|
|
84
|
+
isSubmitting: boolean;
|
|
85
|
+
mergedFlow: import('../../../shared/types/node').Flow;
|
|
37
86
|
missingRequiredFields: string[];
|
|
38
87
|
prevFormValuesRef: import('react').RefObject<FormValues>;
|
|
88
|
+
setFieldErrors: import('react').Dispatch<import('react').SetStateAction<Record<string, string>>>;
|
|
39
89
|
setFieldValue: (fieldName: string, value: unknown) => void;
|
|
40
|
-
setFormErrors: import('react').Dispatch<import('react').SetStateAction<Record<string, string>>>;
|
|
41
90
|
setMultipleFieldValues: (updates: FormValues) => void;
|
|
91
|
+
submitMessage: {
|
|
92
|
+
type: "success" | "error";
|
|
93
|
+
message: string;
|
|
94
|
+
} | null;
|
|
42
95
|
t: (key?: import('../../../main').Translatable | string) => string;
|
|
43
96
|
validateForm: (customValidate?: (values: FormValues, visibleNodesList: Node<TreegeNodeData>[]) => Record<string, string>) => {
|
|
44
97
|
errors: {
|
|
@@ -50,3 +103,8 @@ export declare const useTreegeRenderer: (flows: Flow | Flow[] | null | undefined
|
|
|
50
103
|
visibleNodes: Node<TreegeNodeData>[];
|
|
51
104
|
visibleRootNodes: Node<TreegeNodeData>[];
|
|
52
105
|
};
|
|
106
|
+
/**
|
|
107
|
+
* Type for the return value of useTreegeRenderer
|
|
108
|
+
* Useful for TypeScript users building custom components
|
|
109
|
+
*/
|
|
110
|
+
export type UseTreegeRendererReturn = ReturnType<typeof useTreegeRenderer>;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
import { TreegeRendererProps } from '../../../types/renderer';
|
|
2
|
-
declare const TreegeRenderer: ({ components, flows, googleApiKey, language, onChange, onSubmit, theme, validate, validationMode, initialValues, }: TreegeRendererProps) => import("react/jsx-runtime").JSX.Element;
|
|
2
|
+
declare const TreegeRenderer: ({ components, className, flows, googleApiKey, language, onChange, onSubmit, theme, validate, validationMode, initialValues, }: TreegeRendererProps) => import("react/jsx-runtime").JSX.Element;
|
|
3
3
|
export default TreegeRenderer;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Node } from '@xyflow/react';
|
|
2
|
+
import { ComponentType, ReactNode } from 'react';
|
|
3
|
+
import { FormValues, InputRenderers, TreegeRendererComponents } from '../types/renderer';
|
|
4
|
+
import { TreegeNodeData } from '../../shared/types/node';
|
|
5
|
+
type AnyComponent = ComponentType<any>;
|
|
6
|
+
type UseRenderNodeParams = {
|
|
7
|
+
config: {
|
|
8
|
+
components: TreegeRendererComponents;
|
|
9
|
+
language: string;
|
|
10
|
+
};
|
|
11
|
+
DefaultFormWrapper: AnyComponent;
|
|
12
|
+
DefaultGroup: AnyComponent;
|
|
13
|
+
DefaultSubmitButton: AnyComponent;
|
|
14
|
+
DefaultSubmitButtonWrapper?: AnyComponent;
|
|
15
|
+
defaultInputRenderers: InputRenderers;
|
|
16
|
+
defaultUI: Record<string, AnyComponent>;
|
|
17
|
+
formErrors: Record<string, string>;
|
|
18
|
+
formValues: FormValues;
|
|
19
|
+
missingRequiredFields: string[];
|
|
20
|
+
setFieldValue: (fieldId: string, value: unknown) => void;
|
|
21
|
+
visibleNodes: Node<TreegeNodeData>[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Hook that returns rendering utilities for TreegeRenderer
|
|
25
|
+
* Shared between web and native TreegeRenderer
|
|
26
|
+
*
|
|
27
|
+
* Returns:
|
|
28
|
+
* - renderNode: Function to render individual nodes
|
|
29
|
+
* - FormWrapper: Form wrapper component with fallback
|
|
30
|
+
* - SubmitButton: Submit button component with fallback
|
|
31
|
+
* - SubmitButtonWrapper: Submit button wrapper component with fallback (web only, undefined for native)
|
|
32
|
+
*/
|
|
33
|
+
export declare const useRenderNode: ({ DefaultFormWrapper, DefaultGroup, DefaultSubmitButton, DefaultSubmitButtonWrapper, config, defaultInputRenderers, defaultUI, formErrors, formValues, missingRequiredFields, setFieldValue, visibleNodes, }: UseRenderNodeParams) => {
|
|
34
|
+
FormWrapper: ((props: {
|
|
35
|
+
children: ReactNode;
|
|
36
|
+
onSubmit: (e: import('react').FormEvent) => void;
|
|
37
|
+
}) => ReactNode) | AnyComponent;
|
|
38
|
+
renderNode: (node: Node<TreegeNodeData>) => ReactNode;
|
|
39
|
+
SubmitButton: ((props: {
|
|
40
|
+
label?: string;
|
|
41
|
+
disabled?: boolean;
|
|
42
|
+
[key: string]: unknown;
|
|
43
|
+
} | {
|
|
44
|
+
children?: ReactNode;
|
|
45
|
+
disabled?: boolean;
|
|
46
|
+
isSubmitting?: boolean;
|
|
47
|
+
onPress?: () => void;
|
|
48
|
+
[key: string]: unknown;
|
|
49
|
+
}) => ReactNode) | AnyComponent;
|
|
50
|
+
SubmitButtonWrapper: ((props: {
|
|
51
|
+
children: ReactNode;
|
|
52
|
+
missingFields?: string[];
|
|
53
|
+
}) => ReactNode) | AnyComponent;
|
|
54
|
+
};
|
|
55
|
+
export {};
|
package/dist/renderer/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { TreegeConfigProvider, useTreegeConfig } from './context/TreegeConfigContext';
|
|
2
|
+
export type { UseTreegeRendererReturn } from './features/TreegeRenderer/useTreegeRenderer';
|
|
2
3
|
export { useTreegeRenderer } from './features/TreegeRenderer/useTreegeRenderer';
|
|
3
4
|
export * from './features/TreegeRenderer/web/components/DefaultFormWrapper';
|
|
4
5
|
export * from './features/TreegeRenderer/web/components/DefaultGroup';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { TreegeConfigProvider, useTreegeConfig } from './context/TreegeConfigContext';
|
|
2
|
+
export * from './features/TreegeRenderer/native/components/DefaultFormWrapper';
|
|
3
|
+
export * from './features/TreegeRenderer/native/components/DefaultGroup';
|
|
4
|
+
export * from './features/TreegeRenderer/native/components/DefaultInputs';
|
|
5
|
+
export * from './features/TreegeRenderer/native/components/DefaultSubmitButton';
|
|
6
|
+
export * from './features/TreegeRenderer/native/components/DefaultSubmitButtonWrapper';
|
|
7
|
+
export * from './features/TreegeRenderer/native/components/DefaultUI';
|
|
8
|
+
export type { TreegeRendererNativeProps } from './features/TreegeRenderer/native/TreegeRenderer';
|
|
9
|
+
export { default as TreegeRenderer } from './features/TreegeRenderer/native/TreegeRenderer';
|
|
10
|
+
export type { UseTreegeRendererReturn } from './features/TreegeRenderer/useTreegeRenderer';
|
|
11
|
+
export { useTreegeRenderer } from './features/TreegeRenderer/useTreegeRenderer';
|
|
12
|
+
export type { TreegeRendererConfig } from './types/renderer';
|
|
13
|
+
export * from './types/renderer';
|
|
14
|
+
export * from './utils/conditions';
|
|
15
|
+
export * from './utils/file';
|
|
16
|
+
export * from './utils/flow';
|
|
17
|
+
export * from './utils/form';
|
|
18
|
+
export * from './utils/sanitize.native';
|
|
19
|
+
export { getTranslatedText } from '../shared/utils/translations';
|
|
@@ -120,7 +120,9 @@ export type TreegeRendererComponents = {
|
|
|
120
120
|
/**
|
|
121
121
|
* Custom group container renderer
|
|
122
122
|
*/
|
|
123
|
-
group?: (props: NodeRenderProps
|
|
123
|
+
group?: (props: NodeRenderProps & {
|
|
124
|
+
children?: ReactNode;
|
|
125
|
+
}) => ReactNode;
|
|
124
126
|
/**
|
|
125
127
|
* Custom form wrapper
|
|
126
128
|
*/
|
|
@@ -129,10 +131,20 @@ export type TreegeRendererComponents = {
|
|
|
129
131
|
onSubmit: (e: FormEvent) => void;
|
|
130
132
|
}) => ReactNode;
|
|
131
133
|
/**
|
|
132
|
-
* Custom submit button (
|
|
134
|
+
* Custom submit button (supports both web and native variants)
|
|
135
|
+
* Web variant: { label?: string; disabled?: boolean; ...otherHTMLAttributes }
|
|
136
|
+
* Native variant: { children?: ReactNode; disabled?: boolean; isSubmitting?: boolean; onPress?: () => void }
|
|
133
137
|
*/
|
|
134
138
|
submitButton?: (props: {
|
|
135
139
|
label?: string;
|
|
140
|
+
disabled?: boolean;
|
|
141
|
+
[key: string]: unknown;
|
|
142
|
+
} | {
|
|
143
|
+
children?: ReactNode;
|
|
144
|
+
disabled?: boolean;
|
|
145
|
+
isSubmitting?: boolean;
|
|
146
|
+
onPress?: () => void;
|
|
147
|
+
[key: string]: unknown;
|
|
136
148
|
}) => ReactNode;
|
|
137
149
|
/**
|
|
138
150
|
* Custom submit button wrapper (e.g., for tooltip with missing fields)
|
|
@@ -175,7 +187,11 @@ export type TreegeRendererConfig = {
|
|
|
175
187
|
/**
|
|
176
188
|
* Props for the TreegeRenderer component
|
|
177
189
|
*/
|
|
178
|
-
export
|
|
190
|
+
export interface TreegeRendererProps {
|
|
191
|
+
/**
|
|
192
|
+
* Additional class name for the renderer container
|
|
193
|
+
*/
|
|
194
|
+
className?: string;
|
|
179
195
|
/**
|
|
180
196
|
* Custom component renderers
|
|
181
197
|
*/
|
|
@@ -222,4 +238,4 @@ export type TreegeRendererProps = {
|
|
|
222
238
|
* Validation mode
|
|
223
239
|
*/
|
|
224
240
|
validationMode?: "onChange" | "onSubmit";
|
|
225
|
-
}
|
|
241
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React Native implementation of sanitization utilities
|
|
3
|
+
* Does not use DOMPurify as it depends on browser DOM
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for sanitization
|
|
7
|
+
*/
|
|
8
|
+
interface SanitizeOptions {
|
|
9
|
+
/**
|
|
10
|
+
* Allow only plain text (strip all HTML tags)
|
|
11
|
+
* @default true
|
|
12
|
+
*/
|
|
13
|
+
plainTextOnly?: boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Custom allowed tags (when plainTextOnly is false)
|
|
16
|
+
* Note: In React Native, HTML tags are always stripped
|
|
17
|
+
*/
|
|
18
|
+
allowedTags?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Custom allowed attributes (when plainTextOnly is false)
|
|
21
|
+
* Note: In React Native, attributes are not applicable
|
|
22
|
+
*/
|
|
23
|
+
allowedAttributes?: string[];
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Sanitizes user input to prevent XSS attacks
|
|
27
|
+
*
|
|
28
|
+
* React Native implementation that strips all HTML tags and decodes entities.
|
|
29
|
+
* Since React Native doesn't render HTML, we focus on cleaning text content.
|
|
30
|
+
*
|
|
31
|
+
* @param input - The string to sanitize
|
|
32
|
+
* @param options - Sanitization options (maintained for API compatibility)
|
|
33
|
+
* @returns Sanitized string safe for rendering
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* sanitize('<script>alert("xss")</script>Hello')
|
|
37
|
+
* // => 'Hello'
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* sanitize('<b>Bold text</b><script>alert("xss")</script>')
|
|
41
|
+
* // => 'Bold text'
|
|
42
|
+
*/
|
|
43
|
+
export declare const sanitize: (input: string | undefined | null, _options?: SanitizeOptions) => string;
|
|
44
|
+
/**
|
|
45
|
+
* Sanitizes data from HTTP responses
|
|
46
|
+
*
|
|
47
|
+
* This function recursively sanitizes all string values in an object or array.
|
|
48
|
+
* Useful for cleaning data received from external APIs before displaying it.
|
|
49
|
+
*
|
|
50
|
+
* Protection against:
|
|
51
|
+
* - Circular references: Uses WeakSet to detect and handle circular objects
|
|
52
|
+
* - Deep nesting attacks: Limits recursion depth to prevent DoS
|
|
53
|
+
* - XSS attacks: Sanitizes all string values
|
|
54
|
+
*
|
|
55
|
+
* @param data - The data to sanitize (can be any type)
|
|
56
|
+
* @param options - Sanitization options
|
|
57
|
+
* @param depth - Current recursion depth (internal use)
|
|
58
|
+
* @param seen - WeakSet to track visited objects (internal use)
|
|
59
|
+
* @returns Sanitized data with same structure
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* sanitizeHttpResponse({
|
|
63
|
+
* name: 'John <script>xss</script>',
|
|
64
|
+
* nested: { title: 'Hello <b>world</b>' }
|
|
65
|
+
* })
|
|
66
|
+
* // => { name: 'John ', nested: { title: 'Hello world' } }
|
|
67
|
+
*/
|
|
68
|
+
export declare const sanitizeHttpResponse: (data: unknown, options?: SanitizeOptions, depth?: number, seen?: WeakSet<object>) => unknown;
|
|
69
|
+
export {};
|
|
@@ -33,7 +33,7 @@ export interface SubmitResult {
|
|
|
33
33
|
*
|
|
34
34
|
* @param config - Submit configuration from the submit button node
|
|
35
35
|
* @param formValues - Current form values
|
|
36
|
-
* @param inputNodes - All input nodes (required when
|
|
36
|
+
* @param inputNodes - All input nodes (required when sendAllFormValues is true)
|
|
37
37
|
* @returns Promise with submission result
|
|
38
38
|
*/
|
|
39
39
|
export declare const submitFormData: (config: SubmitConfig, formValues: FormValues, inputNodes: Node<InputNodeData>[]) => Promise<SubmitResult>;
|