Skip to content

Commit 52f57b9

Browse files
committed
Several Cookie improvements
1 parent 79f0990 commit 52f57b9

File tree

6 files changed

+71
-58
lines changed

6 files changed

+71
-58
lines changed

packages/headers/CHANGELOG.md

+12-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,19 @@ This is the changelog for [`headers`](https://github.com/mjackson/remix-the-web/
44

55
## HEAD
66

7-
- BREAKING CHANGE: `cookie.delete(name)` returns `void` instead of `boolean`
7+
This release contains several improvements to `Cookie` that bring it more in line with other headers like `Accept`, `AcceptEncoding`, and `AcceptLanguage`.
8+
9+
- BREAKING CHANGE: `cookie.names()` and `cookie.values()` are now getters that return `string[]` instead of methods that return `IterableIterator<string>`
810
- BREAKING CHANGE: `cookie.forEach()` calls its callback with `(name, value, cookie)` instead of `(value, name, map)`
11+
- BREAKING CHANGE: `cookie.delete(name)` returns `void` instead of `boolean`
12+
13+
```ts
14+
// before
15+
let cookieNames = Array.from(headers.cookie.names());
16+
17+
// after
18+
let cookieNames = headers.cookie.names;
19+
```
920

1021
## v0.9.0 (2024-12-20)
1122

packages/headers/src/lib/accept-encoding.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export class AcceptEncoding implements HeaderValue, Iterable<[string, number]> {
5555
}
5656

5757
#sort() {
58-
this.#map = new Map([...this.#map].sort(([, a], [, b]) => b - a));
58+
this.#map = new Map([...this.#map].sort((a, b) => b[1] - a[1]));
5959
}
6060

6161
/**
@@ -72,6 +72,13 @@ export class AcceptEncoding implements HeaderValue, Iterable<[string, number]> {
7272
return Array.from(this.#map.values());
7373
}
7474

75+
/**
76+
* The number of encodings in the header.
77+
*/
78+
get size(): number {
79+
return this.#map.size;
80+
}
81+
7582
/**
7683
* Returns `true` if the header matches the given encoding (i.e. it is "acceptable").
7784
* @param encoding The encoding to check.
@@ -173,13 +180,6 @@ export class AcceptEncoding implements HeaderValue, Iterable<[string, number]> {
173180
}
174181
}
175182

176-
/**
177-
* The number of encodings in the header.
178-
*/
179-
get size(): number {
180-
return this.#map.size;
181-
}
182-
183183
toString(): string {
184184
let pairs: string[] = [];
185185

packages/headers/src/lib/accept-language.ts

+10-10
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,30 @@ export class AcceptLanguage implements HeaderValue, Iterable<[string, number]> {
5555
}
5656

5757
#sort() {
58-
this.#map = new Map([...this.#map].sort(([, a], [, b]) => b - a));
58+
this.#map = new Map([...this.#map].sort((a, b) => b[1] - a[1]));
5959
}
6060

6161
/**
62-
* An array of all locale identifiers in the header.
62+
* An array of all languages in the header.
6363
*/
6464
get languages(): string[] {
6565
return Array.from(this.#map.keys());
6666
}
6767

6868
/**
69-
* An array of all weight values in the header.
69+
* An array of all weights (q values) in the header.
7070
*/
7171
get weights(): number[] {
7272
return Array.from(this.#map.values());
7373
}
7474

75+
/**
76+
* The number of languages in the header.
77+
*/
78+
get size(): number {
79+
return this.#map.size;
80+
}
81+
7582
/**
7683
* Returns `true` if the header matches the given language (i.e. it is "acceptable").
7784
* @param language The locale identifier of the language to check.
@@ -179,13 +186,6 @@ export class AcceptLanguage implements HeaderValue, Iterable<[string, number]> {
179186
}
180187
}
181188

182-
/**
183-
* The number of languages in the header.
184-
*/
185-
get size(): number {
186-
return this.#map.size;
187-
}
188-
189189
toString(): string {
190190
let pairs: string[] = [];
191191

packages/headers/src/lib/accept.ts

+10-12
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ export class Accept implements HeaderValue, Iterable<[string, number]> {
5555
}
5656

5757
#sort() {
58-
this.#map = new Map([...this.#map].sort(([, a], [, b]) => b - a));
58+
this.#map = new Map([...this.#map].sort((a, b) => b[1] - a[1]));
5959
}
6060

6161
/**
@@ -66,12 +66,19 @@ export class Accept implements HeaderValue, Iterable<[string, number]> {
6666
}
6767

6868
/**
69-
* An array of weight values in the header.
69+
* An array of all weights (q values) in the header.
7070
*/
7171
get weights(): number[] {
7272
return Array.from(this.#map.values());
7373
}
7474

75+
/**
76+
* The number of media types in the `Accept` header.
77+
*/
78+
get size(): number {
79+
return this.#map.size;
80+
}
81+
7582
/**
7683
* Returns `true` if the header matches the given media type (i.e. it is "acceptable").
7784
* @param mediaType The media type to check.
@@ -110,9 +117,7 @@ export class Accept implements HeaderValue, Iterable<[string, number]> {
110117
getPreferred(mediaTypes: string[]): string | null {
111118
let sorted = mediaTypes
112119
.map((mediaType) => [mediaType, this.getWeight(mediaType)] as const)
113-
.sort((a, b) => {
114-
return b[1] - a[1];
115-
});
120+
.sort((a, b) => b[1] - a[1]);
116121

117122
let first = sorted[0];
118123

@@ -179,13 +184,6 @@ export class Accept implements HeaderValue, Iterable<[string, number]> {
179184
}
180185
}
181186

182-
/**
183-
* The number of media types in the `Accept` header.
184-
*/
185-
get size(): number {
186-
return this.#map.size;
187-
}
188-
189187
toString(): string {
190188
let pairs: string[] = [];
191189

packages/headers/src/lib/cookie.test.ts

+10-12
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,16 @@ describe('Cookie', () => {
4242
assert.equal(header.get('name2'), 'value2');
4343
});
4444

45+
it('gets all names', () => {
46+
let header = new Cookie('name1=value1; name2=value2');
47+
assert.deepEqual(header.names, ['name1', 'name2']);
48+
});
49+
50+
it('gets all values', () => {
51+
let header = new Cookie('name1=value1; name2=value2');
52+
assert.deepEqual(header.values, ['value1', 'value2']);
53+
});
54+
4555
it('sets and gets values', () => {
4656
let header = new Cookie();
4757
header.set('name', 'value');
@@ -73,18 +83,6 @@ describe('Cookie', () => {
7383
assert.equal(header.size, 0);
7484
});
7585

76-
it('iterates over names', () => {
77-
let header = new Cookie('name1=value1; name2=value2');
78-
let names = Array.from(header.names());
79-
assert.deepEqual(names, ['name1', 'name2']);
80-
});
81-
82-
it('iterates over values', () => {
83-
let header = new Cookie('name1=value1; name2=value2');
84-
let values = Array.from(header.values());
85-
assert.deepEqual(values, ['value1', 'value2']);
86-
});
87-
8886
it('iterates over entries', () => {
8987
let header = new Cookie('name1=value1; name2=value2');
9088
let entries = Array.from(header.entries());

packages/headers/src/lib/cookie.ts

+21-15
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,27 @@ export class Cookie implements HeaderValue, Iterable<[string, string]> {
3636
}
3737
}
3838

39+
/**
40+
* An array of the names of the cookies in the header.
41+
*/
42+
get names(): string[] {
43+
return Array.from(this.#map.keys());
44+
}
45+
46+
/**
47+
* An array of the values of the cookies in the header.
48+
*/
49+
get values(): string[] {
50+
return Array.from(this.#map.values());
51+
}
52+
53+
/**
54+
* The number of cookies in the header.
55+
*/
56+
get size(): number {
57+
return this.#map.size;
58+
}
59+
3960
/**
4061
* Gets the value of a cookie with the given name from the header.
4162
* @param name The name of the cookie.
@@ -78,14 +99,6 @@ export class Cookie implements HeaderValue, Iterable<[string, string]> {
7899
this.#map.clear();
79100
}
80101

81-
names(): IterableIterator<string> {
82-
return this.#map.keys();
83-
}
84-
85-
values(): IterableIterator<string> {
86-
return this.#map.values();
87-
}
88-
89102
entries(): IterableIterator<[string, string]> {
90103
return this.#map.entries();
91104
}
@@ -100,13 +113,6 @@ export class Cookie implements HeaderValue, Iterable<[string, string]> {
100113
}
101114
}
102115

103-
/**
104-
* The number of cookies in the header.
105-
*/
106-
get size(): number {
107-
return this.#map.size;
108-
}
109-
110116
toString(): string {
111117
let pairs: string[] = [];
112118

0 commit comments

Comments
 (0)