ff-stream-web

git clone git://archive.git.mtrnord.blog/MTRNord/ff-stream-web.git
Log | Files | Refs | README | LICENSE

commit 7456f4723e4d4b4fa85af91e13353640d15ccd95
parent 0f2d46b1475aa233da6b71c439fa46dac15f7204
Author: Vladimir Kutepov <frenzzy.man@gmail.com>
Date:   Sat, 18 Jun 2016 00:01:13 +0300

Remove jade dependency

Diffstat:
Mpackage.json | 2--
Msrc/client.js | 6++++--
Asrc/components/Html.js | 42++++++++++++++++++++++++++++++++++++++++++
Msrc/config.js | 5+++--
Dsrc/content/about.jade | 47-----------------------------------------------
Asrc/content/about.md | 46++++++++++++++++++++++++++++++++++++++++++++++
Dsrc/content/index.jade | 22----------------------
Asrc/content/index.md | 19+++++++++++++++++++
Dsrc/content/privacy.jade | 52----------------------------------------------------
Asrc/content/privacy.md | 46++++++++++++++++++++++++++++++++++++++++++++++
Msrc/data/queries/content.js | 8++------
Msrc/routes/error/ErrorPage.js | 6++++--
Msrc/server.js | 38+++++++++++++++++++++-----------------
Dsrc/views/error.jade | 61-------------------------------------------------------------
Dsrc/views/index.jade | 18------------------
Mtools/webpack.config.js | 4----
16 files changed, 187 insertions(+), 235 deletions(-)

diff --git a/package.json b/package.json @@ -23,7 +23,6 @@ "graphql": "0.6.0", "history": "3.0.0", "isomorphic-style-loader": "1.0.0", - "jade": "1.11.0", "jsonwebtoken": "7.0.0", "markdown-it": "6.0.5", "node-fetch": "1.5.3", @@ -75,7 +74,6 @@ "gaze": "^1.0.0", "git-repository": "^0.1.4", "glob": "^7.0.3", - "jade-loader": "^0.8.0", "json-loader": "^0.5.4", "mkdirp": "^0.5.1", "mocha": "^2.5.3", diff --git a/src/client.js b/src/client.js @@ -65,7 +65,9 @@ let renderComplete = (state, callback) => { // Google Analytics tracking. Don't send 'pageview' event after // the initial rendering, as it was already sent - window.ga('send', 'pageview'); + if (window.ga) { + window.ga('send', 'pageview'); + } callback(true); }; @@ -109,7 +111,7 @@ function run() { query: location.query, state: location.state, context, - render: render.bind(undefined, container, location.state), + render: render.bind(undefined, container, location.state), // eslint-disable-line react/jsx-no-bind, max-len }).catch(err => console.error(err)); // eslint-disable-line no-console } diff --git a/src/components/Html.js b/src/components/Html.js @@ -0,0 +1,42 @@ +import React, { PropTypes } from 'react'; +import { analytics } from '../config'; + +function Html({ title, description, style, script, children }) { + return ( + <html className="no-js" lang=""> + <head> + <meta charSet="utf-8" /> + <meta httpEquiv="x-ua-compatible" content="ie=edge" /> + <title>{title}</title> + <meta name="description" content={description} /> + <meta name="viewport" content="width=device-width, initial-scale=1" /> + <link rel="apple-touch-icon" href="apple-touch-icon.png" /> + <style id="css" dangerouslySetInnerHTML={{ __html: style }} /> + </head> + <body> + <div id="app" dangerouslySetInnerHTML={{ __html: children }} /> + {script && <script src={script} />} + {analytics.google.trackingId && + <script + dangerouslySetInnerHTML={{ __html: + 'window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date;' + + `ga('create','${analytics.google.trackingId}','auto');ga('send','pageview')` }} + /> + } + {analytics.google.trackingId && + <script src="https://www.google-analytics.com/analytics.js" async defer /> + } + </body> + </html> + ); +} + +Html.propTypes = { + title: PropTypes.string.isRequired, + description: PropTypes.string.isRequired, + style: PropTypes.string.isRequired, + script: PropTypes.string, + children: PropTypes.string, +}; + +export default Html; diff --git a/src/config.js b/src/config.js @@ -8,7 +8,6 @@ */ /* eslint-disable max-len */ -/* jscs:disable maximumLineLength */ export const port = process.env.PORT || 3000; export const host = process.env.WEBSITE_HOSTNAME || `localhost:${port}`; @@ -18,7 +17,9 @@ export const databaseUrl = process.env.DATABASE_URL || 'sqlite:database.sqlite'; export const analytics = { // https://analytics.google.com/ - google: { trackingId: process.env.GOOGLE_TRACKING_ID || 'UA-XXXXX-X' }, + google: { + trackingId: process.env.GOOGLE_TRACKING_ID, // UA-XXXXX-X + }, }; diff --git a/src/content/about.jade b/src/content/about.jade @@ -1,47 +0,0 @@ ---- -title: About Us -component: ContentPage ---- -p. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean consequat - tortor fermentum mi fermentum dignissim. Nullam vel ipsum ut ligula elementum - lobortis. Maecenas aliquam, massa laoreet lacinia pretium, nisi urna venenatis - tortor, nec imperdiet tellus libero efficitur metus. Fusce semper posuere - ligula, et facilisis metus bibendum interdum. Mauris at mauris sit amet sem - pharetra commodo a eu leo. Nam at est non risus cursus maximus. Nam feugiat - augue libero, id consectetur tortor bibendum non. Quisque nec fringilla lorem. - Nullam efficitur vulputate mauris, nec maximus leo dignissim id. -p. - In hac habitasse platea dictumst. Duis sagittis dui ac ex suscipit maximus. - Morbi pellentesque venenatis felis sed convallis. Nulla varius, nibh vitae - placerat tempus, mauris sem elementum ipsum, eget sollicitudin nisl est vel - purus. Fusce malesuada odio velit, non cursus leo fermentum id. Cras pharetra - sodales fringilla. Etiam quis est a dolor egestas pellentesque. Maecenas non - scelerisque purus, congue cursus arcu. Donec vel dapibus mi. Mauris maximus - posuere placerat. Sed et libero eu nibh tristique mollis a eget lectus. Donec - interdum augue sollicitudin vehicula hendrerit. Vivamus justo orci, molestie - ac sollicitudin ac, lobortis at tellus. Etiam rhoncus ullamcorper risus eu - tempor. Sed porttitor, neque ac efficitur gravida, arcu lacus pharetra dui, in - consequat elit tellus auctor nulla. Donec placerat elementum diam, vitae - imperdiet lectus luctus at. -p. - Nullam eu feugiat mi. Quisque nec tristique nisl, dignissim dictum leo. Nam - non quam nisi. Donec rutrum turpis ac diam blandit, id pulvinar mauris - suscipit. Pellentesque tincidunt libero ultricies risus iaculis, sit amet - consequat velit blandit. Fusce quis varius nulla. Nullam nisi nisi, suscipit - ut magna quis, feugiat porta nibh. Sed id enim lectus. Suspendisse elementum - justo sapien, sit amet consequat orci accumsan et. Aliquam ornare ullamcorper - sem sed finibus. Nullam ac lacus pulvinar, egestas felis ut, accumsan est. -p. - Pellentesque sagittis vehicula sem quis luctus. Proin sodales magna in lorem - hendrerit aliquam. Integer eu varius orci. Vestibulum ante ipsum primis in - faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum ante ipsum - primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut at mauris - nibh. Suspendisse maximus ac eros at vestibulum. -p. - Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque egestas - tortor et dui consequat faucibus. Nunc vitae odio ornare, venenatis ligula a, - vulputate nisl. Aenean congue varius ex, sit amet bibendum odio posuere at. - Nulla facilisi. In finibus, nulla vitae tincidunt ornare, sapien nulla - fermentum mauris, sed consectetur tortor arcu eget arcu. Vestibulum vel quam - enim. diff --git a/src/content/about.md b/src/content/about.md @@ -0,0 +1,46 @@ +--- +title: About Us +component: ContentPage +--- +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean consequat +tortor fermentum mi fermentum dignissim. Nullam vel ipsum ut ligula elementum +lobortis. Maecenas aliquam, massa laoreet lacinia pretium, nisi urna venenatis +tortor, nec imperdiet tellus libero efficitur metus. Fusce semper posuere +ligula, et facilisis metus bibendum interdum. Mauris at mauris sit amet sem +pharetra commodo a eu leo. Nam at est non risus cursus maximus. Nam feugiat +augue libero, id consectetur tortor bibendum non. Quisque nec fringilla lorem. +Nullam efficitur vulputate mauris, nec maximus leo dignissim id. + +In hac habitasse platea dictumst. Duis sagittis dui ac ex suscipit maximus. +Morbi pellentesque venenatis felis sed convallis. Nulla varius, nibh vitae +placerat tempus, mauris sem elementum ipsum, eget sollicitudin nisl est vel +purus. Fusce malesuada odio velit, non cursus leo fermentum id. Cras pharetra +sodales fringilla. Etiam quis est a dolor egestas pellentesque. Maecenas non +scelerisque purus, congue cursus arcu. Donec vel dapibus mi. Mauris maximus +posuere placerat. Sed et libero eu nibh tristique mollis a eget lectus. Donec +interdum augue sollicitudin vehicula hendrerit. Vivamus justo orci, molestie +ac sollicitudin ac, lobortis at tellus. Etiam rhoncus ullamcorper risus eu +tempor. Sed porttitor, neque ac efficitur gravida, arcu lacus pharetra dui, in +consequat elit tellus auctor nulla. Donec placerat elementum diam, vitae +imperdiet lectus luctus at. + +Nullam eu feugiat mi. Quisque nec tristique nisl, dignissim dictum leo. Nam +non quam nisi. Donec rutrum turpis ac diam blandit, id pulvinar mauris +suscipit. Pellentesque tincidunt libero ultricies risus iaculis, sit amet +consequat velit blandit. Fusce quis varius nulla. Nullam nisi nisi, suscipit +ut magna quis, feugiat porta nibh. Sed id enim lectus. Suspendisse elementum +justo sapien, sit amet consequat orci accumsan et. Aliquam ornare ullamcorper +sem sed finibus. Nullam ac lacus pulvinar, egestas felis ut, accumsan est. + +Pellentesque sagittis vehicula sem quis luctus. Proin sodales magna in lorem +hendrerit aliquam. Integer eu varius orci. Vestibulum ante ipsum primis in +faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum ante ipsum +primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut at mauris +nibh. Suspendisse maximus ac eros at vestibulum. + +Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque egestas +tortor et dui consequat faucibus. Nunc vitae odio ornare, venenatis ligula a, +vulputate nisl. Aenean congue varius ex, sit amet bibendum odio posuere at. +Nulla facilisi. In finibus, nulla vitae tincidunt ornare, sapien nulla +fermentum mauris, sed consectetur tortor arcu eget arcu. Vestibulum vel quam +enim. diff --git a/src/content/index.jade b/src/content/index.jade @@ -1,22 +0,0 @@ ---- -title: React.js Starter Kit -component: ContentPage ---- -div - div - h3 Runtime Components - dl - dt <a href="https://facebook.github.io/react/">React</a> - dd A JavaScript library for building user interfaces, developed by Facebook - dt <a href="http://facebook.github.io/flux/">Flux</a> - dd Application architecture for building user interfaces - div - h3 Development Tools - dl - dt <a href="http://webpack.github.io/">Webpack</a> - dd Compiles front-end source code into modules / bundles - dt <a href="http://www.browsersync.io/">BrowserSync</a> - dd A lightweight HTTP server for development - div - h3 Fork me on GitHub - p <a href="https://github.com/kriasoft/react-starter-kit">github.com/kriasoft/react-starter-kit</a> diff --git a/src/content/index.md b/src/content/index.md @@ -0,0 +1,19 @@ +--- +title: React.js Starter Kit +component: ContentPage +--- +### Runtime Components + +[React](https://facebook.github.io/react/) - A JavaScript library for building user interfaces, developed by Facebook + +[Flux](http://facebook.github.io/flux/) - Application architecture for building user interfaces + +### Development Tools + +[Webpack](http://webpack.github.io/) - Compiles front-end source code into modules / bundles + +[BrowserSync](http://www.browsersync.io/) - A lightweight HTTP server for development + +### Fork me on GitHub + +[github.com/kriasoft/react-starter-kit](https://github.com/kriasoft/react-starter-kit) diff --git a/src/content/privacy.jade b/src/content/privacy.jade @@ -1,52 +0,0 @@ ---- -title: Privacy Policy -component: ContentPage ---- -mixin breadcrumb - ol - li <a href="/">Home</a> - li <a href="/privacy">Privacy</a> - -p. - Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean consequat - tortor fermentum mi fermentum dignissim. Nullam vel ipsum ut ligula elementum - lobortis. Maecenas aliquam, massa laoreet lacinia pretium, nisi urna venenatis - tortor, nec imperdiet tellus libero efficitur metus. Fusce semper posuere - ligula, et facilisis metus bibendum interdum. Mauris at mauris sit amet sem - pharetra commodo a eu leo. Nam at est non risus cursus maximus. Nam feugiat - augue libero, id consectetur tortor bibendum non. Quisque nec fringilla lorem. - Nullam efficitur vulputate mauris, nec maximus leo dignissim id. -p. - In hac habitasse platea dictumst. Duis sagittis dui ac ex suscipit maximus. - Morbi pellentesque venenatis felis sed convallis. Nulla varius, nibh vitae - placerat tempus, mauris sem elementum ipsum, eget sollicitudin nisl est vel - purus. Fusce malesuada odio velit, non cursus leo fermentum id. Cras pharetra - sodales fringilla. Etiam quis est a dolor egestas pellentesque. Maecenas non - scelerisque purus, congue cursus arcu. Donec vel dapibus mi. Mauris maximus - posuere placerat. Sed et libero eu nibh tristique mollis a eget lectus. Donec - interdum augue sollicitudin vehicula hendrerit. Vivamus justo orci, molestie - ac sollicitudin ac, lobortis at tellus. Etiam rhoncus ullamcorper risus eu - tempor. Sed porttitor, neque ac efficitur gravida, arcu lacus pharetra dui, in - consequat elit tellus auctor nulla. Donec placerat elementum diam, vitae - imperdiet lectus luctus at. -p. - Nullam eu feugiat mi. Quisque nec tristique nisl, dignissim dictum leo. Nam - non quam nisi. Donec rutrum turpis ac diam blandit, id pulvinar mauris - suscipit. Pellentesque tincidunt libero ultricies risus iaculis, sit amet - consequat velit blandit. Fusce quis varius nulla. Nullam nisi nisi, suscipit - ut magna quis, feugiat porta nibh. Sed id enim lectus. Suspendisse elementum - justo sapien, sit amet consequat orci accumsan et. Aliquam ornare ullamcorper - sem sed finibus. Nullam ac lacus pulvinar, egestas felis ut, accumsan est. -p. - Pellentesque sagittis vehicula sem quis luctus. Proin sodales magna in lorem - hendrerit aliquam. Integer eu varius orci. Vestibulum ante ipsum primis in - faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum ante ipsum - primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut at mauris - nibh. Suspendisse maximus ac eros at vestibulum. -p. - Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque egestas - tortor et dui consequat faucibus. Nunc vitae odio ornare, venenatis ligula a, - vulputate nisl. Aenean congue varius ex, sit amet bibendum odio posuere at. - Nulla facilisi. In finibus, nulla vitae tincidunt ornare, sapien nulla - fermentum mauris, sed consectetur tortor arcu eget arcu. Vestibulum vel quam - enim. diff --git a/src/content/privacy.md b/src/content/privacy.md @@ -0,0 +1,46 @@ +--- +title: Privacy Policy +component: ContentPage +--- +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean consequat +tortor fermentum mi fermentum dignissim. Nullam vel ipsum ut ligula elementum +lobortis. Maecenas aliquam, massa laoreet lacinia pretium, nisi urna venenatis +tortor, nec imperdiet tellus libero efficitur metus. Fusce semper posuere +ligula, et facilisis metus bibendum interdum. Mauris at mauris sit amet sem +pharetra commodo a eu leo. Nam at est non risus cursus maximus. Nam feugiat +augue libero, id consectetur tortor bibendum non. Quisque nec fringilla lorem. +Nullam efficitur vulputate mauris, nec maximus leo dignissim id. + +In hac habitasse platea dictumst. Duis sagittis dui ac ex suscipit maximus. +Morbi pellentesque venenatis felis sed convallis. Nulla varius, nibh vitae +placerat tempus, mauris sem elementum ipsum, eget sollicitudin nisl est vel +purus. Fusce malesuada odio velit, non cursus leo fermentum id. Cras pharetra +sodales fringilla. Etiam quis est a dolor egestas pellentesque. Maecenas non +scelerisque purus, congue cursus arcu. Donec vel dapibus mi. Mauris maximus +posuere placerat. Sed et libero eu nibh tristique mollis a eget lectus. Donec +interdum augue sollicitudin vehicula hendrerit. Vivamus justo orci, molestie +ac sollicitudin ac, lobortis at tellus. Etiam rhoncus ullamcorper risus eu +tempor. Sed porttitor, neque ac efficitur gravida, arcu lacus pharetra dui, in +consequat elit tellus auctor nulla. Donec placerat elementum diam, vitae +imperdiet lectus luctus at. + +Nullam eu feugiat mi. Quisque nec tristique nisl, dignissim dictum leo. Nam +non quam nisi. Donec rutrum turpis ac diam blandit, id pulvinar mauris +suscipit. Pellentesque tincidunt libero ultricies risus iaculis, sit amet +consequat velit blandit. Fusce quis varius nulla. Nullam nisi nisi, suscipit +ut magna quis, feugiat porta nibh. Sed id enim lectus. Suspendisse elementum +justo sapien, sit amet consequat orci accumsan et. Aliquam ornare ullamcorper +sem sed finibus. Nullam ac lacus pulvinar, egestas felis ut, accumsan est. + +Pellentesque sagittis vehicula sem quis luctus. Proin sodales magna in lorem +hendrerit aliquam. Integer eu varius orci. Vestibulum ante ipsum primis in +faucibus orci luctus et ultrices posuere cubilia Curae; Vestibulum ante ipsum +primis in faucibus orci luctus et ultrices posuere cubilia Curae; Ut at mauris +nibh. Suspendisse maximus ac eros at vestibulum. + +Interdum et malesuada fames ac ante ipsum primis in faucibus. Quisque egestas +tortor et dui consequat faucibus. Nunc vitae odio ornare, venenatis ligula a, +vulputate nisl. Aenean congue varius ex, sit amet bibendum odio posuere at. +Nulla facilisi. In finibus, nulla vitae tincidunt ornare, sapien nulla +fermentum mauris, sed consectetur tortor arcu eget arcu. Vestibulum vel quam +enim. diff --git a/src/data/queries/content.js b/src/data/queries/content.js @@ -10,7 +10,6 @@ import fs from 'fs'; import { join } from 'path'; import Promise from 'bluebird'; -import jade from 'jade'; import fm from 'front-matter'; import MarkdownIt from 'markdown-it'; @@ -23,7 +22,7 @@ import ContentType from '../types/ContentType'; const md = new MarkdownIt(); -// A folder with Jade/Markdown/HTML content pages +// A folder with Markdown/HTML content pages const CONTENT_DIR = join(__dirname, './content'); // Extract 'front matter' metadata and generate HTML @@ -31,9 +30,6 @@ const parseContent = (path, fileContent, extension) => { const fmContent = fm(fileContent); let htmlContent; switch (extension) { - case '.jade': - htmlContent = jade.render(fmContent.body); - break; case '.md': htmlContent = md.render(fmContent.body); break; @@ -73,7 +69,7 @@ async function resolveExtension(path, extension) { } async function resolveFileName(path) { - const extensions = ['.jade', '.md', '.html']; + const extensions = ['.md', '.html']; for (const extension of extensions) { const maybeFileName = await resolveExtension(path, extension); diff --git a/src/routes/error/ErrorPage.js b/src/routes/error/ErrorPage.js @@ -11,7 +11,7 @@ import React, { PropTypes } from 'react'; import withStyles from 'isomorphic-style-loader/lib/withStyles'; import s from './ErrorPage.css'; -function ErrorPage({ error }, context) { +export function ErrorPage({ error }, context) { let title = 'Error'; let content = 'Sorry, a critical error occurred on this page.'; let errorMessage = null; @@ -23,7 +23,9 @@ function ErrorPage({ error }, context) { errorMessage = <pre>{error.stack}</pre>; } - context.setTitle(title); + if (context.setTitle) { + context.setTitle(title); + } return ( <div> diff --git a/src/server.js b/src/server.js @@ -15,7 +15,11 @@ import bodyParser from 'body-parser'; import expressJwt from 'express-jwt'; import expressGraphQL from 'express-graphql'; import jwt from 'jsonwebtoken'; +import React from 'react'; import ReactDOM from 'react-dom/server'; +import Html from './components/Html'; +import { ErrorPage } from './routes/error/ErrorPage'; +import errorPageStyle from './routes/error/ErrorPage.css'; import UniversalRouter from 'universal-router'; import PrettyError from 'pretty-error'; import passport from './core/passport'; @@ -23,7 +27,7 @@ import models from './data/models'; import schema from './data/schema'; import routes from './routes'; import assets from './assets'; // eslint-disable-line import/no-unresolved -import { port, auth, analytics } from './config'; +import { port, auth } from './config'; const app = express(); @@ -48,9 +52,7 @@ app.use(bodyParser.json()); app.use(expressJwt({ secret: auth.jwt.secret, credentialsRequired: false, - /* jscs:disable requireCamelCaseOrUpperCaseIdentifiers */ getToken: req => req.cookies.id_token, - /* jscs:enable requireCamelCaseOrUpperCaseIdentifiers */ })); app.use(passport.initialize()); @@ -84,12 +86,7 @@ app.get('*', async (req, res, next) => { try { let css = []; let statusCode = 200; - const template = require('./views/index.jade'); // eslint-disable-line global-require - const data = { title: '', description: '', css: '', body: '', entry: assets.main.js }; - - if (process.env.NODE_ENV === 'production') { - data.trackingId = analytics.google.trackingId; - } + const data = { title: '', description: '', style: '', script: assets.main.js, children: '' }; await UniversalRouter.resolve(routes, { path: req.path, @@ -104,14 +101,16 @@ app.get('*', async (req, res, next) => { render(component, status = 200) { css = []; statusCode = status; - data.body = ReactDOM.renderToString(component); - data.css = css.join(''); + data.children = ReactDOM.renderToString(component); + data.style = css.join(''); return true; }, }); + const html = ReactDOM.renderToStaticMarkup(<Html {...data} />); + res.status(statusCode); - res.send(template(data)); + res.send(`<!doctype html>${html}`); } catch (err) { next(err); } @@ -126,13 +125,18 @@ pe.skipPackage('express'); app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars console.log(pe.render(err)); // eslint-disable-line no-console - const template = require('./views/error.jade'); // eslint-disable-line global-require const statusCode = err.status || 500; + const html = ReactDOM.renderToStaticMarkup( + <Html + title="Internal Server Error" + description={err.message} + style={errorPageStyle._getCss()} // eslint-disable-line no-underscore-dangle + > + {ReactDOM.renderToString(<ErrorPage error={err} />)} + </Html> + ); res.status(statusCode); - res.send(template({ - message: err.message, - stack: process.env.NODE_ENV === 'production' ? '' : err.stack, - })); + res.send(`<!doctype html>${html}`); }); // diff --git a/src/views/error.jade b/src/views/error.jade @@ -1,61 +0,0 @@ -doctype html -html(lang="en") - head - meta(charset="utf-8") - title Internal Server Error - meta(name="viewport", content="width=device-width, initial-scale=1") - style. - * { - line-height: 1.2; - margin: 0; - } - - html { - color: #888; - display: table; - font-family: sans-serif; - height: 100%; - text-align: center; - width: 100%; - } - - body { - display: table-cell; - vertical-align: middle; - margin: 2em auto; - } - - h1 { - color: #555; - font-size: 2em; - font-weight: 400; - } - - p { - margin: 0 auto; - width: 280px; - } - - pre { - text-align: left; - margin-top: 2rem; - } - - @media only screen and (max-width: 280px) { - - body, p { - width: 95%; - } - - h1 { - font-size: 1.5em; - margin: 0 0 0.3em; - } - - } - - body - h1 Internal Server Error - p Sorry, something went wrong. - pre= stack -// IE needs 512+ bytes: http://blogs.msdn.com/b/ieinternals/archive/2010/08/19/http-error-pages-in-internet-explorer.aspx diff --git a/src/views/index.jade b/src/views/index.jade @@ -1,18 +0,0 @@ -doctype html -html(class="no-js", lang="") - head - meta(charset="utf-8") - meta(http-equiv="x-ua-compatible", content="ie=edge") - title= title - meta(name="description", description=description) - meta(name="viewport", content="width=device-width, initial-scale=1") - link(rel="apple-touch-icon", href="apple-touch-icon.png") - style#css!= css - body - #app!= body - script(src=entry) - script. - window.ga=function(){ga.q.push(arguments)};ga.q=[];ga.l=+new Date; - ga('create','#{trackingId}','auto');ga('send','pageview') - if trackingId - script(src="https://www.google-analytics.com/analytics.js", async=true, defer=true) diff --git a/tools/webpack.config.js b/tools/webpack.config.js @@ -120,10 +120,6 @@ const config = { name: DEBUG ? '[path][name].[ext]?[hash]' : '[hash].[ext]', }, }, - { - test: /\.jade$/, - loader: 'jade-loader', - }, ], },