diff --git a/app/index.html b/app/index.html index a2771b8ac7e..904239588e5 100644 --- a/app/index.html +++ b/app/index.html @@ -9,9 +9,9 @@ - - - + + + @@ -33,14 +33,14 @@ {{content-for 'rubik-font'}} {{content-for 'svg-inline'}} {{content-for 'body'}} - + {{content-for 'fastboot-inline-scripts'}} {{content-for 'fastboot-inline-scripts-tracking'}} {{content-for 'fastboot-inline-scripts-load-svg'}} diff --git a/app/modules/jwplayer-assets.js b/app/modules/jwplayer-assets.js index a07bbbe5155..bbd7e132c81 100644 --- a/app/modules/jwplayer-assets.js +++ b/app/modules/jwplayer-assets.js @@ -1,8 +1,8 @@ import { Promise } from 'rsvp'; export const assetUrls = { - styles: '/mobile-wiki/assets/jwplayer/index.css', - script: '/mobile-wiki/assets/jwplayer/wikiajwplayer.js', + styles: '/mobile-wiki/br/assets/jwplayer/index.css', + script: '/mobile-wiki/br/assets/jwplayer/wikiajwplayer.js', }; /** diff --git a/app/templates/head.hbs b/app/templates/head.hbs index ed8bc40af51..14d42efa507 100644 --- a/app/templates/head.hbs +++ b/app/templates/head.hbs @@ -191,10 +191,10 @@ {{#if model.lazyCss}} {{!- These styles will be added to head on front-end to lazy load them-}} - + {{/if}} {{#if model.shouldLoadDarkCss}} {{!- Styles for dark theme added only in the mobile app view-}} - + {{/if}} diff --git a/config/deploy.js b/config/deploy.js new file mode 100644 index 00000000000..87e00360c69 --- /dev/null +++ b/config/deploy.js @@ -0,0 +1,31 @@ +/* eslint-env node */ + +'use strict'; + +module.exports = function (deployTarget) { + const ENV = { + build: { + outputPath: 'dist/mobile-wiki', + }, + // include other plugin configuration that applies to all deploy targets here + compress: { + compression: ['gzip', 'brotli'], + keep: true, + }, + }; + + if (deployTarget === 'development') { + ENV.build.environment = 'development'; + // configure other plugins for development deploy target here + } + + if (deployTarget === 'production') { + ENV.build.environment = 'production'; + // configure other plugins for production deploy target here + } + + // Note: if you need to build some configuration asynchronously, you can return + // a promise that resolves with the ENV object instead of returning the + // ENV object synchronously. + return ENV; +}; diff --git a/fastboot-server/headers.js b/fastboot-server/headers.js index 12ca2b80d8a..f30b055d49b 100644 --- a/fastboot-server/headers.js +++ b/fastboot-server/headers.js @@ -31,13 +31,13 @@ module.exports = function (req, res, next) { try { // We do want to load this file in runtime and have a fallback if it does not exist /* eslint global-require: 0 */ - vendorAssetPath = require('../dist/mobile-wiki/assets/assetMap.json').assets['assets/vendor.js']; + vendorAssetPath = require('../dist/mobile-wiki/br/assets/assetMap.json').assets['assets/vendor.js']; } catch (exception) { - vendorAssetPath = 'assets/vendor.js'; + vendorAssetPath = '/br/assets/vendor.js'; } } - if (!req.path.startsWith('/mobile-wiki/assets')) { + if (!req.path.startsWith('/mobile-wiki/br/assets')) { res.setHeader('link', `; rel=preload; as=script`); } diff --git a/fastboot-server/middlewares.js b/fastboot-server/middlewares.js index faf8d6134a4..94e39873482 100644 --- a/fastboot-server/middlewares.js +++ b/fastboot-server/middlewares.js @@ -23,7 +23,7 @@ function levelFn(status) { module.exports = { before(app) { - app.use(compression()); + app.use(/^(?!\/mobile-wiki\/)/, compression()); app.disable('x-powered-by'); app.use(logger); @@ -45,6 +45,7 @@ module.exports = { app.use(/^(\/[a-z]{2,3}(?:-[a-z-]{2,12})?)?\/article-preview/, methodOverride(() => 'GET')); app.use('/mobile-wiki', cors(), staticAssets); + app.use('/mobile-wiki/br/', cors(), staticAssets); app.use('/heartbeat', heartbeat); }, diff --git a/fastboot-server/static-assets.js b/fastboot-server/static-assets.js index 1e481e78e9f..b0c2dab8943 100644 --- a/fastboot-server/static-assets.js +++ b/fastboot-server/static-assets.js @@ -1,10 +1,12 @@ -const express = require('express'); +const expressStaticGzip = require('express-static-gzip'); const config = require('../config/fastboot-server'); -module.exports = express.static(config.distPath, { - setHeaders: (res) => { - res.set('Cache-Control', `s-maxage=${config.staticAssetsTTL}`); - res.set('X-Pass-Cache-Control', `public, max-age=${config.staticAssetsTTL}`); - res.set('Vary', 'accept-encoding'); +module.exports = expressStaticGzip(config.distPath, { + enableBrotli: true, + serveStatic: { + setHeaders: (res) => { + res.set('Cache-Control', `s-maxage=${config.staticAssetsTTL}`); + res.set('X-Pass-Cache-Control', `public, max-age=${config.staticAssetsTTL}`); + }, }, }); diff --git a/package-lock.json b/package-lock.json index 4aa36d0f6e2..b4f6ee678a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6879,6 +6879,30 @@ "tmp": "0.0.28" } }, + "caniuse-api": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-2.0.0.tgz", + "integrity": "sha1-sd21pZZrFvSNxJmERNS7xsfZ2DQ=", + "dev": true, + "requires": { + "browserslist": "^2.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "browserslist": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", + "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30000792", + "electron-to-chromium": "^1.3.30" + } + } + } + }, "caniuse-lite": { "version": "1.0.30001012", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001012.tgz", @@ -8313,6 +8337,12 @@ "is-obj": "^1.0.0" } }, + "dotenv": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-1.2.0.tgz", + "integrity": "sha1-fNc+FuB/BXyAchR6W8OoZ38KtcY=", + "dev": true + }, "dtrace-provider": { "version": "0.8.8", "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz", @@ -9729,6 +9759,201 @@ "semver": "^5.5.0" } }, + "ember-cli-deploy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ember-cli-deploy/-/ember-cli-deploy-1.0.2.tgz", + "integrity": "sha1-mrORiMiCtXk3QY21s9pvxlsWuRY=", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "core-object": "^2.0.0", + "dag-map": "^2.0.1", + "dotenv": "^1.2.0", + "ember-cli-deploy-progress": "^1.3.0", + "lodash": "^4.0.0", + "rsvp": "^3.3.3", + "silent-error": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "core-object": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-2.1.1.tgz", + "integrity": "sha1-S3pfHt78sebQ3LWOqxufkL/GZqg=", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "ember-cli-deploy-build": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ember-cli-deploy-build/-/ember-cli-deploy-build-2.0.0.tgz", + "integrity": "sha512-o6TCCKVLC85KYkk3TV8PCmEPfUI9R0qYzb7Sda+SIq9f5oR+vOoTsQmjUPyMB5Qou2sBVreUTjgNEaJBzvLtLg==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "ember-cli-deploy-plugin": "^0.2.1", + "glob": "^7.1.1", + "rsvp": "^3.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "ember-cli-deploy-compress": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ember-cli-deploy-compress/-/ember-cli-deploy-compress-0.3.2.tgz", + "integrity": "sha512-tFdqv5toIYw8OONXSxd+6v0XbxgUBj+9SzBmZpYXnFzazOxOohqYFXhPP0SBjte9flOyo1O69Vay7BaaGhC05A==", + "dev": true, + "requires": { + "caniuse-api": "^2.0.0", + "chalk": "^1.1.3", + "core-object": "^2.0.6", + "ember-cli-deploy-plugin": "^0.2.9", + "iltorb": "^2.3.2", + "minimatch": "^3.0.3", + "rsvp": "^3.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "core-object": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-2.1.1.tgz", + "integrity": "sha1-S3pfHt78sebQ3LWOqxufkL/GZqg=", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "ember-cli-deploy-plugin": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/ember-cli-deploy-plugin/-/ember-cli-deploy-plugin-0.2.9.tgz", + "integrity": "sha1-o9OVuK2tfvaNi6zdCw9KYbz55lE=", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "core-object": "2.0.6", + "lodash.clonedeep": "^4.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "core-object": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/core-object/-/core-object-2.0.6.tgz", + "integrity": "sha1-YBNLnED/abJ7wV6C25ReTfeClhs=", + "dev": true, + "requires": { + "chalk": "^1.1.3" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "ember-cli-deploy-progress": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ember-cli-deploy-progress/-/ember-cli-deploy-progress-1.3.0.tgz", + "integrity": "sha1-GGY97tJbTVOXR2My8l7tPD/fIlo=", + "dev": true + }, "ember-cli-deprecation-workflow": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ember-cli-deprecation-workflow/-/ember-cli-deprecation-workflow-1.0.1.tgz", @@ -17289,6 +17514,14 @@ "url-value-parser": "^2.0.0" } }, + "express-static-gzip": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/express-static-gzip/-/express-static-gzip-2.0.6.tgz", + "integrity": "sha512-RWpcgN8NkbOZLXQ14tVzM0nEZpb9GGVt5vGGECzy1CU5Og1AMdKSoU15k2xtTYKN34t4HC3qCXrHvxnTqcG1iw==", + "requires": { + "serve-static": "^1.14.1" + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -20888,6 +21121,12 @@ "integrity": "sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw=", "dev": true }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", diff --git a/package.json b/package.json index 512e2e19b1e..2a9b7f53042 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ }, "private": true, "scripts": { - "build": "ember build", - "build-prod": "ember build -prod", + "build": "ember deploy development", + "build-prod": "ember deploy production", "clean": "rm -rf node_modules/ dist/ tmp/", "crowdin": "bash ./tasks/download-translations.sh", "dev": "ember serve", @@ -51,6 +51,7 @@ "ember-uuid": "2.1.0", "express-bunyan-logger": "1.3.3", "express-prom-bundle": "5.1.5", + "express-static-gzip": "2.0.6", "fastboot": "3.0.3", "fastboot-app-server": "2.0.0", "hammerjs": "2.0.8", @@ -86,6 +87,9 @@ "ember-cli-bundlesize": "0.0.2", "ember-cli-code-coverage": "0.4.2", "ember-cli-dependency-checker": "3.2.0", + "ember-cli-deploy": "1.0.2", + "ember-cli-deploy-build": "2.0.0", + "ember-cli-deploy-compress": "0.3.2", "ember-cli-deprecation-workflow": "1.0.1", "ember-cli-eslint": "5.1.0", "ember-cli-fastboot": "2.2.2",