@api-client/core 0.3.2 → 0.3.5
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 -0
- package/build/browser.js +1 -0
- package/build/browser.js.map +1 -1
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/index.js.map +1 -1
- package/build/src/models/ErrorResponse.d.ts +5 -4
- package/build/src/models/ErrorResponse.js +18 -5
- package/build/src/models/ErrorResponse.js.map +1 -1
- package/build/src/models/SerializableError.d.ts +30 -0
- package/build/src/models/SerializableError.js +63 -0
- package/build/src/models/SerializableError.js.map +1 -0
- package/build/src/runtime/http-engine/ArcEngine.js +8 -4
- package/build/src/runtime/http-engine/ArcEngine.js.map +1 -1
- package/build/src/runtime/http-engine/HttpEngine.d.ts +3 -3
- package/build/src/runtime/http-engine/HttpEngine.js +3 -3
- package/build/src/runtime/http-engine/HttpEngine.js.map +1 -1
- package/build/src/runtime/http-engine/NodeEngine.js +9 -4
- package/build/src/runtime/http-engine/NodeEngine.js.map +1 -1
- package/build/src/runtime/http-engine/NodeEngineDirect.js +8 -2
- package/build/src/runtime/http-engine/NodeEngineDirect.js.map +1 -1
- package/build/src/runtime/node/ProjectRunner.d.ts +2 -2
- package/build/src/runtime/node/ProjectRunner.js +9 -2
- package/build/src/runtime/node/ProjectRunner.js.map +1 -1
- package/build/src/runtime/store/StoreSdk.js +10 -15
- package/build/src/runtime/store/StoreSdk.js.map +1 -1
- package/package.json +1 -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 +113 -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/SerializableError.ts +80 -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 +1068 -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 +792 -0
- package/src/runtime/http-engine/NodeEngineDirect.ts +482 -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 +281 -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
- package/build/src/runtime/http-engine/Errors.d.ts +0 -10
- package/build/src/runtime/http-engine/Errors.js +0 -14
- package/build/src/runtime/http-engine/Errors.js.map +0 -1
|
@@ -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
|
+
}
|