diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..ceb098e5 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,22 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +We're super excited to announce v15! +This update is an entire rewrite to make it even easier to set up your own VPN. + +## Major Changes + +- Almost all Environment variables removed +- New and Improved UI + +## [14.0.0] - 2024-09-04 + +### Major changes + +- `PASSWORD` has been replaced by `PASSWORD_HASH` diff --git a/package.json b/package.json index ecf2bff0..28f7bdda 100644 --- a/package.json +++ b/package.json @@ -1,8 +1,9 @@ { - "version": "1.0.1", + "version": "1.0.0", + "private": true, "scripts": { "dev": "docker compose -f docker-compose.dev.yml up", "build": "docker build -t wg-easy ." }, - "packageManager": "pnpm@9.9.0" + "packageManager": "pnpm@9.10.0" } diff --git a/src/app/layouts/Header.vue b/src/app/layouts/Header.vue index ace34acf..5023a8ca 100644 --- a/src/app/layouts/Header.vue +++ b/src/app/layouts/Header.vue @@ -63,18 +63,18 @@

{{ $t('updateAvailable') }}

-

{{ latestRelease.changelog }}

+

{{ globalStore.latestRelease.changelog }}

@@ -92,9 +92,6 @@ const route = useRoute(); const isLoginPage = computed(() => route.path == '/login'); -const currentRelease = ref(null); -const latestRelease = ref(null); - const theme = useTheme(); const uiShowCharts = ref(getItem('uiShowCharts') === '1'); diff --git a/src/app/stores/global.ts b/src/app/stores/global.ts index 80a19e25..598b406f 100644 --- a/src/app/stores/global.ts +++ b/src/app/stores/global.ts @@ -2,8 +2,8 @@ import { defineStore } from 'pinia'; export const useGlobalStore = defineStore('Global', () => { const uiShowCharts = ref(getItem('uiShowCharts') === '1'); - const currentRelease = ref(null); - const latestRelease = ref( + const currentRelease = ref(null); + const latestRelease = ref( null ); const features = ref({ @@ -35,18 +35,18 @@ export const useGlobalStore = defineStore('Global', () => { locale.value = lang.value!; } - // this is still called on client. why? const { data: release } = await api.getRelease(); - if ( - Number(release.value!.currentRelease) >= - release.value!.latestRelease.version - ) { + if (!release.value) { + return; + } + + if (!release.value.updateAvailable) { return; } - currentRelease.value = Number(release.value!.currentRelease); - latestRelease.value = release.value!.latestRelease; + currentRelease.value = release.value.currentRelease; + latestRelease.value = release.value.latestRelease; } async function fetchFeatures() { @@ -65,6 +65,8 @@ export const useGlobalStore = defineStore('Global', () => { updateCharts, sortClient, features, + currentRelease, + latestRelease, fetchRelease, fetchFeatures, }; diff --git a/src/package.json b/src/package.json index 2c84ba4d..26d3af41 100644 --- a/src/package.json +++ b/src/package.json @@ -1,9 +1,6 @@ { - "release": { - "version": "14" - }, "name": "wg-easy", - "version": "1.0.1", + "version": "14.0.0", "description": "The easiest way to run WireGuard VPN + Web-based Admin UI.", "private": true, "type": "module", @@ -37,6 +34,7 @@ "nuxt": "^3.13.0", "pinia": "^2.2.2", "qrcode": "^1.5.4", + "semver": "^7.6.3", "tailwindcss": "^3.4.10", "timeago.js": "^4.0.2", "vue": "latest", @@ -47,11 +45,12 @@ "@nuxt/eslint-config": "^0.5.5", "@types/debug": "^4.1.12", "@types/qrcode": "^1.5.5", + "@types/semver": "^7.5.8", "eslint": "^9.9.1", "eslint-config-prettier": "^9.1.0", "prettier": "^3.3.3", "typescript": "^5.5.4", "vue-tsc": "^2.1.4" }, - "packageManager": "pnpm@9.9.0" + "packageManager": "pnpm@9.10.0" } diff --git a/src/pnpm-lock.yaml b/src/pnpm-lock.yaml index 3eb13233..2cd028b4 100644 --- a/src/pnpm-lock.yaml +++ b/src/pnpm-lock.yaml @@ -62,6 +62,9 @@ importers: qrcode: specifier: ^1.5.4 version: 1.5.4 + semver: + specifier: ^7.6.3 + version: 7.6.3 tailwindcss: specifier: ^3.4.10 version: 3.4.10 @@ -87,6 +90,9 @@ importers: '@types/qrcode': specifier: ^1.5.5 version: 1.5.5 + '@types/semver': + specifier: ^7.5.8 + version: 7.5.8 eslint: specifier: ^9.9.1 version: 9.9.1(jiti@1.21.6) @@ -1242,6 +1248,9 @@ packages: '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@typescript-eslint/eslint-plugin@8.4.0': resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5687,6 +5696,8 @@ snapshots: '@types/resolve@1.20.2': {} + '@types/semver@7.5.8': {} + '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4))(eslint@9.9.1(jiti@1.21.6))(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 diff --git a/src/server/api/release.get.ts b/src/server/api/release.get.ts index a7c3f02f..daf40ba7 100644 --- a/src/server/api/release.get.ts +++ b/src/server/api/release.get.ts @@ -1,7 +1,12 @@ +import { gt } from 'semver'; + export default defineEventHandler(async () => { + // TODO: cache this const latestRelease = await fetchLatestRelease(); + const updateAvailable = gt(latestRelease.version, RELEASE); return { currentRelease: RELEASE, latestRelease: latestRelease, + updateAvailable, }; }); diff --git a/src/server/utils/config.ts b/src/server/utils/config.ts index 2b904bbb..a3630bcb 100644 --- a/src/server/utils/config.ts +++ b/src/server/utils/config.ts @@ -5,7 +5,7 @@ import type { Database } from '~~/services/database/repositories/database'; import { parseCidr } from 'cidr-tools'; import { stringifyIp } from 'ip-bigint'; -export const RELEASE = packageJson.release.version; +export const RELEASE = packageJson.version; export const SERVER_DEBUG = debug('Server'); diff --git a/src/server/utils/release.ts b/src/server/utils/release.ts index 118048d0..b76b66ba 100644 --- a/src/server/utils/release.ts +++ b/src/server/utils/release.ts @@ -1,26 +1,27 @@ +type GithubRelease = { + tag_name: string; + body: string; +}; + export async function fetchLatestRelease() { try { - const response = await $fetch>( - 'https://wg-easy.github.io/wg-easy/changelog.json', + const response = await $fetch( + 'https://api.github.com/repos/wg-easy/wg-easy/releases/latest', { method: 'get' } ); - const releasesArray = Object.entries(response).map( - ([version, changelog]) => ({ - version: parseInt(version, 10), - changelog: changelog, - }) - ); - releasesArray.sort((a, b) => { - return b.version - a.version; - }); - - if (releasesArray.length === 0) { - throw new Error('Changelog is empty'); + if (!response) { + throw new Error('Empty Response'); } - - return releasesArray[0]!; + const changelog = response.body.split('\r\n\r\n')[0] ?? ''; + return { + version: response.tag_name, + changelog, + }; } catch (e) { SERVER_DEBUG('Failed to fetch latest releases: ', e); - return { version: 0, changelog: '' }; + throw createError({ + statusCode: 500, + statusMessage: 'Failed to fetch latest release', + }); } }