@stuntman/shared 0.1.9 → 0.1.11

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 CHANGED
@@ -3,6 +3,7 @@
3
3
  [![npm](https://img.shields.io/npm/v/@stuntman/shared.svg)][npmjs]
4
4
  [![Build Status](https://img.shields.io/github/actions/workflow/status/andrzej-woof/stuntman/ci.yaml)][build]
5
5
  [![Coverage Status](https://coveralls.io/repos/github/andrzej-woof/stuntman/badge.svg)][coverage]
6
+ ![License](https://img.shields.io/github/license/andrzej-woof/stuntman)
6
7
 
7
8
  [npmjs]: https://www.npmjs.com/package/@stuntman/shared
8
9
  [build]: https://github.com/andrzej-woof/stuntman/actions/workflows/ci.yaml
@@ -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,SAoChF,CAAC"}
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 lines = json.query
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
  }
@@ -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,KAAK,GAAG,IAAI,CAAC,KAAK;aACnB,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;aAAM;YACH,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAClE;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;AApCW,QAAA,cAAc,kBAoCzB"}
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"}
@@ -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
@@ -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;IAe1B,aAAa,IAAI,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAI5C,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,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;CAO1E"}
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"}
@@ -23,20 +23,20 @@ class RawHeaders extends Array {
23
23
  }
24
24
  set(name, value) {
25
25
  var _a;
26
- let foundHeaders = 0;
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
- this[headerIndex + 1] = value;
30
- ++foundHeaders;
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 (foundHeaders === 0) {
35
+ if (foundIndex === -1) {
34
36
  this.add(name, value);
35
37
  return;
36
38
  }
37
- if (foundHeaders > 1) {
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 foundHeaders = 0;
48
+ let foundIndex = -1;
49
49
  for (let headerIndex = 0; headerIndex < headersCopy.length; headerIndex += 2) {
50
- if (((_a = this[headerIndex - foundHeaders * 2]) === null || _a === void 0 ? void 0 : _a.toLowerCase()) === name.toLowerCase()) {
51
- delete this[headerIndex];
52
- delete this[headerIndex];
53
- ++foundHeaders;
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 (foundHeaders > 1) {
57
- throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
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) {
@@ -1 +1 @@
1
- {"version":3,"file":"rawHeaders.js","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rawHeaders.js","sourceRoot":"","sources":["../src/rawHeaders.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stuntman/shared",
3
- "version": "0.1.9",
3
+ "version": "0.1.11",
4
4
  "description": "Stuntman - HTTP proxy / mock shared types and utils",
5
5
  "main": "dist/index.js",
6
6
  "repository": {
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 lines = json.query
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 foundHeaders = 0;
25
+ let foundIndex = -1;
26
26
  for (let headerIndex = 0; headerIndex < this.length; headerIndex += 2) {
27
27
  if (this[headerIndex]?.toLowerCase() === name.toLowerCase()) {
28
- this[headerIndex + 1] = value;
29
- ++foundHeaders;
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 (foundHeaders === 0) {
34
+ if (foundIndex === -1) {
33
35
  this.add(name, value);
34
36
  return;
35
37
  }
36
- if (foundHeaders > 1) {
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 foundHeaders = 0;
48
+ let foundIndex = -1;
49
49
  for (let headerIndex = 0; headerIndex < headersCopy.length; headerIndex += 2) {
50
- if (this[headerIndex - foundHeaders * 2]?.toLowerCase() === name.toLowerCase()) {
51
- delete this[headerIndex];
52
- delete this[headerIndex];
53
- ++foundHeaders;
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 (foundHeaders > 1) {
57
- throw new Error('Multiple headers with same name. Manipulate rawHeaders instead');
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) {