@salesforce/pwa-kit-runtime 3.15.0-nightly-20251208080231 → 3.15.0-preview.0
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/package.json +5 -5
- package/ssr/server/express.test.js +1 -2
- package/utils/logger-factory.test.js +1 -2
- package/utils/ssr-namespace-paths.test.js +1 -2
- package/utils/ssr-server/configure-proxy.basic.test.js +1 -2
- package/utils/ssr-server/hybrid-proxy.test.js +1 -2
- package/utils/ssr-server/process-lambda-response.js +79 -14
- package/utils/ssr-server/utils.test.js +1 -2
- package/utils/ssr-server.test.js +70 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@salesforce/pwa-kit-runtime",
|
|
3
|
-
"version": "3.15.0-
|
|
3
|
+
"version": "3.15.0-preview.0",
|
|
4
4
|
"description": "The PWAKit Runtime",
|
|
5
5
|
"homepage": "https://github.com/SalesforceCommerceCloud/pwa-kit/tree/develop/packages/pwa-kit-runtime#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -46,11 +46,11 @@
|
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
48
|
"@loadable/component": "^5.15.3",
|
|
49
|
-
"@salesforce/pwa-kit-dev": "3.15.0-
|
|
49
|
+
"@salesforce/pwa-kit-dev": "3.15.0-preview.0",
|
|
50
50
|
"@serverless/event-mocks": "^1.1.1",
|
|
51
51
|
"aws-lambda-mock-context": "^3.2.1",
|
|
52
52
|
"fs-extra": "^11.1.1",
|
|
53
|
-
"internal-lib-build": "3.15.0-
|
|
53
|
+
"internal-lib-build": "3.15.0-preview.0",
|
|
54
54
|
"nock": "^13.3.0",
|
|
55
55
|
"nodemon": "^2.0.22",
|
|
56
56
|
"sinon": "^13.0.2",
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"supertest": "^4.0.2"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
|
-
"@salesforce/pwa-kit-dev": "3.15.0-
|
|
61
|
+
"@salesforce/pwa-kit-dev": "3.15.0-preview.0"
|
|
62
62
|
},
|
|
63
63
|
"peerDependenciesMeta": {
|
|
64
64
|
"@salesforce/pwa-kit-dev": {
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"publishConfig": {
|
|
73
73
|
"directory": "dist"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "40542ae8754e3274bc7910e89e57c96089e2d22a"
|
|
76
76
|
}
|
|
@@ -17,8 +17,7 @@ var _buildRemoteServer = require("./build-remote-server");
|
|
|
17
17
|
var _constants = require("./constants");
|
|
18
18
|
var _express2 = require("./express");
|
|
19
19
|
var _crypto = require("crypto");
|
|
20
|
-
function
|
|
21
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
20
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
22
21
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
23
22
|
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
24
23
|
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _loggerFactory = _interopRequireWildcard(require("./logger-factory"));
|
|
4
|
-
function
|
|
5
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
4
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
6
5
|
/*
|
|
7
6
|
* Copyright (c) 2024, Salesforce, Inc.
|
|
8
7
|
* All rights reserved.
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var _ssrNamespacePaths = require("./ssr-namespace-paths");
|
|
4
4
|
var ssrConfig = _interopRequireWildcard(require("./ssr-config"));
|
|
5
|
-
function
|
|
6
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
5
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
7
6
|
/*
|
|
8
7
|
* Copyright (c) 2024, Salesforce, Inc.
|
|
9
8
|
* All rights reserved.
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var _configureProxy = require("./configure-proxy");
|
|
4
4
|
var ssrProxying = _interopRequireWildcard(require("../ssr-proxying"));
|
|
5
|
-
function
|
|
6
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
5
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
7
6
|
/*
|
|
8
7
|
* Copyright (c) 2025, Salesforce, Inc.
|
|
9
8
|
* All rights reserved.
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
var _hybridProxy = require("./hybrid-proxy");
|
|
4
4
|
var _loggerInstance = _interopRequireDefault(require("../logger-instance"));
|
|
5
5
|
var utils = _interopRequireWildcard(require("./utils"));
|
|
6
|
-
function
|
|
7
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
6
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
8
7
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
8
|
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
10
9
|
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.processLambdaResponse = void 0;
|
|
6
|
+
exports.processLambdaResponse = exports.processHeaders = void 0;
|
|
7
7
|
var _constants = require("../../ssr/server/constants");
|
|
8
8
|
var _serverlessAdapter = require("@h4ad/serverless-adapter");
|
|
9
9
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
@@ -16,30 +16,95 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
|
|
|
16
16
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
17
17
|
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/BSD-3-Clause
|
|
18
18
|
*/
|
|
19
|
+
/**
|
|
20
|
+
* Processes multi-value headers by flattening them into a single headers object,
|
|
21
|
+
* while preserving cookies in multiValueHeaders format.
|
|
22
|
+
* Cookies are extracted from multiValueHeaders and kept separate, as they need
|
|
23
|
+
* to remain in multiValueHeaders format for AWS Lambda responses.
|
|
24
|
+
* Also restores the original content type if it was temporarily replaced
|
|
25
|
+
* (e.g., when binary content encoding is used).
|
|
26
|
+
*
|
|
27
|
+
* @private
|
|
28
|
+
* @param {Object} multiValueHeaders - An object containing multi-value headers,
|
|
29
|
+
* where each key maps to an array of header values (e.g., {'set-cookie': ['cookie1', 'cookie2']})
|
|
30
|
+
* @returns {Object} An object containing:
|
|
31
|
+
* - headers: A flattened headers object with all headers joined by commas,
|
|
32
|
+
* excluding set-cookie headers, with a 'date' header added and content-type
|
|
33
|
+
* restored from x-original-content-type if present
|
|
34
|
+
* - multiValueHeaders: An object containing only the 'set-cookie' header if cookies were present,
|
|
35
|
+
* otherwise an empty object
|
|
36
|
+
*/
|
|
37
|
+
const processHeaders = multiValueHeaders => {
|
|
38
|
+
const cookies = multiValueHeaders === null || multiValueHeaders === void 0 ? void 0 : multiValueHeaders['set-cookie'];
|
|
39
|
+
let headers = (0, _serverlessAdapter.getFlattenedHeadersMap)(multiValueHeaders || {}, ',', true);
|
|
40
|
+
headers['date'] = new Date().toUTCString();
|
|
41
|
+
let newMultiValueHeaders = {};
|
|
42
|
+
|
|
43
|
+
// Only allow set-cookie headers to be in multiValueHeaders
|
|
44
|
+
// to return multiple set-cookie headers instead of a single set-cookie header with multiple values
|
|
45
|
+
if (cookies) {
|
|
46
|
+
delete headers['set-cookie'];
|
|
47
|
+
newMultiValueHeaders = {
|
|
48
|
+
'set-cookie': cookies
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// If the response contains an X_ORIGINAL_CONTENT_TYPE header,
|
|
53
|
+
// then replace the current CONTENT_TYPE header with it.
|
|
54
|
+
const originalContentType = headers[_constants.X_ORIGINAL_CONTENT_TYPE];
|
|
55
|
+
if (originalContentType) {
|
|
56
|
+
headers[_constants.CONTENT_TYPE] = originalContentType;
|
|
57
|
+
delete headers[_constants.X_ORIGINAL_CONTENT_TYPE];
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
headers,
|
|
61
|
+
multiValueHeaders: newMultiValueHeaders
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Processes a Lambda response by converting multi-value headers to a flattened format,
|
|
67
|
+
* preserving cookies in multiValueHeaders, and adding correlation ID from the event.
|
|
68
|
+
*
|
|
69
|
+
* This function is used to transform Express response headers into the format
|
|
70
|
+
* expected by AWS Lambda/API Gateway, ensuring that:
|
|
71
|
+
* - Multi-value headers are properly flattened (except for set-cookie)
|
|
72
|
+
* - Cookies remain in multiValueHeaders format for proper handling
|
|
73
|
+
* - Correlation IDs are propagated from the request to the response
|
|
74
|
+
* - Original content types are restored when they were temporarily replaced
|
|
75
|
+
* (handled by processHeaders)
|
|
76
|
+
*
|
|
77
|
+
* @param {Object} response - The Lambda response object containing multiValueHeaders
|
|
78
|
+
* @param {Object} event - The Lambda event object containing request headers
|
|
79
|
+
* @param {Object} [event.headers] - Request headers from the Lambda event
|
|
80
|
+
* @param {string} [event.headers['x-correlation-id']] - Correlation ID to add to response headers
|
|
81
|
+
* @returns {Object} The processed response object with:
|
|
82
|
+
* - headers: Flattened headers object (all headers joined by commas, except set-cookie)
|
|
83
|
+
* - multiValueHeaders: Object containing set-cookie headers if present
|
|
84
|
+
* - All other properties from the original response object
|
|
85
|
+
*/
|
|
86
|
+
exports.processHeaders = processHeaders;
|
|
19
87
|
const processLambdaResponse = (response, event) => {
|
|
20
88
|
var _event$headers;
|
|
21
89
|
if (!response) return response;
|
|
22
90
|
|
|
23
91
|
// Retrieve the correlation ID from the event headers
|
|
24
92
|
const correlationId = (_event$headers = event.headers) === null || _event$headers === void 0 ? void 0 : _event$headers['x-correlation-id'];
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
93
|
+
|
|
94
|
+
// The response only has multiValueHeaders but the updated response needs joined single value headers
|
|
95
|
+
// except for the set-cookie headers
|
|
96
|
+
let {
|
|
97
|
+
headers,
|
|
98
|
+
multiValueHeaders
|
|
99
|
+
} = processHeaders(response.multiValueHeaders);
|
|
28
100
|
|
|
29
101
|
// Add the correlation ID to the response headers if it exists
|
|
30
102
|
if (correlationId) {
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// If the response contains an X_ORIGINAL_CONTENT_TYPE header,
|
|
35
|
-
// then replace the current CONTENT_TYPE header with it.
|
|
36
|
-
const originalContentType = joinedHeaders[_constants.X_ORIGINAL_CONTENT_TYPE];
|
|
37
|
-
if (originalContentType) {
|
|
38
|
-
joinedHeaders[_constants.CONTENT_TYPE] = originalContentType;
|
|
39
|
-
delete joinedHeaders[_constants.X_ORIGINAL_CONTENT_TYPE];
|
|
103
|
+
headers['x-correlation-id'] = correlationId;
|
|
40
104
|
}
|
|
41
105
|
const result = _objectSpread(_objectSpread({}, response), {}, {
|
|
42
|
-
headers
|
|
106
|
+
headers,
|
|
107
|
+
multiValueHeaders
|
|
43
108
|
});
|
|
44
109
|
return result;
|
|
45
110
|
};
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var utils = _interopRequireWildcard(require("./utils"));
|
|
4
|
-
function
|
|
5
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
4
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
6
5
|
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } /*
|
|
7
6
|
* Copyright (c) 2022, Salesforce, Inc.
|
|
8
7
|
* All rights reserved.
|
package/utils/ssr-server.test.js
CHANGED
|
@@ -502,6 +502,76 @@ describe('processLambdaResponse', () => {
|
|
|
502
502
|
testCase.validate(res.headers);
|
|
503
503
|
});
|
|
504
504
|
});
|
|
505
|
+
test('preserves single cookie in multiValueHeaders', () => {
|
|
506
|
+
const response = {
|
|
507
|
+
multiValueHeaders: {
|
|
508
|
+
'set-cookie': ['test-cookie=test-value; Path=/']
|
|
509
|
+
}
|
|
510
|
+
};
|
|
511
|
+
const event = {};
|
|
512
|
+
const result = (0, _ssrServer.processLambdaResponse)(response, event);
|
|
513
|
+
expect(result.multiValueHeaders).toBeDefined();
|
|
514
|
+
expect(result.multiValueHeaders['set-cookie']).toEqual(['test-cookie=test-value; Path=/']);
|
|
515
|
+
expect(result.headers['set-cookie']).toBeUndefined();
|
|
516
|
+
});
|
|
517
|
+
test('preserves multiple cookies in multiValueHeaders', () => {
|
|
518
|
+
const response = {
|
|
519
|
+
multiValueHeaders: {
|
|
520
|
+
'set-cookie': ['test-cookie=test-value; Path=/', 'test-value2', 'test-value3']
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
const event = {};
|
|
524
|
+
const result = (0, _ssrServer.processLambdaResponse)(response, event);
|
|
525
|
+
expect(result.multiValueHeaders).toBeDefined();
|
|
526
|
+
expect(result.multiValueHeaders['set-cookie']).toEqual(['test-cookie=test-value; Path=/', 'test-value2', 'test-value3']);
|
|
527
|
+
expect(result.headers['set-cookie']).toBeUndefined();
|
|
528
|
+
});
|
|
529
|
+
test('removes set-cookie from headers when cookies are in multiValueHeaders', () => {
|
|
530
|
+
const response = {
|
|
531
|
+
multiValueHeaders: {
|
|
532
|
+
'set-cookie': ['test-cookie=test-value; Path=/'],
|
|
533
|
+
'Accept-Language': ['en-US']
|
|
534
|
+
}
|
|
535
|
+
};
|
|
536
|
+
const event = {};
|
|
537
|
+
const result = (0, _ssrServer.processLambdaResponse)(response, event);
|
|
538
|
+
|
|
539
|
+
// set-cookie should be removed from headers
|
|
540
|
+
expect(result.headers['set-cookie']).toBeUndefined();
|
|
541
|
+
// Other headers should still be present
|
|
542
|
+
expect(result.headers['accept-language']).toBe('en-US');
|
|
543
|
+
// Cookies should be in multiValueHeaders
|
|
544
|
+
expect(result.multiValueHeaders['set-cookie']).toEqual(['test-cookie=test-value; Path=/']);
|
|
545
|
+
});
|
|
546
|
+
test('does not add multiValueHeaders when no cookies are present', () => {
|
|
547
|
+
const response = {
|
|
548
|
+
multiValueHeaders: {
|
|
549
|
+
'Accept-Language': ['en-US']
|
|
550
|
+
}
|
|
551
|
+
};
|
|
552
|
+
const event = {};
|
|
553
|
+
const result = (0, _ssrServer.processLambdaResponse)(response, event);
|
|
554
|
+
|
|
555
|
+
// multiValueHeaders should be an empty object when no cookies are present
|
|
556
|
+
expect(result.multiValueHeaders).toEqual({});
|
|
557
|
+
expect(result.headers['accept-language']).toBe('en-US');
|
|
558
|
+
});
|
|
559
|
+
test('handles cookies with correlation ID', () => {
|
|
560
|
+
const response = {
|
|
561
|
+
multiValueHeaders: {
|
|
562
|
+
'set-cookie': ['test-cookie=test-value; Path=/']
|
|
563
|
+
}
|
|
564
|
+
};
|
|
565
|
+
const event = {
|
|
566
|
+
headers: {
|
|
567
|
+
'x-correlation-id': 'e46cd109-39b7-4173-963e-2c5de78ba087'
|
|
568
|
+
}
|
|
569
|
+
};
|
|
570
|
+
const result = (0, _ssrServer.processLambdaResponse)(response, event);
|
|
571
|
+
expect(result.headers['x-correlation-id']).toBe('e46cd109-39b7-4173-963e-2c5de78ba087');
|
|
572
|
+
expect(result.multiValueHeaders['set-cookie']).toEqual(['test-cookie=test-value; Path=/']);
|
|
573
|
+
expect(result.headers['set-cookie']).toBeUndefined();
|
|
574
|
+
});
|
|
505
575
|
});
|
|
506
576
|
describe('processExpressResponse', () => {
|
|
507
577
|
const testCases = [{
|