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",