binds all API routes to api prefix route, refactors to support

This commit is contained in:
James
2020-04-01 15:21:31 -04:00
parent 0da9b02e94
commit 49ebdaa1ec
45 changed files with 244 additions and 238 deletions

View File

@@ -1,20 +0,0 @@
const passport = require('passport');
const AnonymousStrategy = require('passport-anonymous');
const jwtStrategy = require('./jwt');
const initRoutes = require('../routes/init');
const authRoutes = require('./routes');
const initUserAuth = (User, config, router) => {
passport.use(User.createStrategy());
passport.use(jwtStrategy(User, config));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
passport.use(new AnonymousStrategy.Strategy());
router.use('', initRoutes(User));
router.use('', authRoutes(config, User));
};
module.exports = initUserAuth;

31
src/auth/register.js Normal file
View File

@@ -0,0 +1,31 @@
const mongoose = require('mongoose');
const passport = require('passport');
const AnonymousStrategy = require('passport-anonymous');
const passportLocalMongoose = require('passport-local-mongoose');
const jwtStrategy = require('./jwt');
const authRoutes = require('./routes');
const buildCollectionSchema = require('../collections/buildSchema');
const baseUserFields = require('../auth/baseFields');
const collectionRoutes = require('../collections/routes');
function registerUser() {
this.config.user.fields.push(...baseUserFields);
const userSchema = buildCollectionSchema(this.config.user, this.config);
userSchema.plugin(passportLocalMongoose, { usernameField: this.config.user.auth.useAsUsername });
this.User = mongoose.model(this.config.user.labels.singular, userSchema);
passport.use(this.User.createStrategy());
passport.use(jwtStrategy(this.User, this.config));
passport.serializeUser(this.User.serializeUser());
passport.deserializeUser(this.User.deserializeUser());
passport.use(new AnonymousStrategy.Strategy());
this.router.use(authRoutes(this.config, this.User));
this.router.use(collectionRoutes({
model: this.User,
config: this.config.user,
}));
}
module.exports = registerUser;

View File

@@ -8,6 +8,17 @@ const router = express.Router();
const authRoutes = (config, User) => {
const auth = authRequestHandlers(config, User);
router
.route('/init')
.get((req, res) => {
User.countDocuments({}, (err, count) => {
if (err) res.status(200).json({ error: err });
return count >= 1
? res.status(200).json({ initialized: true })
: res.status(200).json({ initialized: false });
});
});
router
.route('/login')
.post(auth.login);

View File

@@ -3,7 +3,7 @@
const path = require('path');
const webpack = require('webpack');
const getWebpackProdConfig = require('../client/config/getWebpackProdConfig');
const getWebpackProdConfig = require('../webpack/getWebpackProdConfig');
module.exports = (args) => {
const configPath = path.resolve(process.cwd(), (args.config || './payload.config.js'));

View File

@@ -3,7 +3,7 @@ import {
Route, Switch, withRouter, Redirect,
} from 'react-router-dom';
import DefaultList from './views/collections/List';
import config from '../config/sanitizedClientConfig';
import config from '../securedConfig';
import { useUser } from './data/User';
import Dashboard from './views/Dashboard';
import Login from './views/Login';

View File

@@ -7,7 +7,7 @@ import PropTypes from 'prop-types';
import Cookies from 'universal-cookie';
import { useModal } from '@trbl/react-modal';
import { requests } from '../../api';
import config from '../../config/sanitizedClientConfig';
import config from '../../securedConfig';
import StayLoggedInModal from '../modals/StayLoggedIn';
import useThrottledEffect from '../../hooks/useThrottledEffect';

View File

@@ -4,7 +4,7 @@ import Cookies from 'universal-cookie';
import some from 'async-some';
import ReactSelect from '../../../modules/ReactSelect';
import useFieldType from '../../useFieldType';
import config from '../../../../config/sanitizedClientConfig';
import config from '../../../../securedConfig';
import Label from '../../Label';
import Error from '../../Error';

View File

@@ -1,6 +1,6 @@
import React from 'react';
import { useLocation, NavLink, Link } from 'react-router-dom';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import Arrow from '../../graphics/Arrow';
import Icon from '../../graphics/Icon';

View File

@@ -4,7 +4,7 @@ import { useHistory } from 'react-router-dom';
import { asModal } from '@trbl/react-modal';
import ContentBlock from '../../layout/ContentBlock';
import Button from '../../controls/Button';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import './index.scss';

View File

@@ -1,7 +1,7 @@
import React, { useState } from 'react';
import { Link } from 'react-router-dom';
import qs from 'qs';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import { useLocale } from '../../utilities/Locale';
import { useSearchParams } from '../../utilities/SearchParams';
import Arrow from '../../graphics/Arrow';

View File

@@ -2,7 +2,7 @@ import React, { Component } from 'react';
import { Link } from 'react-router-dom';
import Filter from '../Filter';
import Table from '../../layout/Table';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
const { routes: { admin } } = config;

View File

@@ -2,7 +2,7 @@ import React, { Component } from 'react';
import { createPortal } from 'react-dom';
import Button from '../../controls/Button';
import api from '../../../api';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import './index.scss';

View File

@@ -2,7 +2,7 @@ import React, {
createContext, useContext, useState, useEffect,
} from 'react';
import PropTypes from 'prop-types';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import { useSearchParams } from '../SearchParams';
const defaultLocale = (config.localization && config.localization.defaultLocale) ? config.localization.defaultLocale : 'en';

View File

@@ -3,7 +3,7 @@ import {
Redirect,
} from 'react-router-dom';
import { useStatusList } from '../../modules/Status';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
const RedirectToLogin = () => {
const { addStatus } = useStatusList();

View File

@@ -6,7 +6,7 @@ import ContentBlock from '../../layout/ContentBlock';
import Form from '../../forms/Form';
import RenderFields from '../../forms/RenderFields';
import FormSubmit from '../../forms/Submit';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import { useUser } from '../../data/User';
import './index.scss';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import { Link } from 'react-router-dom';
import DefaultTemplate from '../../layout/DefaultTemplate';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import './index.scss';

View File

@@ -6,7 +6,7 @@ import Form from '../../forms/Form';
import Email from '../../forms/field-types/Email';
import Password from '../../forms/field-types/Password';
import FormSubmit from '../../forms/Submit';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import Button from '../../controls/Button';
import { useUser } from '../../data/User';

View File

@@ -1,7 +1,7 @@
import React, { useEffect } from 'react';
import { useUser } from '../../data/User';
import ContentBlock from '../../layout/ContentBlock';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import Button from '../../controls/Button';
import './index.scss';

View File

@@ -1,5 +1,5 @@
import React from 'react';
import config from '../../../config/sanitizedClientConfig';
import config from '../../../securedConfig';
import Button from '../../controls/Button';
import DefaultTemplate from '../../layout/DefaultTemplate';

View File

@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { useRouteMatch, useHistory } from 'react-router-dom';
import config from '../../../../config/sanitizedClientConfig';
import config from '../../../../securedConfig';
import DefaultTemplate from '../../../layout/DefaultTemplate';
import usePayloadAPI from '../../../../hooks/usePayloadAPI';
import Form from '../../../forms/Form';

View File

@@ -3,7 +3,7 @@ import { useLocation } from 'react-router-dom';
import queryString from 'qs';
import PropTypes from 'prop-types';
import usePayloadAPI from '../../../../hooks/usePayloadAPI';
import config from '../../../../config/sanitizedClientConfig';
import config from '../../../../securedConfig';
import DefaultTemplate from '../../../layout/DefaultTemplate';
import HeadingButton from '../../../modules/HeadingButton';
import SearchableTable from '../../../modules/SearchableTable';

View File

@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
import config from '../../../../config/sanitizedClientConfig';
import config from '../../../../securedConfig';
import DefaultTemplate from '../../../layout/DefaultTemplate';
import usePayloadAPI from '../../../../hooks/usePayloadAPI';
import Form from '../../../forms/Form';

View File

@@ -1,3 +0,0 @@
const sanitizeConfig = require('../utilities/sanitizeConfig');
module.exports = config => sanitizeConfig(config);

View File

@@ -1,5 +1,5 @@
const sanitizeConfig = require('../../utilities/sanitizeConfig');
const secureConfig = require('../../utilities/secureConfig');
const sanitizeConfig = require('../utilities/sanitizeConfig');
const secureConfig = require('../utilities/secureConfig');
module.exports = (config) => {
const sanitizedConfig = sanitizeConfig(config);

View File

@@ -0,0 +1,19 @@
const mongoose = require('mongoose');
const collectionRoutes = require('./routes');
const validate = require('./validate');
const buildSchema = require('./buildSchema');
function registerCollections() {
this.config.collections.forEach((collection) => {
validate(collection, this.collections);
this.collections[collection.slug] = {
model: mongoose.model(collection.slug, buildSchema(collection, this.config)),
config: collection,
};
this.router.use(collectionRoutes(this.collections[collection.slug]));
});
}
module.exports = registerCollections;

View File

@@ -1,3 +1,4 @@
const express = require('express');
const requestHandlers = require('../mongoose/requestHandlers');
const bindModelMiddleware = require('../mongoose/bindModel');
const setModelLocaleMiddleware = require('../localization/setModelLocale');
@@ -8,7 +9,9 @@ const {
query, create, findOne, destroy, update,
} = requestHandlers;
const registerRoutes = ({ model, config }, router) => {
const router = express.Router();
const registerRoutes = ({ model, config }) => {
router.all(`/${config.slug}*`,
bindModelMiddleware(model),
bindCollectionMiddleware(config),
@@ -22,6 +25,8 @@ const registerRoutes = ({ model, config }, router) => {
.get(loadPolicy(config.policies.read), findOne)
.put(loadPolicy(config.policies.update), update)
.delete(loadPolicy(config.policies.destroy), destroy);
return router;
};
module.exports = registerRoutes;

35
src/express/middleware.js Normal file
View File

@@ -0,0 +1,35 @@
const express = require('express');
const passport = require('passport');
const compression = require('compression');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const localizationMiddleware = require('../localization/middleware');
const middleware = (config) => {
return [
passport.initialize(),
passport.session(),
express.json(),
methodOverride('X-HTTP-Method-Override'),
express.urlencoded({ extended: true }),
bodyParser.urlencoded({ extended: true }),
compression(config.compression),
localizationMiddleware(config.localization),
(req, res, next) => {
if (config.cors) {
if (config.cors.indexOf(req.headers.origin) > -1) {
res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
}
res.header('Access-Control-Allow-Headers',
'Origin X-Requested-With, Content-Type, Accept, Authorization');
res.header('Content-Language', config.localization.locale);
}
next();
},
];
};
module.exports = middleware;

View File

@@ -1,8 +0,0 @@
const bindGlobalMiddleware = (global) => {
return (req, res, next) => {
req.global = global;
next();
};
};
module.exports = bindGlobalMiddleware;

View File

@@ -4,13 +4,13 @@ const mongooseHidden = require('mongoose-hidden');
const buildSchema = require('../mongoose/schema/buildSchema');
const localizationPlugin = require('../localization/plugin');
const registerSchema = (globalConfigs, config) => {
const registerSchema = (config) => {
const globals = {
config: globalConfigs,
config: config.globals,
model: {},
};
if (globalConfigs && globalConfigs.length > 0) {
if (config.globals && config.globals.length > 0) {
const globalsSchema = new mongoose.Schema({}, { discriminatorKey: 'globalType', timestamps: false })
.plugin(localizationPlugin, config.localization)
.plugin(autopopulate)
@@ -18,7 +18,7 @@ const registerSchema = (globalConfigs, config) => {
const Globals = mongoose.model('globals', globalsSchema);
Object.values(globalConfigs).forEach((globalConfig) => {
Object.values(config.globals).forEach((globalConfig) => {
const globalSchema = buildSchema(globalConfig.fields, config);
globalSchema

View File

@@ -0,0 +1,8 @@
const getMiddleware = (global) => {
return (req, res, next) => {
req.global = global;
next();
};
};
module.exports = getMiddleware;

12
src/globals/register.js Normal file
View File

@@ -0,0 +1,12 @@
const validate = require('./validate');
const buildSchema = require('./buildSchema');
const routes = require('./routes');
function registerGlobals() {
validate(this.config.globals);
this.globals = buildSchema(this.config);
this.router.use(routes(this.config.globals, this.globals));
}
module.exports = registerGlobals;

View File

@@ -1,18 +1,21 @@
const express = require('express');
const requestHandlers = require('./requestHandlers');
const setModelLocaleMiddleware = require('../localization/setModelLocale');
const bindModelMiddleware = require('../mongoose/bindModel');
const loadPolicy = require('../auth/loadPolicy');
const bindGlobalMiddleware = require('../globals/bindGlobalMiddleware');
const getMiddleware = require('./middleware');
const { upsert, findOne } = requestHandlers;
const registerGlobals = (globals, router) => {
const router = express.Router();
const registerGlobals = (globalConfigs, Globals) => {
router.all('/globals*',
bindModelMiddleware(globals.model),
bindModelMiddleware(Globals),
setModelLocaleMiddleware());
globals.config.forEach((global) => {
router.all(`/globals/${global.slug}`, bindGlobalMiddleware(global));
globalConfigs.forEach((global) => {
router.all(`/globals/${global.slug}`, getMiddleware(global));
router
.route(`/globals/${global.slug}`)
@@ -20,6 +23,8 @@ const registerGlobals = (globals, router) => {
.post(loadPolicy(global.policies.create), upsert)
.put(loadPolicy(global.policies.update), upsert);
});
return router;
};
module.exports = registerGlobals;

View File

@@ -1,45 +1,33 @@
const mongoose = require('mongoose');
const passportLocalMongoose = require('passport-local-mongoose');
const connectMongoose = require('./init/connectMongoose');
const registerExpressMiddleware = require('./init/registerExpressMiddleware');
const initPassport = require('./init/passport');
const initCORS = require('./init/cors');
const initUploads = require('./init/uploads');
const initWebpack = require('./init/webpack');
const initUserAuth = require('./auth/init');
const baseUserFields = require('./auth/baseFields');
const baseUploadFields = require('./uploads/baseUploadFields');
const baseImageFields = require('./uploads/baseImageFields');
const registerUploadRoutes = require('./uploads/routes');
const validateCollection = require('./collections/validate');
const buildCollectionSchema = require('./collections/buildSchema');
const registerCollectionRoutes = require('./collections/registerRoutes');
const validateGlobals = require('./globals/validate');
const registerGlobalSchema = require('./globals/registerSchema');
const registerGlobalRoutes = require('./globals/registerRoutes');
const express = require('express');
const connectMongoose = require('./mongoose/connect');
const expressMiddleware = require('./express/middleware');
const initWebpack = require('./webpack/init');
const registerUser = require('./auth/register');
const registerUpload = require('./uploads/register');
const registerCollections = require('./collections/register');
const registerGlobals = require('./globals/register');
const sanitizeConfig = require('./utilities/sanitizeConfig');
class Payload {
constructor(options) {
this.config = sanitizeConfig(options.config);
this.express = options.express;
this.router = express.Router();
this.collections = {};
this.registerUser.bind(this);
this.registerUpload.bind(this);
this.registerGlobals.bind(this);
this.registerCollections.bind(this);
this.registerUser = registerUser.bind(this);
this.registerUpload = registerUpload.bind(this);
this.registerCollections = registerCollections.bind(this);
this.registerGlobals = registerGlobals.bind(this);
this.getCollections.bind(this);
this.getGlobals.bind(this);
// Bind options, app, router
this.app = options.app;
this.config = sanitizeConfig(options.config);
this.router = options.router;
// Setup & initialization
connectMongoose(this.config.mongoURL);
registerExpressMiddleware(this.app, this.config, this.router);
initPassport(this.app);
initUploads(this.app, this.config);
initCORS(this.app, this.config);
this.router.use(...expressMiddleware(this.config));
// Register and bind required collections
this.registerUser();
@@ -51,67 +39,16 @@ class Payload {
// Register globals
this.registerGlobals();
// Enable client webpack
if (!this.config.disableAdmin) initWebpack(this.app, this.config);
}
// Enable client
if (!this.config.disableAdmin) {
this.express.use(initWebpack(this.config));
}
registerUser() {
this.config.user.fields.push(...baseUserFields);
const userSchema = buildCollectionSchema(this.config.user, this.config);
userSchema.plugin(passportLocalMongoose, { usernameField: this.config.user.auth.useAsUsername });
// Bind router to API
this.express.use(this.config.routes.api, this.router);
this.User = mongoose.model(this.config.user.labels.singular, userSchema);
initUserAuth(this.User, this.config, this.router);
registerCollectionRoutes({
model: this.User,
config: this.config.user,
}, this.router);
}
registerUpload() {
// TODO: mongooseHidden on our upload model is hiding all the fields
const uploadSchema = buildCollectionSchema(
this.config.upload,
this.config,
{ discriminatorKey: 'type' },
);
uploadSchema.add(baseUploadFields);
const imageSchema = new mongoose.Schema(baseImageFields, {
discriminatorKey: 'type',
});
this.Upload = mongoose.model(this.config.upload.labels.singular, uploadSchema);
// TODO: image type hard coded, but in the future we need some way of customizing how uploads are handled in customizable pattern
this.Upload.discriminator('image', imageSchema);
registerUploadRoutes(this.Upload, this.config, this.router);
registerCollectionRoutes({
model: this.Upload,
config: this.config.upload,
}, this.router);
}
registerCollections() {
this.config.collections.forEach((collection) => {
validateCollection(collection, this.collections);
this.collections[collection.slug] = {
model: mongoose.model(collection.slug, buildCollectionSchema(collection, this.config)),
config: collection,
};
registerCollectionRoutes(this.collections[collection.slug], this.router);
});
}
registerGlobals() {
validateGlobals(this.config.globals);
this.globals = registerGlobalSchema(this.config.globals, this.config);
registerGlobalRoutes(this.globals, this.router);
// Bind static
this.express.use(this.config.staticURL, express.static(this.config.staticDir));
}
getCollections() {

View File

@@ -1,18 +0,0 @@
const initCORS = (app, config) => {
if (config.cors) {
app.use((req, res, next) => {
if (config.cors.indexOf(req.headers.origin) > -1) {
res.setHeader('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
}
res.header('Access-Control-Allow-Headers',
'Origin X-Requested-With, Content-Type, Accept, Authorization');
res.header('Content-Language', config.localization.locale);
next();
});
}
};
module.exports = initCORS;

View File

@@ -1,8 +0,0 @@
const passport = require('passport');
const initPassport = (app) => {
app.use(passport.initialize());
app.use(passport.session());
};
module.exports = initPassport;

View File

@@ -1,17 +0,0 @@
const express = require('express');
const compression = require('compression');
const bodyParser = require('body-parser');
const methodOverride = require('method-override');
const localizationMiddleware = require('../localization/middleware');
const registerExpressMiddleware = (app, config, router) => {
app.use(express.json());
app.use(methodOverride('X-HTTP-Method-Override'));
app.use(express.urlencoded({ extended: true }));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(compression(config.compression));
app.use(localizationMiddleware(config.localization));
app.use(router);
};
module.exports = registerExpressMiddleware;

View File

@@ -1,8 +0,0 @@
const express = require('express');
const initUploads = (app, config) => {
const staticUrl = config.staticUrl ? config.staticUrl : `/${config.staticDir}`;
app.use(staticUrl, express.static(config.staticDir));
};
module.exports = initUploads;

View File

@@ -1,19 +0,0 @@
const express = require('express');
const router = express.Router();
const initRoutes = (User) => {
router
.route('/init')
.get((req, res) => {
User.countDocuments({}, (err, count) => {
if (err) res.status(200).json({ error: err });
return count >= 1
? res.status(200).json({ initialized: true })
: res.status(200).json({ initialized: false });
});
});
return router;
};
module.exports = initRoutes;

35
src/uploads/register.js Normal file
View File

@@ -0,0 +1,35 @@
const mongoose = require('mongoose');
const collectionRoutes = require('../collections/routes');
const uploadRoutes = require('./routes');
const baseUploadFields = require('./baseUploadFields');
const baseImageFields = require('./baseImageFields');
const buildCollectionSchema = require('../collections/buildSchema');
function registerUpload() {
// TODO: mongooseHidden on our upload model is hiding all the fields
const uploadSchema = buildCollectionSchema(
this.config.upload,
this.config,
{ discriminatorKey: 'type' },
);
uploadSchema.add(baseUploadFields);
const imageSchema = new mongoose.Schema(baseImageFields, {
discriminatorKey: 'type',
});
this.Upload = mongoose.model(this.config.upload.labels.singular, uploadSchema);
// TODO: image type hard coded, but in the future we need some way of customizing how uploads are handled in customizable pattern
this.Upload.discriminator('image', imageSchema);
this.router.use(uploadRoutes(this.config, this.Upload));
this.router.use(collectionRoutes({
model: this.Upload,
config: this.config.upload,
}));
}
module.exports = registerUpload;

View File

@@ -1,10 +1,13 @@
const express = require('express');
const passport = require('passport');
const fileUpload = require('express-fileupload');
const { upload, update } = require('./requestHandlers');
const uploadMiddleware = require('./middleware');
const setModelLocaleMiddleware = require('../localization/setModelLocale');
const uploadRoutes = (Upload, config, router) => {
const router = express.Router();
const uploadRoutes = (config, Upload) => {
const { upload: uploadConfig } = config;
router.all(`/${uploadConfig.slug}*`,

View File

@@ -6,7 +6,10 @@ const getStyleLoaders = require('./getStyleLoaders');
module.exports = (config) => {
return {
entry: {
main: [path.resolve(__dirname, '../../../node_modules/webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000'), path.resolve(__dirname, '../components/index.js')],
main: [
path.resolve(__dirname, '../../node_modules/webpack-hot-middleware/client?path=/__webpack_hmr&timeout=20000'),
path.resolve(__dirname, '../client/components/index.js'),
],
},
output: {
path: '/',
@@ -21,11 +24,11 @@ module.exports = (config) => {
node: {
__dirname: true,
},
resolveLoader: { modules: [path.join(__dirname, '../../../node_modules')] },
resolveLoader: { modules: [path.join(__dirname, '../../node_modules')] },
module: {
rules: [
{
test: require.resolve('../components/customComponents'),
test: require.resolve('../client/components/customComponents'),
use: [
{
loader: 'val-loader',
@@ -34,7 +37,7 @@ module.exports = (config) => {
],
},
{
test: require.resolve('./sanitizedClientConfig'),
test: require.resolve('../client/securedConfig'),
use: [
{
loader: 'val-loader',
@@ -116,13 +119,13 @@ module.exports = (config) => {
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, '../index.html'),
template: path.resolve(__dirname, '../client/index.html'),
filename: './index.html',
}),
new webpack.HotModuleReplacementPlugin(),
],
resolve: {
modules: ['node_modules', path.resolve(__dirname, '../../../node_modules')],
modules: ['node_modules', path.resolve(__dirname, '../../node_modules')],
alias: {
'payload-scss-overrides': config.paths.scssOverrides,
},

View File

@@ -1,28 +1,31 @@
const webpack = require('webpack');
const express = require('express');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const getWebpackDevConfig = require('../client/config/getWebpackDevConfig');
const getWebpackDevConfig = require('./getWebpackDevConfig');
const initWebpack = (app, config) => {
const router = express.Router();
const initWebpack = (config) => {
const webpackDevConfig = getWebpackDevConfig(config);
const compiler = webpack(webpackDevConfig);
app.use(webpackDevMiddleware(compiler, {
router.use(webpackDevMiddleware(compiler, {
publicPath: webpackDevConfig.output.publicPath,
}));
app.use(webpackHotMiddleware(compiler));
router.use(webpackHotMiddleware(compiler));
app.get(`${config.routes.admin}*`, (req, res, next) => {
router.get(`${config.routes.admin}*`, (req, res, next) => {
compiler.outputFileSystem.readFile('/index.html', (err, result) => {
if (err) {
return next(err);
}
res.set('content-type', 'text/html');
res.send(result);
res.end();
return res.set('content-type', 'text/html').send(result);
});
});
return router;
};
module.exports = initWebpack;