@trenskow/app 0.9.80 → 0.9.82

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.
@@ -1,18 +1,14 @@
1
1
  {
2
- "cSpell.words": [
3
- "caseit",
4
- "concat",
5
- "getheader",
6
- "getheadernames",
7
- "hasheader",
8
- "linebreak",
9
- "quuries",
10
- "removeheader",
11
- "setheader",
12
- "writehead"
13
- ],
14
- "[javascript]": {
15
- "editor.formatOnSave": true,
16
- "editor.formatOnPaste": true
17
- }
2
+ "cSpell.words": [
3
+ "caseit",
4
+ "concat",
5
+ "getheader",
6
+ "getheadernames",
7
+ "hasheader",
8
+ "linebreak",
9
+ "quuries",
10
+ "removeheader",
11
+ "setheader",
12
+ "writehead"
13
+ ]
18
14
  }
package/lib/response.js CHANGED
@@ -12,24 +12,31 @@ import { ServerResponse } from 'http';
12
12
 
13
13
  export default class Response extends ServerResponse {
14
14
 
15
- #headerListeners;
16
- #headersProxy;
15
+ #_headerListeners;
16
+ #_headersProxy;
17
+ #_vary;
17
18
 
18
19
  constructor(...args) {
19
20
  super(...args);
20
- this.#headerListeners = [];
21
+ this.#_headerListeners = [];
22
+ this.#_vary = new Set();
23
+ }
24
+
25
+ vary(headerName) {
26
+ this.#_vary.add(
27
+ caseit(headerName));
21
28
  }
22
29
 
23
30
  get headers() {
24
- return this.#headersProxy || (this.#headersProxy = new Proxy(this, {
31
+ return this.#_headersProxy || (this.#_headersProxy = new Proxy(this, {
25
32
  get: function (target, prop) {
26
33
 
27
34
  if (prop === 'on') return (name, callback) => {
28
35
 
29
36
  name = caseit(name);
30
37
 
31
- target.#headerListeners[name] = target.#headerListeners[name] || [];
32
- target.#headerListeners[name].push(callback);
38
+ target.#_headerListeners[name] = target.#_headerListeners[name] || [];
39
+ target.#_headerListeners[name].push(callback);
33
40
 
34
41
  };
35
42
 
@@ -58,16 +65,17 @@ export default class Response extends ServerResponse {
58
65
 
59
66
  name = caseit(name);
60
67
 
61
- if (this.#headerListeners[name]?.some((callback) => callback(value) === false)) return;
68
+ if (this.#_headerListeners[name]?.some((callback) => callback(value) === false)) return;
62
69
 
63
70
  return super.setHeader(caseit(name, 'http'), value);
71
+
64
72
  }
65
73
 
66
74
  removeHeader(name) {
67
75
 
68
76
  name = caseit(name);
69
77
 
70
- if (this.#headerListeners[name]?.some((callback) => callback() === false)) return;
78
+ if (this.#_headerListeners[name]?.some((callback) => callback() === false)) return;
71
79
 
72
80
  return super.removeHeader(caseit(name, 'http'));
73
81
 
@@ -91,6 +99,13 @@ export default class Response extends ServerResponse {
91
99
  Object.entries(headers || {})
92
100
  .forEach(([name, value]) => this.setHeader(name, value));
93
101
 
102
+ const vary = Array.from(this.#_vary)
103
+ .filter((headerName) => this.getHeaderNames().includes(headerName));
104
+
105
+ if (vary.length) {
106
+ this.setHeader('vary', vary.map((name) => caseit(name, 'http')).join(', '));
107
+ }
108
+
94
109
  super.writeHead(statusCode, statusMessage);
95
110
 
96
111
  this.emit('writeHead');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trenskow/app",
3
- "version": "0.9.80",
3
+ "version": "0.9.82",
4
4
  "description": "A small HTTP router.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -30,7 +30,7 @@
30
30
  "chai": "^6.2.2",
31
31
  "eslint": "^10.4.0",
32
32
  "globals": "^17.6.0",
33
- "mocha": "^11.7.5",
33
+ "mocha": "^11.7.6",
34
34
  "supertest": "^7.2.2"
35
35
  },
36
36
  "dependencies": {
package/test/index.js CHANGED
@@ -439,6 +439,27 @@ describe('Application', () => {
439
439
 
440
440
  });
441
441
 
442
+ it ('should come back with `Vary` header set.', async () => {
443
+
444
+ app.root(
445
+ new Endpoint()
446
+ .use(({ response }) => {
447
+ response.vary('contentLanguage');
448
+ })
449
+ .use(({ response }) => {
450
+ response.headers.contentLanguage = 'en';
451
+ })
452
+ .get(() => 'Hello, World!')
453
+ );
454
+
455
+ await request
456
+ .get('/')
457
+ .expect('Content-Language', 'en')
458
+ .expect('Vary', 'Content-Language')
459
+ .expect(200, 'Hello, World!');
460
+
461
+ });
462
+
442
463
  after(async () => {
443
464
  await app.close({ awaitAllConnections: true });
444
465
  });