1
- import 'dart:convert' ;
2
1
import 'package:jinja/jinja.dart' as jj;
3
2
import 'package:apidash/utils/utils.dart'
4
3
show padMultilineString, requestModelToHARJsonRequest, stripUrlParams;
@@ -10,12 +9,14 @@ class AxiosCodeGen {
10
9
11
10
final bool isNodeJs;
12
11
13
- String kStringImportNode = """{% if isNodeJs %}import axios from 'axios';
12
+ String kStringImportNode = """import axios from 'axios';
13
+ {%if hasFileInFormData -%}
14
+ import fs from 'fs'
15
+ {% endif %}
14
16
15
- {% endif %}{% if hasFormData and isNodeJs %}const fs = require('fs');{% endif %}
16
17
""" ;
17
18
18
- String kTemplateStart = """let config = {
19
+ String kTemplateStart = """const config = {
19
20
url: '{{url}}',
20
21
method: '{{method}}'
21
22
""" ;
@@ -37,59 +38,28 @@ class AxiosCodeGen {
37
38
};
38
39
39
40
axios(config)
40
- .then(function (response) {
41
- // handle success
42
- console.log(response.status);
43
- console.log(response.data);
44
- })
45
- .catch(function (error) {
46
- // handle error
47
- console.log(error.response.status);
48
- console.log(error);
49
- });
41
+ .then(res => {
42
+ console.log(res.status);
43
+ console.log(res.data);
44
+ })
45
+ .catch(err => {
46
+ console.log(err);
47
+ });
50
48
""" ;
51
- String kMultiPartBodyTemplate = r'''
52
-
53
-
54
- async function buildFormData(fields) {
55
- var formdata = new FormData();
56
- for (const field of fields) {
57
- const name = field.name || '';
58
- const value = field.value || '';
59
- const type = field.type || 'text';
60
-
61
- if (type === 'text') {
62
- formdata.append(name, value);
63
- } else if (type === 'file') {
64
- formdata.append(name,{% if isNodeJs %} fs.createReadStream(value){% else %} fileInput.files[0],value{% endif %});
65
- }
66
- }
67
- return formdata;
68
- }
69
-
70
-
71
- ''' ;
72
- var kGetFormDataTemplate = '''buildFormData({{fields_list}});
73
- ''' ;
74
49
String ? getCode (
75
50
RequestModel requestModel,
76
51
) {
77
52
try {
78
53
jj.Template kNodejsImportTemplate = jj.Template (kStringImportNode);
79
54
String importsData = kNodejsImportTemplate.render ({
80
- "hasFormData" : requestModel.hasFormData,
81
- "isNodeJs" : isNodeJs,
55
+ "hasFileInFormData" : requestModel.hasFileInFormData,
82
56
});
83
57
84
- String result = importsData;
85
- if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) {
86
- var templateMultiPartBody = jj.Template (kMultiPartBodyTemplate);
87
- var renderedMultiPartBody = templateMultiPartBody.render ({
88
- "isNodeJs" : isNodeJs,
89
- });
90
- result += renderedMultiPartBody;
91
- }
92
-
58
+ String result = isNodeJs
59
+ ? importsData
60
+ : requestModel.hasFileInFormData
61
+ ? "// refer https://github.com/foss42/apidash/issues/293#issuecomment-1997568083 for details regarding integration\n\n "
62
+ : "" ;
93
63
var harJson = requestModelToHARJsonRequest (
94
64
requestModel,
95
65
useEnabled: true ,
@@ -126,17 +96,22 @@ async function buildFormData(fields) {
126
96
.render ({"headers" : padMultilineString (kEncoder.convert (m), 2 )});
127
97
}
128
98
var templateBody = jj.Template (kTemplateBody);
129
-
130
99
if (requestModel.hasFormData && requestModel.formDataMapList.isNotEmpty) {
131
- var getFieldDataTemplate = jj.Template (kGetFormDataTemplate);
132
-
133
- result += templateBody.render ({
134
- "body" : getFieldDataTemplate.render ({
135
- "fields_list" : json.encode (requestModel.formDataMapList),
136
- })
137
- });
138
- }
139
- if (harJson["postData" ]? ["text" ] != null ) {
100
+ // Manually Create a JS Object
101
+ Map <String , String > formParams = {};
102
+ int formFileCounter = 1 ;
103
+ for (var element in requestModel.formDataMapList) {
104
+ formParams["${element ["name" ]}" ] = element["type" ] == "text"
105
+ ? "${element ["value" ]}"
106
+ : isNodeJs
107
+ ? "fs.createReadStream(${element ["value" ]})"
108
+ : "fileInput$formFileCounter .files[0]" ;
109
+ if (element["type" ] == "file" ) formFileCounter++ ;
110
+ }
111
+ var sanitizedJSObject = sanitzeJSObject (kEncoder.convert (formParams));
112
+ result += templateBody
113
+ .render ({"body" : padMultilineString (sanitizedJSObject, 2 )});
114
+ } else if (harJson["postData" ]? ["text" ] != null ) {
140
115
result += templateBody
141
116
.render ({"body" : kEncoder.convert (harJson["postData" ]["text" ])});
142
117
}
@@ -146,4 +121,18 @@ async function buildFormData(fields) {
146
121
return null ;
147
122
}
148
123
}
124
+
125
+ // escape function and variables in JS Object
126
+ String sanitzeJSObject (String jsObject) {
127
+ RegExp pattern = isNodeJs
128
+ ? RegExp (r'"fs\.createReadStream\((.*?)\)"' )
129
+ : RegExp (r'"fileInput(\d+)\.files\[0\]"' );
130
+
131
+ var sanitizedJSObject = jsObject.replaceAllMapped (pattern, (match) {
132
+ return isNodeJs
133
+ ? 'fs.createReadStream("${match .group (1 )}")'
134
+ : 'fileInput${match .group (1 )}.files[0]' ;
135
+ });
136
+ return sanitizedJSObject;
137
+ }
149
138
}
0 commit comments