@api-client/core 0.3.3 → 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.
Files changed (176) hide show
  1. package/package.json +1 -1
  2. package/src/data/DataReader.ts +11 -0
  3. package/src/data/DataUtils.ts +108 -0
  4. package/src/data/JmesparthReader.ts +26 -0
  5. package/src/data/Json2Xml.ts +190 -0
  6. package/src/data/JsonReader.ts +41 -0
  7. package/src/data/PayloadPointer.ts +48 -0
  8. package/src/data/RequestDataExtractor.ts +133 -0
  9. package/src/data/UrlEncodedReader.ts +20 -0
  10. package/src/data/XmlReader.ts +103 -0
  11. package/src/events/BaseEvents.ts +259 -0
  12. package/src/events/CustomEvent.ts +27 -0
  13. package/src/events/EventTypes.ts +19 -0
  14. package/src/events/Events.ts +19 -0
  15. package/src/events/authorization/AuthorizationEventTypes.ts +22 -0
  16. package/src/events/authorization/AuthorizationEvents.ts +61 -0
  17. package/src/events/cookies/CookieEventTypes.ts +13 -0
  18. package/src/events/cookies/CookieEvents.ts +157 -0
  19. package/src/events/encryption/EncryptionEventTypes.ts +4 -0
  20. package/src/events/encryption/EncryptionEvents.ts +51 -0
  21. package/src/events/environment/EnvironmentEventTypes.ts +3 -0
  22. package/src/events/environment/EnvironmentEvents.ts +24 -0
  23. package/src/events/models/ClientCertificateEvents.ts +87 -0
  24. package/src/events/models/ModelEventTypes.ts +47 -0
  25. package/src/events/models/ModelEvents.ts +7 -0
  26. package/src/events/models/ProjectEvents.ts +331 -0
  27. package/src/events/process/ProcessEventTypes.ts +5 -0
  28. package/src/events/process/ProcessEvents.ts +76 -0
  29. package/src/events/readme.md +22 -0
  30. package/src/events/reporting/ReportingEventTypes.ts +3 -0
  31. package/src/events/reporting/ReportingEvents.ts +28 -0
  32. package/src/events/telemetry/TelemetryEventTypes.ts +10 -0
  33. package/src/events/telemetry/TelemetryEvents.ts +156 -0
  34. package/src/lib/cookies/Cookie.ts +312 -0
  35. package/src/lib/cookies/Cookies.ts +326 -0
  36. package/src/lib/cookies/Utils.ts +168 -0
  37. package/src/lib/headers/Headers.ts +219 -0
  38. package/src/lib/logging/DefaultLogger.ts +19 -0
  39. package/src/lib/logging/DummyLogger.ts +21 -0
  40. package/src/lib/logging/Logger.ts +16 -0
  41. package/src/lib/transformers/PayloadSerializer.ts +332 -0
  42. package/src/lib/transformers/Utils.ts +18 -0
  43. package/src/lib/uuid.ts +40 -0
  44. package/src/mocking/LegacyInterfaces.ts +52 -0
  45. package/src/mocking/LegacyMock.ts +37 -0
  46. package/src/mocking/legacy/Authorization.ts +39 -0
  47. package/src/mocking/legacy/Certificates.ts +145 -0
  48. package/src/mocking/legacy/Cookies.ts +51 -0
  49. package/src/mocking/legacy/HostRules.ts +43 -0
  50. package/src/mocking/legacy/Http.ts +236 -0
  51. package/src/mocking/legacy/HttpResponse.ts +106 -0
  52. package/src/mocking/legacy/RestApi.ts +68 -0
  53. package/src/mocking/legacy/Urls.ts +44 -0
  54. package/src/mocking/legacy/Variables.ts +53 -0
  55. package/src/models/ArcResponse.ts +166 -0
  56. package/src/models/Authorization.ts +481 -0
  57. package/src/models/AuthorizationData.ts +60 -0
  58. package/src/models/Backend.ts +107 -0
  59. package/src/models/ClientCertificate.ts +68 -0
  60. package/src/models/Environment.ts +279 -0
  61. package/src/models/ErrorResponse.ts +101 -0
  62. package/src/models/HistoryIndex.ts +76 -0
  63. package/src/models/HistoryRequest.ts +28 -0
  64. package/src/models/HostRule.ts +163 -0
  65. package/src/models/HttpCookie.ts +285 -0
  66. package/src/models/HttpProject.ts +1294 -0
  67. package/src/models/HttpProjectListItem.ts +23 -0
  68. package/src/models/HttpRequest.ts +124 -0
  69. package/src/models/HttpResponse.ts +143 -0
  70. package/src/models/License.ts +113 -0
  71. package/src/models/ProjectDefinitionProperty.ts +40 -0
  72. package/src/models/ProjectFolder.ts +439 -0
  73. package/src/models/ProjectItem.ts +135 -0
  74. package/src/models/ProjectParent.ts +113 -0
  75. package/src/models/ProjectRequest.ts +277 -0
  76. package/src/models/ProjectSchema.ts +202 -0
  77. package/src/models/Property.ts +423 -0
  78. package/src/models/Provider.ts +98 -0
  79. package/src/models/README.md +20 -0
  80. package/src/models/Request.ts +452 -0
  81. package/src/models/RequestActions.ts +163 -0
  82. package/src/models/RequestAuthorization.ts +115 -0
  83. package/src/models/RequestConfig.ts +317 -0
  84. package/src/models/RequestLog.ts +159 -0
  85. package/src/models/RequestTime.ts +108 -0
  86. package/src/models/RequestUiMeta.ts +258 -0
  87. package/src/models/RequestsSize.ts +65 -0
  88. package/src/models/ResponseAuthorization.ts +104 -0
  89. package/src/models/ResponseRedirect.ts +158 -0
  90. package/src/models/RevisionInfo.ts +37 -0
  91. package/src/models/SentRequest.ts +125 -0
  92. package/src/models/SerializablePayload.ts +68 -0
  93. package/src/models/Server.ts +153 -0
  94. package/src/models/Thing.ts +110 -0
  95. package/src/models/Url.ts +90 -0
  96. package/src/models/User.ts +120 -0
  97. package/src/models/WebApi.ts +234 -0
  98. package/src/models/WebApiIndex.ts +122 -0
  99. package/src/models/Workspace.ts +182 -0
  100. package/src/models/actions/Action.ts +213 -0
  101. package/src/models/actions/ActionView.ts +40 -0
  102. package/src/models/actions/Condition.ts +207 -0
  103. package/src/models/actions/ConditionView.ts +42 -0
  104. package/src/models/actions/Enums.ts +29 -0
  105. package/src/models/actions/RunnableAction.ts +144 -0
  106. package/src/models/actions/runnable/DeleteCookieAction.ts +113 -0
  107. package/src/models/actions/runnable/Runnable.ts +9 -0
  108. package/src/models/actions/runnable/SetCookieAction.ts +216 -0
  109. package/src/models/actions/runnable/SetVariableAction.ts +81 -0
  110. package/src/models/legacy/DataExport.ts +172 -0
  111. package/src/models/legacy/Normalizer.ts +110 -0
  112. package/src/models/legacy/actions/Actions.ts +269 -0
  113. package/src/models/legacy/authorization/Authorization.ts +572 -0
  114. package/src/models/legacy/models/ApiTypes.ts +202 -0
  115. package/src/models/legacy/models/ArcLegacyProject.ts +39 -0
  116. package/src/models/legacy/models/AuthData.ts +17 -0
  117. package/src/models/legacy/models/ClientCertificate.ts +95 -0
  118. package/src/models/legacy/models/Cookies.ts +52 -0
  119. package/src/models/legacy/models/HostRule.ts +35 -0
  120. package/src/models/legacy/models/RestApi.ts +49 -0
  121. package/src/models/legacy/models/UrlHistory.ts +37 -0
  122. package/src/models/legacy/models/Variable.ts +43 -0
  123. package/src/models/legacy/models/base.d.ts +95 -0
  124. package/src/models/legacy/request/ArcRequest.ts +405 -0
  125. package/src/models/legacy/request/ArcResponse.ts +177 -0
  126. package/src/models/legacy/request/HistoryData.ts +47 -0
  127. package/src/models/legacy/request/Legacy.ts +45 -0
  128. package/src/models/legacy/request/RequestBody.ts +87 -0
  129. package/src/models/transformers/ArcDexieTransformer.ts +323 -0
  130. package/src/models/transformers/ArcLegacyNormalizer.ts +85 -0
  131. package/src/models/transformers/ArcLegacyTransformer.ts +200 -0
  132. package/src/models/transformers/ArcPouchTransformer.ts +184 -0
  133. package/src/models/transformers/BaseTransformer.ts +116 -0
  134. package/src/models/transformers/ImportUtils.ts +141 -0
  135. package/src/models/transformers/LegacyDataExportToApiProject.ts +76 -0
  136. package/src/models/transformers/LegacyExportProcessor.ts +252 -0
  137. package/src/models/transformers/PostmanBackupTransformer.ts +306 -0
  138. package/src/models/transformers/PostmanDataTransformer.ts +50 -0
  139. package/src/models/transformers/PostmanTransformer.ts +106 -0
  140. package/src/models/transformers/PostmanV21Transformer.ts +311 -0
  141. package/src/models/transformers/PostmanV2Transformer.ts +308 -0
  142. package/src/models/transformers/har.ts +865 -0
  143. package/src/runtime/actions/ActionRunner.ts +83 -0
  144. package/src/runtime/actions/ConditionRunner.ts +194 -0
  145. package/src/runtime/actions/RunnableCondition.ts +57 -0
  146. package/src/runtime/actions/runnable/ActionRunnable.ts +19 -0
  147. package/src/runtime/actions/runnable/DeleteCookieRunnable.ts +39 -0
  148. package/src/runtime/actions/runnable/SetCookieRunnable.ts +92 -0
  149. package/src/runtime/actions/runnable/SetVariableRunnable.ts +53 -0
  150. package/src/runtime/http-engine/ArcEngine.ts +1064 -0
  151. package/src/runtime/http-engine/Errors.ts +13 -0
  152. package/src/runtime/http-engine/FormData.ts +85 -0
  153. package/src/runtime/http-engine/HttpEngine.ts +874 -0
  154. package/src/runtime/http-engine/HttpErrorCodes.ts +270 -0
  155. package/src/runtime/http-engine/NodeEngine.ts +787 -0
  156. package/src/runtime/http-engine/NodeEngineDirect.ts +476 -0
  157. package/src/runtime/http-engine/PayloadSupport.ts +84 -0
  158. package/src/runtime/http-engine/RequestUtils.ts +164 -0
  159. package/src/runtime/http-engine/ntlm/Des.ts +345 -0
  160. package/src/runtime/http-engine/ntlm/MD4.ts +135 -0
  161. package/src/runtime/http-engine/ntlm/NtlmAuth.ts +186 -0
  162. package/src/runtime/http-engine/ntlm/NtlmMessage.ts +57 -0
  163. package/src/runtime/modules/BasicAuthCache.ts +133 -0
  164. package/src/runtime/modules/ExecutionResponse.ts +4 -0
  165. package/src/runtime/modules/ModulesRegistry.ts +136 -0
  166. package/src/runtime/modules/RequestAuthorization.ts +110 -0
  167. package/src/runtime/modules/RequestCookies.ts +145 -0
  168. package/src/runtime/node/ProjectRunner.ts +275 -0
  169. package/src/runtime/node/RequestFactory.ts +422 -0
  170. package/src/runtime/node/VariablesStore.ts +25 -0
  171. package/src/runtime/store/StoreSdk.ts +838 -0
  172. package/src/runtime/variables/Cache.ts +53 -0
  173. package/src/runtime/variables/EvalFunctions.ts +132 -0
  174. package/src/runtime/variables/ProjectVariables.ts +6 -0
  175. package/src/runtime/variables/VariablesProcessor.ts +543 -0
  176. 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
+ }