Browse Source

Merge a393d5a438 into 07f89d15a9

pull/2037/merge
Bernd Storath 1 week ago
committed by GitHub
parent
commit
e8e75926e0
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1
      .vscode/extensions.json
  2. 3
      .vscode/settings.json
  3. 4
      src/eslint.config.mjs
  4. 12
      src/nuxt.config.ts
  5. 29
      src/package.json
  6. 3022
      src/pnpm-lock.yaml
  7. 4
      src/server/database/repositories/client/schema.ts
  8. 6
      src/server/database/repositories/client/types.ts
  9. 5
      src/server/database/repositories/user/schema.ts
  10. 2
      src/server/database/repositories/user/service.ts
  11. 8
      src/server/database/repositories/user/types.ts
  12. 2
      src/server/utils/handler.ts
  13. 2
      src/server/utils/session.ts
  14. 4
      src/server/utils/types.ts
  15. 2
      src/server/utils/wgHelper.ts
  16. 4
      src/shared/utils/permissions.ts
  17. 16
      src/tsconfig.json

1
.vscode/extensions.json

@ -4,7 +4,6 @@
"dbaeumer.vscode-eslint", "dbaeumer.vscode-eslint",
"antfu.goto-alias", "antfu.goto-alias",
"visualstudioexptteam.vscodeintellicode", "visualstudioexptteam.vscodeintellicode",
"Nuxtr.nuxtr-vscode",
"esbenp.prettier-vscode", "esbenp.prettier-vscode",
"yoavbls.pretty-ts-errors", "yoavbls.pretty-ts-errors",
"bradlc.vscode-tailwindcss", "bradlc.vscode-tailwindcss",

3
.vscode/settings.json

@ -3,9 +3,6 @@
"editor.useTabStops": false, "editor.useTabStops": false,
"editor.defaultFormatter": "esbenp.prettier-vscode", "editor.defaultFormatter": "esbenp.prettier-vscode",
"editor.formatOnSave": true, "editor.formatOnSave": true,
"nuxtr.vueFiles.style.addStyleTag": false,
"nuxtr.piniaFiles.defaultTemplate": "setup",
"nuxtr.monorepoMode.DirectoryName": "src",
"editor.codeActionsOnSave": { "editor.codeActionsOnSave": {
"source.fixAll.eslint": "always" "source.fixAll.eslint": "always"
}, },

4
src/eslint.config.mjs

@ -4,9 +4,7 @@ import withNuxt from './.nuxt/eslint.config.mjs';
export default withNuxt([ export default withNuxt([
{ {
rules: { rules: {
// https://github.com/nuxt/eslint/issues/590 'import/order': 'warn',
// 'import/order': 'warn',
'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
}, },
}, },
eslintConfigPrettier, eslintConfigPrettier,

12
src/nuxt.config.ts

@ -2,10 +2,7 @@ import { fileURLToPath } from 'node:url';
// https://nuxt.com/docs/api/configuration/nuxt-config // https://nuxt.com/docs/api/configuration/nuxt-config
export default defineNuxtConfig({ export default defineNuxtConfig({
future: { compatibilityDate: '2025-07-15',
compatibilityVersion: 4,
},
compatibilityDate: '2025-02-04',
devtools: { enabled: true }, devtools: { enabled: true },
modules: [ modules: [
'@nuxtjs/i18n', '@nuxtjs/i18n',
@ -76,9 +73,6 @@ export default defineNuxtConfig({
detectBrowserLanguage: { detectBrowserLanguage: {
useCookie: true, useCookie: true,
}, },
bundle: {
optimizeTranslationDirective: false,
},
}, },
nitro: { nitro: {
esbuild: { esbuild: {
@ -87,15 +81,11 @@ export default defineNuxtConfig({
target: 'es2020', target: 'es2020',
}, },
}, },
alias: {
'#db': fileURLToPath(new URL('./server/database/', import.meta.url)),
},
externals: { externals: {
traceInclude: [fileURLToPath(new URL('./cli/index.ts', import.meta.url))], traceInclude: [fileURLToPath(new URL('./cli/index.ts', import.meta.url))],
}, },
}, },
alias: { alias: {
// for typecheck reasons (https://github.com/nuxt/cli/issues/323)
'#db': fileURLToPath(new URL('./server/database/', import.meta.url)), '#db': fileURLToPath(new URL('./server/database/', import.meta.url)),
}, },
}); });

29
src/package.json

@ -20,27 +20,27 @@
"cli:dev": "tsx cli/index.ts" "cli:dev": "tsx cli/index.ts"
}, },
"dependencies": { "dependencies": {
"@eschricht/nuxt-color-mode": "^1.1.5", "@eschricht/nuxt-color-mode": "^1.2.0",
"@heroicons/vue": "^2.2.0", "@heroicons/vue": "^2.2.0",
"@libsql/client": "^0.15.9", "@libsql/client": "^0.15.10",
"@nuxtjs/i18n": "^9.5.6", "@nuxtjs/i18n": "^10.0.3",
"@nuxtjs/tailwindcss": "^6.14.0", "@nuxtjs/tailwindcss": "^6.14.0",
"@phc/format": "^1.0.0", "@phc/format": "^1.0.0",
"@pinia/nuxt": "^0.11.1", "@pinia/nuxt": "^0.11.2",
"@tailwindcss/forms": "^0.5.10", "@tailwindcss/forms": "^0.5.10",
"apexcharts": "^5.2.0", "apexcharts": "^5.3.1",
"argon2": "^0.43.0", "argon2": "^0.43.1",
"cidr-tools": "^11.0.3", "cidr-tools": "^11.0.3",
"citty": "^0.1.6", "citty": "^0.1.6",
"consola": "^3.4.2", "consola": "^3.4.2",
"crc-32": "^1.2.2", "crc-32": "^1.2.2",
"debug": "^4.4.1", "debug": "^4.4.1",
"drizzle-orm": "^0.44.2", "drizzle-orm": "^0.44.3",
"ip-bigint": "^8.2.1", "ip-bigint": "^8.2.1",
"is-cidr": "^5.1.1", "is-cidr": "^5.1.1",
"is-ip": "^5.0.1", "is-ip": "^5.0.1",
"js-sha256": "^0.11.1", "js-sha256": "^0.11.1",
"nuxt": "^3.17.7", "nuxt": "^4.0.1",
"otpauth": "^9.4.0", "otpauth": "^9.4.0",
"pinia": "^3.0.3", "pinia": "^3.0.3",
"qr": "^0.5.0", "qr": "^0.5.0",
@ -48,24 +48,25 @@
"semver": "^7.7.2", "semver": "^7.7.2",
"tailwindcss": "^3.4.17", "tailwindcss": "^3.4.17",
"timeago.js": "^4.0.2", "timeago.js": "^4.0.2",
"vue": "latest", "vue": "^3.5.18",
"vue-router": "^4.5.1",
"vue3-apexcharts": "^1.8.0", "vue3-apexcharts": "^1.8.0",
"zod": "^4.0.5" "zod": "^4.0.10"
}, },
"devDependencies": { "devDependencies": {
"@nuxt/eslint": "^1.5.2", "@nuxt/eslint": "^1.7.1",
"@types/debug": "^4.1.12", "@types/debug": "^4.1.12",
"@types/phc__format": "^1.0.1", "@types/phc__format": "^1.0.1",
"@types/semver": "^7.7.0", "@types/semver": "^7.7.0",
"drizzle-kit": "^0.31.4", "drizzle-kit": "^0.31.4",
"esbuild": "^0.25.6", "esbuild": "^0.25.8",
"eslint": "^9.31.0", "eslint": "^9.31.0",
"eslint-config-prettier": "^10.1.5", "eslint-config-prettier": "^10.1.8",
"prettier": "^3.6.2", "prettier": "^3.6.2",
"prettier-plugin-tailwindcss": "^0.6.14", "prettier-plugin-tailwindcss": "^0.6.14",
"tsx": "^4.20.3", "tsx": "^4.20.3",
"typescript": "^5.8.3", "typescript": "^5.8.3",
"vue-tsc": "^3.0.1" "vue-tsc": "^3.0.4"
}, },
"packageManager": "pnpm@10.13.1" "packageManager": "pnpm@10.13.1"
} }

3022
src/pnpm-lock.yaml

File diff suppressed because it is too large

4
src/server/database/repositories/client/schema.ts

@ -1,4 +1,4 @@
import { sql, relations } from 'drizzle-orm'; import { sql, relations, type InferSelectModel } from 'drizzle-orm';
import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { oneTimeLink, user, wgInterface } from '../../schema'; import { oneTimeLink, user, wgInterface } from '../../schema';
@ -62,3 +62,5 @@ export const clientsRelations = relations(client, ({ one }) => ({
references: [wgInterface.name], references: [wgInterface.name],
}), }),
})); }));
export type ClientType = InferSelectModel<typeof client>;

6
src/server/database/repositories/client/types.ts

@ -1,9 +1,5 @@
import type { InferSelectModel } from 'drizzle-orm';
import z from 'zod'; import z from 'zod';
import type { ClientType } from './schema';
import type { client } from './schema';
export type ClientType = InferSelectModel<typeof client>;
export type ClientNextIpType = Pick<ClientType, 'ipv4Address' | 'ipv6Address'>; export type ClientNextIpType = Pick<ClientType, 'ipv4Address' | 'ipv6Address'>;

5
src/server/database/repositories/user/schema.ts

@ -1,7 +1,8 @@
import { sql, relations } from 'drizzle-orm'; import { sql, relations, type InferSelectModel } from 'drizzle-orm';
import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core'; import { int, sqliteTable, text } from 'drizzle-orm/sqlite-core';
import { client } from '../../schema'; import { client } from '../../schema';
import type { Role } from '#shared/utils/permissions';
export const user = sqliteTable('users_table', { export const user = sqliteTable('users_table', {
id: int().primaryKey({ autoIncrement: true }), id: int().primaryKey({ autoIncrement: true }),
@ -25,3 +26,5 @@ export const user = sqliteTable('users_table', {
export const usersRelations = relations(user, ({ many }) => ({ export const usersRelations = relations(user, ({ many }) => ({
clients: many(client), clients: many(client),
})); }));
export type UserType = InferSelectModel<typeof user>;

2
src/server/database/repositories/user/service.ts

@ -1,7 +1,7 @@
import { eq, sql } from 'drizzle-orm'; import { eq, sql } from 'drizzle-orm';
import { TOTP } from 'otpauth'; import { TOTP } from 'otpauth';
import { user } from './schema'; import { user } from './schema';
import type { UserType } from './types'; import type { UserType } from './schema';
import type { DBType } from '#db/sqlite'; import type { DBType } from '#db/sqlite';
type LoginResult = type LoginResult =

8
src/server/database/repositories/user/types.ts

@ -1,8 +1,4 @@
import type { InferSelectModel } from 'drizzle-orm';
import z from 'zod'; import z from 'zod';
import type { user } from './schema';
export type UserType = InferSelectModel<typeof user>;
const username = z const username = z
.string({ message: t('zod.user.username') }) .string({ message: t('zod.user.username') })
@ -44,9 +40,7 @@ const name = z
.pipe(safeStringRefine); .pipe(safeStringRefine);
const email = z const email = z
.string({ message: t('zod.user.email') }) .email({ message: t('zod.user.email') })
.min(5, t('zod.user.email'))
.email({ message: t('zod.user.emailInvalid') })
.pipe(safeStringRefine) .pipe(safeStringRefine)
.nullable(); .nullable();

2
src/server/utils/handler.ts

@ -1,5 +1,5 @@
import type { EventHandlerRequest, EventHandlerResponse, H3Event } from 'h3'; import type { EventHandlerRequest, EventHandlerResponse, H3Event } from 'h3';
import type { UserType } from '#db/repositories/user/types'; import type { UserType } from '#db/repositories/user/schema';
import type { SetupStepType } from '#db/repositories/general/types'; import type { SetupStepType } from '#db/repositories/general/types';
import { import {
type Permissions, type Permissions,

2
src/server/utils/session.ts

@ -1,5 +1,5 @@
import type { H3Event } from 'h3'; import type { H3Event } from 'h3';
import type { UserType } from '#db/repositories/user/types'; import type { UserType } from '#db/repositories/user/schema';
export type WGSession = Partial<{ export type WGSession = Partial<{
userId: ID; userId: ID;

4
src/server/utils/types.ts

@ -1,4 +1,4 @@
import type { ZodSchema } from 'zod'; import type { ZodType } from 'zod';
import z from 'zod'; import z from 'zod';
import type { H3Event, EventHandlerRequest } from 'h3'; import type { H3Event, EventHandlerRequest } from 'h3';
@ -62,7 +62,7 @@ export const schemaForType =
}; };
export function validateZod<T>( export function validateZod<T>(
schema: ZodSchema<T>, schema: ZodType<T>,
event: H3Event<EventHandlerRequest> event: H3Event<EventHandlerRequest>
) { ) {
return async (data: unknown) => { return async (data: unknown) => {

2
src/server/utils/wgHelper.ts

@ -1,6 +1,6 @@
import { parseCidr } from 'cidr-tools'; import { parseCidr } from 'cidr-tools';
import { stringifyIp } from 'ip-bigint'; import { stringifyIp } from 'ip-bigint';
import type { ClientType } from '#db/repositories/client/types'; import type { ClientType } from '#db/repositories/client/schema';
import type { InterfaceType } from '#db/repositories/interface/types'; import type { InterfaceType } from '#db/repositories/interface/types';
import type { UserConfigType } from '#db/repositories/userConfig/types'; import type { UserConfigType } from '#db/repositories/userConfig/types';
import type { HooksType } from '#db/repositories/hooks/types'; import type { HooksType } from '#db/repositories/hooks/types';

4
src/shared/utils/permissions.ts

@ -1,5 +1,5 @@
import type { ClientType } from '#db/repositories/client/types'; import type { ClientType } from '#db/repositories/client/schema';
import type { UserType } from '#db/repositories/user/types'; import type { UserType } from '#db/repositories/user/schema';
type BrandedRole = { type BrandedRole = {
readonly __role: unique symbol; readonly __role: unique symbol;

16
src/tsconfig.json

@ -1,4 +1,18 @@
{ {
// https://nuxt.com/docs/guide/concepts/typescript // https://nuxt.com/docs/guide/concepts/typescript
"extends": "./.nuxt/tsconfig.json" "files": [],
"references": [
{
"path": "./.nuxt/tsconfig.app.json"
},
{
"path": "./.nuxt/tsconfig.server.json"
},
{
"path": "./.nuxt/tsconfig.shared.json"
},
{
"path": "./.nuxt/tsconfig.node.json"
}
]
} }

Loading…
Cancel
Save