Skip to content

Commit 0f0a995

Browse files
Added .toHeaders() function (#9)
1 parent 5ba60c0 commit 0f0a995

File tree

5 files changed

+52
-15
lines changed

5 files changed

+52
-15
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ Otherwise:
8383
#### .appendFromString(str: string): void
8484
Appends the headers defined in the provided CLRF-delimited string (e.g. `key-a: one\r\nkey-b: two`)
8585

86+
#### .toHeaders(): Headers
87+
Returns an instance of the browser's `Headers` class. This will throw an exception if the current browser does not have
88+
the `Headers` class.
89+
8690
## Warning about `.append` in native `Headers`
8791
The `.append` function of the `Headers` class differs significantly between browsers.
8892

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "browser-headers",
3-
"version": "0.1.7",
3+
"version": "0.2.0",
44
"main": "lib/index.js",
55
"types": "lib/index.d.ts",
66
"repository": "https://github.com/improbable-eng/js-browser-headers",

src/BrowserHeaders.ts

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,14 @@ interface MapConstructor {
1919

2020
declare const Map: MapConstructor;
2121

22-
export type HeaderObject = {[key: string]: string|string[]};
23-
export type HeaderMap = Map<string, string|string[]>;
24-
2522
// Declare that there is a global property named "Headers" - this might not be present at runtime
2623
declare const Headers: any;
2724

2825
// BrowserHeaders is a wrapper class for Headers
29-
export default class BrowserHeaders {
26+
export class BrowserHeaders {
3027
keyValueMap: {[key: string]: string[]};
3128

32-
constructor(init: HeaderObject | HeaderMap | BrowserHeaders | WindowHeaders | string = "", options: {splitValues: boolean} = { splitValues: false } ) {
29+
constructor(init: BrowserHeaders.ConstructorArg = {}, options: {splitValues: boolean} = { splitValues: false } ) {
3330
this.keyValueMap = {};
3431

3532
if (init) {
@@ -46,19 +43,19 @@ export default class BrowserHeaders {
4643
});
4744
});
4845
} else if (init instanceof BrowserHeaders) {
49-
init.forEach((key, values) => {
46+
(init as BrowserHeaders).forEach((key, values) => {
5047
this.append(key, values)
5148
});
5249
} else if (typeof Map !== "undefined" && init instanceof Map) {
53-
const asMap = init as HeaderMap;
50+
const asMap = init as BrowserHeaders.HeaderMap;
5451
asMap.forEach((value: string|string[], key: string) => {
5552
this.append(key, value);
5653
});
5754
} else if (typeof init === "string") {
5855
this.appendFromString(init);
5956
} else if (typeof init === "object") {
6057
Object.getOwnPropertyNames(init).forEach(key => {
61-
const asObject = init as HeaderObject;
58+
const asObject = init as BrowserHeaders.HeaderObject;
6259
const values = asObject[key];
6360
if (Array.isArray(values)) {
6461
values.forEach(value => {
@@ -162,4 +159,22 @@ export default class BrowserHeaders {
162159
callback(key, this.keyValueMap[key]);
163160
}, this);
164161
}
162+
163+
toHeaders(): WindowHeaders {
164+
const headers: WindowHeaders = new Headers();
165+
166+
this.forEach((key, values) => {
167+
values.forEach(value => {
168+
headers.append(key, value);
169+
});
170+
});
171+
172+
return headers;
173+
}
174+
}
175+
176+
export namespace BrowserHeaders {
177+
export type HeaderObject = {[key: string]: string|string[]};
178+
export type HeaderMap = Map<string, string|string[]>;
179+
export type ConstructorArg = HeaderObject | HeaderMap | BrowserHeaders | WindowHeaders | string;
165180
}

src/index.ts

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
1-
import BrowserHeaders from "./BrowserHeaders";
2-
3-
export default BrowserHeaders;
1+
export { BrowserHeaders } from "./BrowserHeaders";

test/BrowserHeaders.spec.ts

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import BrowserHeaders from "../src/BrowserHeaders";
1+
import { BrowserHeaders } from "../src/BrowserHeaders";
2+
import { getHeaderValues } from "../src/util";
23

3-
const { deepEqual } = require("assert");
4+
const { deepEqual, ok } = require("assert");
45

56
declare function describe(name: string, test: () => void): void;
67
declare function it(name: string, test: () => void): void;
@@ -201,7 +202,7 @@ describe("browser-headers", () => {
201202
browserHeaders.append("keyA", ["one", "Two"]);
202203
browserHeaders.append("keyB", ["three", "four"]);
203204
const visited: string[] = [];
204-
browserHeaders.forEach((key, values) => {
205+
browserHeaders.forEach((key: string, values: string[]) => {
205206
visited.push(key + "." + values.join(","));
206207
});
207208
deepEqual(visited, [
@@ -256,6 +257,25 @@ describe("browser-headers", () => {
256257
deepEqual(browserHeaders.get("keyA"), ["one", "Two"]);
257258
deepEqual(browserHeaders.get("keyB"), ["three"]);
258259
});
260+
261+
describe("toHeaders", () => {
262+
it("should return a Headers instance that contains the same headers", () => {
263+
const browserHeaders = new BrowserHeaders({
264+
"keyA": ["one", "Two"],
265+
"keyB": "three"
266+
});
267+
const headers = browserHeaders.toHeaders();
268+
const keyA = getHeaderValues(headers, "keyA");
269+
270+
// The value of keyA is one of ["one", "Two"], ["one,Two"] or ["one, Two"] depending on whether or not the
271+
// `.append` function of the current browser's Header class concatenates and what it joins by.
272+
273+
// Join the array by ", " so that the value(s) should now be either separated by ", " or just ","
274+
const keyAString = keyA.join(", ");
275+
ok(keyAString === "one, Two" || keyAString === "one,Two");
276+
deepEqual(getHeaderValues(headers, "keyB"), ["three"]);
277+
});
278+
});
259279
});
260280
}
261281

0 commit comments

Comments
 (0)