diff --git a/__tests__/server/middleware/sendHtml.spec.js b/__tests__/server/middleware/sendHtml.spec.js index 2082bdbca..a8153e9d4 100644 --- a/__tests__/server/middleware/sendHtml.spec.js +++ b/__tests__/server/middleware/sendHtml.spec.js @@ -253,7 +253,8 @@ describe('sendHtml', () => { }); it('sends a rendered page with the __holocron_module_bundle_type__ global set according to the user agent and the client module map that only includes the relevant details', () => { - req.headers['user-agent'] = 'Browser/5.0 (compatible; NUEI 100.0; Doors TX 81.4; Layers/1.0)'; + // MSIE indicates legacy IE + req.headers['user-agent'] = 'Browser/5.0 (compatible; MSIE 100.0; Doors TX 81.4; Layers/1.0)'; sendHtml(req, res); expect(res.send).toHaveBeenCalledTimes(1); expect(res.send.mock.calls[0][0]).toContain(''); @@ -319,7 +320,8 @@ describe('sendHtml', () => { }); it('sends a rendered page with the legacy app bundle according to the user agent', () => { - req.headers['user-agent'] = 'Browser/5.0 (compatible; NUEI 100.0; Doors TX 81.4; Layers/1.0)'; + // rv:11 indicates IE 11 on mobile + req.headers['user-agent'] = 'Browser/5.0 (compatible; NUEI 100.0; Doors TX 81.4; rv:11)'; sendHtml(req, res); expect(res.send).toHaveBeenCalledTimes(1); expect(res.send.mock.calls[0][0]).toContain(''); diff --git a/package-lock.json b/package-lock.json index 650870382..8b6867734 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4556,16 +4556,6 @@ "node-releases": "^1.1.42" } }, - "browserslist-useragent": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/browserslist-useragent/-/browserslist-useragent-3.0.2.tgz", - "integrity": "sha512-/UPzK9xZnk5mwwWx4wcuBKAKx/mD3MNY8sUuZ2NPqnr4RVFWZogX+8mOP0cQEYo8j78sHk0hiDNaVXZ1U3hM9A==", - "requires": { - "browserslist": "^4.6.6", - "semver": "^6.3.0", - "useragent": "^2.3.0" - } - }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", @@ -16478,7 +16468,8 @@ "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true }, "psl": { "version": "1.6.0", @@ -19016,6 +19007,7 @@ "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -19564,31 +19556,6 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, - "useragent": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.3.0.tgz", - "integrity": "sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw==", - "requires": { - "lru-cache": "4.1.x", - "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - } - } - }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", diff --git a/package.json b/package.json index b133a6a49..09b05198c 100644 --- a/package.json +++ b/package.json @@ -79,9 +79,7 @@ "@americanexpress/one-app-ducks": "^4.0.1", "@americanexpress/one-app-router": "^1.1.0", "@americanexpress/vitruvius": "^2.0.0", - "babel-preset-amex": "^3.2.0", "body-parser": "^1.19.0", - "browserslist-useragent": "^3.0.2", "chalk": "^3.0.0", "compression": "^1.7.4", "cookie-parser": "^1.4.4", @@ -129,6 +127,7 @@ "@babel/core": "^7.7.2", "@babel/node": "^7.7.0", "@babel/register": "^7.7.0", + "babel-preset-amex": "^3.2.0", "@commitlint/cli": "^8.2.0", "@commitlint/config-conventional": "^8.2.0", "@rollup/plugin-node-resolve": "^7.1.1", diff --git a/src/server/middleware/sendHtml.js b/src/server/middleware/sendHtml.js index 404d2e78c..3edae1161 100644 --- a/src/server/middleware/sendHtml.js +++ b/src/server/middleware/sendHtml.js @@ -16,8 +16,6 @@ // This rule is only needed for a couple functions below /* eslint-disable es/no-arrow-functions */ -import { matchesUA } from 'browserslist-useragent'; -import { browserList } from 'babel-preset-amex/browserlist'; import { Set as iSet, Map as iMap } from 'immutable'; import transit from '../../universal/utils/transit'; @@ -33,6 +31,16 @@ const { buildVersion } = readJsonFile('../../../.build-meta.json'); const integrityManifest = readJsonFile('../../../bundle.integrity.manifest.json'); const nodeEnvIsDevelopment = process.env.NODE_ENV === 'development'; +// http://www.useragentstring.com/pages/useragentstring.php?name=Internet+Explorer +const legacyIndicators = [ + 'rv:11', // IE 11 on mobile + 'MSIE', // IE +]; + +const legacyUserAgent = (userAgent) => ( + legacyIndicators.some((legacyIndicator) => userAgent.includes(legacyIndicator)) +); + function getChunkAssets(assetsByChunkName) { return Object .entries(assetsByChunkName) @@ -278,10 +286,7 @@ export default function sendHtml(req, res) { } = req; const { scriptNonce } = res; const userAgent = headers['user-agent']; - const isLegacy = !matchesUA(userAgent, { - browsers: browserList, - allowHigherVersions: true, - }); + const isLegacy = legacyUserAgent(userAgent); console.info(`sendHtml, have store? ${!!store}, have appHtml? ${!!appHtml}`); if (appHtml && typeof appHtml !== 'string') {