diff --git a/README.md b/README.md index d6a77b8d..300a6030 100644 --- a/README.md +++ b/README.md @@ -1 +1,60 @@ -umami - deliciously simple web stats \ No newline at end of file +# umami + +## Getting started + +### Install umami + +``` +git clone https://github.com/mikecao/umami.git +``` + +### Go into your repo folder + +``` +cd umami +``` + +### Create database tables + +Umami supports MySQL and Postgresql. Create a database for your Umami +installation and install the tables with the included scripts. + +For MySQL: + +``` +mysql -u username -p databasename < sql/schema.mysql.sql +``` + +For Postgresql: + +``` +psql -h hostname -U username -d databasename -f sql/schema.postgresql.sql +``` + +### Configure umami + +Create an `.env` file with the following + +``` +DATABASE_URL=(connection url) +HASH_SALT=(any random string) +``` + +The connection url is in the following format: +``` +postgresql://username:mypassword@localhost:5432/mydb + +mysql://username:mypassword@localhost:3306/mydb +``` + +### Start the development server + +``` +npm run develop +``` + +### Create a production build + +``` +npm run build +``` \ No newline at end of file diff --git a/cli/index.js b/cli/index.js deleted file mode 100644 index 0005f853..00000000 --- a/cli/index.js +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node - -import 'dotenv/config'; -import yargs from 'yargs'; -import chalk from 'chalk'; -import createAccount from './create-account'; - -const cmd = yargs.usage('Usage: umami [arguments]').help('h').alias('h', 'help'); - -const { argv } = cmd; -const { - _: [action, ...params], -} = argv; - -const exec = async () => { - if (action === 'create') { - await createAccount(); - } else { - cmd.showHelp(); - } - - console.log(chalk.green('Finished.')); -}; - -exec().then(() => { - process.exit(0); -}); diff --git a/cli/init.js b/cli/init.js deleted file mode 100644 index f78eb6ae..00000000 --- a/cli/init.js +++ /dev/null @@ -1,7 +0,0 @@ -import term from 'terminal-kit'; - -const { terminal } = term; - -export default function init() { - terminal('hello!'); -} diff --git a/lib/db.js b/lib/db.js index 48371da4..d32b9f27 100644 --- a/lib/db.js +++ b/lib/db.js @@ -20,11 +20,11 @@ let prisma; if (process.env.NODE_ENV === 'production') { prisma = new PrismaClient(options); - prisma.on('query', logQuery); + prisma.$on('query', logQuery); } else { if (!global.prisma) { global.prisma = new PrismaClient(options); - global.prisma.on('query', logQuery); + global.prisma.$on('query', logQuery); } prisma = global.prisma; diff --git a/package.json b/package.json index 4dd04c93..31ca1b77 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "umami", "version": "0.2.0", - "description": "Deliciously simple website stats", + "description": "Delicious web stats", "author": "Mike Cao ", "license": "MIT", "homepage": "https://github.com/mikecao/umami", @@ -9,19 +9,16 @@ "type": "git", "url": "https://github.com/mikecao/umami.git" }, - "main": "index.js", - "bin": { - "umami": "cli.js" - }, "scripts": { - "dev": "cross-env LOG_QUERY=1 next dev -p 8000", + "dev": "next dev -p 8000", "build": "next build", "start": "next start", "build-cli": "rollup -c rollup.cli.config.js", "build-tracker": "rollup -c rollup.tracker.config.js", - "build-db-schema": "dotenv prisma introspect", - "build-db-client": "dotenv prisma generate", - "create-account": "node cli/create-account.js" + "build-mysql-schema": "dotenv prisma introspect -- --schema=./prisma/schema.mysql.prisma", + "build-mysql-client": "dotenv prisma generate -- --schema=./prisma/schema.mysql.prisma", + "build-postgresql-schema": "dotenv prisma introspect -- --schema=./prisma/schema.postgresql.prisma", + "build-postgresql-client": "dotenv prisma generate -- --schema=./prisma/schema.postgresql.prisma" }, "lint-staged": { "**/*.js": [ @@ -41,7 +38,6 @@ "@prisma/client": "2.4.1", "@reduxjs/toolkit": "^1.4.0", "bcrypt": "^5.0.0", - "chalk": "^4.1.0", "chart.js": "^2.9.3", "classnames": "^2.2.6", "cookie": "^0.4.1", @@ -54,11 +50,10 @@ "formik": "^2.1.5", "geolite2-redist": "^1.0.7", "is-localhost-ip": "^1.4.0", - "jose": "^1.27.3", + "jose": "^1.28.0", "maxmind": "^4.1.4", "moment-timezone": "^0.5.31", - "next": "9.5.1", - "node-fetch": "^2.6.0", + "next": "9.5.2", "promise-polyfill": "^8.1.3", "react": "16.13.1", "react-dom": "16.13.1", @@ -72,13 +67,11 @@ "request-ip": "^2.1.3", "tinycolor2": "^1.4.1", "unfetch": "^4.1.0", - "uuid": "^8.3.0", - "yargs": "^15.4.1" + "uuid": "^8.3.0" }, "devDependencies": { "@prisma/cli": "2.4.1", "@rollup/plugin-buble": "^0.21.3", - "@rollup/plugin-commonjs": "^14.0.0", "@rollup/plugin-node-resolve": "^8.4.0", "@rollup/plugin-replace": "^2.3.3", "@svgr/webpack": "^5.4.0", @@ -90,7 +83,6 @@ "eslint-plugin-react": "^7.20.5", "eslint-plugin-react-hooks": "^4.0.4", "husky": "^4.2.5", - "less": "^3.12.2", "lint-staged": "^10.2.9", "postcss-flexbugs-fixes": "^4.2.1", "postcss-import": "^12.0.1", @@ -99,7 +91,7 @@ "prettier-eslint": "^11.0.0", "rollup": "^2.23.1", "rollup-plugin-hashbang": "^2.2.2", - "rollup-plugin-terser": "^6.1.0", + "rollup-plugin-terser": "^7.0.0", "stylelint": "^13.6.0", "stylelint-config-css-modules": "^2.2.0", "stylelint-config-prettier": "^8.0.1", diff --git a/public/umami.js b/public/umami.js index 0db8c3ea..7b2fb336 100644 --- a/public/umami.js +++ b/public/umami.js @@ -1 +1 @@ -!function(){"use strict";function e(e){var t=this.constructor;return this.then((function(n){return t.resolve(e()).then((function(){return n}))}),(function(n){return t.resolve(e()).then((function(){return t.reject(n)}))}))}var t=setTimeout;function n(e){return Boolean(e&&void 0!==e.length)}function r(){}function o(e){if(!(this instanceof o))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],f(e,this)}function i(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,o._immediateFn((function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var r;try{r=n(e._value)}catch(e){return void s(t.promise,e)}u(t.promise,r)}else(1===e._state?u:s)(t.promise,e._value)}))):e._deferreds.push(t)}function u(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if(t instanceof o)return e._state=3,e._value=t,void a(e);if("function"==typeof n)return void f((r=n,i=t,function(){r.apply(i,arguments)}),e)}e._state=1,e._value=t,a(e)}catch(t){s(e,t)}var r,i}function s(e,t){e._state=2,e._value=t,a(e)}function a(e){2===e._state&&0===e._deferreds.length&&o._immediateFn((function(){e._handled||o._unhandledRejectionFn(e._value)}));for(var t=0,n=e._deferreds.length;t