Split the html into templates and partials

This commit is contained in:
Daniel Vassallo
2019-10-01 00:18:19 -07:00
parent fe9cf0e41c
commit 1175e6578e
9 changed files with 292 additions and 172 deletions

151
package-lock.json generated
View File

@@ -737,14 +737,6 @@
"requires": {
"core-js": "^2.6.5",
"regenerator-runtime": "^0.13.2"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
"dev": true
}
}
},
"@babel/preset-env": {
@@ -812,14 +804,6 @@
"dev": true,
"requires": {
"regenerator-runtime": "^0.13.2"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
"dev": true
}
}
},
"@babel/template": {
@@ -1407,6 +1391,12 @@
"integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
"dev": true
},
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true
},
"accepts": {
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
@@ -1744,6 +1734,14 @@
"babel-runtime": "^6.26.0",
"core-js": "^2.5.0",
"regenerator-runtime": "^0.10.5"
},
"dependencies": {
"regenerator-runtime": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
"dev": true
}
}
},
"babel-runtime": {
@@ -2590,6 +2588,16 @@
"typedarray": "^0.0.6"
}
},
"config-chain": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
"integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
"dev": true,
"requires": {
"ini": "^1.3.4",
"proto-list": "~1.2.1"
}
},
"connect-history-api-fallback": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz",
@@ -3314,6 +3322,36 @@
"safer-buffer": "^2.1.0"
}
},
"editorconfig": {
"version": "0.15.3",
"resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
"integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
"dev": true,
"requires": {
"commander": "^2.19.0",
"lru-cache": "^4.1.5",
"semver": "^5.6.0",
"sigmund": "^1.0.1"
},
"dependencies": {
"lru-cache": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
"integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
"dev": true,
"requires": {
"pseudomap": "^1.0.2",
"yallist": "^2.1.2"
}
},
"yallist": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
"integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
"dev": true
}
}
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -4977,6 +5015,18 @@
"integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
"dev": true
},
"html-beautify-webpack-plugin": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/html-beautify-webpack-plugin/-/html-beautify-webpack-plugin-1.0.5.tgz",
"integrity": "sha512-5mt+1QVY861mWQfodXMw1vaP6kKJ55EXCe7sshCoykpnhXiZ/OerxvR64WDO9xi15j6o9o6kor4pYAjzIGLEVQ==",
"dev": true,
"requires": {
"assert": "^1.4.1",
"chalk": "^2.3.0",
"js-beautify": "^1.7.5",
"lodash": "^4.17.4"
}
},
"html-comment-regex": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
@@ -5666,6 +5716,19 @@
"integrity": "sha512-MUj2XlMB8kpe+8DJUGH/3UJm4XpI8XEgZQ+CiHDeyrGoKPdW/8FJv6ku+3UiYm5Fz3CWaL+iXmD8Q4Ap6aC1Jw==",
"dev": true
},
"js-beautify": {
"version": "1.10.2",
"resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.10.2.tgz",
"integrity": "sha512-ZtBYyNUYJIsBWERnQP0rPN9KjkrDfJcMjuVGcvXOUJrD1zmOGwhRwQ4msG+HJ+Ni/FA7+sRQEMYVzdTQDvnzvQ==",
"dev": true,
"requires": {
"config-chain": "^1.1.12",
"editorconfig": "^0.15.3",
"glob": "^7.1.3",
"mkdirp": "~0.5.1",
"nopt": "~4.0.1"
}
},
"js-levenshtein": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
@@ -6409,6 +6472,16 @@
"integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=",
"dev": true
},
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"requires": {
"abbrev": "1",
"osenv": "^0.1.4"
}
},
"normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -6682,6 +6755,12 @@
"integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
"dev": true
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true
},
"os-locale": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
@@ -6693,6 +6772,22 @@
"mem": "^4.0.0"
}
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"requires": {
"os-homedir": "^1.0.0",
"os-tmpdir": "^1.0.0"
}
},
"output-file-sync": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-2.0.1.tgz",
@@ -7785,6 +7880,12 @@
"integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
"dev": true
},
"proto-list": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
"integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
"dev": true
},
"proxy-addr": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
@@ -7801,6 +7902,12 @@
"integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=",
"dev": true
},
"pseudomap": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
"integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
"dev": true
},
"psl": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz",
@@ -8057,9 +8164,9 @@
}
},
"regenerator-runtime": {
"version": "0.10.5",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
"integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=",
"version": "0.13.3",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz",
"integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==",
"dev": true
},
"regenerator-transform": {
@@ -8632,6 +8739,12 @@
"integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
"dev": true
},
"sigmund": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
"integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
"dev": true
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",

View File

@@ -11,17 +11,18 @@
"author": "Daniel Vassallo",
"license": "MIT",
"devDependencies": {
"@babel/runtime": "^7.4.5",
"@babel/cli": "^7.4.4",
"@babel/core": "^7.4.5",
"@babel/plugin-transform-runtime": "^7.4.4",
"@babel/preset-env": "^7.4.5",
"@babel/runtime": "^7.4.5",
"autoprefixer": "^9.6.0",
"babel-loader": "^8.0.6",
"babel-polyfill": "^6.26.0",
"css-loader": "^2.1.1",
"favicons-webpack-plugin": "^1.0.2",
"file-loader": "^3.0.1",
"html-beautify-webpack-plugin": "^1.0.5",
"html-loader": "^0.5.5",
"html-webpack-plugin": "^3.2.0",
"lodash": ">=4.17.13",

View File

@@ -1,133 +0,0 @@
<!doctype html>
<html lang="en">
<head>
<title>Userbase</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div class="container mx-auto max-w-2xl px-4 text-blackish" style="font-size: 16px">
<div class="section">
<div class="flex justify-center">
<img class="w-32 h-32" src="./img/icon.png">
</div>
<h1 class="font-logo">Userbase</h1>
<h2>You won't believe it's not a database!</h2>
</div>
<hr>
<div class="section">
<h3 id="what-is-userbase">What is Userbase?</h3>
<p>Userbase is like a database, but purpose-built for web app user data. It's accessible directly
from the browser through a very simple JavaScript SDK.</p>
</div>
<hr>
<div class="section">
<h3 id="why-not-a-database">Why isn't it a database?</h3>
<p>With Userbase you can durably store, update, delete, and query user data. But that's where the
similarities with traditional databases end.</p>
<h4 id="zero-management">Zero management</h4>
<p>Unlike a real database, all Userbase queries run in the browser, with the server-side acting as
a dumb data store. There's no database to manage and worry about.
</p>
<h4 id="user-management">Built-in user management</h4>
<p>Unlike a real database, Userbase takes care of your user accounts. It comes with built-in APIs for user
signups, logins, and access control.</p>
<h4 id="e2ee">End-to-end encrypted</h4>
<p>Unlike a real database, Userbase won't show you what your users store in your web app.</p>
<p>Wait, what!? — Yes, that's a feature — maybe the most important feature. Userbase spares you from the liability
of handling user data by encrypting everything in the browser, using keys that always stay with the user.</p>
</div>
<hr>
<div class="section">
<h3 id="what-would-i-use-it">When would I use it?</h3>
<p>If you're building a web app, you will likely need a database. Userbase can substitute your
database... </p>
<ul>
<li>If you want to build a web app without writing any backend code.</li>
<li>If you never want to see your users' data.</li>
<li>If you're tired of dealing with databases.</li>
<li>If you want to radically simplify your GDPR compliance.</li>
<li>And if you want to keep things really simple.</li>
</ul>
</div>
<hr>
<div class="section">
<h3 id="how-do-i-start">How do I start?</h3>
<p>Userbase will be available around mid-December 2019.</p>
<h4 id="oss">Open source</h4>
<p>Userbase is being developed in the open, and is <a href="https://github.com/encrypted-dev/userbase"
target="_blank" rel="noopener noreferrer">100% open-source</a>, MIT licensed. You can modify and extend the
backend to your liking, and run it yourself in your AWS account, always under your control.</p>
<h4 id="saas">As a service</h4>
<p>Or for just $39/month you can go fully serverless, backendless, databaseless, and AWSless!</p>
<ul>
<li>Unlimited web apps.</li>
<li>Unlimited users.</li>
<li>1 GB storage included.</li>
<li>Unlimited extra storage at $1/month per GB.</li>
<li>All features included.</li>
</ul>
<h4 id="mailing-list">Join the waiting list</h4>
<p>Enter your email to receive occasional updates about Userbase. No spam ever.</p>
<form method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" target="_blank"
class="validate text-center"
action="https://danielvassallo.us20.list-manage.com/subscribe/post?u=e3b0fd293a0e6d7ea0080fafe&amp;id=d0aae9dd3e">
<input type="email" value="" name="EMAIL" id="mce-EMAIL" required autocorrect="off" spellcheck="false"
placeholder="Email address"
class="font-light text-sm h-10 p-2 border border-gray-500 outline-none w-64 rounded my-4 inline-block">
<input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"
class="rounded-lg w-40 h-10 bg-yellowish font-bold cursor-pointer text-gray-900 inline-block relative"
style="top: 1px;">
<div class="mc-status" class="hidden"></div>
<div style="position: absolute; left: -5000px;" aria-hidden="true">
<input type="text" name="b_e3b0fd293a0e6d7ea0080fafe_d0aae9dd3e" tabindex="-1" value=""></div>
<div class="clear"></div>
</form>
</div>
<hr>
<div class="section">
<h3 id="about">Who's behind this?</h3>
<p>This product is the work of <a href="https://twitter.com/dvassallo" target="_blank"
rel="noopener noreferrer">Daniel Vassallo</a> and <a href="https://twitter.com/justinberman95" target="_blank"
rel="noopener noreferrer">Justin Berman</a>. We're a small independent business, structured
to be lean, profitable, and sustainable. We're here for the long haul.
</p>
<p>If you have any questions, or there's anything we can do to help you with your web app, please <a
href="mailto:daniel@encrypted.dev">get in touch</a>. Thank you!</p>
</div>
<hr>
${require('./footer.html')}
</div>
</body>
</html>

104
src/pages/index.html Normal file
View File

@@ -0,0 +1,104 @@
<div class="section">
<h3 id="what-is-userbase">What is Userbase?</h3>
<p>Userbase is like a database, but purpose-built for web app user data. It's accessible directly
from the browser through a very simple JavaScript SDK.</p>
</div>
<hr>
<div class="section">
<h3 id="why-not-a-database">Why isn't it a database?</h3>
<p>With Userbase you can durably store, update, delete, and query user data. But that's where the
similarities with traditional databases end.</p>
<h4 id="zero-management">Zero management</h4>
<p>Unlike a real database, all Userbase queries run in the browser, with the server-side acting as
a dumb data store. There's no database to manage and worry about.
</p>
<h4 id="user-management">Built-in user management</h4>
<p>Unlike a real database, Userbase takes care of your user accounts. It comes with built-in APIs for user
signups, logins, and access control.</p>
<h4 id="e2ee">End-to-end encrypted</h4>
<p>Unlike a real database, Userbase won't show you what your users store in your web app.</p>
<p>Wait, what!? — Yes, that's a feature — maybe the most important feature. Userbase spares you from the liability
of handling user data by encrypting everything in the browser, using keys that always stay with the user.</p>
</div>
<hr>
<div class="section">
<h3 id="what-would-i-use-it">When would I use it?</h3>
<p>If you're building a web app, you will likely need a database. Userbase can substitute your
database... </p>
<ul>
<li>If you want to build a web app without writing any backend code.</li>
<li>If you never want to see your users' data.</li>
<li>If you're tired of dealing with databases.</li>
<li>If you want to radically simplify your GDPR compliance.</li>
<li>And if you want to keep things really simple.</li>
</ul>
</div>
<hr>
<div class="section">
<h3 id="how-do-i-start">How do I start?</h3>
<p>Userbase will be available around mid-December 2019.</p>
<h4 id="oss">Open source</h4>
<p>Userbase is being developed in the open, and is <a href="https://github.com/encrypted-dev/userbase" target="_blank"
rel="noopener noreferrer">100% open-source</a>, MIT licensed. You can modify and extend the
backend to your liking, and run it yourself in your AWS account, always under your control.</p>
<h4 id="saas">As a service</h4>
<p>Or for just $39/month you can go fully serverless, backendless, databaseless, and AWSless!</p>
<ul>
<li>Unlimited web apps.</li>
<li>Unlimited users.</li>
<li>1 GB storage included.</li>
<li>Unlimited extra storage at $1/month per GB.</li>
<li>All features included.</li>
</ul>
<h4 id="mailing-list">Join the waiting list</h4>
<p>Enter your email to receive occasional updates about Userbase. No spam ever.</p>
<form method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" target="_blank"
class="validate text-center"
action="https://danielvassallo.us20.list-manage.com/subscribe/post?u=e3b0fd293a0e6d7ea0080fafe&amp;id=d0aae9dd3e">
<input type="email" value="" name="EMAIL" id="mce-EMAIL" required autocorrect="off" spellcheck="false"
placeholder="Email address"
class="font-light text-sm h-10 p-2 border border-gray-500 outline-none w-64 rounded my-4 inline-block">
<input type="submit" value="Subscribe" name="subscribe" id="mc-embedded-subscribe"
class="rounded-lg w-40 h-10 bg-yellowish font-bold cursor-pointer text-gray-900 inline-block relative"
style="top: 1px;">
<div class="mc-status" class="hidden"></div>
<div style="position: absolute; left: -5000px;" aria-hidden="true">
<input type="text" name="b_e3b0fd293a0e6d7ea0080fafe_d0aae9dd3e" tabindex="-1" value=""></div>
<div class="clear"></div>
</form>
</div>
<hr>
<div class="section">
<h3 id="about">Who's behind this?</h3>
<p>This product is the work of <a href="https://twitter.com/dvassallo" target="_blank"
rel="noopener noreferrer">Daniel Vassallo</a> and <a href="https://twitter.com/justinberman95" target="_blank"
rel="noopener noreferrer">Justin Berman</a>. We're a small independent business, structured to be lean,
profitable, and sustainable. We're here for the long haul.
</p>
<p>If you have any questions, or there's anything we can do to help you with your web app, please <a
href="mailto:daniel@encrypted.dev">get in touch</a>. Thank you!</p>
</div>
<hr>

9
src/partials/header.html Normal file
View File

@@ -0,0 +1,9 @@
<div class="section">
<div class="flex justify-center">
<img class="w-32 h-32" src="../img/icon.png">
</div>
<h1 class="font-logo">Userbase</h1>
<h2>You won't believe it's not a database!</h2>
</div>
<hr>

View File

@@ -3,7 +3,7 @@
@tailwind components;
body {
@apply pb-10;
@apply pb-10 text-center;
}
a {

18
src/template.html Normal file
View File

@@ -0,0 +1,18 @@
<!doctype html>
<html lang="en">
<head>
<title>Userbase</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
</head>
<body>
<div class="container mx-auto max-w-2xl px-4 text-blackish" style="font-size: 16px">
<%= require('html-loader!./partials/' + header + '.html') %>
<%= require('html-loader!./pages/' + page + '.html') %>
<%= require('html-loader!./partials/' + footer + '.html') %>
</div>
</body>
</html>

View File

@@ -1,3 +1,4 @@
const fs = require('fs')
const path = require('path')
const glob = require('glob')
const webpack = require('webpack')
@@ -6,12 +7,23 @@ const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const PurgecssPlugin = require('purgecss-webpack-plugin')
const HtmlWebPackPlugin = require('html-webpack-plugin')
const HtmlBeautifyPlugin = require('html-beautify-webpack-plugin')
const FaviconsWebpackPlugin = require('favicons-webpack-plugin')
const OpenBrowserPlugin = require('opn-browser-webpack-plugin')
module.exports = (env, argv) => {
const PATHS = {
const pages = []
fs.readdirSync('./src/pages/').forEach(file => {
pages.push(new HtmlWebPackPlugin({
template: './src/template.html',
filename: './' + file,
templateParameters() { return { header: 'header', footer: 'footer', page: file.split('.')[0] } }
}))
})
const paths = {
src: path.join(__dirname, 'src')
}
@@ -51,18 +63,6 @@ module.exports = (env, argv) => {
exclude: /node_modules/,
loader: 'babel-loader'
},
{
test: /\.html$/,
use: [
{
loader: 'html-loader',
options: {
interpolate: true,
minimize: false
}
}
]
},
{
test: /\.(woff|woff2|eot|ttf|otf|png|svg|jpg|gif)$/,
use: ['file-loader']
@@ -76,13 +76,21 @@ module.exports = (env, argv) => {
ignoreOrder: false
}),
new PurgecssPlugin({
paths: glob.sync(`${PATHS.src}/**/*`, { nodir: true }),
}),
new HtmlWebPackPlugin({
template: './src/index.html',
filename: './index.html'
paths: glob.sync(`${paths.src}/**/*`, { nodir: true }),
}),
...pages,
new FaviconsWebpackPlugin('./src/img/icon.png'),
new HtmlBeautifyPlugin({
config: {
html: {
end_with_newline: true,
indent_size: 2,
indent_with_tabs: false,
indent_inner_html: false,
preserve_newlines: true
}
}
}),
new webpack.NoEmitOnErrorsPlugin(),
new webpack.WatchIgnorePlugin(['./dist'])
]