diff --git a/.eslintrc.json b/.eslintrc.json
index 7a824ff6c..9d747b879 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -4,14 +4,6 @@
"es2020": true,
"node": true
},
- "parser": "@typescript-eslint/parser",
- "parserOptions": {
- "ecmaFeatures": {
- "jsx": true
- },
- "ecmaVersion": 11,
- "sourceType": "module"
- },
"extends": [
"eslint:recommended",
"plugin:prettier/recommended",
@@ -19,22 +11,29 @@
"plugin:@typescript-eslint/recommended",
"next"
],
-
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaFeatures": {
+ "jsx": true
+ },
+ "ecmaVersion": 11,
+ "sourceType": "module"
+ },
"plugins": ["@typescript-eslint", "prettier"],
"settings": {
"import/resolver": {
"alias": {
"map": [
- ["assets", "./assets"],
- ["components", "./components"],
+ ["assets", "./src/assets"],
+ ["components", "./src/components"],
["db", "./db"],
- ["hooks", "./hooks"],
- ["lang", "./lang"],
- ["lib", "./lib"],
+ ["hooks", "./src/components/hooks"],
+ ["lang", "./src/lang"],
+ ["lib", "./src/lib"],
["public", "./public"],
- ["queries", "./queries"],
- ["store", "./store"],
- ["styles", "./styles"]
+ ["queries", "./src/queries"],
+ ["store", "./src/store"],
+ ["styles", "./src/styles"]
],
"extensions": [".ts", ".tsx", ".js", ".jsx", ".json"]
}
@@ -50,7 +49,9 @@
"@next/next/no-img-element": "off",
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-explicit-any": "off",
- "@typescript-eslint/no-var-requires": "off"
+ "@typescript-eslint/no-var-requires": "off",
+ "@typescript-eslint/no-empty-interface": "off",
+ "@typescript-eslint/no-unused-vars": ["error", { "ignoreRestSiblings": true }]
},
"globals": {
"React": "writable"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 775f9ecf5..66e16a03e 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -16,10 +16,6 @@ jobs:
strategy:
matrix:
include:
- - node-version: 16.x
- db-type: postgresql
- - node-version: 16.x
- db-type: mysql
- node-version: 18.x
db-type: postgresql
- node-version: 18.x
diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml
index bf2505b14..f16040149 100644
--- a/.github/workflows/stale-issues.yml
+++ b/.github/workflows/stale-issues.yml
@@ -19,4 +19,7 @@ jobs:
close-issue-message: 'This issue was closed because it has been inactive for 7 days since being marked as stale.'
days-before-pr-stale: -1
days-before-pr-close: -1
+ operations-per-run: 200
+ ascending: true
repo-token: ${{ secrets.GITHUB_TOKEN }}
+ exempt-issue-labels: bug,enhancement
diff --git a/.gitignore b/.gitignore
index 99087ab50..050397c90 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,9 +34,7 @@ yarn-error.log*
# local env files
.env
-.env.development.local
-.env.test.local
-.env.production.local
+.env.*
*.dev.yml
diff --git a/Dockerfile b/Dockerfile
index bdc678dac..801b2bc20 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -12,8 +12,8 @@ RUN yarn install --frozen-lockfile
FROM node:18-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
-COPY docker/middleware.js .
COPY . .
+COPY docker/middleware.js ./src
ARG DATABASE_TYPE
ARG BASE_PATH
@@ -35,7 +35,9 @@ ENV NEXT_TELEMETRY_DISABLED 1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
-RUN yarn add npm-run-all dotenv prisma
+RUN set -x \
+ && apk add --no-cache curl \
+ && yarn add npm-run-all dotenv prisma semver
# You only need to copy next.config.js if you are NOT using the default configuration
COPY --from=builder /app/next.config.js .
@@ -53,6 +55,7 @@ USER nextjs
EXPOSE 3000
+ENV HOSTNAME 0.0.0.0
ENV PORT 3000
CMD ["yarn", "start-docker"]
diff --git a/README.md b/README.md
index 19935ed59..32e78e31c 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,7 @@ A detailed getting started guide can be found at [https://umami.is/docs/](https:
### Requirements
-- A server with Node.js version 12 or newer
+- A server with Node.js version 16.13 or newer
- A database. Umami supports [MySQL](https://www.mysql.com/) and [Postgresql](https://www.postgresql.org/) databases.
### Install Yarn
@@ -72,13 +72,13 @@ docker compose up -d
Alternatively, to pull just the Umami Docker image with PostgreSQL support:
```bash
-docker pull docker.umami.dev/umami-software/umami:postgresql-latest
+docker pull ghcr.io/umami-software/umami:postgresql-latest
```
Or with MySQL support:
```bash
-docker pull docker.umami.dev/umami-software/umami:mysql-latest
+docker pull ghcr.io/umami-software/umami:mysql-latest
```
## Getting updates
diff --git a/components/common/FilterButtons.js b/components/common/FilterButtons.js
deleted file mode 100644
index f5a54fb63..000000000
--- a/components/common/FilterButtons.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { ButtonGroup, Button, Flexbox } from 'react-basics';
-
-export function FilterButtons({ items, selectedKey, onSelect }) {
- return (
-
{formatMessage(messages.trackingCode)}
- - > - ); -} - -export default TrackingCode; diff --git a/components/pages/settings/websites/WebsitesList.js b/components/pages/settings/websites/WebsitesList.js deleted file mode 100644 index de423d0b2..000000000 --- a/components/pages/settings/websites/WebsitesList.js +++ /dev/null @@ -1,60 +0,0 @@ -import { Button, Icon, Text, Modal, ModalTrigger, useToasts, Icons } from 'react-basics'; -import Page from 'components/layout/Page'; -import PageHeader from 'components/layout/PageHeader'; -import EmptyPlaceholder from 'components/common/EmptyPlaceholder'; -import WebsiteAddForm from 'components/pages/settings/websites/WebsiteAddForm'; -import WebsitesTable from 'components/pages/settings/websites/WebsitesTable'; -import useApi from 'hooks/useApi'; -import useUser from 'hooks/useUser'; -import useMessages from 'hooks/useMessages'; -import { ROLES } from 'lib/constants'; - -export function WebsitesList() { - const { formatMessage, labels, messages } = useMessages(); - const { user } = useUser(); - const { get, useQuery } = useApi(); - const { data, isLoading, error, refetch } = useQuery( - ['websites', user?.id], - () => get(`/users/${user?.id}/websites`), - { enabled: !!user }, - ); - const { showToast } = useToasts(); - const hasData = data && data.length !== 0; - - const handleSave = async () => { - await refetch(); - showToast({ message: formatMessage(messages.saved), variant: 'success' }); - }; - - const addButton = ( - <> - {user.role !== ROLES.viewOnly && ( -