@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.
Files changed (183) hide show
  1. package/build/browser.d.ts +1 -1
  2. package/build/index.d.ts +2 -2
  3. package/build/index.js.map +1 -1
  4. package/build/src/models/Backend.d.ts +22 -0
  5. package/build/src/runtime/store/StoreSdk.d.ts +192 -12
  6. package/build/src/runtime/store/StoreSdk.js +592 -53
  7. package/build/src/runtime/store/StoreSdk.js.map +1 -1
  8. package/package.json +3 -1
  9. package/src/data/DataReader.ts +11 -0
  10. package/src/data/DataUtils.ts +108 -0
  11. package/src/data/JmesparthReader.ts +26 -0
  12. package/src/data/Json2Xml.ts +190 -0
  13. package/src/data/JsonReader.ts +41 -0
  14. package/src/data/PayloadPointer.ts +48 -0
  15. package/src/data/RequestDataExtractor.ts +133 -0
  16. package/src/data/UrlEncodedReader.ts +20 -0
  17. package/src/data/XmlReader.ts +103 -0
  18. package/src/events/BaseEvents.ts +259 -0
  19. package/src/events/CustomEvent.ts +27 -0
  20. package/src/events/EventTypes.ts +19 -0
  21. package/src/events/Events.ts +19 -0
  22. package/src/events/authorization/AuthorizationEventTypes.ts +22 -0
  23. package/src/events/authorization/AuthorizationEvents.ts +61 -0
  24. package/src/events/cookies/CookieEventTypes.ts +13 -0
  25. package/src/events/cookies/CookieEvents.ts +157 -0
  26. package/src/events/encryption/EncryptionEventTypes.ts +4 -0
  27. package/src/events/encryption/EncryptionEvents.ts +51 -0
  28. package/src/events/environment/EnvironmentEventTypes.ts +3 -0
  29. package/src/events/environment/EnvironmentEvents.ts +24 -0
  30. package/src/events/models/ClientCertificateEvents.ts +87 -0
  31. package/src/events/models/ModelEventTypes.ts +47 -0
  32. package/src/events/models/ModelEvents.ts +7 -0
  33. package/src/events/models/ProjectEvents.ts +331 -0
  34. package/src/events/process/ProcessEventTypes.ts +5 -0
  35. package/src/events/process/ProcessEvents.ts +76 -0
  36. package/src/events/readme.md +22 -0
  37. package/src/events/reporting/ReportingEventTypes.ts +3 -0
  38. package/src/events/reporting/ReportingEvents.ts +28 -0
  39. package/src/events/telemetry/TelemetryEventTypes.ts +10 -0
  40. package/src/events/telemetry/TelemetryEvents.ts +156 -0
  41. package/src/lib/cookies/Cookie.ts +312 -0
  42. package/src/lib/cookies/Cookies.ts +326 -0
  43. package/src/lib/cookies/Utils.ts +168 -0
  44. package/src/lib/headers/Headers.ts +219 -0
  45. package/src/lib/logging/DefaultLogger.ts +19 -0
  46. package/src/lib/logging/DummyLogger.ts +21 -0
  47. package/src/lib/logging/Logger.ts +16 -0
  48. package/src/lib/transformers/PayloadSerializer.ts +332 -0
  49. package/src/lib/transformers/Utils.ts +18 -0
  50. package/src/lib/uuid.ts +40 -0
  51. package/src/mocking/LegacyInterfaces.ts +52 -0
  52. package/src/mocking/LegacyMock.ts +37 -0
  53. package/src/mocking/legacy/Authorization.ts +39 -0
  54. package/src/mocking/legacy/Certificates.ts +145 -0
  55. package/src/mocking/legacy/Cookies.ts +51 -0
  56. package/src/mocking/legacy/HostRules.ts +43 -0
  57. package/src/mocking/legacy/Http.ts +236 -0
  58. package/src/mocking/legacy/HttpResponse.ts +106 -0
  59. package/src/mocking/legacy/RestApi.ts +68 -0
  60. package/src/mocking/legacy/Urls.ts +44 -0
  61. package/src/mocking/legacy/Variables.ts +53 -0
  62. package/src/models/ArcResponse.ts +166 -0
  63. package/src/models/Authorization.ts +481 -0
  64. package/src/models/AuthorizationData.ts +60 -0
  65. package/src/models/Backend.ts +107 -0
  66. package/src/models/ClientCertificate.ts +68 -0
  67. package/src/models/Environment.ts +279 -0
  68. package/src/models/ErrorResponse.ts +101 -0
  69. package/src/models/HistoryIndex.ts +76 -0
  70. package/src/models/HistoryRequest.ts +28 -0
  71. package/src/models/HostRule.ts +163 -0
  72. package/src/models/HttpCookie.ts +285 -0
  73. package/src/models/HttpProject.ts +1294 -0
  74. package/src/models/HttpProjectListItem.ts +23 -0
  75. package/src/models/HttpRequest.ts +124 -0
  76. package/src/models/HttpResponse.ts +143 -0
  77. package/src/models/License.ts +113 -0
  78. package/src/models/ProjectDefinitionProperty.ts +40 -0
  79. package/src/models/ProjectFolder.ts +439 -0
  80. package/src/models/ProjectItem.ts +135 -0
  81. package/src/models/ProjectParent.ts +113 -0
  82. package/src/models/ProjectRequest.ts +277 -0
  83. package/src/models/ProjectSchema.ts +202 -0
  84. package/src/models/Property.ts +423 -0
  85. package/src/models/Provider.ts +98 -0
  86. package/src/models/README.md +20 -0
  87. package/src/models/Request.ts +452 -0
  88. package/src/models/RequestActions.ts +163 -0
  89. package/src/models/RequestAuthorization.ts +115 -0
  90. package/src/models/RequestConfig.ts +317 -0
  91. package/src/models/RequestLog.ts +159 -0
  92. package/src/models/RequestTime.ts +108 -0
  93. package/src/models/RequestUiMeta.ts +258 -0
  94. package/src/models/RequestsSize.ts +65 -0
  95. package/src/models/ResponseAuthorization.ts +104 -0
  96. package/src/models/ResponseRedirect.ts +158 -0
  97. package/src/models/RevisionInfo.ts +37 -0
  98. package/src/models/SentRequest.ts +125 -0
  99. package/src/models/SerializablePayload.ts +68 -0
  100. package/src/models/Server.ts +153 -0
  101. package/src/models/Thing.ts +110 -0
  102. package/src/models/Url.ts +90 -0
  103. package/src/models/User.ts +120 -0
  104. package/src/models/WebApi.ts +234 -0
  105. package/src/models/WebApiIndex.ts +122 -0
  106. package/src/models/Workspace.ts +182 -0
  107. package/src/models/actions/Action.ts +213 -0
  108. package/src/models/actions/ActionView.ts +40 -0
  109. package/src/models/actions/Condition.ts +207 -0
  110. package/src/models/actions/ConditionView.ts +42 -0
  111. package/src/models/actions/Enums.ts +29 -0
  112. package/src/models/actions/RunnableAction.ts +144 -0
  113. package/src/models/actions/runnable/DeleteCookieAction.ts +113 -0
  114. package/src/models/actions/runnable/Runnable.ts +9 -0
  115. package/src/models/actions/runnable/SetCookieAction.ts +216 -0
  116. package/src/models/actions/runnable/SetVariableAction.ts +81 -0
  117. package/src/models/legacy/DataExport.ts +172 -0
  118. package/src/models/legacy/Normalizer.ts +110 -0
  119. package/src/models/legacy/actions/Actions.ts +269 -0
  120. package/src/models/legacy/authorization/Authorization.ts +572 -0
  121. package/src/models/legacy/models/ApiTypes.ts +202 -0
  122. package/src/models/legacy/models/ArcLegacyProject.ts +39 -0
  123. package/src/models/legacy/models/AuthData.ts +17 -0
  124. package/src/models/legacy/models/ClientCertificate.ts +95 -0
  125. package/src/models/legacy/models/Cookies.ts +52 -0
  126. package/src/models/legacy/models/HostRule.ts +35 -0
  127. package/src/models/legacy/models/RestApi.ts +49 -0
  128. package/src/models/legacy/models/UrlHistory.ts +37 -0
  129. package/src/models/legacy/models/Variable.ts +43 -0
  130. package/src/models/legacy/models/base.d.ts +95 -0
  131. package/src/models/legacy/request/ArcRequest.ts +405 -0
  132. package/src/models/legacy/request/ArcResponse.ts +177 -0
  133. package/src/models/legacy/request/HistoryData.ts +47 -0
  134. package/src/models/legacy/request/Legacy.ts +45 -0
  135. package/src/models/legacy/request/RequestBody.ts +87 -0
  136. package/src/models/transformers/ArcDexieTransformer.ts +323 -0
  137. package/src/models/transformers/ArcLegacyNormalizer.ts +85 -0
  138. package/src/models/transformers/ArcLegacyTransformer.ts +200 -0
  139. package/src/models/transformers/ArcPouchTransformer.ts +184 -0
  140. package/src/models/transformers/BaseTransformer.ts +116 -0
  141. package/src/models/transformers/ImportUtils.ts +141 -0
  142. package/src/models/transformers/LegacyDataExportToApiProject.ts +76 -0
  143. package/src/models/transformers/LegacyExportProcessor.ts +252 -0
  144. package/src/models/transformers/PostmanBackupTransformer.ts +306 -0
  145. package/src/models/transformers/PostmanDataTransformer.ts +50 -0
  146. package/src/models/transformers/PostmanTransformer.ts +106 -0
  147. package/src/models/transformers/PostmanV21Transformer.ts +311 -0
  148. package/src/models/transformers/PostmanV2Transformer.ts +308 -0
  149. package/src/models/transformers/har.ts +865 -0
  150. package/src/runtime/actions/ActionRunner.ts +83 -0
  151. package/src/runtime/actions/ConditionRunner.ts +194 -0
  152. package/src/runtime/actions/RunnableCondition.ts +57 -0
  153. package/src/runtime/actions/runnable/ActionRunnable.ts +19 -0
  154. package/src/runtime/actions/runnable/DeleteCookieRunnable.ts +39 -0
  155. package/src/runtime/actions/runnable/SetCookieRunnable.ts +92 -0
  156. package/src/runtime/actions/runnable/SetVariableRunnable.ts +53 -0
  157. package/src/runtime/http-engine/ArcEngine.ts +1064 -0
  158. package/src/runtime/http-engine/Errors.ts +13 -0
  159. package/src/runtime/http-engine/FormData.ts +85 -0
  160. package/src/runtime/http-engine/HttpEngine.ts +874 -0
  161. package/src/runtime/http-engine/HttpErrorCodes.ts +270 -0
  162. package/src/runtime/http-engine/NodeEngine.ts +787 -0
  163. package/src/runtime/http-engine/NodeEngineDirect.ts +476 -0
  164. package/src/runtime/http-engine/PayloadSupport.ts +84 -0
  165. package/src/runtime/http-engine/RequestUtils.ts +164 -0
  166. package/src/runtime/http-engine/ntlm/Des.ts +345 -0
  167. package/src/runtime/http-engine/ntlm/MD4.ts +135 -0
  168. package/src/runtime/http-engine/ntlm/NtlmAuth.ts +186 -0
  169. package/src/runtime/http-engine/ntlm/NtlmMessage.ts +57 -0
  170. package/src/runtime/modules/BasicAuthCache.ts +133 -0
  171. package/src/runtime/modules/ExecutionResponse.ts +4 -0
  172. package/src/runtime/modules/ModulesRegistry.ts +136 -0
  173. package/src/runtime/modules/RequestAuthorization.ts +110 -0
  174. package/src/runtime/modules/RequestCookies.ts +145 -0
  175. package/src/runtime/node/ProjectRunner.ts +275 -0
  176. package/src/runtime/node/RequestFactory.ts +422 -0
  177. package/src/runtime/node/VariablesStore.ts +25 -0
  178. package/src/runtime/store/StoreSdk.ts +838 -0
  179. package/src/runtime/variables/Cache.ts +53 -0
  180. package/src/runtime/variables/EvalFunctions.ts +132 -0
  181. package/src/runtime/variables/ProjectVariables.ts +6 -0
  182. package/src/runtime/variables/VariablesProcessor.ts +543 -0
  183. package/src/runtime/variables/VariablesTokenizer.ts +55 -0
@@ -0,0 +1,87 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ import { ApiType } from "../models/ApiTypes.js";
3
+
4
+ /**
5
+ * @deprecated
6
+ */
7
+ export interface MultipartBody {
8
+ /**
9
+ * When true a this entry represent a file part
10
+ */
11
+ isFile: boolean;
12
+ /**
13
+ * The name of the filed
14
+ */
15
+ name: string;
16
+ /**
17
+ * Converted value
18
+ */
19
+ value: string;
20
+ /**
21
+ * A content type entered by the user to the text part of the text part input.
22
+ * This can only be set when `isFile` is false.
23
+ */
24
+ type?: string;
25
+ /**
26
+ * The original file name used with the part
27
+ */
28
+ fileName?: string;
29
+ /**
30
+ * Whether the parameter is enabled. Default to true.
31
+ */
32
+ enabled?: boolean;
33
+ /**
34
+ * When `isFile` is true then this is the size of the selected file.
35
+ */
36
+ size?: number;
37
+ }
38
+
39
+ /**
40
+ * @deprecated
41
+ */
42
+ export interface RawBody {
43
+ /**
44
+ * The last used body value.
45
+ */
46
+ value: string;
47
+ /**
48
+ * True when the generator was used to build the value
49
+ */
50
+ isGenerator?: boolean;
51
+ /**
52
+ * The schema for the generator. Work in progress.
53
+ */
54
+ generatorSchema?: any;
55
+ }
56
+
57
+ /**
58
+ * The body editor may produce multiple view models
59
+ * for the UI. Each editor can store it's data in here
60
+ * to restore it after opening a request,
61
+ * @deprecated
62
+ */
63
+ export interface BodyMetaModel {
64
+ /**
65
+ * The id of the editor. Each editor in ARC has own id.
66
+ */
67
+ type: string;
68
+ /**
69
+ * Generated view model.
70
+ */
71
+ viewModel: (ApiType | MultipartBody | RawBody)[];
72
+ }
73
+
74
+ /**
75
+ * Body editor meta data.
76
+ * @deprecated
77
+ */
78
+ export interface BodyMeta {
79
+ /**
80
+ * The model generated for the body editor.
81
+ */
82
+ model?: BodyMetaModel[];
83
+ /**
84
+ * The selected editor
85
+ */
86
+ selected?: string;
87
+ }
@@ -0,0 +1,323 @@
1
+ import v4 from '../../lib/uuid.js';
2
+ import { BaseTransformer, dataValue } from './BaseTransformer.js';
3
+ import { Creator, Browser, Page, Entry } from './har.js';
4
+ import {
5
+ ArcExportObject,
6
+ ExportArcProjects,
7
+ ExportArcSavedRequest,
8
+ ExportArcHistoryRequest,
9
+ } from '../legacy/DataExport.js';
10
+
11
+ interface DexieExport {
12
+ kind: string;
13
+ createdAt: string;
14
+ version: string;
15
+ requests?: DexieRequest[];
16
+ projects?: DexieProject[];
17
+ }
18
+ interface DexieRequest {
19
+ order: number;
20
+ url: string;
21
+ method: string;
22
+ type: string;
23
+ updateTime: number;
24
+ id: string;
25
+ kind: string;
26
+ har: DexieHar;
27
+ _har?: DexieHar;
28
+ name?: string;
29
+ _name?: string;
30
+ referenceEntry?: number;
31
+ driveId?: string;
32
+ }
33
+
34
+ interface DexieHar {
35
+ comment: string;
36
+ version: string;
37
+ creator: Creator;
38
+ browser: Browser;
39
+ pages: Page[];
40
+ entries: Entry[];
41
+ }
42
+
43
+ interface DexieProject {
44
+ order: number;
45
+ created: number;
46
+ updateTime: number;
47
+ requestIds: string[];
48
+ name: string;
49
+ kind: string;
50
+ id: number;
51
+ }
52
+
53
+ interface ProjectItem {
54
+ updateData: string[];
55
+ legacyProject: ExportArcProjects;
56
+ }
57
+
58
+ interface RequestProcessItem {
59
+ origin: string;
60
+ request: ExportArcSavedRequest | ExportArcHistoryRequest;
61
+ }
62
+
63
+ interface ProcessedRequests {
64
+ saved: RequestProcessItem[];
65
+ history: RequestProcessItem[];
66
+ }
67
+
68
+ /**
69
+ * Transforms Dexie system (legacy system) into the legacy PouchDB system.
70
+ */
71
+ export class ArcDexieTransformer extends BaseTransformer {
72
+ /**
73
+ * Transforms legacy ARC export object based on Dexie data store
74
+ * into current export data model.
75
+ *
76
+ * @returns New data model object.
77
+ */
78
+ async transform(): Promise<ArcExportObject> {
79
+ const raw = this[dataValue] as DexieExport;
80
+
81
+ const requests = await this.parseRequests(raw.requests || []);
82
+ const pData = this.processProjects(raw.projects || []);
83
+ const data = this.associateProjects(requests, pData);
84
+ const result = {
85
+ createdAt: new Date().toISOString(),
86
+ version: 'unknown',
87
+ kind: 'ARC#Import',
88
+ requests: data.saved ? (data.saved as any[]).map((item) => item.request as ExportArcSavedRequest) : [],
89
+ projects: pData ? pData.map((item) => item.legacyProject as ExportArcProjects) : [],
90
+ history: data.history ? (data.history as any[]).map((item) => item.request as ExportArcHistoryRequest) : []
91
+ };
92
+ // TODO: handle history data.
93
+ return result;
94
+ }
95
+
96
+ /**
97
+ * In new structure projects do not have a reference to request ids. It's
98
+ * the other way around in previous system.
99
+ * It's a bad pattern for object stores but it must suffice for now.
100
+ *
101
+ * @param projects List of projects in the import.
102
+ * @returns Preprocessed projects array
103
+ */
104
+ processProjects(projects: DexieProject[]): ProjectItem[] {
105
+ if (!projects || !projects.length) {
106
+ return [];
107
+ }
108
+ const list: ProjectItem[] = [];
109
+ projects.forEach((item) => {
110
+ const result = this.processProjectItem(item);
111
+ if (result) {
112
+ list.push(result);
113
+ }
114
+ });
115
+ return list;
116
+ }
117
+
118
+ /**
119
+ * Creates a pre-processed project data.
120
+ *
121
+ * @param item Project object from the Dexie import.
122
+ * @return Pre-processed project object with project store data
123
+ * under the `legacyProject` property and list of requests IDs under
124
+ * the `updateData` property.
125
+ */
126
+ processProjectItem(item: DexieProject): ProjectItem|undefined {
127
+ if (!item.requestIds || !item.requestIds.length) {
128
+ return undefined;
129
+ }
130
+ return {
131
+ updateData: item.requestIds,
132
+ legacyProject: {
133
+ kind: 'ARC#Project',
134
+ key: v4(),
135
+ name: item.name,
136
+ order: item.order,
137
+ updated: item.updateTime,
138
+ created: item.created,
139
+ }
140
+ };
141
+ }
142
+
143
+ /**
144
+ * History is placed in its own store, saved items has own store.
145
+ * Har data are not imported this way as user cannot actually use it.
146
+ *
147
+ * @param requests List of requests objects from the import file.
148
+ * @returns A promise resolved when import is ready.
149
+ */
150
+ async parseRequests(requests: DexieRequest[]): Promise<ProcessedRequests> {
151
+ const data = await this.parseRequestsDeffered(requests);
152
+ // remove duplicates from the history.
153
+ const ids: string[] = [];
154
+ data.history = (data.history as any[]).filter((item) => {
155
+ if (ids.indexOf(item.request.key) === -1) {
156
+ ids[ids.length] = item.request.key;
157
+ return true;
158
+ }
159
+ return false;
160
+ });
161
+ return data;
162
+ }
163
+
164
+ /**
165
+ * Parses the request data.
166
+ * It takes only portion of the data to parse so the script release the
167
+ * event loop and ANR screen won't appear.
168
+ *
169
+ * @param requests List of requests from the import.
170
+ * @param saved Final list of saved requests
171
+ * @param history Final list of history items.
172
+ */
173
+ async parseRequestsDeffered(requests: DexieRequest[], saved: RequestProcessItem[]=[], history: RequestProcessItem[]=[]): Promise<ProcessedRequests> {
174
+ if (requests.length === 0) {
175
+ return {
176
+ saved,
177
+ history,
178
+ };
179
+ }
180
+ const len = Math.min(requests.length, 200);
181
+ // Up to 200 loop iteration at once.
182
+ // Then the function return and release main loop.
183
+ for (let i = 0; i < len; i++) {
184
+ const item = requests[i];
185
+ if (item.type === 'history') {
186
+ const result = this.parseHistoryItem(item);
187
+ history.push(result);
188
+ } else if (item.type === 'saved') {
189
+ const result = this.parseSavedItem(item);
190
+ saved.push(result);
191
+ } else if (item.type === 'drive') {
192
+ const result = this.parseDriveItem(item);
193
+ saved.push(result);
194
+ }
195
+ }
196
+ requests.splice(0, len);
197
+ return this.parseRequestsDeffered(requests, saved, history);
198
+ }
199
+
200
+ parseHistoryItem(item: DexieRequest): RequestProcessItem {
201
+ const updated = { ...item };
202
+ updated.updateTime = updated.updateTime || Date.now();
203
+ const obj: ExportArcHistoryRequest = {
204
+ key: v4(),
205
+ method: updated.method,
206
+ url: updated.url,
207
+ updated: new Date(updated.updateTime).getTime()
208
+ };
209
+ // payload and headers
210
+ const har = updated._har || updated.har;
211
+ const {entries} = har;
212
+ const entry = entries[entries.length - 1];
213
+ if (entry) {
214
+ const harRequest = entry.request;
215
+ obj.headers = this.parseHarHeaders(harRequest.headers);
216
+ obj.payload = harRequest.postData?.text;
217
+ let t = new Date(entry.startedDateTime).getTime();
218
+ if (Number.isNaN(t)) {
219
+ t = Date.now();
220
+ }
221
+ obj.created = t;
222
+ } else {
223
+ obj.created = obj.updated;
224
+ }
225
+ obj.updated = Date.now();
226
+ return {
227
+ origin: updated.id,
228
+ request: obj
229
+ };
230
+ }
231
+
232
+ parseSavedItem(item: DexieRequest): RequestProcessItem {
233
+ const requestName = item.name || item._name;
234
+ let keyName = requestName;
235
+ if (keyName && keyName[0] === '_') {
236
+ keyName = keyName.substr(1);
237
+ }
238
+ const obj: ExportArcSavedRequest = {
239
+ name: requestName || '',
240
+ method: item.method,
241
+ url: item.url,
242
+ type: 'saved',
243
+ kind: 'ARC#HttpRequest',
244
+ key: v4(),
245
+ };
246
+ // payload and headers
247
+ const harIndex = item.referenceEntry || 0;
248
+ const har = item._har || item.har;
249
+ if (har) {
250
+ const {entries} = har;
251
+ let entry;
252
+ if (harIndex || harIndex === 0) {
253
+ entry = entries[harIndex];
254
+ } else {
255
+ [entry] = entries;
256
+ }
257
+ if (entry) {
258
+ const harRequest = entry.request;
259
+ obj.headers = this.parseHarHeaders(harRequest.headers);
260
+ obj.payload = harRequest.postData?.text;
261
+ let t = new Date(entry.startedDateTime).getTime();
262
+ if (Number.isNaN(t)) {
263
+ t = Date.now();
264
+ }
265
+ obj.created = t;
266
+ }
267
+ }
268
+ obj.updated = Date.now();
269
+
270
+ return {
271
+ origin: item.id,
272
+ request: obj
273
+ };
274
+ }
275
+
276
+ parseDriveItem(item: DexieRequest): RequestProcessItem {
277
+ const result = this.parseSavedItem(item);
278
+ result.request.driveId = item.driveId;
279
+ return result;
280
+ }
281
+
282
+ parseHarHeaders(arr: any[]): string {
283
+ if (!arr || !arr.length) {
284
+ return '';
285
+ }
286
+ return arr.map((item) => `${item.name}: ${item.value}`).join('\n');
287
+ }
288
+
289
+ /**
290
+ * Associate requests with project data.
291
+ *
292
+ * @param {ProcessedRequests} data Parsed requests object
293
+ * @param {ProjectItem[]} projects List of projects
294
+ * @return {ProcessedRequests} Parsed requests object
295
+ */
296
+ associateProjects(data: ProcessedRequests, projects: ProjectItem[]): ProcessedRequests {
297
+ if (!projects || !projects.length) {
298
+ return data;
299
+ }
300
+ if (!data.saved) {
301
+ data.saved = [];
302
+ }
303
+ const savedLen = data.saved.length;
304
+ const projectsLen = projects.length;
305
+ for (let i = 0; i < projectsLen; i++) {
306
+ const project = projects[i];
307
+ const newProjectId = project.legacyProject.key;
308
+ for (let j = 0, rLen = project.updateData.length; j < rLen; j++) {
309
+ const rId = project.updateData[j];
310
+ for (let k = 0; k < savedLen; k++) {
311
+ if (data.saved[k].origin === rId) {
312
+ const {request} = data.saved[k];
313
+ request.key += `/${newProjectId}`;
314
+ this.addProjectReference(request as ExportArcSavedRequest, newProjectId);
315
+ this.addRequestReference(project.legacyProject, request.key);
316
+ break;
317
+ }
318
+ }
319
+ }
320
+ }
321
+ return data;
322
+ }
323
+ }
@@ -0,0 +1,85 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ import { isArcFile, prepareImportObject, } from './ImportUtils.js';
3
+ import { ArcLegacyTransformer } from './ArcLegacyTransformer.js';
4
+ import { ArcDexieTransformer } from './ArcDexieTransformer.js';
5
+ import { ArcPouchTransformer } from './ArcPouchTransformer.js';
6
+ import { ArcExportObject } from '../legacy/DataExport.js';
7
+
8
+ /**
9
+ * Normalizes all legacy ARC export objects to the `ArcExportObject`.
10
+ * This is also a legacy format. Use the `LegacyDataExportToApiProject` class
11
+ * to transform it to `HttpProject`(s).
12
+ */
13
+ export class ArcLegacyNormalizer {
14
+ /**
15
+ * Transforms any previous ARC export file to the current export object.
16
+ *
17
+ * Note, the data has to be decrypted before running this function.
18
+ *
19
+ * @param data Data from the import file.
20
+ * @returns Normalized data import object.
21
+ */
22
+ async normalize(data: any): Promise<ArcExportObject> {
23
+ const processed = prepareImportObject(data);
24
+ if (isArcFile(processed)) {
25
+ return this.normalizeArcData(processed);
26
+ }
27
+ throw new Error('File not recognized');
28
+ }
29
+
30
+ /**
31
+ * Normalizes any previous and current ARC file export data to common model.
32
+ *
33
+ * @param data Imported data.
34
+ * @return A promise resolved to ARC data export object.
35
+ */
36
+ async normalizeArcData(data: any): Promise<ArcExportObject> {
37
+ switch (data.kind) {
38
+ case 'ARC#SavedHistoryDataExport':
39
+ case 'ARC#AllDataExport':
40
+ case 'ARC#SavedDataExport':
41
+ case 'ARC#SavedExport':
42
+ case 'ARC#HistoryDataExport':
43
+ case 'ARC#HistoryExport':
44
+ case 'ARC#Project':
45
+ case 'ARC#SessionCookies':
46
+ case 'ARC#HostRules':
47
+ case 'ARC#ProjectExport':
48
+ return this.normalizeArcPouchSystem(data);
49
+ case 'ARC#requestsDataExport':
50
+ return this.normalizeArcDexieSystem(data);
51
+ default:
52
+ return this.normalizeArcLegacyData(data);
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Normalizes export data from the GWT system.
58
+ * @param data Parsed data
59
+ * @returns Normalized import object
60
+ */
61
+ normalizeArcLegacyData(data: any): Promise<ArcExportObject> {
62
+ const transformer = new ArcLegacyTransformer(data);
63
+ return transformer.transform();
64
+ }
65
+
66
+ /**
67
+ * Normalizes export data from Dexie powered data store.
68
+ * @param data Parsed data
69
+ * @returns Normalized import object
70
+ */
71
+ normalizeArcDexieSystem(data: any): Promise<ArcExportObject> {
72
+ const transformer = new ArcDexieTransformer(data);
73
+ return transformer.transform();
74
+ }
75
+
76
+ /**
77
+ * Normalizes ARC's data exported in PouchDB system
78
+ * @param data Parsed data
79
+ * @returns Normalized import object
80
+ */
81
+ normalizeArcPouchSystem(data: any): Promise<ArcExportObject> {
82
+ const transformer = new ArcPouchTransformer(data);
83
+ return transformer.transform();
84
+ }
85
+ }
@@ -0,0 +1,200 @@
1
+ import v4 from '../../lib/uuid.js';
2
+ import { BaseTransformer, dataValue } from './BaseTransformer.js';
3
+ import {
4
+ ArcExportObject,
5
+ ExportArcProjects,
6
+ ExportArcSavedRequest,
7
+ } from '../legacy/DataExport.js';
8
+
9
+ interface LegacyExport {
10
+ requests: LegacyRequest[];
11
+ projects: LegacyProject[];
12
+ }
13
+
14
+ interface LegacyRequest {
15
+ id: number;
16
+ name: string;
17
+ project: number;
18
+ url: string;
19
+ method: string;
20
+ encoding: string|null;
21
+ headers: string|null;
22
+ payload: string|null;
23
+ skipProtocol: boolean;
24
+ skipServer: boolean;
25
+ skipParams: boolean;
26
+ skipHistory: boolean;
27
+ skipMethod: boolean;
28
+ skipPayload: boolean;
29
+ skipHeaders: boolean;
30
+ skipPath: boolean;
31
+ time: number;
32
+ driveId?: string|null;
33
+ }
34
+
35
+ interface LegacyProject {
36
+ created: number;
37
+ id: number;
38
+ name: string;
39
+ }
40
+
41
+ interface LegacyProjectProcessing extends ExportArcProjects {
42
+ originId: number;
43
+ }
44
+
45
+ /**
46
+ * Tests if the data import is a single request export.
47
+ *
48
+ * @param data Imported data
49
+ * @return True if `data` represents single request
50
+ */
51
+ export function isSingleRequest(data: any): boolean {
52
+ if ('requests' in data || 'projects' in data) {
53
+ return false;
54
+ }
55
+ return true;
56
+ }
57
+
58
+
59
+ /**
60
+ * Transforms the first ARC data object to current schema.
61
+ */
62
+ export class ArcLegacyTransformer extends BaseTransformer {
63
+ /**
64
+ * Transforms legacy ARC export object into current export data model.
65
+ *
66
+ * @return New data model object.
67
+ */
68
+ async transform(): Promise<ArcExportObject> {
69
+ const raw = this[dataValue] as any;
70
+
71
+ let projects: ExportArcProjects[] | undefined;
72
+ let requests: ExportArcSavedRequest[] | undefined;
73
+ if (isSingleRequest(raw)) {
74
+ const item = raw as LegacyRequest;
75
+ projects = [];
76
+ requests = [this.transformRequest(item)];
77
+ } else {
78
+ const data = raw as LegacyExport;
79
+ const tmp = projects = this.transformProjects(data.projects);
80
+ requests = this.transformRequests(data.requests, tmp);
81
+ projects = projects.map((item) => {
82
+ // @ts-ignore
83
+ delete item.originId;
84
+ return item;
85
+ });
86
+ }
87
+
88
+ const result: ArcExportObject = {
89
+ createdAt: new Date().toISOString(),
90
+ version: 'unknown',
91
+ kind: 'ARC#Import',
92
+ requests,
93
+ projects,
94
+ };
95
+
96
+ return result;
97
+ }
98
+
99
+ /**
100
+ * Returns a list of projects from a legacy export file.
101
+ *
102
+ * Each project will have newly generated ID to not make conflicts with
103
+ * existing projects. Old project id is moved to the `originId` property.
104
+ *
105
+ * @param projects List of legacy project objects
106
+ * @returns List of project object in current data model. It can be
107
+ * empty array.
108
+ */
109
+ transformProjects(projects: LegacyProject[]): LegacyProjectProcessing[] {
110
+ if (!projects || !(projects instanceof Array) || !projects.length) {
111
+ return [];
112
+ }
113
+ return projects.map((item) => {
114
+ let created = Number(item.created);
115
+ if (Number.isNaN(created)) {
116
+ created = Date.now();
117
+ }
118
+ return {
119
+ kind: 'ARC#ProjectData',
120
+ key: v4(),
121
+ created,
122
+ name: item.name || 'unnamed',
123
+ order: 0,
124
+ updated: Date.now(),
125
+ originId: item.id,
126
+ };
127
+ });
128
+ }
129
+
130
+ /**
131
+ * Transform the list of requests into new data model.
132
+ */
133
+ transformRequests(requests: LegacyRequest[], projects?: LegacyProjectProcessing[]): ExportArcSavedRequest[] {
134
+ if (!requests || !(requests instanceof Array) || !requests.length) {
135
+ return [];
136
+ }
137
+ return requests.map((item) => this.transformRequest(item, projects));
138
+ }
139
+
140
+ /**
141
+ * Transforms a single request object into current data model.
142
+ *
143
+ * Note that required properties will be default to the following:
144
+ * - `name` - "unnamed"
145
+ * - `url` - "http://"
146
+ * - `method` - "GET"
147
+ *
148
+ * @param item Legacy request definition
149
+ * @param projects List of projects in the import file.
150
+ * @return Current model of the request object.
151
+ */
152
+ transformRequest(item: LegacyRequest, projects?: LegacyProjectProcessing[]): ExportArcSavedRequest {
153
+ // LegacyRequest may have `null` values.
154
+ item.name = item.name || 'unnamed';
155
+ item.url = item.url || 'http://';
156
+ item.method = item.method || 'GET';
157
+
158
+ const project = this.findProject(item.project, projects);
159
+ const projectId = project ? project.key : undefined;
160
+ const id = v4();
161
+ let created = Number(item.time);
162
+ if (Number.isNaN(created)) {
163
+ created = Date.now();
164
+ }
165
+ const result: ExportArcSavedRequest = {
166
+ kind: 'ARC#HttpRequest',
167
+ key: id,
168
+ created,
169
+ updated: Date.now(),
170
+ headers: item.headers || '',
171
+ method: item.method,
172
+ name: item.name,
173
+ payload: item.payload || '',
174
+ type: 'saved',
175
+ url: item.url,
176
+ };
177
+ if (project && projectId) {
178
+ result.projects = [projectId];
179
+ this.addRequestReference(project, id);
180
+ }
181
+ if (item.driveId) {
182
+ result.driveId = item.driveId;
183
+ }
184
+ return result;
185
+ }
186
+
187
+ /**
188
+ * Finds a project in the list of projects.
189
+ *
190
+ * @param projectId A project ID to search for
191
+ * @param projects List of project to look into. It compares the `originId` property of the list items.
192
+ * @returns A project object or null if not found.
193
+ */
194
+ findProject(projectId: number, projects?: LegacyProjectProcessing[]): LegacyProjectProcessing|undefined {
195
+ if (!projectId || !Array.isArray(projects)) {
196
+ return undefined;
197
+ }
198
+ return projects.find((p) => p.originId === projectId);
199
+ }
200
+ }