Refactored `web/middleware` and `web/utils` to `web/shared` (#9892)

refs #9866

- Moved web/middleware to web/shared/middlewares
- Moved util file to web/shared/utils
This commit is contained in:
Rishabh Garg 2018-09-20 23:34:34 +05:30 committed by Katharina Irrgang
parent 07fee6d027
commit fcd275f6c0
56 changed files with 122 additions and 122 deletions

View File

@ -10,7 +10,7 @@ const Promise = require('bluebird'),
urlService = require('../services/url'),
localUtils = require('./utils'),
models = require('../models'),
spamPrevention = require('../web/middleware/api/spam-prevention'),
spamPrevention = require('../web/shared/middlewares/api/spam-prevention'),
mailAPI = require('./mail'),
settingsAPI = require('./settings'),
tokenSecurity = {};
@ -327,7 +327,7 @@ authentication = {
return updatedUser.save(options);
})
.catch(common.errors.ValidationError, (err) => {
return Promise.reject(err);
return Promise.reject(err);
})
.catch((err) => {
if (common.errors.utils.isIgnitionError(err)) {
@ -414,7 +414,7 @@ authentication = {
}, options);
})
.then(() => {
return invite.destroy(options);
return invite.destroy(options);
});
}

View File

@ -6,7 +6,7 @@ const fs = require('fs-extra'),
common = require('../lib/common'),
validation = require('../data/validation'),
localUtils = require('./utils'),
customRedirectsMiddleware = require('../web/middleware/custom-redirects');
customRedirectsMiddleware = require('../web/shared/middlewares/custom-redirects');
let redirectsAPI,
_private = {};

View File

@ -3,7 +3,7 @@ const path = require('path'),
middleware = require('./middleware'),
bodyParser = require('body-parser'),
routing = require('../../../services/routing'),
brute = require('../../../web/middleware/brute'),
brute = require('../../../web/shared/middlewares/brute'),
templateName = 'private',
privateRouter = express.Router();

View File

@ -3,7 +3,7 @@ var oauth2orize = require('oauth2orize'),
passport = require('passport'),
models = require('../../models'),
authUtils = require('./utils'),
spamPrevention = require('../../web/middleware/api/spam-prevention'),
spamPrevention = require('../../web/shared/middlewares/api/spam-prevention'),
common = require('../../lib/common'),
oauthServer,
oauth;

View File

@ -12,11 +12,11 @@ const adminMiddleware = require('./middleware');
const serveStatic = require('express').static;
// Global/shared middleware
const cacheControl = require('../middleware/cache-control');
const urlRedirects = require('../middleware/url-redirects');
const errorHandler = require('../middleware/error-handler');
const maintenance = require('../middleware/maintenance');
const prettyURLs = require('../middleware/pretty-urls');
const cacheControl = require('../shared/middlewares/cache-control');
const urlRedirects = require('../shared/middlewares/url-redirects');
const errorHandler = require('../shared/middlewares/error-handler');
const maintenance = require('../shared/middlewares/maintenance');
const prettyURLs = require('../shared/middlewares/pretty-urls');
module.exports = function setupAdminApp() {
debug('Admin setup start');

View File

@ -9,13 +9,13 @@ const routes = require('./routes');
// Include the middleware
// API specific
const versionMatch = require('../../middleware/api/version-match'); // global
const versionMatch = require('../../shared/middlewares/api/version-match'); // global
// Shared
const bodyParser = require('body-parser'); // global, shared
const cacheControl = require('../../middleware/cache-control'); // global, shared
const maintenance = require('../../middleware/maintenance'); // global, shared
const errorHandler = require('../../middleware/error-handler'); // global, shared
const cacheControl = require('../../shared/middlewares/cache-control'); // global, shared
const maintenance = require('../../shared/middlewares/maintenance'); // global, shared
const errorHandler = require('../../shared/middlewares/error-handler'); // global, shared
module.exports = function setupApiApp() {
debug('API v0.1 setup start');

View File

@ -1,6 +1,6 @@
const prettyURLs = require('../../middleware/pretty-urls');
const cors = require('../../middleware/api/cors');
const urlRedirects = require('../../middleware/url-redirects');
const prettyURLs = require('../../shared/middlewares/pretty-urls');
const cors = require('../../shared/middlewares/api/cors');
const urlRedirects = require('../../shared/middlewares/url-redirects');
const auth = require('../../../services/auth');
/**

View File

@ -7,18 +7,18 @@ const mw = require('./middleware');
// API specific
const auth = require('../../../services/auth');
const cors = require('../../middleware/api/cors');
const brute = require('../../middleware/brute');
const cors = require('../../shared/middlewares/api/cors');
const brute = require('../../shared/middlewares/brute');
// Handling uploads & imports
const tmpdir = require('os').tmpdir;
const upload = require('multer')({dest: tmpdir()});
const validation = require('../../middleware/validation');
const image = require('../../middleware/image');
const validation = require('../../shared/middlewares/validation');
const image = require('../../shared/middlewares/image');
// Temporary
// @TODO find a more appy way to do this!
const labs = require('../../middleware/labs');
const labs = require('../../shared/middlewares/labs');
module.exports = function apiRoutes() {
const apiRouter = express.Router();

View File

@ -9,13 +9,13 @@ const routes = require('./routes');
// Include the middleware
// API specific
const versionMatch = require('../../../middleware/api/version-match'); // global
const versionMatch = require('../../../shared/middlewares/api/version-match'); // global
// Shared
const bodyParser = require('body-parser'); // global, shared
const cacheControl = require('../../../middleware/cache-control'); // global, shared
const maintenance = require('../../../middleware/maintenance'); // global, shared
const errorHandler = require('../../../middleware/error-handler'); // global, shared
const cacheControl = require('../../../shared/middlewares/cache-control'); // global, shared
const maintenance = require('../../../shared/middlewares/maintenance'); // global, shared
const errorHandler = require('../../../shared/middlewares/error-handler'); // global, shared
module.exports = function setupApiApp() {
debug('Admin API v2 setup start');

View File

@ -1,6 +1,6 @@
const prettyURLs = require('../../../middleware/pretty-urls');
const cors = require('../../../middleware/api/cors');
const {adminRedirect} = require('../../../middleware/url-redirects');
const prettyURLs = require('../../../shared/middlewares/pretty-urls');
const cors = require('../../../shared/middlewares/api/cors');
const {adminRedirect} = require('../../../shared/middlewares/url-redirects');
const auth = require('../../../../services/auth');
/**

View File

@ -7,18 +7,18 @@ const mw = require('./middleware');
// API specific
const auth = require('../../../../services/auth');
const cors = require('../../../middleware/api/cors');
const brute = require('../../../middleware/brute');
const cors = require('../../../shared/middlewares/api/cors');
const brute = require('../../../shared/middlewares/brute');
// Handling uploads & imports
const tmpdir = require('os').tmpdir;
const upload = require('multer')({dest: tmpdir()});
const validation = require('../../../middleware/validation');
const image = require('../../../middleware/image');
const validation = require('../../../shared/middlewares/validation');
const image = require('../../../shared/middlewares/image');
// Temporary
// @TODO find a more appy way to do this!
const labs = require('../../../middleware/labs');
const labs = require('../../../shared/middlewares/labs');
module.exports = function apiRoutes() {
const router = express.Router();

View File

@ -9,9 +9,9 @@ const routes = require('./routes');
// Include the middleware
// Shared
const cacheControl = require('../../../middleware/cache-control'); // global, shared
const maintenance = require('../../../middleware/maintenance'); // global, shared
const errorHandler = require('../../../middleware/error-handler'); // global, shared
const cacheControl = require('../../../shared/middlewares/cache-control'); // global, shared
const maintenance = require('../../../shared/middlewares/maintenance'); // global, shared
const errorHandler = require('../../../shared/middlewares/error-handler'); // global, shared
module.exports = function setupApiApp() {
debug('Content API v2 setup start');

View File

@ -1,6 +1,6 @@
const prettyURLs = require('../../../middleware/pretty-urls');
const cors = require('../../../middleware/api/cors');
const {adminRedirect} = require('../../../middleware/url-redirects');
const prettyURLs = require('../../../shared/middlewares/pretty-urls');
const cors = require('../../../shared/middlewares/api/cors');
const {adminRedirect} = require('../../../shared/middlewares/url-redirects');
const auth = require('../../../../services/auth');
/**

View File

@ -6,11 +6,11 @@ const api = require('../../../../api');
const mw = require('./middleware');
// API specific
const cors = require('../../../middleware/api/cors');
const cors = require('../../../shared/middlewares/api/cors');
// Temporary
// @TODO find a more appy way to do this!
const labs = require('../../../middleware/labs');
const labs = require('../../../shared/middlewares/labs');
module.exports = function apiRoutes() {
const router = express.Router();

View File

@ -9,8 +9,8 @@ const compress = require('compression');
const netjet = require('netjet');
// local middleware
const ghostLocals = require('./middleware/ghost-locals');
const logRequest = require('./middleware/log-request');
const ghostLocals = require('./shared/middlewares/ghost-locals');
const logRequest = require('./shared/middlewares/log-request');
module.exports = function setupParentApp(options = {}) {
debug('ParentApp setup start');

View File

@ -1,5 +1,5 @@
const express = require('express');
const urlService = require('../../services/url');
const urlService = require('../../../services/url');
const adminRedirect = (path) => {
return function doRedirect(req, res) {

View File

@ -2,7 +2,7 @@ const cors = require('cors');
const url = require('url');
const os = require('os');
const some = require('lodash/some');
const urlService = require('../../../services/url');
const urlService = require('../../../../services/url');
let whitelist = [];
const ENABLE_CORS = {origin: true, maxAge: 86400};

View File

@ -1,8 +1,8 @@
const moment = require('moment');
const extend = require('lodash/extend');
const pick = require('lodash/pick');
const config = require('../../../config');
const common = require('../../../lib/common');
const config = require('../../../../config');
const common = require('../../../../lib/common');
const spam = config.get('spam') || {};
const spamPrivateBlog = spam.private_blog || {};
@ -45,7 +45,7 @@ const handleStoreError = (err) => {
const globalBlock = () => {
const ExpressBrute = require('express-brute');
const BruteKnex = require('brute-knex');
const db = require('../../../data/db');
const db = require('../../../../data/db');
store = store || new BruteKnex({
tablename: 'brute',
@ -74,7 +74,7 @@ const globalBlock = () => {
const globalReset = () => {
const ExpressBrute = require('express-brute');
const BruteKnex = require('brute-knex');
const db = require('../../../data/db');
const db = require('../../../../data/db');
store = store || new BruteKnex({
tablename: 'brute',
@ -108,7 +108,7 @@ const globalReset = () => {
const userLogin = () => {
const ExpressBrute = require('express-brute');
const BruteKnex = require('brute-knex');
const db = require('../../../data/db');
const db = require('../../../../data/db');
store = store || new BruteKnex({
tablename: 'brute',
@ -140,7 +140,7 @@ const userLogin = () => {
const userReset = function userReset() {
const ExpressBrute = require('express-brute');
const BruteKnex = require('brute-knex');
const db = require('../../../data/db');
const db = require('../../../../data/db');
store = store || new BruteKnex({
tablename: 'brute',
@ -171,7 +171,7 @@ const userReset = function userReset() {
const privateBlog = () => {
const ExpressBrute = require('express-brute');
const BruteKnex = require('brute-knex');
const db = require('../../../data/db');
const db = require('../../../../data/db');
store = store || new BruteKnex({
tablename: 'brute',

View File

@ -1,5 +1,5 @@
const semver = require('semver');
const common = require('../../../lib/common');
const common = require('../../../../lib/common');
function checkVersionMatch(req, res, next) {
const clientVersion = req.get('X-Ghost-Version');

View File

@ -7,7 +7,7 @@
// Allows each app to declare its own default caching rules
const isString = require('lodash/isString');
const config = require('../../config');
const config = require('../../../config');
const cacheControl = (options) => {
const profiles = {

View File

@ -3,9 +3,9 @@ const express = require('express');
const url = require('url');
const path = require('path');
const debug = require('ghost-ignition').debug('custom-redirects');
const config = require('../../config');
const common = require('../../lib/common');
const validation = require('../../data/validation');
const config = require('../../../config');
const common = require('../../../lib/common');
const validation = require('../../../data/validation');
const _private = {};

View File

@ -1,8 +1,8 @@
const hbs = require('express-hbs');
const debug = require('ghost-ignition').debug('error-handler');
const config = require('../../config');
const common = require('../../lib/common');
const helpers = require('../../services/routing/helpers');
const config = require('../../../config');
const common = require('../../../lib/common');
const helpers = require('../../../services/routing/helpers');
const escapeExpression = hbs.Utils.escapeExpression;
const _private = {};
@ -14,7 +14,7 @@ const errorHandler = {};
*/
_private.createHbsEngine = () => {
const engine = hbs.create();
engine.registerHelper('asset', require('../../helpers/asset'));
engine.registerHelper('asset', require('../../../helpers/asset'));
return engine.express4();
};

View File

@ -1,6 +1,6 @@
const api = require('../../api');
const labs = require('../../services/labs');
const common = require('../../lib/common');
const api = require('../../../api');
const labs = require('../../../services/labs');
const common = require('../../../lib/common');
module.exports = function getFrontendClient(req, res, next) {
if (labs.isSet('publicAPI') !== true) {

View File

@ -1,4 +1,4 @@
const ghostVersion = require('../../lib/ghost-version');
const ghostVersion = require('../../../lib/ghost-version');
// ### GhostLocals Middleware
// Expose the standard locals that every request will need to have available

View File

@ -1,8 +1,8 @@
const cloneDeep = require('lodash/cloneDeep');
const path = require('path');
const config = require('../../../config');
const common = require('../../../lib/common');
const image = require('../../../lib/image');
const config = require('../../../../config');
const common = require('../../../../lib/common');
const image = require('../../../../lib/image');
module.exports = function normalize(req, res, next) {
const imageOptimizationOptions = config.get('imageOptimization');

View File

@ -1,5 +1,5 @@
const labsUtil = require('../../services/labs');
const common = require('../../lib/common');
const labsUtil = require('../../../services/labs');
const common = require('../../../lib/common');
const labs = {
subscribers(req, res, next) {

View File

@ -1,5 +1,5 @@
const uuid = require('uuid');
const common = require('../../lib/common');
const common = require('../../../lib/common');
/**
* @TODO:

View File

@ -1,6 +1,6 @@
const config = require('../../config');
const common = require('../../lib/common');
const urlService = require('../../services/url');
const config = require('../../../config');
const common = require('../../../lib/common');
const urlService = require('../../../services/url');
module.exports = function maintenance(req, res, next) {
if (config.get('maintenance').enabled) {

View File

@ -7,7 +7,7 @@
// @TODO optimise this to reduce the number of redirects required to get to a pretty URL
// @TODO move this to being used by routers?
const slashes = require('connect-slashes');
const config = require('../../config');
const config = require('../../../config');
module.exports = [
slashes(true, {

View File

@ -1,11 +1,11 @@
const fs = require('fs-extra');
const path = require('path');
const crypto = require('crypto');
const config = require('../../config');
const imageLib = require('../../lib/image');
const storage = require('../../adapters/storage');
const urlService = require('../../services/url');
const settingsCache = require('../../services/settings/cache');
const config = require('../../../config');
const imageLib = require('../../../lib/image');
const storage = require('../../../adapters/storage');
const urlService = require('../../../services/url');
const settingsCache = require('../../../services/settings/cache');
let content;

View File

@ -1,8 +1,8 @@
const crypto = require('crypto');
const fs = require('fs-extra');
const path = require('path');
const config = require('../../config');
const urlService = require('../../services/url');
const config = require('../../../config');
const urlService = require('../../../services/url');
// ### servePublicFile Middleware
// Handles requests to robots.txt and favicon.ico (and caches them)

View File

@ -1,8 +1,8 @@
const express = require('express');
const path = require('path');
const config = require('../../config');
const constants = require('../../lib/constants');
const themeUtils = require('../../services/themes');
const config = require('../../../config');
const constants = require('../../../lib/constants');
const themeUtils = require('../../../services/themes');
function isBlackListedFileType(file) {
const blackListedFileTypes = ['.hbs', '.md', '.json'];

View File

@ -12,8 +12,8 @@
// req.baseUrl = /blog
// req.path = /ghost/signin/
const urlService = require('../../services/url');
const common = require('../../lib/common');
const urlService = require('../../../services/url');
const common = require('../../../lib/common');
const localUtils = require('../utils');
const uncapitalise = (req, res, next) => {

View File

@ -1,7 +1,7 @@
const url = require('url');
const path = require('path');
const debug = require('ghost-ignition').debug('url-redirects');
const urlService = require('../../services/url');
const urlService = require('../../../services/url');
const _private = {};

View File

@ -1,6 +1,6 @@
const config = require('../../../config');
const common = require('../../../lib/common');
const imageLib = require('../../../lib/image');
const config = require('../../../../config');
const common = require('../../../../lib/common');
const imageLib = require('../../../../lib/image');
const validIconFileSize = (size) => {
return (size / 1024) <= 100;

View File

@ -1,6 +1,6 @@
const path = require('path');
const common = require('../../../lib/common');
const config = require('../../../config');
const common = require('../../../../lib/common');
const config = require('../../../../config');
const localUtils = require('../../utils');
module.exports = function upload(options) {

View File

@ -16,19 +16,19 @@ const sitemapHandler = require('../../data/xml/sitemap/handler');
const siteRoutes = require('./routes');
// Global/shared middleware
const cacheControl = require('../middleware/cache-control');
const errorHandler = require('../middleware/error-handler');
const frontendClient = require('../middleware/frontend-client');
const maintenance = require('../middleware/maintenance');
const prettyURLs = require('../middleware/pretty-urls');
const urlRedirects = require('../middleware/url-redirects');
const cacheControl = require('../shared/middlewares/cache-control');
const errorHandler = require('../shared/middlewares/error-handler');
const frontendClient = require('../shared/middlewares/frontend-client');
const maintenance = require('../shared/middlewares/maintenance');
const prettyURLs = require('../shared/middlewares/pretty-urls');
const urlRedirects = require('../shared/middlewares/url-redirects');
// local middleware
const servePublicFile = require('../middleware/serve-public-file');
const staticTheme = require('../middleware/static-theme');
const customRedirects = require('../middleware/custom-redirects');
const serveFavicon = require('../middleware/serve-favicon');
const adminRedirects = require('../middleware/admin-redirects');
const servePublicFile = require('../shared/middlewares/serve-public-file');
const staticTheme = require('../shared/middlewares/static-theme');
const customRedirects = require('../shared/middlewares/custom-redirects');
const serveFavicon = require('../shared/middlewares/serve-favicon');
const adminRedirects = require('../shared/middlewares/admin-redirects');
// middleware for themes
const themeMiddleware = require('../../services/themes').middleware;

View File

@ -35,7 +35,7 @@ describe('storage utils', function () {
});
// Very unlikely that this is necessary, because Ghost will redirect the request beforehand.
// See https://github.com/TryGhost/Ghost/blob/master/core/server/web/middleware/url-redirects.js#L76
// See https://github.com/TryGhost/Ghost/blob/master/core/server/web/shared/middlewares/url-redirects.js#L76
// TODO: Change the code to make this test work
it.skip('should return local file storage path for https request, when blog setup as http', function () {
var url = 'https://myblog.com/content/images/2017/07/ghost-logo.png',
@ -124,7 +124,7 @@ describe('storage utils', function () {
});
// Very unlikely that this is necessary, because Ghost will redirect the request beforehand.
// See https://github.com/TryGhost/Ghost/blob/master/core/server/web/middleware/url-redirects.js#L76
// See https://github.com/TryGhost/Ghost/blob/master/core/server/web/shared/middlewares/url-redirects.js#L76
// TODO: Change the code to make this test work
it.skip('should return local file storage path for https request, when blog setup as http', function () {
var url = 'https://myblog.com/content/images/2017/07/ghost-logo.png',

View File

@ -5,7 +5,7 @@ var should = require('should'),
testUtils = require('../../../utils'),
oAuth = require('../../../../server/services/auth/oauth'),
authUtils = require('../../../../server/services/auth/utils'),
spamPrevention = require('../../../../server/web/middleware/api/spam-prevention'),
spamPrevention = require('../../../../server/web/shared/middlewares/api/spam-prevention'),
common = require('../../../../server/lib/common'),
models = require('../../../../server/models'),

View File

@ -2,7 +2,7 @@ var should = require('should'),
sinon = require('sinon'),
rewire = require('rewire'),
configUtils = require('../../../../utils/configUtils'),
cors = rewire('../../../../../server/web/middleware/api/cors'),
cors = rewire('../../../../../server/web/shared/middlewares/api/cors'),
sandbox = sinon.sandbox.create();
describe('cors', function () {
@ -33,7 +33,7 @@ describe('cors', function () {
afterEach(function () {
sandbox.restore();
configUtils.restore();
cors = rewire('../../../../../server/web/middleware/api/cors');
cors = rewire('../../../../../server/web/shared/middlewares/api/cors');
});
it('should not be enabled without a request origin header', function (done) {

View File

@ -1,7 +1,7 @@
var should = require('should'),
sinon = require('sinon'),
versionMatch = require('../../../../../server/web/middleware/api/version-match'),
versionMatch = require('../../../../../server/web/shared/middlewares/api/version-match'),
sandbox = sinon.sandbox.create();

View File

@ -1,6 +1,6 @@
var should = require('should'),
sinon = require('sinon'),
cacheControl = require('../../../../server/web/middleware/cache-control'),
cacheControl = require('../../../../server/web/shared/middlewares/cache-control'),
sandbox = sinon.sandbox.create();

View File

@ -1,6 +1,6 @@
var should = require('should'),
sinon = require('sinon'),
ghostLocals = require('../../../../server/web/middleware/ghost-locals'),
ghostLocals = require('../../../../server/web/shared/middlewares/ghost-locals'),
sandbox = sinon.sandbox.create();

View File

@ -3,7 +3,7 @@ const sinon = require('sinon');
const configUtils = require('../../../../utils/configUtils');
const image = require('../../../../../server/lib/image');
const common = require('../../../../../server/lib/common');
const normalize = require('../../../../../server/web/middleware/image/normalize');
const normalize = require('../../../../../server/web/shared/middlewares/image/normalize');
const sandbox = sinon.sandbox.create();

View File

@ -1,7 +1,7 @@
var should = require('should'),
sinon = require('sinon'),
express = require('express'),
serveFavicon = require('../../../../server/web/middleware/serve-favicon'),
serveFavicon = require('../../../../server/web/shared/middlewares/serve-favicon'),
settingsCache = require('../../../../server/services/settings/cache'),
storage = require('../../../../server/adapters/storage'),
configUtils = require('../../../utils/configUtils'),

View File

@ -1,7 +1,7 @@
var should = require('should'),
sinon = require('sinon'),
fs = require('fs-extra'),
servePublicFile = require('../../../../server/web/middleware/serve-public-file'),
servePublicFile = require('../../../../server/web/shared/middlewares/serve-public-file'),
sandbox = sinon.sandbox.create();

View File

@ -3,7 +3,7 @@ var should = require('should'),
express = require('express'),
themeUtils = require('../../../../server/services/themes'),
staticTheme = require('../../../../server/web/middleware/static-theme'),
staticTheme = require('../../../../server/web/shared/middlewares/static-theme'),
sandbox = sinon.sandbox.create();

View File

@ -1,6 +1,6 @@
var should = require('should'),
sinon = require('sinon'),
uncapitalise = require('../../../../server/web/middleware/uncapitalise'),
uncapitalise = require('../../../../server/web/shared/middlewares/uncapitalise'),
sandbox = sinon.sandbox.create();

View File

@ -2,7 +2,7 @@ var should = require('should'),
sinon = require('sinon'),
rewire = require('rewire'),
configUtils = require('../../../utils/configUtils'),
urlRedirects = rewire('../../../../server/web/middleware/url-redirects'),
urlRedirects = rewire('../../../../server/web/shared/middlewares/url-redirects'),
{adminRedirect} = urlRedirects,
getAdminRedirectUrl = urlRedirects.__get__('_private.getAdminRedirectUrl'),
getBlogRedirectUrl = urlRedirects.__get__('_private.getBlogRedirectUrl'),

View File

@ -1,5 +1,5 @@
var should = require('should'),
webUtils = require('../../../server/web/utils');
webUtils = require('../../../server/web/shared/utils');
describe('web utils', function () {
describe('checkFileExists', function () {

View File

@ -23,7 +23,7 @@ var Promise = require('bluebird'),
settingsService = require('../../server/services/settings'),
settingsCache = require('../../server/services/settings/cache'),
imageLib = require('../../server/lib/image'),
customRedirectsMiddleware = require('../../server/web/middleware/custom-redirects'),
customRedirectsMiddleware = require('../../server/web/shared/middlewares/custom-redirects'),
permissions = require('../../server/services/permissions'),
sequence = require('../../server/lib/promise/sequence'),
themes = require('../../server/services/themes'),