@stuntman/shared 0.1.8 → 0.1.10
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/README.md +9 -0
- package/dist/gqlParser.d.ts.map +1 -1
- package/dist/gqlParser.js +6 -4
- package/dist/gqlParser.js.map +1 -1
- package/dist/rawHeaders.d.ts +2 -0
- package/dist/rawHeaders.d.ts.map +1 -1
- package/dist/rawHeaders.js +39 -14
- package/dist/rawHeaders.js.map +1 -1
- package/package.json +1 -1
- package/src/gqlParser.ts +6 -3
- package/src/rawHeaders.ts +38 -14
package/README.md
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
1
|
# Stuntman proxy/mock shared library
|
|
2
2
|
|
|
3
|
+
[][npmjs]
|
|
4
|
+
[][build]
|
|
5
|
+
[][coverage]
|
|
6
|
+

|
|
7
|
+
|
|
8
|
+
[npmjs]: https://www.npmjs.com/package/@stuntman/shared
|
|
9
|
+
[build]: https://github.com/andrzej-woof/stuntman/actions/workflows/ci.yaml
|
|
10
|
+
[coverage]: https://coveralls.io/github/andrzej-woof/stuntman
|
|
11
|
+
|
|
3
12
|
Shared types and utils for [Stunman](https://github.com/andrzej-woof/stuntman#readme)
|
package/dist/gqlParser.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gqlParser.d.ts","sourceRoot":"","sources":["../src/gqlParser.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,CAAC;AAGzC,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,MAAM,KAAG,SAAS,cAAc,GAAG,
|
|
1
|
+
{"version":3,"file":"gqlParser.d.ts","sourceRoot":"","sources":["../src/gqlParser.ts"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,SAAS,CAAC;AAGzC,eAAO,MAAM,cAAc,SAAU,MAAM,GAAG,MAAM,KAAG,SAAS,cAAc,GAAG,SAuChF,CAAC"}
|
package/dist/gqlParser.js
CHANGED
|
@@ -15,7 +15,12 @@ const naiveGQLParser = (body) => {
|
|
|
15
15
|
if (!(json === null || json === void 0 ? void 0 : json.query) && !(json === null || json === void 0 ? void 0 : json.operationName)) {
|
|
16
16
|
return undefined;
|
|
17
17
|
}
|
|
18
|
-
const
|
|
18
|
+
const trimmed = json.query.trim();
|
|
19
|
+
if (!/^(query|mutation)\s+/.test(trimmed) || !/[{}]/.test(trimmed)) {
|
|
20
|
+
throw new Error('invalid query');
|
|
21
|
+
}
|
|
22
|
+
const lines = trimmed
|
|
23
|
+
.replace(/{/g, '{\n')
|
|
19
24
|
.split('\n')
|
|
20
25
|
.map((l) => l.replace(/^\s+/g, '').trim())
|
|
21
26
|
.filter((l) => !!l);
|
|
@@ -28,9 +33,6 @@ const naiveGQLParser = (body) => {
|
|
|
28
33
|
else if (/^mutation /.test(lines[0])) {
|
|
29
34
|
json.type = 'mutation';
|
|
30
35
|
}
|
|
31
|
-
else {
|
|
32
|
-
throw new Error(`Unable to resolve query type of ${lines[0]}`);
|
|
33
|
-
}
|
|
34
36
|
if (json.operationName && lines[1]) {
|
|
35
37
|
json.methodName = lines[1].split('(')[0].split('{')[0];
|
|
36
38
|
}
|
package/dist/gqlParser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gqlParser.js","sourceRoot":"","sources":["../src/gqlParser.ts"],"names":[],"mappings":";;;AACA,qCAAkC;AAE3B,MAAM,cAAc,GAAG,CAAC,IAAqB,EAAuC,EAAE;IACzF,+BAA+B;IAC/B,IAAI;QACA,IAAI,IAAI,GAAwC,SAAS,CAAC;QAC1D,IAAI;YACA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC5E;QAAC,OAAO,IAAI,EAAE;YACX,cAAc;SACjB;QACD,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAA,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,CAAA,EAAE;YACtC,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,
|
|
1
|
+
{"version":3,"file":"gqlParser.js","sourceRoot":"","sources":["../src/gqlParser.ts"],"names":[],"mappings":";;;AACA,qCAAkC;AAE3B,MAAM,cAAc,GAAG,CAAC,IAAqB,EAAuC,EAAE;IACzF,+BAA+B;IAC/B,IAAI;QACA,IAAI,IAAI,GAAwC,SAAS,CAAC;QAC1D,IAAI;YACA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC5E;QAAC,OAAO,IAAI,EAAE;YACX,cAAc;SACjB;QACD,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAA,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,aAAa,CAAA,EAAE;YACtC,OAAO,SAAS,CAAC;SACpB;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAClC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAChE,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;SACpC;QACD,MAAM,KAAK,GAAG,OAAO;aAChB,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;aACpB,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;SAC3C;QACD,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YAC1B,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;SACvB;aAAM,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;YACpC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;SAC1B;QACD,IAAI,IAAI,CAAC,aAAa,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE;YAChC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;SAC5D;aAAM,IAAI,IAAI,CAAC,aAAa,EAAE;YAC3B,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;SAC5D;QACD,OAAO,IAAI,CAAC;KACf;IAAC,OAAO,KAAK,EAAE;QACZ,eAAM,CAAC,KAAK,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC;KAC9C;IACD,OAAO,SAAS,CAAC;AACrB,CAAC,CAAC;AAvCW,QAAA,cAAc,kBAuCzB"}
|
package/dist/rawHeaders.d.ts
CHANGED
|
@@ -6,8 +6,10 @@ export declare class RawHeaders extends Array<string> implements Stuntman.RawHea
|
|
|
6
6
|
add(name: string, value: string): void;
|
|
7
7
|
remove(name: string): void;
|
|
8
8
|
toHeaderPairs(): readonly [string, string][];
|
|
9
|
+
toHeadersRecord(): Record<string, string | string[]>;
|
|
9
10
|
static fromHeaderPairs(headerPairs: [string, string][]): RawHeaders;
|
|
10
11
|
static fromHeadersRecord(headersRecord: Record<string, string | string[] | undefined>): RawHeaders;
|
|
12
|
+
static toHeadersRecord(rawHeaders: RawHeaders): Record<string, string | string[]>;
|
|
11
13
|
static toHeaderPairs(rawHeaders: string[]): readonly [string, string][];
|
|
12
14
|
}
|
|
13
15
|
//# sourceMappingURL=rawHeaders.d.ts.map
|
package/dist/rawHeaders.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawHeaders.d.ts","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,CAAC;AAEnC,qBAAa,UAAW,SAAQ,KAAK,CAAC,MAAM,CAAE,YAAW,QAAQ,CAAC,mBAAmB;IACjF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAYrC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAQ1C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"rawHeaders.d.ts","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,QAAQ,MAAM,GAAG,CAAC;AAEnC,qBAAa,UAAW,SAAQ,KAAK,CAAC,MAAM,CAAE,YAAW,QAAQ,CAAC,mBAAmB;IACjF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAYrC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO;IAQ1C,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAiBtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKtC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAiB1B,aAAa,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAI5C,eAAe,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAIpD,MAAM,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAG,UAAU;IAInE,MAAM,CAAC,iBAAiB,CAAC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,GAAG,UAAU;IAclG,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAkBjF,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;CAO1E"}
|
package/dist/rawHeaders.js
CHANGED
|
@@ -23,20 +23,20 @@ class RawHeaders extends Array {
|
|
|
23
23
|
}
|
|
24
24
|
set(name, value) {
|
|
25
25
|
var _a;
|
|
26
|
-
let
|
|
26
|
+
let foundIndex = -1;
|
|
27
27
|
for (let headerIndex = 0; headerIndex < this.length; headerIndex += 2) {
|
|
28
28
|
if (((_a = this[headerIndex]) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === name.toLowerCase()) {
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
if (foundIndex !== -1) {
|
|
30
|
+
throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
|
|
31
|
+
}
|
|
32
|
+
foundIndex = headerIndex;
|
|
31
33
|
}
|
|
32
34
|
}
|
|
33
|
-
if (
|
|
35
|
+
if (foundIndex === -1) {
|
|
34
36
|
this.add(name, value);
|
|
35
37
|
return;
|
|
36
38
|
}
|
|
37
|
-
|
|
38
|
-
throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
|
|
39
|
-
}
|
|
39
|
+
this[foundIndex + 1] = value;
|
|
40
40
|
}
|
|
41
41
|
add(name, value) {
|
|
42
42
|
this.push(name);
|
|
@@ -45,21 +45,26 @@ class RawHeaders extends Array {
|
|
|
45
45
|
remove(name) {
|
|
46
46
|
var _a;
|
|
47
47
|
const headersCopy = [...this];
|
|
48
|
-
let
|
|
48
|
+
let foundIndex = -1;
|
|
49
49
|
for (let headerIndex = 0; headerIndex < headersCopy.length; headerIndex += 2) {
|
|
50
|
-
if (((_a = this[headerIndex
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
if (((_a = this[headerIndex]) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === name.toLowerCase()) {
|
|
51
|
+
if (foundIndex !== -1) {
|
|
52
|
+
throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
|
|
53
|
+
}
|
|
54
|
+
foundIndex = headerIndex;
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
|
-
if (
|
|
57
|
-
|
|
57
|
+
if (foundIndex === -1) {
|
|
58
|
+
return;
|
|
58
59
|
}
|
|
60
|
+
this.splice(foundIndex, 2);
|
|
59
61
|
}
|
|
60
62
|
toHeaderPairs() {
|
|
61
63
|
return RawHeaders.toHeaderPairs(this);
|
|
62
64
|
}
|
|
65
|
+
toHeadersRecord() {
|
|
66
|
+
return RawHeaders.toHeadersRecord(this);
|
|
67
|
+
}
|
|
63
68
|
static fromHeaderPairs(headerPairs) {
|
|
64
69
|
return new RawHeaders(...headerPairs.flatMap((x) => x));
|
|
65
70
|
}
|
|
@@ -76,6 +81,26 @@ class RawHeaders extends Array {
|
|
|
76
81
|
}
|
|
77
82
|
return output;
|
|
78
83
|
}
|
|
84
|
+
static toHeadersRecord(rawHeaders) {
|
|
85
|
+
const output = {};
|
|
86
|
+
const headerPairs = rawHeaders.toHeaderPairs();
|
|
87
|
+
for (const [key, value] of headerPairs) {
|
|
88
|
+
if (!output[key]) {
|
|
89
|
+
output[key] = value;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
else if (typeof output[key] === 'string') {
|
|
93
|
+
output[key] = [output[key], value];
|
|
94
|
+
}
|
|
95
|
+
else if (Array.isArray(output[key])) {
|
|
96
|
+
output[key].push(value);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
throw new Error('unexpected error');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return output;
|
|
103
|
+
}
|
|
79
104
|
static toHeaderPairs(rawHeaders) {
|
|
80
105
|
const headers = new Array();
|
|
81
106
|
for (let headerIndex = 0; headerIndex < rawHeaders.length; headerIndex += 2) {
|
package/dist/rawHeaders.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rawHeaders.js","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":";;;AAEA,MAAa,UAAW,SAAQ,KAAa;IACzC,GAAG,CAAC,IAAY;;QACZ,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACrC,MAAM,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACzF,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,SAAS,CAAC;SACpB;QACD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9B,OAAO,MAAA,eAAe,CAAC,CAAC,CAAC,0CAAG,CAAC,CAAC,CAAC;SAClC;QACD,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACtF,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAc;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,KAAK,SAAS,EAAE;YACrB,OAAO,UAAU,KAAK,SAAS,CAAC;SACnC;QACD,OAAO,UAAU,KAAK,KAAK,CAAC;IAChC,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,KAAa;;QAC3B,IAAI,
|
|
1
|
+
{"version":3,"file":"rawHeaders.js","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/gqlParser.ts
CHANGED
|
@@ -13,7 +13,12 @@ export const naiveGQLParser = (body: Buffer | string): Stuntman.GQLRequestBody |
|
|
|
13
13
|
if (!json?.query && !json?.operationName) {
|
|
14
14
|
return undefined;
|
|
15
15
|
}
|
|
16
|
-
const
|
|
16
|
+
const trimmed = json.query.trim();
|
|
17
|
+
if (!/^(query|mutation)\s+/.test(trimmed) || !/[{}]/.test(trimmed)) {
|
|
18
|
+
throw new Error('invalid query');
|
|
19
|
+
}
|
|
20
|
+
const lines = trimmed
|
|
21
|
+
.replace(/{/g, '{\n')
|
|
17
22
|
.split('\n')
|
|
18
23
|
.map((l) => l.replace(/^\s+/g, '').trim())
|
|
19
24
|
.filter((l) => !!l);
|
|
@@ -24,8 +29,6 @@ export const naiveGQLParser = (body: Buffer | string): Stuntman.GQLRequestBody |
|
|
|
24
29
|
json.type = 'query';
|
|
25
30
|
} else if (/^mutation /.test(lines[0])) {
|
|
26
31
|
json.type = 'mutation';
|
|
27
|
-
} else {
|
|
28
|
-
throw new Error(`Unable to resolve query type of ${lines[0]}`);
|
|
29
32
|
}
|
|
30
33
|
if (json.operationName && lines[1]) {
|
|
31
34
|
json.methodName = lines[1].split('(')[0]!.split('{')[0]!;
|
package/src/rawHeaders.ts
CHANGED
|
@@ -22,20 +22,20 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
set(name: string, value: string): void {
|
|
25
|
-
let
|
|
25
|
+
let foundIndex = -1;
|
|
26
26
|
for (let headerIndex = 0; headerIndex < this.length; headerIndex += 2) {
|
|
27
27
|
if (this[headerIndex]?.toLowerCase() === name.toLowerCase()) {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
if (foundIndex !== -1) {
|
|
29
|
+
throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
|
|
30
|
+
}
|
|
31
|
+
foundIndex = headerIndex;
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
|
-
if (
|
|
34
|
+
if (foundIndex === -1) {
|
|
33
35
|
this.add(name, value);
|
|
34
36
|
return;
|
|
35
37
|
}
|
|
36
|
-
|
|
37
|
-
throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
|
|
38
|
-
}
|
|
38
|
+
this[foundIndex + 1] = value;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
add(name: string, value: string): void {
|
|
@@ -45,23 +45,29 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
|
|
|
45
45
|
|
|
46
46
|
remove(name: string): void {
|
|
47
47
|
const headersCopy = [...this];
|
|
48
|
-
let
|
|
48
|
+
let foundIndex = -1;
|
|
49
49
|
for (let headerIndex = 0; headerIndex < headersCopy.length; headerIndex += 2) {
|
|
50
|
-
if (this[headerIndex
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
if (this[headerIndex]?.toLowerCase() === name.toLowerCase()) {
|
|
51
|
+
if (foundIndex !== -1) {
|
|
52
|
+
throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
|
|
53
|
+
}
|
|
54
|
+
foundIndex = headerIndex;
|
|
54
55
|
}
|
|
55
56
|
}
|
|
56
|
-
if (
|
|
57
|
-
|
|
57
|
+
if (foundIndex === -1) {
|
|
58
|
+
return;
|
|
58
59
|
}
|
|
60
|
+
this.splice(foundIndex, 2);
|
|
59
61
|
}
|
|
60
62
|
|
|
61
63
|
toHeaderPairs(): readonly [string, string][] {
|
|
62
64
|
return RawHeaders.toHeaderPairs(this);
|
|
63
65
|
}
|
|
64
66
|
|
|
67
|
+
toHeadersRecord(): Record<string, string | string[]> {
|
|
68
|
+
return RawHeaders.toHeadersRecord(this);
|
|
69
|
+
}
|
|
70
|
+
|
|
65
71
|
static fromHeaderPairs(headerPairs: [string, string][]): RawHeaders {
|
|
66
72
|
return new RawHeaders(...headerPairs.flatMap((x) => x));
|
|
67
73
|
}
|
|
@@ -80,6 +86,24 @@ export class RawHeaders extends Array<string> implements Stuntman.RawHeadersInte
|
|
|
80
86
|
return output;
|
|
81
87
|
}
|
|
82
88
|
|
|
89
|
+
static toHeadersRecord(rawHeaders: RawHeaders): Record<string, string | string[]> {
|
|
90
|
+
const output: Record<string, string | string[]> = {};
|
|
91
|
+
const headerPairs = rawHeaders.toHeaderPairs();
|
|
92
|
+
for (const [key, value] of headerPairs) {
|
|
93
|
+
if (!output[key]) {
|
|
94
|
+
output[key] = value;
|
|
95
|
+
continue;
|
|
96
|
+
} else if (typeof output[key] === 'string') {
|
|
97
|
+
output[key] = [output[key] as string, value];
|
|
98
|
+
} else if (Array.isArray(output[key])) {
|
|
99
|
+
(output[key] as string[]).push(value);
|
|
100
|
+
} else {
|
|
101
|
+
throw new Error('unexpected error');
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return output;
|
|
105
|
+
}
|
|
106
|
+
|
|
83
107
|
static toHeaderPairs(rawHeaders: string[]): readonly [string, string][] {
|
|
84
108
|
const headers = new Array<[string, string]>();
|
|
85
109
|
for (let headerIndex = 0; headerIndex < rawHeaders.length; headerIndex += 2) {
|