diff --git a/app.js b/app.js
index d1d715b..11e6375 100644
--- a/app.js
+++ b/app.js
@@ -13,14 +13,12 @@ require('dotenv').config({ path: 'variables.env' })
const helpers = require('./helpers')
const { translate, initializeTranslations } = require('./i18n/i18n')
const breadcrumb = require('./lib/breadcrumb')
+const settings = require('./lib/settings')
const routes = require('./routes/index')
-const { initClients, getSpace } = require('./services/contentful')
-const { updateCookie } = require('./lib/cookies')
+const { getSpace } = require('./services/contentful')
const app = express()
-const SETTINGS_NAME = 'theExampleAppSettings'
-
// View engine setup
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'pug')
@@ -40,42 +38,9 @@ app.use(function (req, res, next) {
}
next()
})
-// Set our application state based on environment variables or query parameters
-app.use(async function (request, response, next) {
- // Set default settings based on environment variables
- let settings = {
- spaceId: process.env.CONTENTFUL_SPACE_ID,
- deliveryToken: process.env.CONTENTFUL_DELIVERY_TOKEN,
- previewToken: process.env.CONTENTFUL_PREVIEW_TOKEN,
- editorialFeatures: false,
- // Overwrite default settings using those stored in cookie, if present
- ...request.cookies.theExampleAppSettings
- }
- // Allow setting of API credentials via query parameters
- const { space_id, preview_token, delivery_token } = request.query
- if (space_id && preview_token && delivery_token) { // eslint-disable-line camelcase
- settings = {
- ...settings,
- spaceId: space_id,
- deliveryToken: delivery_token,
- previewToken: preview_token
- }
- updateCookie(response, SETTINGS_NAME, settings)
- }
-
- // Allow enabling of editorial features via query parameters
- const { enable_editorial_features } = request.query
- if (enable_editorial_features !== undefined) { // eslint-disable-line camelcase
- delete request.query.enable_editorial_features
- settings.editorialFeatures = true
- updateCookie(response, SETTINGS_NAME, settings)
- }
-
- initClients(settings)
- response.locals.settings = settings
- next()
-})
+// Set our application settings based on environment variables or query parameters
+app.use(settings)
// Make data available for our views to consume
app.use(async function (request, response, next) {
diff --git a/bin/vendor/analytics.html b/bin/vendor/analytics.html
new file mode 100644
index 0000000..62da75f
--- /dev/null
+++ b/bin/vendor/analytics.html
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
diff --git a/bin/vendor/deploy.sh b/bin/vendor/deploy.sh
new file mode 100755
index 0000000..6f94fa0
--- /dev/null
+++ b/bin/vendor/deploy.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+set -e
+
+analytics_file="../bin/vendor/analytics.html"
+layout_file="$(dirname $0)/../../views/layout.pug"
+
+# Replace analytics script in layout
+distro=`uname`
+if [[ $distro != 'Linux' ]]; then
+ sed -i '' 's,'",include $analytics_file"',g' "$layout_file"
+else # If running on macOS, the sed command has different syntax
+ sed -i 's,'",include $analytics_file"',g' "$layout_file"
+fi
diff --git a/lib/settings.js b/lib/settings.js
new file mode 100644
index 0000000..366db17
--- /dev/null
+++ b/lib/settings.js
@@ -0,0 +1,48 @@
+/**
+ * The purpose of this middleware is to set our application settings based
+ * on environment variables or query parameters
+ */
+
+const { initClients } = require('../services/contentful')
+const { updateCookie } = require('./cookies')
+
+const SETTINGS_NAME = 'theExampleAppSettings'
+
+module.exports = async function settingsMiddleware (request, response, next) {
+ // Set default settings based on environment variables
+ let settings = {
+ spaceId: process.env.CONTENTFUL_SPACE_ID,
+ deliveryToken: process.env.CONTENTFUL_DELIVERY_TOKEN,
+ previewToken: process.env.CONTENTFUL_PREVIEW_TOKEN,
+ editorialFeatures: false,
+ // Overwrite default settings using those stored in cookie, if present
+ ...request.cookies.theExampleAppSettings
+ }
+
+ // Allow setting of API credentials via query parameters
+ const { space_id, preview_token, delivery_token } = request.query
+ if (space_id && preview_token && delivery_token) { // eslint-disable-line camelcase
+ settings = {
+ ...settings,
+ spaceId: space_id,
+ deliveryToken: delivery_token,
+ previewToken: preview_token
+ }
+ updateCookie(response, SETTINGS_NAME, settings)
+ }
+
+ // Allow enabling of editorial features via query parameters
+ const { enable_editorial_features } = request.query
+ if (enable_editorial_features !== undefined) { // eslint-disable-line camelcase
+ delete request.query.enable_editorial_features
+ settings.editorialFeatures = true
+ updateCookie(response, SETTINGS_NAME, settings)
+ }
+
+ // The space id needs to be available in the frontend for our example app
+ response.cookie('space_id', settings.spaceId)
+
+ initClients(settings)
+ response.locals.settings = settings
+ next()
+}
diff --git a/package.json b/package.json
index 5f03afe..cd4337b 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,8 @@
"test:integration": "jest test/integration",
"test:integration:watch": "jest test/integration --watch",
"test:unit": "jest test/unit",
- "test:unit:watch": "jest test/unit --watch"
+ "test:unit:watch": "jest test/unit --watch",
+ "heroku-postbuild": "./bin/vendor/deploy.sh"
},
"engines": {
"node": ">=8.4.0"
diff --git a/views/layout.pug b/views/layout.pug
index a99807f..ce7c4f1 100644
--- a/views/layout.pug
+++ b/views/layout.pug
@@ -139,3 +139,5 @@ html
use(xlink:href='/icons/icons.svg#cross')
script(src='/scripts/index.js')
+
+