drop more dependencies + remove updater
parent
e667928863
commit
8965d60516
|
@ -1,47 +0,0 @@
|
||||||
import React from 'react';
|
|
||||||
import { FormattedMessage } from 'react-intl';
|
|
||||||
import useVersion from 'hooks/useVersion';
|
|
||||||
import styles from './UpdateNotice.module.css';
|
|
||||||
import ButtonLayout from '../layout/ButtonLayout';
|
|
||||||
import Button from './Button';
|
|
||||||
import useForceUpdate from '../../hooks/useForceUpdate';
|
|
||||||
|
|
||||||
export default function UpdateNotice() {
|
|
||||||
const forceUpdate = useForceUpdate();
|
|
||||||
const { hasUpdate, checked, latest, updateCheck } = useVersion(true);
|
|
||||||
|
|
||||||
function handleViewClick() {
|
|
||||||
location.href = 'https://github.com/mikecao/umami/releases';
|
|
||||||
updateCheck();
|
|
||||||
forceUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleDismissClick() {
|
|
||||||
updateCheck();
|
|
||||||
forceUpdate();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hasUpdate || checked) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className={styles.notice}>
|
|
||||||
<div className={styles.message}>
|
|
||||||
<FormattedMessage
|
|
||||||
id="message.new-version-available"
|
|
||||||
defaultMessage="A new version of umami {version} is available!"
|
|
||||||
values={{ version: `v${latest}` }}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
<ButtonLayout>
|
|
||||||
<Button size="xsmall" variant="action" onClick={handleViewClick}>
|
|
||||||
<FormattedMessage id="label.view-details" defaultMessage="View details" />
|
|
||||||
</Button>
|
|
||||||
<Button size="xsmall" onClick={handleDismissClick}>
|
|
||||||
<FormattedMessage id="label.dismiss" defaultMessage="Dismiss" />
|
|
||||||
</Button>
|
|
||||||
</ButtonLayout>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
|
@ -6,7 +6,6 @@ import Link from 'components/common/Link';
|
||||||
import Icon from 'components/common/Icon';
|
import Icon from 'components/common/Icon';
|
||||||
import LanguageButton from 'components/settings/LanguageButton';
|
import LanguageButton from 'components/settings/LanguageButton';
|
||||||
import ThemeButton from 'components/settings/ThemeButton';
|
import ThemeButton from 'components/settings/ThemeButton';
|
||||||
import UpdateNotice from 'components/common/UpdateNotice';
|
|
||||||
import UserButton from 'components/settings/UserButton';
|
import UserButton from 'components/settings/UserButton';
|
||||||
import Logo from 'assets/logo.svg';
|
import Logo from 'assets/logo.svg';
|
||||||
import styles from './Header.module.css';
|
import styles from './Header.module.css';
|
||||||
|
@ -21,7 +20,6 @@ export default function Header() {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<nav className="container">
|
<nav className="container">
|
||||||
{user?.is_admin && <UpdateNotice />}
|
|
||||||
<div className={classNames(styles.header, 'row align-items-center')}>
|
<div className={classNames(styles.header, 'row align-items-center')}>
|
||||||
<div className={styles.nav}>
|
<div className={styles.nav}>
|
||||||
<div className="">
|
<div className="">
|
||||||
|
|
19
package.json
19
package.json
|
@ -11,16 +11,16 @@
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev",
|
"dev": "next dev",
|
||||||
"build": "npm-run-all build-tracker build-geo build-db build-app",
|
"clean": "rimraf .next",
|
||||||
|
"build": "npm-run-all clean build-tracker build-geo build-db build-app",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"start-env": "node -r dotenv/config scripts/start-env.js",
|
"start-env": "node -r dotenv/config scripts/start-env.js",
|
||||||
"build-app": "next build",
|
"build-app": "next build",
|
||||||
"build-tracker": "rollup -c rollup.tracker.config.js",
|
"build-tracker": "microbundle tracker/index.js -o public/umami.js --no-sourcemap -f cjs",
|
||||||
"build-db": "npm-run-all build-db-client",
|
"build-db": "npm-run-all build-db-client",
|
||||||
"build-geo": "node scripts/build-geo.js",
|
"build-geo": "node scripts/build-geo.js",
|
||||||
"build-db-schema": "dotenv prisma introspect",
|
"build-db-schema": "dotenv prisma introspect",
|
||||||
"build-db-client": "dotenv prisma generate",
|
"build-db-client": "dotenv prisma generate"
|
||||||
"download-country-names": "node scripts/download-country-names.js"
|
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@prisma/client": "2.21.2",
|
"@prisma/client": "2.21.2",
|
||||||
|
@ -58,7 +58,6 @@
|
||||||
"redux": "4.1.0",
|
"redux": "4.1.0",
|
||||||
"redux-thunk": "2.3.0",
|
"redux-thunk": "2.3.0",
|
||||||
"request-ip": "2.1.3",
|
"request-ip": "2.1.3",
|
||||||
"semver": "7.3.5",
|
|
||||||
"thenby": "1.3.4",
|
"thenby": "1.3.4",
|
||||||
"timezone-support": "2.0.2",
|
"timezone-support": "2.0.2",
|
||||||
"tinycolor2": "1.4.2",
|
"tinycolor2": "1.4.2",
|
||||||
|
@ -66,24 +65,18 @@
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@formatjs/cli": "2.13.16",
|
"@formatjs/cli": "2.13.16",
|
||||||
"@rollup/plugin-buble": "0.21.3",
|
|
||||||
"@rollup/plugin-node-resolve": "11.2.1",
|
|
||||||
"@rollup/plugin-replace": "2.3.4",
|
|
||||||
"@svgr/webpack": "5.5.0",
|
"@svgr/webpack": "5.5.0",
|
||||||
"cross-env": "7.0.3",
|
"cross-env": "7.0.3",
|
||||||
"del": "6.0.0",
|
|
||||||
"dotenv-cli": "4.0.0",
|
"dotenv-cli": "4.0.0",
|
||||||
"extract-react-intl-messages": "4.1.1",
|
"extract-react-intl-messages": "4.1.1",
|
||||||
|
"microbundle": "0.13.0",
|
||||||
"npm-run-all": "4.1.5",
|
"npm-run-all": "4.1.5",
|
||||||
"pkg": "^5.2.0",
|
|
||||||
"postcss-flexbugs-fixes": "5.0.2",
|
"postcss-flexbugs-fixes": "5.0.2",
|
||||||
"postcss-import": "13.0.0",
|
"postcss-import": "13.0.0",
|
||||||
"postcss-preset-env": "6.7.0",
|
"postcss-preset-env": "6.7.0",
|
||||||
"prettier": "2.2.1",
|
"prettier": "2.2.1",
|
||||||
"prisma": "2.21.2",
|
"prisma": "2.21.2",
|
||||||
"rollup": "2.45.2",
|
"rimraf": "3.0.2",
|
||||||
"rollup-plugin-hashbang": "2.2.2",
|
|
||||||
"rollup-plugin-terser": "7.0.2",
|
|
||||||
"tar": "6.0.5"
|
"tar": "6.0.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,6 @@ import {
|
||||||
THEME_CONFIG,
|
THEME_CONFIG,
|
||||||
VERSION_CHECK,
|
VERSION_CHECK,
|
||||||
} from 'lib/constants';
|
} from 'lib/constants';
|
||||||
import semver from 'semver';
|
|
||||||
|
|
||||||
const app = createSlice({
|
const app = createSlice({
|
||||||
name: 'app',
|
name: 'app',
|
||||||
|
@ -17,7 +16,6 @@ const app = createSlice({
|
||||||
versions: {
|
versions: {
|
||||||
current: process.env.VERSION,
|
current: process.env.VERSION,
|
||||||
latest: null,
|
latest: null,
|
||||||
hasUpdate: false,
|
|
||||||
},
|
},
|
||||||
shareToken: null,
|
shareToken: null,
|
||||||
},
|
},
|
||||||
|
@ -74,13 +72,11 @@ export function checkVersion() {
|
||||||
|
|
||||||
const latest = tag_name.startsWith('v') ? tag_name.slice(1) : tag_name;
|
const latest = tag_name.startsWith('v') ? tag_name.slice(1) : tag_name;
|
||||||
const lastCheck = getItem(VERSION_CHECK);
|
const lastCheck = getItem(VERSION_CHECK);
|
||||||
const hasUpdate = latest && semver.gt(latest, current) && lastCheck?.version !== latest;
|
|
||||||
|
|
||||||
return dispatch(
|
return dispatch(
|
||||||
setVersions({
|
setVersions({
|
||||||
current,
|
current,
|
||||||
latest,
|
latest,
|
||||||
hasUpdate,
|
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
import 'dotenv/config';
|
|
||||||
import buble from '@rollup/plugin-buble';
|
|
||||||
import resolve from '@rollup/plugin-node-resolve';
|
|
||||||
import { terser } from 'rollup-plugin-terser';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
input: 'tracker/index.js',
|
|
||||||
output: {
|
|
||||||
file: 'public/umami.js',
|
|
||||||
format: 'iife',
|
|
||||||
},
|
|
||||||
plugins: [resolve(), buble({ objectAssign: true }), terser({ compress: { evaluate: false } })],
|
|
||||||
};
|
|
|
@ -1,39 +0,0 @@
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const https = require('https');
|
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
const src = path.resolve(__dirname, '../lang');
|
|
||||||
const dest = path.resolve(__dirname, '../public/country');
|
|
||||||
const files = fs.readdirSync(src);
|
|
||||||
|
|
||||||
const getUrl = locale =>
|
|
||||||
`https://raw.githubusercontent.com/umpirsky/country-list/master/data/${locale}/country.json`;
|
|
||||||
|
|
||||||
const asyncForEach = async (array, callback) => {
|
|
||||||
for (let index = 0; index < array.length; index++) {
|
|
||||||
await callback(array[index], index, array);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (!fs.existsSync(dest)) {
|
|
||||||
fs.mkdirSync(dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
const download = async files => {
|
|
||||||
await asyncForEach(files, async file => {
|
|
||||||
const locale = file.replace('-', '_').replace('.json', '');
|
|
||||||
|
|
||||||
const filename = path.join(dest, file);
|
|
||||||
if (!fs.existsSync(filename)) {
|
|
||||||
await new Promise(resolve => {
|
|
||||||
https.get(getUrl(locale), res => {
|
|
||||||
console.log('Downloaded', chalk.greenBright('->'), filename);
|
|
||||||
resolve(res.pipe(fs.createWriteStream(filename)));
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
download(files);
|
|
|
@ -1,35 +0,0 @@
|
||||||
const fs = require('fs');
|
|
||||||
const path = require('path');
|
|
||||||
const del = require('del');
|
|
||||||
const prettier = require('prettier');
|
|
||||||
const chalk = require('chalk');
|
|
||||||
|
|
||||||
const src = path.resolve(__dirname, '../lang');
|
|
||||||
const dest = path.resolve(__dirname, '../build');
|
|
||||||
const files = fs.readdirSync(src);
|
|
||||||
|
|
||||||
const removed = del.sync([path.join(dest, '*.json')]);
|
|
||||||
|
|
||||||
if (removed.length) {
|
|
||||||
console.log(removed.map(n => `${n} ${chalk.redBright('✗')}`).join('\n'));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fs.existsSync(dest)) {
|
|
||||||
fs.mkdirSync(dest);
|
|
||||||
}
|
|
||||||
|
|
||||||
files.forEach(file => {
|
|
||||||
const lang = require(`../lang/${file}`);
|
|
||||||
const keys = Object.keys(lang).sort();
|
|
||||||
|
|
||||||
const formatted = keys.reduce((obj, key) => {
|
|
||||||
obj[key] = { defaultMessage: lang[key] };
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
|
|
||||||
const json = prettier.format(JSON.stringify(formatted), { parser: 'json' });
|
|
||||||
|
|
||||||
fs.writeFileSync(path.resolve(dest, file), json);
|
|
||||||
|
|
||||||
console.log(path.resolve(src, file), chalk.greenBright('->'), path.resolve(dest, file));
|
|
||||||
});
|
|
Loading…
Reference in New Issue