@jaypie/express 1.2.4-rc2 → 1.2.4-rc4

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.
@@ -23,11 +23,31 @@ export declare class LambdaResponseBuffered extends Writable {
23
23
  getHeaders(): OutgoingHttpHeaders;
24
24
  hasHeader(name: string): boolean;
25
25
  getHeaderNames(): string[];
26
+ /**
27
+ * Proxy for direct header access (e.g., res.headers['content-type']).
28
+ * Required for compatibility with middleware like helmet that access headers directly.
29
+ */
30
+ get headers(): Record<string, string | string[] | undefined>;
26
31
  writeHead(statusCode: number, statusMessageOrHeaders?: OutgoingHttpHeaders | string, headers?: OutgoingHttpHeaders): this;
27
32
  get headersSent(): boolean;
33
+ /**
34
+ * Express-style alias for getHeader().
35
+ * Used by middleware like decorateResponse that use res.get().
36
+ */
37
+ get(name: string): number | string | string[] | undefined;
38
+ /**
39
+ * Express-style alias for setHeader().
40
+ * Used by middleware like decorateResponse that use res.set().
41
+ */
42
+ set(name: string, value: number | string | string[]): this;
28
43
  status(code: number): this;
29
44
  json(data: unknown): this;
30
45
  send(body?: Buffer | object | string): this;
46
+ /**
47
+ * Add a field to the Vary response header.
48
+ * Used by CORS middleware to indicate response varies by Origin.
49
+ */
50
+ vary(field: string): this;
31
51
  _write(chunk: Buffer | string, encoding: BufferEncoding, // eslint-disable-line no-undef
32
52
  callback: (error?: Error | null) => void): void;
33
53
  _final(callback: (error?: Error | null) => void): void;
@@ -23,12 +23,32 @@ export declare class LambdaResponseStreaming extends Writable {
23
23
  getHeaders(): OutgoingHttpHeaders;
24
24
  hasHeader(name: string): boolean;
25
25
  getHeaderNames(): string[];
26
+ /**
27
+ * Proxy for direct header access (e.g., res.headers['content-type']).
28
+ * Required for compatibility with middleware like helmet that access headers directly.
29
+ */
30
+ get headers(): Record<string, string | string[] | undefined>;
26
31
  writeHead(statusCode: number, statusMessageOrHeaders?: OutgoingHttpHeaders | string, headers?: OutgoingHttpHeaders): this;
27
32
  get headersSent(): boolean;
28
33
  flushHeaders(): void;
34
+ /**
35
+ * Express-style alias for getHeader().
36
+ * Used by middleware like decorateResponse that use res.get().
37
+ */
38
+ get(name: string): number | string | string[] | undefined;
39
+ /**
40
+ * Express-style alias for setHeader().
41
+ * Used by middleware like decorateResponse that use res.set().
42
+ */
43
+ set(name: string, value: number | string | string[]): this;
29
44
  status(code: number): this;
30
45
  json(data: unknown): this;
31
46
  send(body?: Buffer | object | string): this;
47
+ /**
48
+ * Add a field to the Vary response header.
49
+ * Used by CORS middleware to indicate response varies by Origin.
50
+ */
51
+ vary(field: string): this;
32
52
  _write(chunk: Buffer | string, encoding: BufferEncoding, // eslint-disable-line no-undef
33
53
  callback: (error?: Error | null) => void): void;
34
54
  _final(callback: (error?: Error | null) => void): void;
package/dist/esm/index.js CHANGED
@@ -233,6 +233,43 @@ class LambdaResponseBuffered extends Writable {
233
233
  getHeaderNames() {
234
234
  return Array.from(this._headers.keys());
235
235
  }
236
+ /**
237
+ * Proxy for direct header access (e.g., res.headers['content-type']).
238
+ * Required for compatibility with middleware like helmet that access headers directly.
239
+ */
240
+ get headers() {
241
+ return new Proxy({}, {
242
+ deleteProperty: (_target, prop) => {
243
+ this.removeHeader(String(prop));
244
+ return true;
245
+ },
246
+ get: (_target, prop) => {
247
+ if (typeof prop === "symbol")
248
+ return undefined;
249
+ return this.getHeader(String(prop));
250
+ },
251
+ getOwnPropertyDescriptor: (_target, prop) => {
252
+ if (this.hasHeader(String(prop))) {
253
+ return {
254
+ configurable: true,
255
+ enumerable: true,
256
+ value: this.getHeader(String(prop)),
257
+ };
258
+ }
259
+ return undefined;
260
+ },
261
+ has: (_target, prop) => {
262
+ return this.hasHeader(String(prop));
263
+ },
264
+ ownKeys: () => {
265
+ return this.getHeaderNames();
266
+ },
267
+ set: (_target, prop, value) => {
268
+ this.setHeader(String(prop), value);
269
+ return true;
270
+ },
271
+ });
272
+ }
236
273
  writeHead(statusCode, statusMessageOrHeaders, headers) {
237
274
  this.statusCode = statusCode;
238
275
  let headersToSet;
@@ -260,6 +297,20 @@ class LambdaResponseBuffered extends Writable {
260
297
  //
261
298
  // Express compatibility methods
262
299
  //
300
+ /**
301
+ * Express-style alias for getHeader().
302
+ * Used by middleware like decorateResponse that use res.get().
303
+ */
304
+ get(name) {
305
+ return this.getHeader(name);
306
+ }
307
+ /**
308
+ * Express-style alias for setHeader().
309
+ * Used by middleware like decorateResponse that use res.set().
310
+ */
311
+ set(name, value) {
312
+ return this.setHeader(name, value);
313
+ }
263
314
  status(code) {
264
315
  this.statusCode = code;
265
316
  return this;
@@ -276,6 +327,26 @@ class LambdaResponseBuffered extends Writable {
276
327
  this.end(body);
277
328
  return this;
278
329
  }
330
+ /**
331
+ * Add a field to the Vary response header.
332
+ * Used by CORS middleware to indicate response varies by Origin.
333
+ */
334
+ vary(field) {
335
+ const existing = this.getHeader("vary");
336
+ if (!existing) {
337
+ this.setHeader("vary", field);
338
+ }
339
+ else {
340
+ // Append to existing Vary header if field not already present
341
+ const fields = String(existing)
342
+ .split(",")
343
+ .map((f) => f.trim().toLowerCase());
344
+ if (!fields.includes(field.toLowerCase())) {
345
+ this.setHeader("vary", `${existing}, ${field}`);
346
+ }
347
+ }
348
+ return this;
349
+ }
279
350
  //
280
351
  // Writable stream implementation
281
352
  //
@@ -392,6 +463,43 @@ class LambdaResponseStreaming extends Writable {
392
463
  getHeaderNames() {
393
464
  return Array.from(this._headers.keys());
394
465
  }
466
+ /**
467
+ * Proxy for direct header access (e.g., res.headers['content-type']).
468
+ * Required for compatibility with middleware like helmet that access headers directly.
469
+ */
470
+ get headers() {
471
+ return new Proxy({}, {
472
+ deleteProperty: (_target, prop) => {
473
+ this.removeHeader(String(prop));
474
+ return true;
475
+ },
476
+ get: (_target, prop) => {
477
+ if (typeof prop === "symbol")
478
+ return undefined;
479
+ return this.getHeader(String(prop));
480
+ },
481
+ getOwnPropertyDescriptor: (_target, prop) => {
482
+ if (this.hasHeader(String(prop))) {
483
+ return {
484
+ configurable: true,
485
+ enumerable: true,
486
+ value: this.getHeader(String(prop)),
487
+ };
488
+ }
489
+ return undefined;
490
+ },
491
+ has: (_target, prop) => {
492
+ return this.hasHeader(String(prop));
493
+ },
494
+ ownKeys: () => {
495
+ return this.getHeaderNames();
496
+ },
497
+ set: (_target, prop, value) => {
498
+ this.setHeader(String(prop), value);
499
+ return true;
500
+ },
501
+ });
502
+ }
395
503
  writeHead(statusCode, statusMessageOrHeaders, headers) {
396
504
  if (this._headersSent) {
397
505
  return this;
@@ -443,6 +551,20 @@ class LambdaResponseStreaming extends Writable {
443
551
  //
444
552
  // Express compatibility methods
445
553
  //
554
+ /**
555
+ * Express-style alias for getHeader().
556
+ * Used by middleware like decorateResponse that use res.get().
557
+ */
558
+ get(name) {
559
+ return this.getHeader(name);
560
+ }
561
+ /**
562
+ * Express-style alias for setHeader().
563
+ * Used by middleware like decorateResponse that use res.set().
564
+ */
565
+ set(name, value) {
566
+ return this.setHeader(name, value);
567
+ }
446
568
  status(code) {
447
569
  this.statusCode = code;
448
570
  return this;
@@ -459,6 +581,26 @@ class LambdaResponseStreaming extends Writable {
459
581
  this.end(body);
460
582
  return this;
461
583
  }
584
+ /**
585
+ * Add a field to the Vary response header.
586
+ * Used by CORS middleware to indicate response varies by Origin.
587
+ */
588
+ vary(field) {
589
+ const existing = this.getHeader("vary");
590
+ if (!existing) {
591
+ this.setHeader("vary", field);
592
+ }
593
+ else {
594
+ // Append to existing Vary header if field not already present
595
+ const fields = String(existing)
596
+ .split(",")
597
+ .map((f) => f.trim().toLowerCase());
598
+ if (!fields.includes(field.toLowerCase())) {
599
+ this.setHeader("vary", `${existing}, ${field}`);
600
+ }
601
+ }
602
+ return this;
603
+ }
462
604
  //
463
605
  // Writable stream implementation
464
606
  //