/
PostmanEditor.ts
85 lines (71 loc) · 2.46 KB
/
PostmanEditor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import { SpecTreeNode, HttpMethod, SpecTreeNodeParam } from '../../models';
import { BaseEditor } from '../BaseEditor';
import { PostmanParametersParser } from './PostmanParametersParser';
import { PostmanUrlParser } from './PostmanUrlParser';
import { PostmanVariablesParser } from './PostmanVariablesParser';
import { DocFormat, Postman } from '@har-sdk/core';
export class PostmanEditor extends BaseEditor<Postman.Document> {
private readonly postmanUrlParser = new PostmanUrlParser();
public setup(source: string, format?: DocFormat): Promise<void> {
return this.load(source, 'Bad Postman collection', format);
}
public parse(): SpecTreeNode {
const parameters = new PostmanVariablesParser(this.doc).parse('/variable');
this.tree = {
jsonPointer: '/',
path: '/',
name: this.doc.info.name,
children: this.createNodes(this.doc, ''),
...(parameters?.length ? { parameters } : {})
};
return this.tree;
}
private createNodes(
folder: Postman.ItemGroup,
groupJsonPointer: string
): SpecTreeNode[] {
return folder.item.flatMap(
(x: Postman.ItemGroup | Postman.Item, idx: number): SpecTreeNode[] => {
const itemJsonPointer = `${groupJsonPointer}/item/${idx.toString(10)}`;
const parameters = new PostmanParametersParser(this.doc).parse(
itemJsonPointer
);
if (this.isItemGroup(x)) {
return [this.createGroupNode(x, itemJsonPointer, parameters)];
}
const node = this.createSingleNode(x, itemJsonPointer, parameters);
return node ? [node] : [];
}
);
}
private isItemGroup(
x: Postman.Item | Postman.ItemGroup
): x is Postman.ItemGroup {
return Array.isArray((x as Postman.ItemGroup).item);
}
private createGroupNode(
itemGroup: Postman.ItemGroup,
pointer: string,
parameters: SpecTreeNodeParam[]
): SpecTreeNode {
const children = this.createNodes(itemGroup, pointer);
return {
jsonPointer: pointer,
path: this.postmanUrlParser.getGroupPath(children),
children,
...(parameters?.length ? { parameters } : {})
};
}
private createSingleNode(
item: Postman.Item,
pointer: string,
parameters: SpecTreeNodeParam[]
): SpecTreeNode {
return {
jsonPointer: pointer,
path: this.postmanUrlParser.parse(item.request.url),
method: item.request.method.toUpperCase() as HttpMethod,
...(parameters?.length ? { parameters } : {})
};
}
}