treege 3.0.0-beta.9 → 3.0.0-beta.90
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/LICENSE +18 -12
- package/README.md +598 -79
- package/dist/DefaultSubmitButton-NeSDqyzv.js +1909 -0
- package/dist/ThemeContext-CPsC8QIP.js +1008 -0
- package/dist/editor/components/input/ComboboxWithCreate.d.ts +2 -1
- package/dist/editor/components/styles/EditorStyles.d.ts +2 -0
- package/dist/editor/constants/defaultNode.d.ts +1 -1
- package/dist/editor/constants/edgeTypes.d.ts +3 -2
- package/dist/editor/constants/inputTypeIcons.d.ts +3 -0
- package/dist/editor/constants/nodeSpacing.d.ts +25 -0
- package/dist/editor/constants/nodeTypes.d.ts +4 -5
- package/dist/editor/context/OpenApiContext.d.ts +79 -0
- package/dist/editor/context/TreegeEditorRuntimeProvider.d.ts +78 -0
- package/dist/editor/features/TreegeEditor/TreegeEditor.d.ts +1 -1
- package/dist/editor/features/TreegeEditor/controls/MiniMapControl.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/dialogs/AuthorizeDialog.d.ts +20 -0
- package/dist/editor/features/TreegeEditor/dialogs/ChangeNodeTypeDialog.d.ts +2 -0
- package/dist/editor/features/TreegeEditor/dialogs/DeleteNodeDialog.d.ts +2 -0
- package/dist/editor/features/TreegeEditor/dialogs/HeadersDialog.d.ts +19 -0
- package/dist/editor/features/TreegeEditor/dialogs/OpenApiDialog.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/edges/ConditionalEdge.d.ts +2 -2
- package/dist/editor/features/TreegeEditor/edges/DefaultEdge.d.ts +3 -0
- package/dist/editor/features/TreegeEditor/forms/HttpConfigForm.d.ts +4 -1
- package/dist/editor/features/TreegeEditor/forms/JsonTemplateEditor.d.ts +13 -0
- package/dist/editor/features/TreegeEditor/forms/OptionsMappingFields.d.ts +34 -0
- package/dist/editor/features/TreegeEditor/forms/OptionsSourceForm.d.ts +7 -0
- package/dist/editor/features/TreegeEditor/forms/SensitiveHeaderWarning.d.ts +13 -0
- package/dist/editor/features/TreegeEditor/forms/SubmitConfigForm.d.ts +7 -0
- package/dist/editor/features/TreegeEditor/inputs/ApiUrlCombobox.d.ts +20 -0
- package/dist/editor/features/TreegeEditor/inputs/ComboboxPattern.d.ts +2 -1
- package/dist/editor/features/TreegeEditor/inputs/DefaultFileValueField.d.ts +14 -0
- package/dist/editor/features/TreegeEditor/inputs/OptionImageField.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/inputs/SelectNodeGroup.d.ts +22 -1
- package/dist/editor/features/TreegeEditor/inputs/TranslatableInput.d.ts +20 -0
- package/dist/editor/features/TreegeEditor/layout/AutoLayout.d.ts +15 -0
- package/dist/editor/features/TreegeEditor/listeners/FlowChangeEmitter.d.ts +19 -0
- package/dist/editor/features/TreegeEditor/nodes/TreegeNode.d.ts +5 -0
- package/dist/editor/features/TreegeEditor/nodes/components/BottomHandleDropdown.d.ts +25 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeGroupBadge.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeImage.d.ts +5 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeImageButton.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeInputPreview.d.ts +12 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeLabelInput.d.ts +10 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeMoreMenu.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeRequiredButton.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeStackOrderButtons.d.ts +6 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeTypeBadge.d.ts +7 -0
- package/dist/editor/features/TreegeEditor/nodes/components/NodeTypePickerMenuContent.d.ts +12 -0
- package/dist/editor/features/TreegeEditor/nodes/layout/NodeWrapper.d.ts +4 -2
- package/dist/editor/features/TreegeEditor/panel/AIGeneratorDialog.d.ts +16 -0
- package/dist/editor/features/TreegeEditor/panel/ActionsPanel.d.ts +7 -2
- package/dist/editor/features/TreegeEditor/panel/MultiSelectionPanel.d.ts +7 -0
- package/dist/editor/hooks/useAvailableParentFields.d.ts +13 -0
- package/dist/editor/hooks/useFlowActions.d.ts +6 -2
- package/dist/editor/hooks/useFlowConnections.d.ts +14 -0
- package/dist/editor/hooks/useFlowContent.d.ts +16 -0
- package/dist/editor/hooks/useHistoryStore.d.ts +26 -0
- package/dist/editor/hooks/useIsStackedEdge.d.ts +8 -0
- package/dist/editor/hooks/useKeyValueRows.d.ts +15 -0
- package/dist/editor/hooks/useNodesSelection.d.ts +5 -5
- package/dist/editor/hooks/useStackPosition.d.ts +14 -0
- package/dist/editor/hooks/useTranslate.d.ts +1 -1
- package/dist/editor/hooks/useUndoRedo.d.ts +31 -0
- package/dist/editor/types/ai.d.ts +65 -0
- package/dist/editor/types/editor.d.ts +106 -10
- package/dist/editor/types/openapi.d.ts +106 -0
- package/dist/editor/utils/aiFlowGenerator.d.ts +5 -0
- package/dist/editor/utils/cleanEmptyData.d.ts +18 -0
- package/dist/editor/utils/cleanNodeConfig.d.ts +5 -0
- package/dist/editor/utils/dagreLayout.d.ts +8 -0
- package/dist/editor/utils/edge.d.ts +50 -0
- package/dist/editor/utils/groupColor.d.ts +14 -0
- package/dist/editor/utils/image.d.ts +7 -0
- package/dist/editor/utils/inputTypeIcon.d.ts +6 -0
- package/dist/editor/utils/jsonBindTarget.d.ts +15 -0
- package/dist/editor/utils/openApiPayload.d.ts +12 -0
- package/dist/editor/utils/openapi.d.ts +35 -0
- package/dist/editor/utils/sensitiveHeaders.d.ts +20 -0
- package/dist/editor/utils/stackPositionIndex.d.ts +9 -0
- package/dist/editor-D3EmQ-8C.js +6485 -0
- package/dist/editor.js +3 -7
- package/dist/main.js +6 -52
- package/dist/renderer/context/TreegeRenderRuntimeProvider.d.ts +135 -0
- package/dist/renderer/context/TreegeRendererProvider.d.ts +15 -0
- package/dist/renderer/context/TreegeViewerProvider.d.ts +28 -0
- package/dist/renderer/features/TreegeRenderer/native/TreegeRenderer.d.ts +19 -11
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultFormWrapper.d.ts +7 -7
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputLabel.d.ts +10 -0
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputWrapper.d.ts +9 -0
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultInputs.d.ts +20 -15
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultLoadingSkeleton.d.ts +8 -0
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultStep.d.ts +3 -0
- 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/DependencyHint.d.ts +15 -0
- package/dist/renderer/features/TreegeRenderer/native/components/OptionItemContent.d.ts +17 -0
- 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/DefaultSubmitInput.d.ts +11 -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 +97 -24
- package/dist/renderer/features/TreegeRenderer/web/TreegeRenderer.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultFormWrapper.d.ts +3 -2
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultInputLabel.d.ts +9 -0
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultInputWrapper.d.ts +9 -0
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultLoadingSkeleton.d.ts +7 -0
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultStep.d.ts +3 -0
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultSubmitButton.d.ts +5 -1
- package/dist/renderer/features/TreegeRenderer/web/components/DependencyHint.d.ts +22 -0
- package/dist/renderer/features/TreegeRenderer/web/components/OptionItemContent.d.ts +17 -0
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultAddressInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultAutocompleteInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultCheckboxInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultDateInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultDateRangeInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultFileInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultHiddenInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultHttpInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultNumberInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultPasswordInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultRadioInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultSelectInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultSubmitInput.d.ts +11 -0
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultSwitchInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTextAreaInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTextInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTimeInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/inputs/DefaultTimeRangeInput.d.ts +1 -1
- package/dist/renderer/features/TreegeRenderer/web/components/styles/RendererStyles.d.ts +2 -0
- package/dist/renderer/features/TreegeViewer/utils/viewerFields.d.ts +102 -0
- package/dist/renderer/features/TreegeViewer/web/TreegeViewer.d.ts +94 -0
- package/dist/renderer/hooks/useInputOptions.d.ts +28 -0
- package/dist/renderer/hooks/useRenderNode.d.ts +62 -0
- package/dist/renderer/hooks/useSubmitHandler.d.ts +37 -0
- package/dist/renderer/hooks/useTranslate.d.ts +7 -5
- package/dist/renderer/index.d.ts +10 -2
- package/dist/renderer/index.native.d.ts +20 -0
- package/dist/renderer/types/renderer.d.ts +332 -49
- package/dist/renderer/utils/extraPayload.d.ts +21 -0
- package/dist/renderer/utils/file.d.ts +24 -10
- package/dist/renderer/utils/flow.d.ts +1 -18
- package/dist/renderer/utils/form.d.ts +54 -2
- package/dist/renderer/utils/http.d.ts +177 -0
- package/dist/renderer/utils/jsonTemplate.d.ts +30 -0
- package/dist/renderer/utils/node.d.ts +29 -1
- package/dist/renderer/utils/sanitize.d.ts +85 -0
- package/dist/renderer/utils/sanitize.native.d.ts +69 -0
- package/dist/renderer/utils/step.d.ts +27 -0
- package/dist/renderer/utils/submit.d.ts +50 -0
- package/dist/renderer/utils/templateDependencies.d.ts +17 -0
- package/dist/renderer-CNbSt_QW.js +446 -0
- package/dist/renderer-native.d.ts +2 -0
- package/dist/renderer-native.js +3692 -0
- package/dist/renderer.js +5 -45
- package/dist/shared/components/ui/badge.d.ts +2 -2
- package/dist/shared/components/ui/button.d.ts +3 -3
- package/dist/shared/components/ui/collapsible.d.ts +1 -1
- package/dist/shared/components/ui/command.d.ts +1 -1
- package/dist/shared/components/ui/dropdown-menu.d.ts +1 -1
- package/dist/shared/components/ui/field.d.ts +24 -0
- package/dist/shared/components/ui/form.d.ts +1 -1
- package/dist/shared/components/ui/item.d.ts +23 -0
- package/dist/shared/components/ui/popover.d.ts +10 -2
- package/dist/shared/components/ui/select.d.ts +3 -1
- package/dist/shared/components/ui/sheet.d.ts +1 -1
- package/dist/shared/components/ui/skeleton.d.ts +3 -0
- package/dist/shared/components/ui/toggle-group.d.ts +7 -0
- package/dist/shared/components/ui/toggle.d.ts +9 -0
- package/dist/shared/components/ui/tooltip.d.ts +1 -1
- package/dist/shared/constants/colors.d.ts +45 -0
- package/dist/shared/constants/inputType.d.ts +6 -0
- package/dist/shared/constants/node.d.ts +0 -1
- package/dist/shared/context/PortalContainerContext.d.ts +5 -0
- package/dist/shared/context/ThemeContext.d.ts +2 -0
- package/dist/shared/context/ThemeContext.native.d.ts +22 -0
- package/dist/shared/hooks/useMediaQuery.d.ts +12 -0
- package/dist/shared/hooks/useThemeColors.d.ts +37 -0
- package/dist/shared/locales/ar.json.d.ts +259 -19
- package/dist/shared/locales/de.json.d.ts +260 -20
- package/dist/shared/locales/en.json.d.ts +261 -21
- package/dist/shared/locales/es.json.d.ts +260 -20
- package/dist/shared/locales/fr.json.d.ts +260 -20
- package/dist/shared/locales/it.json.d.ts +260 -20
- package/dist/shared/locales/pt.json.d.ts +260 -20
- package/dist/shared/types/edge.d.ts +6 -0
- package/dist/shared/types/file.d.ts +14 -0
- package/dist/shared/types/node.d.ts +155 -19
- package/dist/shared/utils/httpRecord.d.ts +20 -0
- package/dist/shared/utils/inputTypeGuards.d.ts +7 -0
- package/dist/shared/utils/nodeTypeGuards.d.ts +1 -6
- package/dist/shared/utils/normalizeLabel.d.ts +22 -0
- package/dist/shared/utils/translations.d.ts +21 -1
- package/dist/useRenderNode-CG466pNk.js +538 -0
- package/package.json +54 -22
- package/dist/ThemeContext-BIvs8Kw-.js +0 -758
- package/dist/TreegeEditor-Lv5Tn9_F.js +0 -2152
- package/dist/TreegeRenderer-BVaqgInZ.js +0 -1405
- package/dist/editor/context/TreegeEditorContext.d.ts +0 -12
- package/dist/editor/features/TreegeEditor/forms/FlowNodeForm.d.ts +0 -2
- package/dist/editor/features/TreegeEditor/inputs/SelectInputType.d.ts +0 -7
- package/dist/editor/features/TreegeEditor/nodes/FlowNode.d.ts +0 -6
- package/dist/editor/features/TreegeEditor/nodes/GroupNode.d.ts +0 -6
- package/dist/editor/features/TreegeEditor/nodes/InputNode.d.ts +0 -6
- package/dist/editor/features/TreegeEditor/nodes/UINode.d.ts +0 -6
- package/dist/editor/hooks/useEdgesSelection.d.ts +0 -11
- package/dist/renderer/context/TreegeConfigContext.d.ts +0 -39
- package/dist/renderer/context/TreegeRendererContext.d.ts +0 -25
- package/dist/renderer/features/TreegeRenderer/native/components/DefaultGroup.d.ts +0 -7
- package/dist/renderer/features/TreegeRenderer/web/components/DefaultGroup.d.ts +0 -6
- /package/dist/editor/components/{data-display/logo.d.ts → branding/Logo.d.ts} +0 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { FormValues } from '../types/renderer';
|
|
2
|
+
import { HttpHeaders, InputOption, OptionsSourceMapping, QueryParams } from '../../shared/types/node';
|
|
3
|
+
/**
|
|
4
|
+
* Merge multiple lists of HTTP headers. Later sources override earlier ones
|
|
5
|
+
* when they specify the same key (case-insensitive comparison, since HTTP
|
|
6
|
+
* header names are case-insensitive). The casing of the latest occurrence
|
|
7
|
+
* is preserved in the output.
|
|
8
|
+
*/
|
|
9
|
+
export declare const mergeHttpHeaders: (...sources: (HttpHeaders | undefined)[]) => HttpHeaders;
|
|
10
|
+
/**
|
|
11
|
+
* Resolve `{{templateVar}}` placeholders in every value of a header/query-param
|
|
12
|
+
* record, leaving the keys untouched. Returns `undefined` for `undefined` so
|
|
13
|
+
* callers can pass the result straight into `mergeHttpHeaders`/`makeHttpRequest`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const resolveTemplateRecord: (record: Record<string, string> | undefined, values: FormValues, options?: {
|
|
16
|
+
encode?: boolean;
|
|
17
|
+
json?: boolean;
|
|
18
|
+
}) => Record<string, string> | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Append query parameters to a URL. Entries with an empty key are skipped,
|
|
21
|
+
* keys and values are URL-encoded, and `?` or `&` is chosen automatically
|
|
22
|
+
* based on whether the URL already has a query string. Values are expected
|
|
23
|
+
* to already have their template variables resolved.
|
|
24
|
+
*/
|
|
25
|
+
export declare const appendQueryParams: (url: string, params?: QueryParams) => string;
|
|
26
|
+
/**
|
|
27
|
+
* Prepend a base URL to a relative URL. Absolute urls (starting with
|
|
28
|
+
* `http://` or `https://`, case-insensitive) and protocol-relative urls
|
|
29
|
+
* (`//host/...`) are returned untouched, so individual fields can still
|
|
30
|
+
* target an external API. A single slash is enforced at the join so a
|
|
31
|
+
* trailing slash on the base and/or a leading slash on the path don't
|
|
32
|
+
* produce `//`. When no base URL is configured, the url is returned as-is.
|
|
33
|
+
*
|
|
34
|
+
* Expects the url to already have its template variables resolved.
|
|
35
|
+
*/
|
|
36
|
+
export declare const resolveUrl: (url: string, baseUrl?: string) => string;
|
|
37
|
+
/**
|
|
38
|
+
* Parse a response body as JSON without throwing. Returns a discriminated
|
|
39
|
+
* result so callers can branch declaratively instead of wrapping a `let` in
|
|
40
|
+
* try/catch. A relative url resolved against the app origin (no baseUrl) or an
|
|
41
|
+
* auth redirect returns an HTML page, which `JSON.parse` would otherwise reject
|
|
42
|
+
* with a cryptic "Unexpected token '<'".
|
|
43
|
+
*
|
|
44
|
+
* @param text - The raw response body
|
|
45
|
+
* @returns `{ ok: true, value }` on success, `{ ok: false }` on parse failure
|
|
46
|
+
*/
|
|
47
|
+
export declare const tryParseJson: (text: string) => {
|
|
48
|
+
ok: true;
|
|
49
|
+
value: unknown;
|
|
50
|
+
} | {
|
|
51
|
+
ok: false;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Result of an HTTP request
|
|
55
|
+
*/
|
|
56
|
+
export interface HttpRequestResult {
|
|
57
|
+
/**
|
|
58
|
+
* Whether the request was successful (2xx status code)
|
|
59
|
+
*/
|
|
60
|
+
success: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Response data (parsed JSON or raw text)
|
|
63
|
+
*/
|
|
64
|
+
data?: unknown;
|
|
65
|
+
/**
|
|
66
|
+
* Error message if request failed
|
|
67
|
+
*/
|
|
68
|
+
error?: string;
|
|
69
|
+
/**
|
|
70
|
+
* HTTP status code
|
|
71
|
+
*/
|
|
72
|
+
status?: number;
|
|
73
|
+
/**
|
|
74
|
+
* HTTP status text
|
|
75
|
+
*/
|
|
76
|
+
statusText?: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Options for making an HTTP request
|
|
80
|
+
*/
|
|
81
|
+
export interface HttpRequestOptions {
|
|
82
|
+
/**
|
|
83
|
+
* The URL to call (should already have variables replaced)
|
|
84
|
+
*/
|
|
85
|
+
url: string;
|
|
86
|
+
/**
|
|
87
|
+
* HTTP method
|
|
88
|
+
*/
|
|
89
|
+
method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
90
|
+
/**
|
|
91
|
+
* Request headers
|
|
92
|
+
*/
|
|
93
|
+
headers?: HttpHeaders;
|
|
94
|
+
/**
|
|
95
|
+
* Query parameters appended to the URL (values should already have their
|
|
96
|
+
* template variables resolved; keys/values are URL-encoded here)
|
|
97
|
+
*/
|
|
98
|
+
queryParams?: QueryParams;
|
|
99
|
+
/**
|
|
100
|
+
* Request body (for POST/PUT/PATCH)
|
|
101
|
+
*/
|
|
102
|
+
body?: string;
|
|
103
|
+
/**
|
|
104
|
+
* Optional abort signal to cancel the request
|
|
105
|
+
*/
|
|
106
|
+
signal?: AbortSignal;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Make an HTTP request with common error handling and response parsing
|
|
110
|
+
*
|
|
111
|
+
* This is a shared utility used by both HTTP inputs and submit buttons
|
|
112
|
+
* to ensure consistent behavior across the library.
|
|
113
|
+
*
|
|
114
|
+
* @param options - Request options
|
|
115
|
+
* @returns Promise with request result
|
|
116
|
+
*/
|
|
117
|
+
export declare const makeHttpRequest: (options: HttpRequestOptions) => Promise<HttpRequestResult>;
|
|
118
|
+
/**
|
|
119
|
+
* Replace template variables in a string with actual values from form data
|
|
120
|
+
*
|
|
121
|
+
* Uses {{fieldId}} syntax for all replacements (URLs, JSON bodies, etc.)
|
|
122
|
+
*
|
|
123
|
+
* Smart JSON handling:
|
|
124
|
+
* - Strings: automatically wrapped in quotes and escaped
|
|
125
|
+
* - Numbers/Booleans: converted to JSON-safe format
|
|
126
|
+
* - Arrays/Objects: JSON.stringify
|
|
127
|
+
*
|
|
128
|
+
* @param template - The template string containing variables
|
|
129
|
+
* @param values - Form values to substitute
|
|
130
|
+
* @param options - Replacement options
|
|
131
|
+
* @param options.encode - Whether to URL-encode the replaced values (for URLs)
|
|
132
|
+
* @param options.json - Whether to use smart JSON handling (for request bodies)
|
|
133
|
+
* @returns The string with variables replaced
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* // For URLs (with encoding)
|
|
137
|
+
* replaceTemplateVariables("https://api.com/users/{{userId}}", { userId: "john doe" }, { encode: true })
|
|
138
|
+
* // => "https://api.com/users/john%20doe"
|
|
139
|
+
*
|
|
140
|
+
* // For JSON bodies (smart handling)
|
|
141
|
+
* replaceTemplateVariables('{"name": {{userName}}}', { userName: "John" }, { json: true })
|
|
142
|
+
* // => '{"name": "John"}'
|
|
143
|
+
*
|
|
144
|
+
* replaceTemplateVariables('{"age": {{userAge}}}', { userAge: 25 }, { json: true })
|
|
145
|
+
* // => '{"age": 25}'
|
|
146
|
+
*/
|
|
147
|
+
export declare const replaceTemplateVariables: (template: string | undefined, values: FormValues, options?: {
|
|
148
|
+
encode?: boolean;
|
|
149
|
+
json?: boolean;
|
|
150
|
+
}) => string;
|
|
151
|
+
/**
|
|
152
|
+
* Replace template variables in response data (for redirect URLs)
|
|
153
|
+
*
|
|
154
|
+
* Supports {{response.field}} format to access response data
|
|
155
|
+
*
|
|
156
|
+
* @param template - The template string containing variables
|
|
157
|
+
* @param responseData - Response data object
|
|
158
|
+
* @returns The string with variables replaced
|
|
159
|
+
*/
|
|
160
|
+
export declare const replaceResponseVariables: (template: string | undefined, responseData: unknown) => string;
|
|
161
|
+
/**
|
|
162
|
+
* Extract a value from an object using a path that supports dot notation
|
|
163
|
+
* and array indexing. Examples:
|
|
164
|
+
* - "data.users" → obj.data.users
|
|
165
|
+
* - "results[0].name" → obj.results[0].name
|
|
166
|
+
*
|
|
167
|
+
* @param obj - The object to extract value from
|
|
168
|
+
* @param path - The path expression (empty string returns the object as-is)
|
|
169
|
+
* @returns The value at the path, or undefined if not found
|
|
170
|
+
*/
|
|
171
|
+
export declare const getValueByPath: (obj: unknown, path: string) => unknown;
|
|
172
|
+
/**
|
|
173
|
+
* Project a list-shaped HTTP response into InputOption objects, applying
|
|
174
|
+
* a field-to-property mapping. Returns an empty array when the data is not
|
|
175
|
+
* iterable or required fields are missing.
|
|
176
|
+
*/
|
|
177
|
+
export declare const extractOptionsFromResponse: (response: unknown, responsePath: string | undefined, mapping: OptionsSourceMapping) => InputOption[];
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Node } from '@xyflow/react';
|
|
2
|
+
import { FormValues } from '../types/renderer';
|
|
3
|
+
import { InputNodeData } from '../../shared/types/node';
|
|
4
|
+
/**
|
|
5
|
+
* Resolve a free-form JSON template into the actual payload.
|
|
6
|
+
*
|
|
7
|
+
* The template is valid JSON where field tokens sit inside string positions,
|
|
8
|
+
* e.g. `{ "data": { "name": "{{firstName}}", "age": "{{age}}" } }`. The template
|
|
9
|
+
* is parsed first, then each `"{{token}}"` is replaced by the matching field
|
|
10
|
+
* value (`token` = a field's node id, or its token-safe `name`), preserving the
|
|
11
|
+
* value's JSON type. Tokens may also be used inside object keys.
|
|
12
|
+
*
|
|
13
|
+
* @param template - The JSON template string
|
|
14
|
+
* @param formValues - Current form values, keyed by node id
|
|
15
|
+
* @param inputNodes - Input nodes, used to also expose values by field name
|
|
16
|
+
* @returns The resolved payload, or `undefined` when the template is empty or
|
|
17
|
+
* not valid JSON (e.g. while the user is still typing)
|
|
18
|
+
*/
|
|
19
|
+
export declare const resolveJsonTemplate: (template: string | undefined, formValues: FormValues, inputNodes: Node<InputNodeData>[]) => unknown;
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a JSON template and serialize it to a string, ready to be used as an
|
|
22
|
+
* HTTP request body. Returns `undefined` when the template is empty or invalid
|
|
23
|
+
* JSON (so the caller can omit the body).
|
|
24
|
+
*/
|
|
25
|
+
export declare const resolveTemplateToJson: (template: string | undefined, formValues: FormValues, inputNodes: Node<InputNodeData>[]) => string | undefined;
|
|
26
|
+
/**
|
|
27
|
+
* Whether a non-empty JSON template is syntactically valid JSON. Used by the
|
|
28
|
+
* editor to surface a clear error instead of silently falling back at runtime.
|
|
29
|
+
*/
|
|
30
|
+
export declare const isJsonTemplateValid: (template: string | undefined) => boolean;
|
|
@@ -6,9 +6,37 @@ import { InputNodeData, TreegeNodeData } from '../../shared/types/node';
|
|
|
6
6
|
* @returns Array of input nodes only
|
|
7
7
|
*/
|
|
8
8
|
export declare const getInputNodes: (nodes: Node<TreegeNodeData>[]) => Node<InputNodeData>[];
|
|
9
|
+
/**
|
|
10
|
+
* Resolve the key name for an input node using priority: name > label (en) > nodeId
|
|
11
|
+
* This is the single source of truth for key resolution across the application
|
|
12
|
+
* @param node - The input node
|
|
13
|
+
* @returns The resolved key (name, label, or node ID)
|
|
14
|
+
*/
|
|
15
|
+
export declare const resolveNodeKey: (node: Node<InputNodeData>) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Resolve a human, end-user-facing label for an input node, preferring the
|
|
18
|
+
* translated `label` for the given language over the technical `name`. Used
|
|
19
|
+
* when surfacing field references to users (e.g. dependency hints). Priority:
|
|
20
|
+
* translated label > name > node id. This differs from `resolveNodeKey`, which
|
|
21
|
+
* prioritizes `name` for form-submission keys.
|
|
22
|
+
* @param node - The input node
|
|
23
|
+
* @param language - The current language code
|
|
24
|
+
* @returns The resolved display label
|
|
25
|
+
*/
|
|
26
|
+
export declare const resolveNodeLabel: (node: Node<InputNodeData>, language: string) => string;
|
|
27
|
+
/**
|
|
28
|
+
* Resolve the placeholder text for an input, falling back to the static
|
|
29
|
+
* "newAnswer" translation for textfield-like types when the user has not
|
|
30
|
+
* defined a placeholder for the current language.
|
|
31
|
+
* @param data - The input node data
|
|
32
|
+
* @param language - The current language code
|
|
33
|
+
* @returns The resolved placeholder string (empty string if none available)
|
|
34
|
+
*/
|
|
35
|
+
export declare const resolveInputPlaceholder: (data: InputNodeData, language: string) => string;
|
|
9
36
|
/**
|
|
10
37
|
* Get the field name (DOM name attribute) for a given node ID
|
|
11
|
-
*
|
|
38
|
+
* Priority: name > label (en) > nodeId
|
|
39
|
+
* This must match the logic in convertFormValuesToNamedFormat for consistency
|
|
12
40
|
* @param nodeId - The ID of the input node
|
|
13
41
|
* @param nodes - Array of input nodes
|
|
14
42
|
* @returns The field name to use in the DOM, or undefined if node not found
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for DOMPurify sanitization
|
|
3
|
+
*/
|
|
4
|
+
interface SanitizeOptions {
|
|
5
|
+
/**
|
|
6
|
+
* Allow only plain text (strip all HTML tags)
|
|
7
|
+
* @default true
|
|
8
|
+
*/
|
|
9
|
+
plainTextOnly?: boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Custom allowed tags (when plainTextOnly is false)
|
|
12
|
+
*/
|
|
13
|
+
allowedTags?: string[];
|
|
14
|
+
/**
|
|
15
|
+
* Custom allowed attributes (when plainTextOnly is false)
|
|
16
|
+
*/
|
|
17
|
+
allowedAttributes?: string[];
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Sanitizes user input to prevent XSS attacks
|
|
21
|
+
*
|
|
22
|
+
* This utility wraps DOMPurify and provides secure defaults for the treege library.
|
|
23
|
+
* It should be used on all user-provided content before rendering, especially:
|
|
24
|
+
* - Labels from node data
|
|
25
|
+
* - Helper text
|
|
26
|
+
* - Placeholder text
|
|
27
|
+
* - Any content from HTTP responses
|
|
28
|
+
*
|
|
29
|
+
* @param input - The string to sanitize
|
|
30
|
+
* @param options - Sanitization options
|
|
31
|
+
* @returns Sanitized string safe for rendering
|
|
32
|
+
*
|
|
33
|
+
* @example
|
|
34
|
+
* // Plain text only (default behavior)
|
|
35
|
+
* sanitize('<script>alert("xss")</script>Hello')
|
|
36
|
+
* // => 'Hello'
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* // Allow safe HTML tags
|
|
40
|
+
* sanitize('<b>Bold text</b><script>alert("xss")</script>', { plainTextOnly: false })
|
|
41
|
+
* // => '<b>Bold text</b>'
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* // Custom allowed tags
|
|
45
|
+
* sanitize('<a href="http://example.com">Link</a>', {
|
|
46
|
+
* plainTextOnly: false,
|
|
47
|
+
* allowedTags: ['a'],
|
|
48
|
+
* allowedAttributes: ['href']
|
|
49
|
+
* })
|
|
50
|
+
* // => '<a href="http://example.com">Link</a>'
|
|
51
|
+
*/
|
|
52
|
+
export declare const sanitize: (input: string | undefined | null, options?: SanitizeOptions) => string;
|
|
53
|
+
/**
|
|
54
|
+
* Sanitizes data from HTTP responses
|
|
55
|
+
*
|
|
56
|
+
* This function recursively sanitizes all string values in an object or array.
|
|
57
|
+
* Useful for cleaning data received from external APIs before displaying it.
|
|
58
|
+
*
|
|
59
|
+
* Protection against:
|
|
60
|
+
* - Circular references: Uses WeakSet to detect and handle circular objects
|
|
61
|
+
* - Deep nesting attacks: Limits recursion depth to prevent DoS
|
|
62
|
+
* - XSS attacks: Sanitizes all string values
|
|
63
|
+
*
|
|
64
|
+
* @param data - The data to sanitize (can be any type)
|
|
65
|
+
* @param options - Sanitization options
|
|
66
|
+
* @param depth - Current recursion depth (internal use)
|
|
67
|
+
* @param seen - WeakSet to track visited objects (internal use)
|
|
68
|
+
* @returns Sanitized data with same structure
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* sanitizeHttpResponse({
|
|
72
|
+
* name: 'John <script>xss</script>',
|
|
73
|
+
* nested: { title: 'Hello <b>world</b>' }
|
|
74
|
+
* })
|
|
75
|
+
* // => { name: 'John ', nested: { title: 'Hello <b>world</b>' } }
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* // Handles circular references gracefully
|
|
79
|
+
* const obj = { name: 'Test' };
|
|
80
|
+
* obj.self = obj;
|
|
81
|
+
* sanitizeHttpResponse(obj)
|
|
82
|
+
* // => { name: 'Test', self: { name: 'Test' } } // circular ref broken
|
|
83
|
+
*/
|
|
84
|
+
export declare const sanitizeHttpResponse: (data: unknown, options?: SanitizeOptions, depth?: number, seen?: WeakSet<object>) => unknown;
|
|
85
|
+
export {};
|
|
@@ -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 {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Node } from '@xyflow/react';
|
|
2
|
+
import { TreegeNodeData } from '../../shared/types/node';
|
|
3
|
+
/**
|
|
4
|
+
* A renderer step — a contiguous slice of visible nodes that share the same
|
|
5
|
+
* `parentId` (group id) or no parent (orphan step).
|
|
6
|
+
*
|
|
7
|
+
* Steps are derived from the flow's visible nodes at render time; the editor's
|
|
8
|
+
* group nodes carry only metadata (label) and are no longer rendered.
|
|
9
|
+
*/
|
|
10
|
+
export type FlowStep = {
|
|
11
|
+
/**
|
|
12
|
+
* Group id owning the step, or null for orphan steps (nodes without `parentId`).
|
|
13
|
+
*/
|
|
14
|
+
groupId: string | null;
|
|
15
|
+
/**
|
|
16
|
+
* The actual nodes (input + ui) rendered in this step, in flow order.
|
|
17
|
+
*/
|
|
18
|
+
nodes: Node<TreegeNodeData>[];
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Partition `visibleNodes` into ordered steps. A new step is started every
|
|
22
|
+
* time the `parentId` of the next renderable node changes (i.e. the flow
|
|
23
|
+
* crosses a group boundary, or moves between an orphan and a grouped node).
|
|
24
|
+
*
|
|
25
|
+
* Group nodes themselves are skipped — they're metadata only.
|
|
26
|
+
*/
|
|
27
|
+
export declare const computeSteps: (visibleNodes: Node<TreegeNodeData>[]) => FlowStep[];
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Node } from '@xyflow/react';
|
|
2
|
+
import { ExtraPayload, FormValues } from '../types/renderer';
|
|
3
|
+
import { HttpHeaders, InputNodeData, SubmitConfig } from '../../shared/types/node';
|
|
4
|
+
/**
|
|
5
|
+
* Result of a form submission
|
|
6
|
+
*/
|
|
7
|
+
export interface SubmitResult {
|
|
8
|
+
/**
|
|
9
|
+
* Whether the submission was successful
|
|
10
|
+
*/
|
|
11
|
+
success: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Response data from the server
|
|
14
|
+
*/
|
|
15
|
+
data?: unknown;
|
|
16
|
+
/**
|
|
17
|
+
* Error message if submission failed
|
|
18
|
+
*/
|
|
19
|
+
error?: string;
|
|
20
|
+
/**
|
|
21
|
+
* URL to redirect to (if configured)
|
|
22
|
+
*/
|
|
23
|
+
redirectUrl?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Submit form data using the provided submit configuration
|
|
27
|
+
*
|
|
28
|
+
* This function handles:
|
|
29
|
+
* - Template variable replacement in URL, body, and headers
|
|
30
|
+
* - HTTP request to the configured endpoint
|
|
31
|
+
* - Response parsing
|
|
32
|
+
* - Redirect URL generation with response data
|
|
33
|
+
*
|
|
34
|
+
* @param config - Submit configuration from the submit button node
|
|
35
|
+
* @param formValues - Current form values
|
|
36
|
+
* @param inputNodes - All input nodes (required when sendAllFormValues is true)
|
|
37
|
+
* @param headers
|
|
38
|
+
* @param baseUrl - Base URL prepended to a relative submit url
|
|
39
|
+
* @param extraPayload - Consumer-injected fields merged into the request body
|
|
40
|
+
* @returns Promise with submission result
|
|
41
|
+
*/
|
|
42
|
+
export declare const submitFormData: (config: SubmitConfig, formValues: FormValues, inputNodes: Node<InputNodeData>[], headers?: HttpHeaders, baseUrl?: string, extraPayload?: ExtraPayload) => Promise<SubmitResult>;
|
|
43
|
+
/**
|
|
44
|
+
* Perform redirect to the specified URL
|
|
45
|
+
*
|
|
46
|
+
* Handles both relative and absolute URLs
|
|
47
|
+
*
|
|
48
|
+
* @param url - The URL to redirect to
|
|
49
|
+
*/
|
|
50
|
+
export declare const redirect: (url: string) => void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Node } from '@xyflow/react';
|
|
2
|
+
import { FormValues, MissingDependency } from '../types/renderer';
|
|
3
|
+
import { InputNodeData } from '../../shared/types/node';
|
|
4
|
+
/**
|
|
5
|
+
* The node ids an input's dynamic request depends on — every `{{nodeId}}`
|
|
6
|
+
* referenced in its `httpConfig` or `optionsSource` url, query-param values, or
|
|
7
|
+
* body. These are the fields that must be filled before the input can fetch its
|
|
8
|
+
* options. Headers are excluded: they carry auth/global values, not user-filled
|
|
9
|
+
* form fields.
|
|
10
|
+
*/
|
|
11
|
+
export declare const getTemplateDependencyIds: (node: Node<InputNodeData>) => string[];
|
|
12
|
+
/**
|
|
13
|
+
* The input's template dependencies that are not yet filled, paired with the
|
|
14
|
+
* referenced field's translated label. Computed centrally in `useRenderNode`
|
|
15
|
+
* and passed to every input renderer as `extra.missingDependencies`.
|
|
16
|
+
*/
|
|
17
|
+
export declare const getMissingDependencies: (node: Node<InputNodeData>, formValues: FormValues, inputNodes: Node<InputNodeData>[], language: string) => MissingDependency[];
|