@api-client/core 0.3.1 → 0.3.4
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/build/browser.d.ts +1 -1
- package/build/index.d.ts +2 -2
- package/build/index.js.map +1 -1
- package/build/src/models/Backend.d.ts +22 -0
- package/build/src/runtime/store/StoreSdk.d.ts +192 -12
- package/build/src/runtime/store/StoreSdk.js +592 -53
- package/build/src/runtime/store/StoreSdk.js.map +1 -1
- package/package.json +3 -1
- package/src/data/DataReader.ts +11 -0
- package/src/data/DataUtils.ts +108 -0
- package/src/data/JmesparthReader.ts +26 -0
- package/src/data/Json2Xml.ts +190 -0
- package/src/data/JsonReader.ts +41 -0
- package/src/data/PayloadPointer.ts +48 -0
- package/src/data/RequestDataExtractor.ts +133 -0
- package/src/data/UrlEncodedReader.ts +20 -0
- package/src/data/XmlReader.ts +103 -0
- package/src/events/BaseEvents.ts +259 -0
- package/src/events/CustomEvent.ts +27 -0
- package/src/events/EventTypes.ts +19 -0
- package/src/events/Events.ts +19 -0
- package/src/events/authorization/AuthorizationEventTypes.ts +22 -0
- package/src/events/authorization/AuthorizationEvents.ts +61 -0
- package/src/events/cookies/CookieEventTypes.ts +13 -0
- package/src/events/cookies/CookieEvents.ts +157 -0
- package/src/events/encryption/EncryptionEventTypes.ts +4 -0
- package/src/events/encryption/EncryptionEvents.ts +51 -0
- package/src/events/environment/EnvironmentEventTypes.ts +3 -0
- package/src/events/environment/EnvironmentEvents.ts +24 -0
- package/src/events/models/ClientCertificateEvents.ts +87 -0
- package/src/events/models/ModelEventTypes.ts +47 -0
- package/src/events/models/ModelEvents.ts +7 -0
- package/src/events/models/ProjectEvents.ts +331 -0
- package/src/events/process/ProcessEventTypes.ts +5 -0
- package/src/events/process/ProcessEvents.ts +76 -0
- package/src/events/readme.md +22 -0
- package/src/events/reporting/ReportingEventTypes.ts +3 -0
- package/src/events/reporting/ReportingEvents.ts +28 -0
- package/src/events/telemetry/TelemetryEventTypes.ts +10 -0
- package/src/events/telemetry/TelemetryEvents.ts +156 -0
- package/src/lib/cookies/Cookie.ts +312 -0
- package/src/lib/cookies/Cookies.ts +326 -0
- package/src/lib/cookies/Utils.ts +168 -0
- package/src/lib/headers/Headers.ts +219 -0
- package/src/lib/logging/DefaultLogger.ts +19 -0
- package/src/lib/logging/DummyLogger.ts +21 -0
- package/src/lib/logging/Logger.ts +16 -0
- package/src/lib/transformers/PayloadSerializer.ts +332 -0
- package/src/lib/transformers/Utils.ts +18 -0
- package/src/lib/uuid.ts +40 -0
- package/src/mocking/LegacyInterfaces.ts +52 -0
- package/src/mocking/LegacyMock.ts +37 -0
- package/src/mocking/legacy/Authorization.ts +39 -0
- package/src/mocking/legacy/Certificates.ts +145 -0
- package/src/mocking/legacy/Cookies.ts +51 -0
- package/src/mocking/legacy/HostRules.ts +43 -0
- package/src/mocking/legacy/Http.ts +236 -0
- package/src/mocking/legacy/HttpResponse.ts +106 -0
- package/src/mocking/legacy/RestApi.ts +68 -0
- package/src/mocking/legacy/Urls.ts +44 -0
- package/src/mocking/legacy/Variables.ts +53 -0
- package/src/models/ArcResponse.ts +166 -0
- package/src/models/Authorization.ts +481 -0
- package/src/models/AuthorizationData.ts +60 -0
- package/src/models/Backend.ts +107 -0
- package/src/models/ClientCertificate.ts +68 -0
- package/src/models/Environment.ts +279 -0
- package/src/models/ErrorResponse.ts +101 -0
- package/src/models/HistoryIndex.ts +76 -0
- package/src/models/HistoryRequest.ts +28 -0
- package/src/models/HostRule.ts +163 -0
- package/src/models/HttpCookie.ts +285 -0
- package/src/models/HttpProject.ts +1294 -0
- package/src/models/HttpProjectListItem.ts +23 -0
- package/src/models/HttpRequest.ts +124 -0
- package/src/models/HttpResponse.ts +143 -0
- package/src/models/License.ts +113 -0
- package/src/models/ProjectDefinitionProperty.ts +40 -0
- package/src/models/ProjectFolder.ts +439 -0
- package/src/models/ProjectItem.ts +135 -0
- package/src/models/ProjectParent.ts +113 -0
- package/src/models/ProjectRequest.ts +277 -0
- package/src/models/ProjectSchema.ts +202 -0
- package/src/models/Property.ts +423 -0
- package/src/models/Provider.ts +98 -0
- package/src/models/README.md +20 -0
- package/src/models/Request.ts +452 -0
- package/src/models/RequestActions.ts +163 -0
- package/src/models/RequestAuthorization.ts +115 -0
- package/src/models/RequestConfig.ts +317 -0
- package/src/models/RequestLog.ts +159 -0
- package/src/models/RequestTime.ts +108 -0
- package/src/models/RequestUiMeta.ts +258 -0
- package/src/models/RequestsSize.ts +65 -0
- package/src/models/ResponseAuthorization.ts +104 -0
- package/src/models/ResponseRedirect.ts +158 -0
- package/src/models/RevisionInfo.ts +37 -0
- package/src/models/SentRequest.ts +125 -0
- package/src/models/SerializablePayload.ts +68 -0
- package/src/models/Server.ts +153 -0
- package/src/models/Thing.ts +110 -0
- package/src/models/Url.ts +90 -0
- package/src/models/User.ts +120 -0
- package/src/models/WebApi.ts +234 -0
- package/src/models/WebApiIndex.ts +122 -0
- package/src/models/Workspace.ts +182 -0
- package/src/models/actions/Action.ts +213 -0
- package/src/models/actions/ActionView.ts +40 -0
- package/src/models/actions/Condition.ts +207 -0
- package/src/models/actions/ConditionView.ts +42 -0
- package/src/models/actions/Enums.ts +29 -0
- package/src/models/actions/RunnableAction.ts +144 -0
- package/src/models/actions/runnable/DeleteCookieAction.ts +113 -0
- package/src/models/actions/runnable/Runnable.ts +9 -0
- package/src/models/actions/runnable/SetCookieAction.ts +216 -0
- package/src/models/actions/runnable/SetVariableAction.ts +81 -0
- package/src/models/legacy/DataExport.ts +172 -0
- package/src/models/legacy/Normalizer.ts +110 -0
- package/src/models/legacy/actions/Actions.ts +269 -0
- package/src/models/legacy/authorization/Authorization.ts +572 -0
- package/src/models/legacy/models/ApiTypes.ts +202 -0
- package/src/models/legacy/models/ArcLegacyProject.ts +39 -0
- package/src/models/legacy/models/AuthData.ts +17 -0
- package/src/models/legacy/models/ClientCertificate.ts +95 -0
- package/src/models/legacy/models/Cookies.ts +52 -0
- package/src/models/legacy/models/HostRule.ts +35 -0
- package/src/models/legacy/models/RestApi.ts +49 -0
- package/src/models/legacy/models/UrlHistory.ts +37 -0
- package/src/models/legacy/models/Variable.ts +43 -0
- package/src/models/legacy/models/base.d.ts +95 -0
- package/src/models/legacy/request/ArcRequest.ts +405 -0
- package/src/models/legacy/request/ArcResponse.ts +177 -0
- package/src/models/legacy/request/HistoryData.ts +47 -0
- package/src/models/legacy/request/Legacy.ts +45 -0
- package/src/models/legacy/request/RequestBody.ts +87 -0
- package/src/models/transformers/ArcDexieTransformer.ts +323 -0
- package/src/models/transformers/ArcLegacyNormalizer.ts +85 -0
- package/src/models/transformers/ArcLegacyTransformer.ts +200 -0
- package/src/models/transformers/ArcPouchTransformer.ts +184 -0
- package/src/models/transformers/BaseTransformer.ts +116 -0
- package/src/models/transformers/ImportUtils.ts +141 -0
- package/src/models/transformers/LegacyDataExportToApiProject.ts +76 -0
- package/src/models/transformers/LegacyExportProcessor.ts +252 -0
- package/src/models/transformers/PostmanBackupTransformer.ts +306 -0
- package/src/models/transformers/PostmanDataTransformer.ts +50 -0
- package/src/models/transformers/PostmanTransformer.ts +106 -0
- package/src/models/transformers/PostmanV21Transformer.ts +311 -0
- package/src/models/transformers/PostmanV2Transformer.ts +308 -0
- package/src/models/transformers/har.ts +865 -0
- package/src/runtime/actions/ActionRunner.ts +83 -0
- package/src/runtime/actions/ConditionRunner.ts +194 -0
- package/src/runtime/actions/RunnableCondition.ts +57 -0
- package/src/runtime/actions/runnable/ActionRunnable.ts +19 -0
- package/src/runtime/actions/runnable/DeleteCookieRunnable.ts +39 -0
- package/src/runtime/actions/runnable/SetCookieRunnable.ts +92 -0
- package/src/runtime/actions/runnable/SetVariableRunnable.ts +53 -0
- package/src/runtime/http-engine/ArcEngine.ts +1064 -0
- package/src/runtime/http-engine/Errors.ts +13 -0
- package/src/runtime/http-engine/FormData.ts +85 -0
- package/src/runtime/http-engine/HttpEngine.ts +874 -0
- package/src/runtime/http-engine/HttpErrorCodes.ts +270 -0
- package/src/runtime/http-engine/NodeEngine.ts +787 -0
- package/src/runtime/http-engine/NodeEngineDirect.ts +476 -0
- package/src/runtime/http-engine/PayloadSupport.ts +84 -0
- package/src/runtime/http-engine/RequestUtils.ts +164 -0
- package/src/runtime/http-engine/ntlm/Des.ts +345 -0
- package/src/runtime/http-engine/ntlm/MD4.ts +135 -0
- package/src/runtime/http-engine/ntlm/NtlmAuth.ts +186 -0
- package/src/runtime/http-engine/ntlm/NtlmMessage.ts +57 -0
- package/src/runtime/modules/BasicAuthCache.ts +133 -0
- package/src/runtime/modules/ExecutionResponse.ts +4 -0
- package/src/runtime/modules/ModulesRegistry.ts +136 -0
- package/src/runtime/modules/RequestAuthorization.ts +110 -0
- package/src/runtime/modules/RequestCookies.ts +145 -0
- package/src/runtime/node/ProjectRunner.ts +275 -0
- package/src/runtime/node/RequestFactory.ts +422 -0
- package/src/runtime/node/VariablesStore.ts +25 -0
- package/src/runtime/store/StoreSdk.ts +838 -0
- package/src/runtime/variables/Cache.ts +53 -0
- package/src/runtime/variables/EvalFunctions.ts +132 -0
- package/src/runtime/variables/ProjectVariables.ts +6 -0
- package/src/runtime/variables/VariablesProcessor.ts +543 -0
- package/src/runtime/variables/VariablesTokenizer.ts +55 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ExportOptionsInternal,
|
|
3
|
+
ArcExportObject,
|
|
4
|
+
ExportArcSavedRequest,
|
|
5
|
+
ExportArcHistoryRequest,
|
|
6
|
+
ExportArcProjects,
|
|
7
|
+
ExportArcWebsocketUrl,
|
|
8
|
+
ExportArcUrlHistory,
|
|
9
|
+
ExportArcHostRule,
|
|
10
|
+
ExportArcVariable,
|
|
11
|
+
ExportArcAuthData,
|
|
12
|
+
ArcExportProcessedData,
|
|
13
|
+
ArcNativeDataExport,
|
|
14
|
+
ArcExportClientCertificateData,
|
|
15
|
+
ExportArcClientCertificateData,
|
|
16
|
+
} from '../legacy/DataExport.js';
|
|
17
|
+
import { ARCProject } from '../legacy/models/ArcLegacyProject.js';
|
|
18
|
+
import { ARCAuthData } from '../legacy/models/AuthData.js';
|
|
19
|
+
import { ARCWebsocketUrlHistory, ARCUrlHistory } from '../legacy/models/UrlHistory.js';
|
|
20
|
+
import { ARCHostRule } from '../legacy/models/HostRule.js';
|
|
21
|
+
import { ARCVariable } from '../legacy/models/Variable.js';
|
|
22
|
+
import { ARCHistoryRequest, ARCSavedRequest } from '../legacy/request/ArcRequest.js';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* A class that processes ARC data to create a standard export object.
|
|
26
|
+
*/
|
|
27
|
+
export class LegacyExportProcessor {
|
|
28
|
+
electronCookies: boolean;
|
|
29
|
+
/**
|
|
30
|
+
* @param electronCookies True if the cookies were read from electron storage
|
|
31
|
+
*/
|
|
32
|
+
constructor(electronCookies: boolean) {
|
|
33
|
+
this.electronCookies = electronCookies;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Creates an export object for the data.
|
|
38
|
+
*
|
|
39
|
+
* @param exportData
|
|
40
|
+
* @param options Export configuration object
|
|
41
|
+
* @returns ARC export object declaration.
|
|
42
|
+
*/
|
|
43
|
+
createExportObject(exportData: ArcExportProcessedData[], options: ExportOptionsInternal): ArcExportObject {
|
|
44
|
+
const result: ArcExportObject = {
|
|
45
|
+
createdAt: new Date().toISOString(),
|
|
46
|
+
version: options.appVersion,
|
|
47
|
+
kind: options.kind || '',
|
|
48
|
+
electronCookies: this.electronCookies,
|
|
49
|
+
};
|
|
50
|
+
if (options.skipImport) {
|
|
51
|
+
result.loadToWorkspace = true;
|
|
52
|
+
}
|
|
53
|
+
exportData.forEach(({ key, data }) => {
|
|
54
|
+
if (!data) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
result[key] = this.prepareItem(key, data);
|
|
58
|
+
});
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
prepareItem(key: keyof ArcNativeDataExport, values: any[]): any[]|undefined {
|
|
63
|
+
switch (key) {
|
|
64
|
+
case 'authdata': return this.prepareAuthData(values);
|
|
65
|
+
case 'clientcertificates': return this.prepareClientCertData(values);
|
|
66
|
+
case 'cookies': return this.prepareCookieData(values);
|
|
67
|
+
case 'history': return this.prepareHistoryDataList(values);
|
|
68
|
+
case 'hostrules': return this.prepareHostRulesData(values);
|
|
69
|
+
case 'projects': return this.prepareProjectsList(values);
|
|
70
|
+
case 'requests': return this.prepareRequestsList(values);
|
|
71
|
+
case 'urlhistory': return this.prepareUrlHistoryData(values);
|
|
72
|
+
case 'variables': return this.prepareVariablesData(values);
|
|
73
|
+
case 'websocketurlhistory': return this.prepareWsUrlHistoryData(values);
|
|
74
|
+
default: return undefined;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Maps list of request to the export object.
|
|
80
|
+
* @param requests The list of requests to process.
|
|
81
|
+
*/
|
|
82
|
+
prepareRequestsList(requests: ARCSavedRequest[]): ExportArcSavedRequest[] {
|
|
83
|
+
const result = requests.map((item) => {
|
|
84
|
+
const request = { ...item } as ExportArcSavedRequest;
|
|
85
|
+
// @ts-ignore
|
|
86
|
+
if (item.legacyProject) {
|
|
87
|
+
if (item.projects) {
|
|
88
|
+
// @ts-ignore
|
|
89
|
+
request.projects[item.projects.length] = item.legacyProject;
|
|
90
|
+
} else {
|
|
91
|
+
// @ts-ignore
|
|
92
|
+
request.projects = [request.legacyProject];
|
|
93
|
+
}
|
|
94
|
+
// @ts-ignore
|
|
95
|
+
delete request.legacyProject;
|
|
96
|
+
}
|
|
97
|
+
request.kind = 'ARC#HttpRequest';
|
|
98
|
+
request.key = item._id as string;
|
|
99
|
+
delete request._rev;
|
|
100
|
+
delete request._id;
|
|
101
|
+
return request;
|
|
102
|
+
});
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
prepareProjectsList(projects: ARCProject[]): ExportArcProjects[] {
|
|
107
|
+
return projects.map((item) => {
|
|
108
|
+
const project = { ...item } as ExportArcProjects;
|
|
109
|
+
project.kind = 'ARC#ProjectData';
|
|
110
|
+
project.key = item._id as string;
|
|
111
|
+
// @ts-ignore
|
|
112
|
+
delete project._rev;
|
|
113
|
+
// @ts-ignore
|
|
114
|
+
delete project._id;
|
|
115
|
+
return project;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* @param history The list of requests to process.
|
|
121
|
+
*/
|
|
122
|
+
prepareHistoryDataList(history: ARCHistoryRequest[]): ExportArcHistoryRequest[] {
|
|
123
|
+
const result = history.map((item) => {
|
|
124
|
+
const request = { ...item } as ExportArcHistoryRequest;
|
|
125
|
+
request.kind = 'ARC#HttpRequest';
|
|
126
|
+
request.key = item._id as string;
|
|
127
|
+
// @ts-ignore
|
|
128
|
+
delete request._rev;
|
|
129
|
+
// @ts-ignore
|
|
130
|
+
delete request._id;
|
|
131
|
+
return request;
|
|
132
|
+
});
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
prepareWsUrlHistoryData(data: ARCWebsocketUrlHistory[]): ExportArcWebsocketUrl[] {
|
|
137
|
+
const result = data.map((item) => {
|
|
138
|
+
const history = { ...item } as ExportArcWebsocketUrl;
|
|
139
|
+
history.key = item._id as string;
|
|
140
|
+
// @ts-ignore
|
|
141
|
+
delete history._rev;
|
|
142
|
+
// @ts-ignore
|
|
143
|
+
delete history._id;
|
|
144
|
+
history.kind = 'ARC#WebsocketHistoryData';
|
|
145
|
+
return history;
|
|
146
|
+
});
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
prepareUrlHistoryData(data: ARCUrlHistory[]): ExportArcUrlHistory[] {
|
|
151
|
+
const result = data.map((item) => {
|
|
152
|
+
const history = { ...item } as ExportArcUrlHistory;
|
|
153
|
+
history.key = item._id as string;
|
|
154
|
+
// @ts-ignore
|
|
155
|
+
delete history._rev;
|
|
156
|
+
// @ts-ignore
|
|
157
|
+
delete history._id;
|
|
158
|
+
history.kind = 'ARC#UrlHistoryData';
|
|
159
|
+
return history;
|
|
160
|
+
});
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
prepareVariablesData(data: ARCVariable[]): ExportArcVariable[] {
|
|
165
|
+
const result: ExportArcVariable[] = [];
|
|
166
|
+
data.forEach((item) => {
|
|
167
|
+
const value = { ...item } as ExportArcVariable;
|
|
168
|
+
if (!value.environment) {
|
|
169
|
+
// PouchDB creates some views in the main datastore and it is added to
|
|
170
|
+
// get all docs function without any reason. It should be eliminated
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (value.variable) {
|
|
174
|
+
value.name = value.variable;
|
|
175
|
+
delete value.variable;
|
|
176
|
+
}
|
|
177
|
+
value.key = item._id as string;
|
|
178
|
+
// @ts-ignore
|
|
179
|
+
delete value._rev;
|
|
180
|
+
// @ts-ignore
|
|
181
|
+
delete value._id;
|
|
182
|
+
value.kind = 'ARC#Variable';
|
|
183
|
+
result.push(value);
|
|
184
|
+
});
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
prepareAuthData(authData: ARCAuthData[]): ExportArcAuthData[] {
|
|
189
|
+
const result = authData.map((item) => {
|
|
190
|
+
const value = item as ExportArcAuthData;
|
|
191
|
+
value.key = item._id as string;
|
|
192
|
+
// @ts-ignore
|
|
193
|
+
delete value._rev;
|
|
194
|
+
// @ts-ignore
|
|
195
|
+
delete value._id;
|
|
196
|
+
value.kind = 'ARC#AuthData';
|
|
197
|
+
return value;
|
|
198
|
+
});
|
|
199
|
+
return result;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
prepareCookieData(cookies: any[]): any[] {
|
|
203
|
+
const isElectron = this.electronCookies;
|
|
204
|
+
const result = cookies.map((item) => {
|
|
205
|
+
const value = item as any;
|
|
206
|
+
if (!isElectron) {
|
|
207
|
+
value.key = item._id as string;
|
|
208
|
+
// @ts-ignore
|
|
209
|
+
delete value._rev;
|
|
210
|
+
// @ts-ignore
|
|
211
|
+
delete value._id;
|
|
212
|
+
}
|
|
213
|
+
value.kind = 'ARC#Cookie';
|
|
214
|
+
return item;
|
|
215
|
+
});
|
|
216
|
+
return result;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* @param {ARCHostRule[]} hostRules
|
|
221
|
+
* @return {ExportArcHostRule[]}
|
|
222
|
+
*/
|
|
223
|
+
prepareHostRulesData(hostRules: ARCHostRule[]): ExportArcHostRule[] {
|
|
224
|
+
return hostRules.map((item) => {
|
|
225
|
+
const value = item as ExportArcHostRule;
|
|
226
|
+
value.key = value._id as string;
|
|
227
|
+
// @ts-ignore
|
|
228
|
+
delete value._rev;
|
|
229
|
+
// @ts-ignore
|
|
230
|
+
delete value._id;
|
|
231
|
+
value.kind = 'ARC#HostRule';
|
|
232
|
+
return value;
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
prepareClientCertData(items: ArcExportClientCertificateData[]): ExportArcClientCertificateData[] {
|
|
237
|
+
return items.map(({ item, data }) => {
|
|
238
|
+
const value = item as ExportArcClientCertificateData;
|
|
239
|
+
value.key = item._id as string;
|
|
240
|
+
// @ts-ignore
|
|
241
|
+
delete value._rev;
|
|
242
|
+
// @ts-ignore
|
|
243
|
+
delete value._id;
|
|
244
|
+
value.kind = 'ARC#ClientCertificate';
|
|
245
|
+
value.cert = data.cert;
|
|
246
|
+
if (data.key) {
|
|
247
|
+
value.pKey = data.key;
|
|
248
|
+
}
|
|
249
|
+
return value;
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
}
|
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
import { PostmanTransformer, dataValue, paramValue } from './PostmanTransformer.js';
|
|
3
|
+
import { HttpProject, IHttpProject, Kind as ProjectKind } from '../HttpProject.js';
|
|
4
|
+
import { ProjectFolder } from '../ProjectFolder.js';
|
|
5
|
+
import { ProjectRequest } from '../ProjectRequest.js';
|
|
6
|
+
import { IMultipartBody } from '../../lib/transformers/PayloadSerializer.js';
|
|
7
|
+
import { Environment } from '../Environment.js';
|
|
8
|
+
|
|
9
|
+
interface PostmanBackupV1 {
|
|
10
|
+
version: number;
|
|
11
|
+
collections?: PostmanCollection[];
|
|
12
|
+
environments?: PostmanEnvironment[];
|
|
13
|
+
headerPresets?: PostmanHeadersPreset[];
|
|
14
|
+
globals?: PostmanVariable[];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface PostmanCollection {
|
|
18
|
+
id: string;
|
|
19
|
+
name: string;
|
|
20
|
+
description: string;
|
|
21
|
+
order: string[];
|
|
22
|
+
folders?: PostmanFolder[];
|
|
23
|
+
folders_order: string[];
|
|
24
|
+
timestamp: number;
|
|
25
|
+
synced: boolean;
|
|
26
|
+
remote_id: number;
|
|
27
|
+
owner: number;
|
|
28
|
+
sharedWithTeam: boolean;
|
|
29
|
+
subscribed: boolean;
|
|
30
|
+
remoteLink: string;
|
|
31
|
+
remoteLinkUpdatedAt: string;
|
|
32
|
+
public: boolean;
|
|
33
|
+
createdAt: number;
|
|
34
|
+
updatedAt: number;
|
|
35
|
+
write: boolean;
|
|
36
|
+
published: boolean;
|
|
37
|
+
favorite: boolean;
|
|
38
|
+
requests: PostmanRequest[];
|
|
39
|
+
variables?: PostmanVariable[];
|
|
40
|
+
}
|
|
41
|
+
interface PostmanRequest {
|
|
42
|
+
id: string;
|
|
43
|
+
name: string;
|
|
44
|
+
time: number;
|
|
45
|
+
headers: string;
|
|
46
|
+
url: string;
|
|
47
|
+
queryParams: PostmanParameter[];
|
|
48
|
+
headerData: PostmanParameter[];
|
|
49
|
+
pathVariableData: PostmanParameter[];
|
|
50
|
+
preRequestScript: string;
|
|
51
|
+
method: string;
|
|
52
|
+
collectionId: string;
|
|
53
|
+
data: string|PostmanBodyParam[]|null;
|
|
54
|
+
dataMode: string;
|
|
55
|
+
description: string;
|
|
56
|
+
descriptionFormat: string;
|
|
57
|
+
version: number;
|
|
58
|
+
tests: string;
|
|
59
|
+
currentHelper: string;
|
|
60
|
+
rawModeData?: string;
|
|
61
|
+
}
|
|
62
|
+
interface PostmanEnvironment {
|
|
63
|
+
id: string;
|
|
64
|
+
name: string;
|
|
65
|
+
timestamp: number;
|
|
66
|
+
synced: boolean;
|
|
67
|
+
values: PostmanParameter[];
|
|
68
|
+
}
|
|
69
|
+
interface PostmanHeadersPreset {
|
|
70
|
+
id: string;
|
|
71
|
+
name: string;
|
|
72
|
+
headers: PostmanHeader[];
|
|
73
|
+
timestamp: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
interface PostmanVariable {
|
|
77
|
+
disabled: boolean;
|
|
78
|
+
key: string;
|
|
79
|
+
value: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
interface PostmanParameter {
|
|
83
|
+
enabled: boolean;
|
|
84
|
+
key: string;
|
|
85
|
+
value: string;
|
|
86
|
+
type: string;
|
|
87
|
+
}
|
|
88
|
+
interface PostmanBodyParam extends PostmanParameter {
|
|
89
|
+
description: string;
|
|
90
|
+
}
|
|
91
|
+
interface PostmanHeader extends PostmanParameter {
|
|
92
|
+
description: string;
|
|
93
|
+
warning: string;
|
|
94
|
+
}
|
|
95
|
+
interface PostmanFolder {
|
|
96
|
+
name: string;
|
|
97
|
+
description: string;
|
|
98
|
+
collectionId: string;
|
|
99
|
+
collection: string;
|
|
100
|
+
order: string[];
|
|
101
|
+
owner: number;
|
|
102
|
+
folders_order: string[];
|
|
103
|
+
createdAt: number;
|
|
104
|
+
updatedAt: number;
|
|
105
|
+
id: string;
|
|
106
|
+
collection_id: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Transformer for Postman backup file.
|
|
111
|
+
*/
|
|
112
|
+
export class PostmanBackupTransformer extends PostmanTransformer {
|
|
113
|
+
async transform(): Promise<HttpProject[]> {
|
|
114
|
+
const raw = this[dataValue] as PostmanBackupV1;
|
|
115
|
+
const result: HttpProject[] = [];
|
|
116
|
+
if (!raw.collections) {
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
119
|
+
for (const collection of raw.collections) {
|
|
120
|
+
const project = await this.transformCollection(collection);
|
|
121
|
+
result.push(project);
|
|
122
|
+
}
|
|
123
|
+
return result;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async transformCollection(collection: PostmanCollection): Promise<HttpProject> {
|
|
127
|
+
const { folders_order, order } = collection;
|
|
128
|
+
const project = this.createProject(collection);
|
|
129
|
+
this.setProjectVariables(project, collection);
|
|
130
|
+
if (Array.isArray(folders_order)) {
|
|
131
|
+
for (const id of folders_order) {
|
|
132
|
+
await this.addFolder(project, collection, id);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
if (Array.isArray(order)) {
|
|
136
|
+
for (const id of order) {
|
|
137
|
+
await this.addRequest(project, collection, id);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return project;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
createProject(collection: PostmanCollection): HttpProject {
|
|
144
|
+
const { description, id, name } = collection;
|
|
145
|
+
const init: IHttpProject = {
|
|
146
|
+
kind: ProjectKind,
|
|
147
|
+
definitions: {},
|
|
148
|
+
environments: [],
|
|
149
|
+
info: {
|
|
150
|
+
kind: 'ARC#Thing',
|
|
151
|
+
name,
|
|
152
|
+
},
|
|
153
|
+
items: [],
|
|
154
|
+
key: id,
|
|
155
|
+
};
|
|
156
|
+
if (description) {
|
|
157
|
+
init.info.description = description;
|
|
158
|
+
}
|
|
159
|
+
const project = new HttpProject(init);
|
|
160
|
+
return project;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
setProjectVariables(project: HttpProject, collection: PostmanCollection): void {
|
|
164
|
+
const { variables } = collection;
|
|
165
|
+
if (!Array.isArray(variables)) {
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const env = Environment.fromName('Default');
|
|
169
|
+
project.addEnvironment(env);
|
|
170
|
+
variables.forEach((param) => {
|
|
171
|
+
const { disabled=false, key, value } = param;
|
|
172
|
+
|
|
173
|
+
const parsed = this.ensureVariablesSyntax(value) as string;
|
|
174
|
+
const created = env.addVariable(key, parsed);
|
|
175
|
+
created.enabled = !disabled;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
async addFolder(current: HttpProject | ProjectFolder, collection: PostmanCollection, id: string): Promise<void> {
|
|
180
|
+
const { folders } = collection;
|
|
181
|
+
const folder = folders?.find(i => i.id === id);
|
|
182
|
+
if (!folder) {
|
|
183
|
+
this.addLog('warning', `Folder ${id} not found in the collection.`);
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const created = current.addFolder(folder.name);
|
|
187
|
+
if (folder.description) {
|
|
188
|
+
created.info.description = folder.description;
|
|
189
|
+
}
|
|
190
|
+
if (Array.isArray(folder.folders_order)) {
|
|
191
|
+
for (const id of folder.folders_order) {
|
|
192
|
+
await this.addFolder(created, collection, id);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
if (Array.isArray(folder.order)) {
|
|
196
|
+
for (const id of folder.order) {
|
|
197
|
+
await this.addRequest(created, collection, id);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
async addRequest(current: HttpProject | ProjectFolder, collection: PostmanCollection, id: string): Promise<void> {
|
|
203
|
+
const { requests } = collection;
|
|
204
|
+
const request = requests?.find(i => i.id === id);
|
|
205
|
+
if (!request) {
|
|
206
|
+
this.addLog('warning', `Request ${id} not found in the collection.`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
const name = request.name || 'unnamed';
|
|
211
|
+
let url = request.url || 'http://';
|
|
212
|
+
url = this.ensureVariablesSyntax(url) as string;
|
|
213
|
+
let method = request.method || 'GET';
|
|
214
|
+
method = this.ensureVariablesSyntax(method) as string;
|
|
215
|
+
let headers = request.headers || '';
|
|
216
|
+
headers = this.ensureVariablesSyntax(headers) as string;
|
|
217
|
+
|
|
218
|
+
let createdTime = Number(request.time);
|
|
219
|
+
if (Number.isNaN(createdTime)) {
|
|
220
|
+
createdTime = Date.now();
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const created = current.addRequest(url);
|
|
224
|
+
created.info.name = name;
|
|
225
|
+
if (request.description) {
|
|
226
|
+
created.info.description = request.description;
|
|
227
|
+
}
|
|
228
|
+
created.expects.method = method;
|
|
229
|
+
if (headers) {
|
|
230
|
+
created.expects.headers = headers;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
await this.addRequestBody(created, request);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
async addRequestBody(created: ProjectRequest, request: PostmanRequest): Promise<void> {
|
|
237
|
+
switch (request.dataMode) {
|
|
238
|
+
case 'urlencoded': return this.addUrlencodedBody(created, request);
|
|
239
|
+
case 'binary': return this.addBinaryBody(created, request);
|
|
240
|
+
case 'params': return this.addParamsBody(created, request);
|
|
241
|
+
case 'raw': return this.addRawBody(created, request);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
async addUrlencodedBody(created: ProjectRequest, request: PostmanRequest): Promise<void> {
|
|
246
|
+
if (!Array.isArray(request.data)) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
const data = request.data as PostmanBodyParam[];
|
|
250
|
+
const body = data.map(i => `${paramValue(i.key)}=${paramValue(i.value)}`).join('&');
|
|
251
|
+
await created.expects.writePayload(body);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async addBinaryBody(created: ProjectRequest, request: PostmanRequest): Promise<void> {
|
|
255
|
+
// Postman sets the `rawModeData` property with the path to the file
|
|
256
|
+
// but not data itself. Because of that this method is a stub that can be extended
|
|
257
|
+
// by particular implementation (like node, CLI).
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async addParamsBody(created: ProjectRequest, request: PostmanRequest): Promise<void> {
|
|
261
|
+
// "params" is Postman's FormData implementation.
|
|
262
|
+
// Similarly to the `addBinaryBody()`, file parts carry no data.
|
|
263
|
+
// Override the `addParamsFilePart()` to handle file read from the filesystem.
|
|
264
|
+
if (!Array.isArray(request.data)) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
const data = request.data as PostmanBodyParam[];
|
|
268
|
+
const body: IMultipartBody[] = [];
|
|
269
|
+
for (const part of data) {
|
|
270
|
+
if (part.type === 'text') {
|
|
271
|
+
await this.addParamsTextPart(body, part);
|
|
272
|
+
} else if (part.type === 'file') {
|
|
273
|
+
await this.addParamsFilePart(body, part);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
created.expects.payload = {
|
|
277
|
+
type: 'formdata',
|
|
278
|
+
data: body,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
async addParamsTextPart(body: IMultipartBody[], param: PostmanBodyParam): Promise<void> {
|
|
283
|
+
const { key, value, enabled=true } = param;
|
|
284
|
+
body.push({
|
|
285
|
+
isFile: false,
|
|
286
|
+
name: key,
|
|
287
|
+
value,
|
|
288
|
+
enabled,
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
async addParamsFilePart(body: IMultipartBody[], param: PostmanBodyParam): Promise<void> {
|
|
293
|
+
// Postman sets the `value` property with the path to the file
|
|
294
|
+
// but not data itself. Because of that this method is a stub that can be extended
|
|
295
|
+
// by particular implementation (like node, CLI).
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
async addRawBody(created: ProjectRequest, request: PostmanRequest): Promise<void> {
|
|
299
|
+
const { rawModeData, data } = request;
|
|
300
|
+
if (rawModeData && typeof rawModeData === 'string') {
|
|
301
|
+
await created.expects.writePayload(rawModeData);
|
|
302
|
+
} else if (data && typeof data === 'string') {
|
|
303
|
+
await created.expects.writePayload(data);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { PostmanBackupTransformer } from './PostmanBackupTransformer.js';
|
|
2
|
+
|
|
3
|
+
import { PostmanV2Transformer } from './PostmanV2Transformer.js';
|
|
4
|
+
import { PostmanV21Transformer } from './PostmanV21Transformer.js';
|
|
5
|
+
import { PostmanTransformer } from './PostmanTransformer.js';
|
|
6
|
+
import { HttpProject } from '../HttpProject.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Transforms Postman collections (v2 and v2.1) and Postman's data export
|
|
10
|
+
* into an HTTP Project (or projects for data export).
|
|
11
|
+
*/
|
|
12
|
+
export class PostmanDataTransformer {
|
|
13
|
+
static transform(init: any): Promise<HttpProject|HttpProject[]> {
|
|
14
|
+
let data = init;
|
|
15
|
+
if (typeof init === 'string') {
|
|
16
|
+
data = JSON.parse(init);
|
|
17
|
+
}
|
|
18
|
+
const version = this.recognizeVersion(data);
|
|
19
|
+
let instance: PostmanTransformer;
|
|
20
|
+
switch (version) {
|
|
21
|
+
case 'backup':
|
|
22
|
+
instance = new PostmanBackupTransformer(data);
|
|
23
|
+
break;
|
|
24
|
+
case 'collection-v2':
|
|
25
|
+
instance = new PostmanV2Transformer(data);
|
|
26
|
+
break;
|
|
27
|
+
case 'collection-v2.1':
|
|
28
|
+
instance = new PostmanV21Transformer(data);
|
|
29
|
+
break;
|
|
30
|
+
default: return Promise.reject(new Error('Unsupported Postman version.'));
|
|
31
|
+
}
|
|
32
|
+
return instance.transform();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
static recognizeVersion(data: any): string | undefined {
|
|
36
|
+
if (data.version) {
|
|
37
|
+
return 'backup';
|
|
38
|
+
}
|
|
39
|
+
if (data.info.schema) {
|
|
40
|
+
switch (data.info.schema) {
|
|
41
|
+
case 'https://schema.getpostman.com/json/collection/v2.0.0/collection.json':
|
|
42
|
+
return 'collection-v2';
|
|
43
|
+
case 'https://schema.getpostman.com/json/collection/v2.1.0/collection.json':
|
|
44
|
+
return 'collection-v2.1';
|
|
45
|
+
default: return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { HttpProject } from '../HttpProject.js';
|
|
2
|
+
|
|
3
|
+
export const postmanVarRegex = /\{\{(.*?)\}\}/gim;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Replacer function for regex replace to be used to replace variables
|
|
7
|
+
* notation to ARC's
|
|
8
|
+
*
|
|
9
|
+
* @param match
|
|
10
|
+
* @param value
|
|
11
|
+
* @return Value to be replaced in the string.
|
|
12
|
+
*/
|
|
13
|
+
export function variablesReplacerFunction(match: string, value: string): string {
|
|
14
|
+
switch (value) {
|
|
15
|
+
case '$randomInt': value = 'random()'; break;
|
|
16
|
+
case '$guid': value = 'uuid()'; break;
|
|
17
|
+
case '$timestamp': value = 'now()'; break;
|
|
18
|
+
default:
|
|
19
|
+
}
|
|
20
|
+
return `\${${value}}`;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Parse input string as a payload param key or value.
|
|
25
|
+
*
|
|
26
|
+
* @param input An input to parse.
|
|
27
|
+
* @return Trimmed string
|
|
28
|
+
*/
|
|
29
|
+
export function paramValue(input: string): string {
|
|
30
|
+
if (!input) {
|
|
31
|
+
return String();
|
|
32
|
+
}
|
|
33
|
+
input = String(input);
|
|
34
|
+
input = input.trim();
|
|
35
|
+
return input;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const dataValue = Symbol('dataValue');
|
|
39
|
+
|
|
40
|
+
export type PostmanImportLogLevel = 'error' | 'warning' | 'info';
|
|
41
|
+
|
|
42
|
+
export interface PostmanImportLog {
|
|
43
|
+
type: PostmanImportLogLevel;
|
|
44
|
+
message: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Base class for all Postman transformers
|
|
49
|
+
*/
|
|
50
|
+
export abstract class PostmanTransformer {
|
|
51
|
+
[dataValue]: any;
|
|
52
|
+
logs: PostmanImportLog[] = [];
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* @param data Data to be transformed.
|
|
56
|
+
*/
|
|
57
|
+
constructor(data: any) {
|
|
58
|
+
this[dataValue] = data;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
addLog(type: PostmanImportLogLevel, message: string): void {
|
|
62
|
+
this.logs.push({
|
|
63
|
+
type,
|
|
64
|
+
message,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Replaces any occurrence of {{STRING}} with ARC's variables syntax.
|
|
70
|
+
*
|
|
71
|
+
* @param str A string value to check for variables.
|
|
72
|
+
* @return The same string with ARC's variables syntax
|
|
73
|
+
*/
|
|
74
|
+
ensureVariablesSyntax(str?: string): string|undefined {
|
|
75
|
+
if (!str || !str.indexOf) {
|
|
76
|
+
return str;
|
|
77
|
+
}
|
|
78
|
+
// https://jsperf.com/regex-replace-with-test-conditions
|
|
79
|
+
if (str.indexOf('{{') !== -1) {
|
|
80
|
+
str = str.replace(postmanVarRegex, variablesReplacerFunction);
|
|
81
|
+
}
|
|
82
|
+
return str;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
ensureVarsRecursively(obj: any): any {
|
|
86
|
+
if (Array.isArray(obj)) {
|
|
87
|
+
return obj.map((item) => this.ensureVarsRecursively(item));
|
|
88
|
+
}
|
|
89
|
+
if (obj === Object(obj)) {
|
|
90
|
+
Object.keys(obj).forEach((key) => {
|
|
91
|
+
obj[key] = this.ensureVarsRecursively(obj[key]);
|
|
92
|
+
});
|
|
93
|
+
return obj;
|
|
94
|
+
}
|
|
95
|
+
if (typeof obj === 'string') {
|
|
96
|
+
return this.ensureVariablesSyntax(obj);
|
|
97
|
+
}
|
|
98
|
+
return obj;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Transforms the data into ARC data model.
|
|
103
|
+
* @returns Promise resolved when data are transformed.
|
|
104
|
+
*/
|
|
105
|
+
abstract transform(): Promise<HttpProject|HttpProject[]>;
|
|
106
|
+
}
|