diff --git a/package-lock.json b/package-lock.json index 812826b..b311620 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index b66a7a8..aaa62c3 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/index.html b/src/index.html deleted file mode 100644 index 95048d4..0000000 --- a/src/index.html +++ /dev/null @@ -1,133 +0,0 @@ - - - - - Userbase - - - - - -
-
-
- -
-

Userbase

-

You won't believe it's not a database!

-
- -
- -
-

What is Userbase?

- -

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.

-
- -
- -
-

Why isn't it a database?

- -

With Userbase you can durably store, update, delete, and query user data. But that's where the - similarities with traditional databases end.

-

Zero management

-

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. -

-

Built-in user management

-

Unlike a real database, Userbase takes care of your user accounts. It comes with built-in APIs for user - signups, logins, and access control.

-

End-to-end encrypted

-

Unlike a real database, Userbase won't show you what your users store in your web app.

-

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.

-
- -
- -
-

When would I use it?

- -

If you're building a web app, you will likely need a database. Userbase can substitute your - database...

- -
- -
- -
-

How do I start?

- -

Userbase will be available around mid-December 2019.

- -

Open source

-

Userbase is being developed in the open, and is 100% open-source, MIT licensed. You can modify and extend the - backend to your liking, and run it yourself in your AWS account, always under your control.

- -

As a service

-

Or for just $39/month you can go fully serverless, backendless, databaseless, and AWSless!

- - -

Join the waiting list

-

Enter your email to receive occasional updates about Userbase. No spam ever.

- -
- - - - - -
- -
-
- -
- -
- -
-

Who's behind this?

- -

This product is the work of Daniel Vassallo and Justin Berman. We're a small independent business, structured - to be lean, profitable, and sustainable. We're here for the long haul. -

- -

If you have any questions, or there's anything we can do to help you with your web app, please get in touch. Thank you!

-
- -
- - ${require('./footer.html')} - -
- - - - \ No newline at end of file diff --git a/src/pages/index.html b/src/pages/index.html new file mode 100644 index 0000000..0d99f54 --- /dev/null +++ b/src/pages/index.html @@ -0,0 +1,104 @@ +
+

What is Userbase?

+ +

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.

+
+ +
+ +
+

Why isn't it a database?

+ +

With Userbase you can durably store, update, delete, and query user data. But that's where the + similarities with traditional databases end.

+

Zero management

+

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. +

+

Built-in user management

+

Unlike a real database, Userbase takes care of your user accounts. It comes with built-in APIs for user + signups, logins, and access control.

+

End-to-end encrypted

+

Unlike a real database, Userbase won't show you what your users store in your web app.

+

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.

+
+ +
+ +
+

When would I use it?

+ +

If you're building a web app, you will likely need a database. Userbase can substitute your + database...

+ +
+ +
+ +
+

How do I start?

+ +

Userbase will be available around mid-December 2019.

+ +

Open source

+

Userbase is being developed in the open, and is 100% open-source, MIT licensed. You can modify and extend the + backend to your liking, and run it yourself in your AWS account, always under your control.

+ +

As a service

+

Or for just $39/month you can go fully serverless, backendless, databaseless, and AWSless!

+ + +

Join the waiting list

+

Enter your email to receive occasional updates about Userbase. No spam ever.

+ +
+ + + + + +
+ +
+
+ +
+ +
+ +
+

Who's behind this?

+ +

This product is the work of Daniel Vassallo and Justin Berman. We're a small independent business, structured to be lean, + profitable, and sustainable. We're here for the long haul. +

+ +

If you have any questions, or there's anything we can do to help you with your web app, please get in touch. Thank you!

+
+ +
\ No newline at end of file diff --git a/src/footer.html b/src/partials/footer.html similarity index 100% rename from src/footer.html rename to src/partials/footer.html diff --git a/src/partials/header.html b/src/partials/header.html new file mode 100644 index 0000000..d5e3732 --- /dev/null +++ b/src/partials/header.html @@ -0,0 +1,9 @@ +
+
+ +
+

Userbase

+

You won't believe it's not a database!

+
+ +
\ No newline at end of file diff --git a/src/style.css b/src/style.css index cbde7b3..94d75b9 100644 --- a/src/style.css +++ b/src/style.css @@ -3,7 +3,7 @@ @tailwind components; body { - @apply pb-10; + @apply pb-10 text-center; } a { diff --git a/src/template.html b/src/template.html new file mode 100644 index 0000000..c8ed1f5 --- /dev/null +++ b/src/template.html @@ -0,0 +1,18 @@ + + + + + Userbase + + + + + +
+ <%= require('html-loader!./partials/' + header + '.html') %> + <%= require('html-loader!./pages/' + page + '.html') %> + <%= require('html-loader!./partials/' + footer + '.html') %> +
+ + + \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js index 25549a4..01348de 100755 --- a/webpack.config.js +++ b/webpack.config.js @@ -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']) ]