@gostack-framework/react 0.0.0-stage → 0.1.0
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/dist/api.d.ts +83 -0
- package/dist/api.js +170 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +136 -0
- package/dist/auth.js.map +1 -0
- package/dist/data.d.ts +25 -0
- package/dist/data.js +73 -0
- package/dist/data.js.map +1 -0
- package/dist/examples.d.ts +6 -0
- package/dist/examples.js +47 -0
- package/dist/examples.js.map +1 -0
- package/dist/hooks.d.ts +58 -0
- package/dist/hooks.js +109 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/layouts.d.ts +6 -0
- package/dist/layouts.js +34 -0
- package/dist/layouts.js.map +1 -0
- package/dist/line-flow/bus.d.ts +13 -0
- package/dist/line-flow/bus.js +52 -0
- package/dist/line-flow/bus.js.map +1 -0
- package/dist/line-flow/derived-line.d.ts +21 -0
- package/dist/line-flow/derived-line.js +122 -0
- package/dist/line-flow/derived-line.js.map +1 -0
- package/dist/line-flow/errors.d.ts +62 -0
- package/dist/line-flow/errors.js +91 -0
- package/dist/line-flow/errors.js.map +1 -0
- package/dist/line-flow/event-line.d.ts +16 -0
- package/dist/line-flow/event-line.js +81 -0
- package/dist/line-flow/event-line.js.map +1 -0
- package/dist/line-flow/index.d.ts +11 -0
- package/dist/line-flow/index.js +11 -0
- package/dist/line-flow/index.js.map +1 -0
- package/dist/line-flow/interchange.d.ts +17 -0
- package/dist/line-flow/interchange.js +86 -0
- package/dist/line-flow/interchange.js.map +1 -0
- package/dist/line-flow/lineflow.d.ts +12 -0
- package/dist/line-flow/lineflow.js +15 -0
- package/dist/line-flow/lineflow.js.map +1 -0
- package/dist/line-flow/network.d.ts +28 -0
- package/dist/line-flow/network.js +165 -0
- package/dist/line-flow/network.js.map +1 -0
- package/dist/line-flow/react/bridge.d.ts +23 -0
- package/dist/line-flow/react/bridge.js +40 -0
- package/dist/line-flow/react/bridge.js.map +1 -0
- package/dist/line-flow/react/hooks.d.ts +29 -0
- package/dist/line-flow/react/hooks.js +117 -0
- package/dist/line-flow/react/hooks.js.map +1 -0
- package/dist/line-flow/react/index.d.ts +3 -0
- package/dist/line-flow/react/index.js +4 -0
- package/dist/line-flow/react/index.js.map +1 -0
- package/dist/line-flow/react/provider.d.ts +15 -0
- package/dist/line-flow/react/provider.js +25 -0
- package/dist/line-flow/react/provider.js.map +1 -0
- package/dist/line-flow/scope.d.ts +21 -0
- package/dist/line-flow/scope.js +157 -0
- package/dist/line-flow/scope.js.map +1 -0
- package/dist/line-flow/state-line.d.ts +21 -0
- package/dist/line-flow/state-line.js +106 -0
- package/dist/line-flow/state-line.js.map +1 -0
- package/dist/line-flow/taxi.d.ts +15 -0
- package/dist/line-flow/taxi.js +81 -0
- package/dist/line-flow/taxi.js.map +1 -0
- package/dist/line-flow/types.d.ts +222 -0
- package/dist/line-flow/types.js +2 -0
- package/dist/line-flow/types.js.map +1 -0
- package/dist/line-flow/utils.d.ts +24 -0
- package/dist/line-flow/utils.js +53 -0
- package/dist/line-flow/utils.js.map +1 -0
- package/dist/paramsSerializer.d.ts +87 -0
- package/dist/paramsSerializer.js +138 -0
- package/dist/paramsSerializer.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.js +115 -0
- package/dist/registry.js.map +1 -0
- package/dist/runtime.d.ts +80 -0
- package/dist/runtime.js +442 -0
- package/dist/runtime.js.map +1 -0
- package/dist/schemas.d.ts +88 -0
- package/dist/schemas.js +146 -0
- package/dist/schemas.js.map +1 -0
- package/dist/services.d.ts +35 -0
- package/dist/services.js +65 -0
- package/dist/services.js.map +1 -0
- package/dist/shared-types/file.types.d.ts +12 -0
- package/dist/shared-types/file.types.js +2 -0
- package/dist/shared-types/file.types.js.map +1 -0
- package/dist/shared-types/gallery.types.d.ts +22 -0
- package/dist/shared-types/gallery.types.js +2 -0
- package/dist/shared-types/gallery.types.js.map +1 -0
- package/dist/shared-types/governorates.types.d.ts +12 -0
- package/dist/shared-types/governorates.types.js +2 -0
- package/dist/shared-types/governorates.types.js.map +1 -0
- package/dist/shared-types/grade.types.d.ts +7 -0
- package/dist/shared-types/grade.types.js +2 -0
- package/dist/shared-types/grade.types.js.map +1 -0
- package/dist/shared-types/index.d.ts +13 -0
- package/dist/shared-types/index.js +14 -0
- package/dist/shared-types/index.js.map +1 -0
- package/dist/shared-types/metadata.types.d.ts +61 -0
- package/dist/shared-types/metadata.types.js +3 -0
- package/dist/shared-types/metadata.types.js.map +1 -0
- package/dist/shared-types/table.types.d.ts +33 -0
- package/dist/shared-types/table.types.js +2 -0
- package/dist/shared-types/table.types.js.map +1 -0
- package/dist/shared-types/viewCard.types.d.ts +78 -0
- package/dist/shared-types/viewCard.types.js +3 -0
- package/dist/shared-types/viewCard.types.js.map +1 -0
- package/dist/styles.css +347 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.js +19 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/conditionCompiler.d.ts +11 -0
- package/dist/utils/conditionCompiler.js +18 -0
- package/dist/utils/conditionCompiler.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +50 -0
- package/dist/utils/fileUtils.js +266 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/dist/utils/metadataUtils.d.ts +35 -0
- package/dist/utils/metadataUtils.js +176 -0
- package/dist/utils/metadataUtils.js.map +1 -0
- package/dist/utils/normalizeTime.d.ts +1 -0
- package/dist/utils/normalizeTime.js +25 -0
- package/dist/utils/normalizeTime.js.map +1 -0
- package/dist/utils/tableUtils.d.ts +9 -0
- package/dist/utils/tableUtils.js +92 -0
- package/dist/utils/tableUtils.js.map +1 -0
- package/dist/utils/toFormData.d.ts +152 -0
- package/dist/utils/toFormData.js +250 -0
- package/dist/utils/toFormData.js.map +1 -0
- package/dist/utils/wizard.utils.d.ts +420 -0
- package/dist/utils/wizard.utils.js +596 -0
- package/dist/utils/wizard.utils.js.map +1 -0
- package/package.json +49 -3
- package/README.md +0 -3
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* toFormData Utility
|
|
3
|
+
*
|
|
4
|
+
* Converts JavaScript objects to FormData with support for:
|
|
5
|
+
* - Nested objects (flattened with bracket notation)
|
|
6
|
+
* - Arrays (configurable format: brackets[], indices[0], or flat)
|
|
7
|
+
* - Files and Blobs (passed through directly)
|
|
8
|
+
* - Dates (converted to ISO string)
|
|
9
|
+
* - Booleans (converted to "1"/"0" or "true"/"false")
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* // Basic usage
|
|
14
|
+
* const formData = toFormData({
|
|
15
|
+
* title: "My Report",
|
|
16
|
+
* attachments: [file1, file2],
|
|
17
|
+
* meta: { tags: ["urgent", "review"] }
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // With options
|
|
21
|
+
* const formData = toFormData(payload, {
|
|
22
|
+
* arrayFormat: 'indices', // Use [0], [1] instead of []
|
|
23
|
+
* booleanFormat: 'string', // Use "true"/"false" instead of "1"/"0"
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Supported value types for FormData conversion
|
|
29
|
+
*/
|
|
30
|
+
export type FormDataValue = string | number | boolean | null | undefined | File | Blob | FileList | Date | FormDataValue[] | {
|
|
31
|
+
[key: string]: FormDataValue;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Array format options
|
|
35
|
+
* - `brackets`: key[]=value (PHP/Laravel default)
|
|
36
|
+
* - `indices`: key[0]=value (Java/.NET)
|
|
37
|
+
* - `flat`: key=value repeated (some REST APIs)
|
|
38
|
+
*/
|
|
39
|
+
export type ArrayFormat = "brackets" | "indices" | "flat";
|
|
40
|
+
/**
|
|
41
|
+
* Boolean format options
|
|
42
|
+
* - `numeric`: "1" for true, "0" for false (PHP default)
|
|
43
|
+
* - `string`: "true" or "false"
|
|
44
|
+
*/
|
|
45
|
+
export type BooleanFormat = "numeric" | "string";
|
|
46
|
+
/**
|
|
47
|
+
* Date format options
|
|
48
|
+
* - `iso`: ISO 8601 string (default)
|
|
49
|
+
* - `timestamp`: Unix timestamp in milliseconds
|
|
50
|
+
* - `date`: YYYY-MM-DD format
|
|
51
|
+
*/
|
|
52
|
+
export type DateFormat = "iso" | "timestamp" | "date";
|
|
53
|
+
/**
|
|
54
|
+
* Options for toFormData conversion
|
|
55
|
+
*/
|
|
56
|
+
export interface ToFormDataOptions {
|
|
57
|
+
/**
|
|
58
|
+
* How to format array keys
|
|
59
|
+
* @default 'brackets'
|
|
60
|
+
*/
|
|
61
|
+
arrayFormat?: ArrayFormat;
|
|
62
|
+
/**
|
|
63
|
+
* How to format boolean values
|
|
64
|
+
* @default 'numeric'
|
|
65
|
+
*/
|
|
66
|
+
booleanFormat?: BooleanFormat;
|
|
67
|
+
/**
|
|
68
|
+
* How to format Date values
|
|
69
|
+
* @default 'iso'
|
|
70
|
+
*/
|
|
71
|
+
dateFormat?: DateFormat;
|
|
72
|
+
/**
|
|
73
|
+
* Skip null and undefined values
|
|
74
|
+
* @default true
|
|
75
|
+
*/
|
|
76
|
+
skipNull?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Skip empty string values
|
|
79
|
+
* @default false
|
|
80
|
+
*/
|
|
81
|
+
skipEmpty?: boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Skip empty arrays
|
|
84
|
+
* @default true
|
|
85
|
+
*/
|
|
86
|
+
skipEmptyArrays?: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Convert a JavaScript object to FormData
|
|
90
|
+
*
|
|
91
|
+
* @param payload - The object to convert
|
|
92
|
+
* @param options - Conversion options
|
|
93
|
+
* @returns FormData instance
|
|
94
|
+
*
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* // Example 1: Simple form with file
|
|
98
|
+
* const formData = toFormData({
|
|
99
|
+
* title: "My Document",
|
|
100
|
+
* file: selectedFile,
|
|
101
|
+
* isActive: true
|
|
102
|
+
* });
|
|
103
|
+
* // Result:
|
|
104
|
+
* // title: "My Document"
|
|
105
|
+
* // file: [File object]
|
|
106
|
+
* // isActive: "1"
|
|
107
|
+
*
|
|
108
|
+
* // Example 2: Nested object with arrays
|
|
109
|
+
* const formData = toFormData({
|
|
110
|
+
* title: "Report",
|
|
111
|
+
* attachments: [file1, file2],
|
|
112
|
+
* meta: {
|
|
113
|
+
* tags: ["urgent", "review"],
|
|
114
|
+
* priority: 1
|
|
115
|
+
* }
|
|
116
|
+
* });
|
|
117
|
+
* // Result (brackets format - default):
|
|
118
|
+
* // title: "Report"
|
|
119
|
+
* // attachments[]: [File1]
|
|
120
|
+
* // attachments[]: [File2]
|
|
121
|
+
* // meta[tags][]: "urgent"
|
|
122
|
+
* // meta[tags][]: "review"
|
|
123
|
+
* // meta[priority]: "1"
|
|
124
|
+
*
|
|
125
|
+
* // Example 3: Using indices format for .NET backend
|
|
126
|
+
* const formData = toFormData({
|
|
127
|
+
* items: ["a", "b", "c"]
|
|
128
|
+
* }, { arrayFormat: 'indices' });
|
|
129
|
+
* // Result:
|
|
130
|
+
* // items[0]: "a"
|
|
131
|
+
* // items[1]: "b"
|
|
132
|
+
* // items[2]: "c"
|
|
133
|
+
* ```
|
|
134
|
+
*/
|
|
135
|
+
export declare const toFormData: (payload: Record<string, FormDataValue>, options?: ToFormDataOptions) => FormData;
|
|
136
|
+
/**
|
|
137
|
+
* Debug helper to log FormData contents
|
|
138
|
+
*/
|
|
139
|
+
export declare const logFormDataContents: (formData: FormData, label?: string) => void;
|
|
140
|
+
/**
|
|
141
|
+
* Type-safe wrapper for React Hook Form integration
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* const onSubmit = handleSubmit((data) => {
|
|
146
|
+
* const formData = formDataFromRHF(data);
|
|
147
|
+
* await api.post('/upload', formData, { meta: { multipart: true } });
|
|
148
|
+
* });
|
|
149
|
+
* ```
|
|
150
|
+
*/
|
|
151
|
+
export declare const formDataFromRHF: <T extends Record<string, unknown>>(data: T, options?: ToFormDataOptions) => FormData;
|
|
152
|
+
export default toFormData;
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* toFormData Utility
|
|
3
|
+
*
|
|
4
|
+
* Converts JavaScript objects to FormData with support for:
|
|
5
|
+
* - Nested objects (flattened with bracket notation)
|
|
6
|
+
* - Arrays (configurable format: brackets[], indices[0], or flat)
|
|
7
|
+
* - Files and Blobs (passed through directly)
|
|
8
|
+
* - Dates (converted to ISO string)
|
|
9
|
+
* - Booleans (converted to "1"/"0" or "true"/"false")
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* // Basic usage
|
|
14
|
+
* const formData = toFormData({
|
|
15
|
+
* title: "My Report",
|
|
16
|
+
* attachments: [file1, file2],
|
|
17
|
+
* meta: { tags: ["urgent", "review"] }
|
|
18
|
+
* });
|
|
19
|
+
*
|
|
20
|
+
* // With options
|
|
21
|
+
* const formData = toFormData(payload, {
|
|
22
|
+
* arrayFormat: 'indices', // Use [0], [1] instead of []
|
|
23
|
+
* booleanFormat: 'string', // Use "true"/"false" instead of "1"/"0"
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
const defaultOptions = {
|
|
28
|
+
arrayFormat: "brackets",
|
|
29
|
+
booleanFormat: "numeric",
|
|
30
|
+
dateFormat: "iso",
|
|
31
|
+
skipNull: true,
|
|
32
|
+
skipEmpty: false,
|
|
33
|
+
skipEmptyArrays: true,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Build the key for nested properties
|
|
37
|
+
*/
|
|
38
|
+
const buildKey = (prefix, key, isArrayItem, arrayFormat, index) => {
|
|
39
|
+
if (!prefix) {
|
|
40
|
+
return key;
|
|
41
|
+
}
|
|
42
|
+
if (isArrayItem) {
|
|
43
|
+
switch (arrayFormat) {
|
|
44
|
+
case "indices":
|
|
45
|
+
return `${prefix}[${index}]`;
|
|
46
|
+
case "flat":
|
|
47
|
+
return prefix;
|
|
48
|
+
case "brackets":
|
|
49
|
+
default:
|
|
50
|
+
return `${prefix}[]`;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return `${prefix}[${key}]`;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Format a boolean value based on options
|
|
57
|
+
*/
|
|
58
|
+
const formatBoolean = (value, format) => {
|
|
59
|
+
if (format === "string") {
|
|
60
|
+
return value ? "true" : "false";
|
|
61
|
+
}
|
|
62
|
+
return value ? "1" : "0";
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Format a Date value based on options
|
|
66
|
+
*/
|
|
67
|
+
const formatDate = (value, format) => {
|
|
68
|
+
switch (format) {
|
|
69
|
+
case "timestamp":
|
|
70
|
+
return String(value.getTime());
|
|
71
|
+
case "date":
|
|
72
|
+
return value.toISOString().split("T")[0];
|
|
73
|
+
case "iso":
|
|
74
|
+
default:
|
|
75
|
+
return value.toISOString();
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Recursively append values to FormData
|
|
80
|
+
*/
|
|
81
|
+
const appendToFormData = (formData, key, value, options, seen) => {
|
|
82
|
+
// Handle null/undefined
|
|
83
|
+
if (value === null || value === undefined) {
|
|
84
|
+
if (!options.skipNull) {
|
|
85
|
+
formData.append(key, "");
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// Handle empty strings
|
|
90
|
+
if (value === "" && options.skipEmpty) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
// Handle FileList (convert to array of files)
|
|
94
|
+
if (typeof FileList !== "undefined" && value instanceof FileList) {
|
|
95
|
+
Array.from(value).forEach((file, index) => {
|
|
96
|
+
const fileKey = buildKey(key, "", true, options.arrayFormat, index);
|
|
97
|
+
formData.append(fileKey, file);
|
|
98
|
+
});
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
// Handle File/Blob (passthrough)
|
|
102
|
+
if (value instanceof File || value instanceof Blob) {
|
|
103
|
+
formData.append(key, value);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
// Handle Date
|
|
107
|
+
if (value instanceof Date) {
|
|
108
|
+
// Skip invalid dates
|
|
109
|
+
if (Number.isNaN(value.getTime())) {
|
|
110
|
+
console.warn(`[toFormData] Invalid Date value for key "${key}", skipping`);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
formData.append(key, formatDate(value, options.dateFormat));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
// Handle boolean
|
|
117
|
+
if (typeof value === "boolean") {
|
|
118
|
+
formData.append(key, formatBoolean(value, options.booleanFormat));
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
// Handle number
|
|
122
|
+
if (typeof value === "number") {
|
|
123
|
+
// Skip NaN and Infinity as they're not valid form values
|
|
124
|
+
if (Number.isNaN(value) || !Number.isFinite(value)) {
|
|
125
|
+
console.warn(`[toFormData] Invalid number value for key "${key}" (${value}), skipping`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
formData.append(key, String(value));
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
// Handle string
|
|
132
|
+
if (typeof value === "string") {
|
|
133
|
+
formData.append(key, value);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
// Handle arrays
|
|
137
|
+
if (Array.isArray(value)) {
|
|
138
|
+
if (value.length === 0 && options.skipEmptyArrays) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
value.forEach((item, index) => {
|
|
142
|
+
const arrayKey = buildKey(key, "", true, options.arrayFormat, index);
|
|
143
|
+
appendToFormData(formData, arrayKey, item, options, seen);
|
|
144
|
+
});
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
// Handle objects (nested)
|
|
148
|
+
if (typeof value === "object") {
|
|
149
|
+
// Circular reference protection
|
|
150
|
+
if (seen.has(value)) {
|
|
151
|
+
console.warn(`[toFormData] Circular reference detected for key "${key}", skipping`);
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
seen.add(value);
|
|
155
|
+
Object.entries(value).forEach(([nestedKey, nestedValue]) => {
|
|
156
|
+
const fullKey = buildKey(key, nestedKey, false, options.arrayFormat);
|
|
157
|
+
appendToFormData(formData, fullKey, nestedValue, options, seen);
|
|
158
|
+
});
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Convert a JavaScript object to FormData
|
|
164
|
+
*
|
|
165
|
+
* @param payload - The object to convert
|
|
166
|
+
* @param options - Conversion options
|
|
167
|
+
* @returns FormData instance
|
|
168
|
+
*
|
|
169
|
+
* @example
|
|
170
|
+
* ```ts
|
|
171
|
+
* // Example 1: Simple form with file
|
|
172
|
+
* const formData = toFormData({
|
|
173
|
+
* title: "My Document",
|
|
174
|
+
* file: selectedFile,
|
|
175
|
+
* isActive: true
|
|
176
|
+
* });
|
|
177
|
+
* // Result:
|
|
178
|
+
* // title: "My Document"
|
|
179
|
+
* // file: [File object]
|
|
180
|
+
* // isActive: "1"
|
|
181
|
+
*
|
|
182
|
+
* // Example 2: Nested object with arrays
|
|
183
|
+
* const formData = toFormData({
|
|
184
|
+
* title: "Report",
|
|
185
|
+
* attachments: [file1, file2],
|
|
186
|
+
* meta: {
|
|
187
|
+
* tags: ["urgent", "review"],
|
|
188
|
+
* priority: 1
|
|
189
|
+
* }
|
|
190
|
+
* });
|
|
191
|
+
* // Result (brackets format - default):
|
|
192
|
+
* // title: "Report"
|
|
193
|
+
* // attachments[]: [File1]
|
|
194
|
+
* // attachments[]: [File2]
|
|
195
|
+
* // meta[tags][]: "urgent"
|
|
196
|
+
* // meta[tags][]: "review"
|
|
197
|
+
* // meta[priority]: "1"
|
|
198
|
+
*
|
|
199
|
+
* // Example 3: Using indices format for .NET backend
|
|
200
|
+
* const formData = toFormData({
|
|
201
|
+
* items: ["a", "b", "c"]
|
|
202
|
+
* }, { arrayFormat: 'indices' });
|
|
203
|
+
* // Result:
|
|
204
|
+
* // items[0]: "a"
|
|
205
|
+
* // items[1]: "b"
|
|
206
|
+
* // items[2]: "c"
|
|
207
|
+
* ```
|
|
208
|
+
*/
|
|
209
|
+
export const toFormData = (payload, options) => {
|
|
210
|
+
const formData = new FormData();
|
|
211
|
+
const mergedOptions = { ...defaultOptions, ...options };
|
|
212
|
+
const seen = new WeakSet();
|
|
213
|
+
Object.entries(payload).forEach(([key, value]) => {
|
|
214
|
+
appendToFormData(formData, key, value, mergedOptions, seen);
|
|
215
|
+
});
|
|
216
|
+
return formData;
|
|
217
|
+
};
|
|
218
|
+
/**
|
|
219
|
+
* Debug helper to log FormData contents
|
|
220
|
+
*/
|
|
221
|
+
export const logFormDataContents = (formData, label) => {
|
|
222
|
+
console.log(label ? `${label}:` : "FormData contents:");
|
|
223
|
+
formData.forEach((value, key) => {
|
|
224
|
+
if (value instanceof File) {
|
|
225
|
+
console.log(` ${key}: [File] ${value.name} (${value.size} bytes)`);
|
|
226
|
+
}
|
|
227
|
+
else if (typeof value === "object" && value !== null) {
|
|
228
|
+
console.log(` ${key}: [Blob] (${value.size} bytes)`);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
console.log(` ${key}: ${value}`);
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
};
|
|
235
|
+
/**
|
|
236
|
+
* Type-safe wrapper for React Hook Form integration
|
|
237
|
+
*
|
|
238
|
+
* @example
|
|
239
|
+
* ```ts
|
|
240
|
+
* const onSubmit = handleSubmit((data) => {
|
|
241
|
+
* const formData = formDataFromRHF(data);
|
|
242
|
+
* await api.post('/upload', formData, { meta: { multipart: true } });
|
|
243
|
+
* });
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
export const formDataFromRHF = (data, options) => {
|
|
247
|
+
return toFormData(data, options);
|
|
248
|
+
};
|
|
249
|
+
export default toFormData;
|
|
250
|
+
//# sourceMappingURL=toFormData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toFormData.js","sourceRoot":"","sources":["../../src/utils/toFormData.ts"],"names":[],"mappings":"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"}
|